diff options
Diffstat (limited to 'test')
1764 files changed, 157154 insertions, 14665 deletions
diff --git a/test/Analysis/BasicAA/intrinsics.ll b/test/Analysis/BasicAA/intrinsics.ll index 59725cfded05..c1cf587204cf 100644 --- a/test/Analysis/BasicAA/intrinsics.ll +++ b/test/Analysis/BasicAA/intrinsics.ll @@ -7,7 +7,7 @@ target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32- ; CHECK: define <8 x i16> @test0(i8* noalias %p, i8* noalias %q, <8 x i16> %y) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) nounwind +; CHECK-NEXT: %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) [[ATTR:#[0-9]+]] ; CHECK-NEXT: call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16) ; CHECK-NEXT: %c = add <8 x i16> %a, %a define <8 x i16> @test0(i8* noalias %p, i8* noalias %q, <8 x i16> %y) { @@ -22,7 +22,7 @@ entry: ; CHECK: define <8 x i16> @test1(i8* %p, <8 x i16> %y) { ; CHECK-NEXT: entry: ; CHECK-NEXT: %q = getelementptr i8* %p, i64 16 -; CHECK-NEXT: %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) nounwind +; CHECK-NEXT: %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) [[ATTR]] ; CHECK-NEXT: call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16) ; CHECK-NEXT: %c = add <8 x i16> %a, %a define <8 x i16> @test1(i8* %p, <8 x i16> %y) { @@ -37,3 +37,6 @@ entry: declare <8 x i16> @llvm.arm.neon.vld1.v8i16(i8*, i32) nounwind readonly declare void @llvm.arm.neon.vst1.v8i16(i8*, <8 x i16>, i32) nounwind + +; CHECK: attributes #0 = { nounwind readonly } +; CHECK: attributes [[ATTR]] = { nounwind } diff --git a/test/Analysis/BasicAA/invariant_load.ll b/test/Analysis/BasicAA/invariant_load.ll new file mode 100644 index 000000000000..cd6ddb92d210 --- /dev/null +++ b/test/Analysis/BasicAA/invariant_load.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -basicaa -gvn -S | FileCheck %s + +; The input *.ll is obtained by manually annotating "invariant.load" to the +; two loads. With "invariant.load" metadata, the second load is redundant. +; +; int foo(int *p, char *q) { +; *q = (char)*p; +; return *p + 1; +; } + +define i32 @foo(i32* nocapture %p, i8* nocapture %q) { +entry: + %0 = load i32* %p, align 4, !tbaa !0, !invariant.load !3 + %conv = trunc i32 %0 to i8 + store i8 %conv, i8* %q, align 1, !tbaa !1 + %1 = load i32* %p, align 4, !tbaa !0, !invariant.load !3 + %add = add nsw i32 %1, 1 + ret i32 %add + +; CHECK: foo +; CHECK: %0 = load i32* %p +; CHECK: store i8 %conv, i8* %q, +; CHECK: %add = add nsw i32 %0, 1 +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{} diff --git a/test/Analysis/BasicAA/phi-spec-order.ll b/test/Analysis/BasicAA/phi-spec-order.ll new file mode 100644 index 000000000000..27d47bcd5bf3 --- /dev/null +++ b/test/Analysis/BasicAA/phi-spec-order.ll @@ -0,0 +1,71 @@ +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-bgq-linux" +; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s + +@X = external global [16000 x double], align 32 +@Y = external global [16000 x double], align 32 + +define signext i32 @s000() nounwind { +entry: + br label %for.cond2.preheader + +for.cond2.preheader: ; preds = %for.end, %entry + %nl.018 = phi i32 [ 0, %entry ], [ %inc9, %for.end ] + br label %for.body4 + +for.body4: ; preds = %for.body4, %for.cond2.preheader + %lsr.iv4 = phi [16000 x double]* [ %i11, %for.body4 ], [ bitcast (double* getelementptr inbounds ([16000 x double]* @Y, i64 0, i64 8) + to [16000 x double]*), %for.cond2.preheader ] + %lsr.iv1 = phi [16000 x double]* [ %i10, %for.body4 ], [ @X, %for.cond2.preheader ] + +; CHECK: NoAlias:{{[ \t]+}}[16000 x double]* %lsr.iv1, [16000 x double]* %lsr.iv4 + + %lsr.iv = phi i32 [ %lsr.iv.next, %for.body4 ], [ 16000, %for.cond2.preheader ] + %lsr.iv46 = bitcast [16000 x double]* %lsr.iv4 to <4 x double>* + %lsr.iv12 = bitcast [16000 x double]* %lsr.iv1 to <4 x double>* + %scevgep11 = getelementptr <4 x double>* %lsr.iv46, i64 -2 + %i6 = load <4 x double>* %scevgep11, align 32, !tbaa !0 + %add = fadd <4 x double> %i6, <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00> + store <4 x double> %add, <4 x double>* %lsr.iv12, align 32, !tbaa !0 + %scevgep10 = getelementptr <4 x double>* %lsr.iv46, i64 -1 + %i7 = load <4 x double>* %scevgep10, align 32, !tbaa !0 + %add.4 = fadd <4 x double> %i7, <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00> + %scevgep9 = getelementptr <4 x double>* %lsr.iv12, i64 1 + store <4 x double> %add.4, <4 x double>* %scevgep9, align 32, !tbaa !0 + %i8 = load <4 x double>* %lsr.iv46, align 32, !tbaa !0 + %add.8 = fadd <4 x double> %i8, <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00> + %scevgep8 = getelementptr <4 x double>* %lsr.iv12, i64 2 + store <4 x double> %add.8, <4 x double>* %scevgep8, align 32, !tbaa !0 + %scevgep7 = getelementptr <4 x double>* %lsr.iv46, i64 1 + %i9 = load <4 x double>* %scevgep7, align 32, !tbaa !0 + %add.12 = fadd <4 x double> %i9, <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00> + %scevgep3 = getelementptr <4 x double>* %lsr.iv12, i64 3 + store <4 x double> %add.12, <4 x double>* %scevgep3, align 32, !tbaa !0 + +; CHECK: NoAlias:{{[ \t]+}}<4 x double>* %scevgep11, <4 x double>* %scevgep7 +; CHECK: NoAlias:{{[ \t]+}}<4 x double>* %scevgep10, <4 x double>* %scevgep7 +; CHECK: NoAlias:{{[ \t]+}}<4 x double>* %scevgep7, <4 x double>* %scevgep9 +; CHECK: NoAlias:{{[ \t]+}}<4 x double>* %scevgep11, <4 x double>* %scevgep3 +; CHECK: NoAlias:{{[ \t]+}}<4 x double>* %scevgep10, <4 x double>* %scevgep3 +; CHECK: NoAlias:{{[ \t]+}}<4 x double>* %scevgep3, <4 x double>* %scevgep9 + + %lsr.iv.next = add i32 %lsr.iv, -16 + %scevgep = getelementptr [16000 x double]* %lsr.iv1, i64 0, i64 16 + %i10 = bitcast double* %scevgep to [16000 x double]* + %scevgep5 = getelementptr [16000 x double]* %lsr.iv4, i64 0, i64 16 + %i11 = bitcast double* %scevgep5 to [16000 x double]* + %exitcond.15 = icmp eq i32 %lsr.iv.next, 0 + br i1 %exitcond.15, label %for.end, label %for.body4 + +for.end: ; preds = %for.body4 + %inc9 = add nsw i32 %nl.018, 1 + %exitcond = icmp eq i32 %inc9, 400000 + br i1 %exitcond, label %for.end10, label %for.cond2.preheader + +for.end10: ; preds = %for.end + ret i32 0 +} + +!0 = metadata !{metadata !"double", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/Analysis/BasicAA/phi-speculation.ll b/test/Analysis/BasicAA/phi-speculation.ll index 21c65929862f..5e1e118d9855 100644 --- a/test/Analysis/BasicAA/phi-speculation.ll +++ b/test/Analysis/BasicAA/phi-speculation.ll @@ -4,9 +4,9 @@ target datalayout = ; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s ; ptr_phi and ptr2_phi do not alias. +; CHECK: test_noalias_1 ; CHECK: NoAlias: i32* %ptr2_phi, i32* %ptr_phi - -define i32 @test_noalias(i32* %ptr2, i32 %count, i32* %coeff) { +define i32 @test_noalias_1(i32* %ptr2, i32 %count, i32* %coeff) { entry: %ptr = getelementptr inbounds i32* %ptr2, i64 1 br label %while.body @@ -31,3 +31,64 @@ while.body: the_exit: ret i32 %add } + +; CHECK: test_noalias_2 +; CHECK: NoAlias: i32* %ptr_outer_phi, i32* %ptr_outer_phi2 +; CHECK: NoAlias: i32* %ptr2_phi, i32* %ptr_phi +define i32 @test_noalias_2(i32* %ptr2, i32 %count, i32* %coeff) { +entry: + %ptr = getelementptr inbounds i32* %ptr2, i64 1 + br label %outer.while.header + +outer.while.header: + %ptr_outer_phi = phi i32* [%ptr_inc_outer, %outer.while.backedge], [ %ptr, %entry] + %ptr_outer_phi2 = phi i32* [%ptr2_inc_outer, %outer.while.backedge], [ %ptr2, %entry] + %num.outer = phi i32 [ %count, %entry ], [ %dec.outer, %outer.while.backedge ] + br label %while.body + +while.body: + %num = phi i32 [ %count, %outer.while.header ], [ %dec, %while.body ] + %ptr_phi = phi i32* [ %ptr_outer_phi, %outer.while.header ], [ %ptr_inc, %while.body ] + %ptr2_phi = phi i32* [ %ptr_outer_phi2, %outer.while.header ], [ %ptr2_inc, %while.body ] + %result.09 = phi i32 [ 0 , %outer.while.header ], [ %add, %while.body ] + %dec = add nsw i32 %num, -1 + %0 = load i32* %ptr_phi, align 4 + store i32 %0, i32* %ptr2_phi, align 4 + %1 = load i32* %coeff, align 4 + %2 = load i32* %ptr_phi, align 4 + %mul = mul nsw i32 %1, %2 + %add = add nsw i32 %mul, %result.09 + %tobool = icmp eq i32 %dec, 0 + %ptr_inc = getelementptr inbounds i32* %ptr_phi, i64 1 + %ptr2_inc = getelementptr inbounds i32* %ptr2_phi, i64 1 + br i1 %tobool, label %outer.while.backedge, label %while.body + +outer.while.backedge: + %ptr_inc_outer = getelementptr inbounds i32* %ptr_phi, i64 1 + %ptr2_inc_outer = getelementptr inbounds i32* %ptr2_phi, i64 1 + %dec.outer = add nsw i32 %num.outer, -1 + %br.cond = icmp eq i32 %dec.outer, 0 + br i1 %br.cond, label %the_exit, label %outer.while.header + +the_exit: + ret i32 %add +} + +; CHECK: test_noalias_3 +; CHECK: MayAlias: i8* %ptr2_phi, i8* %ptr_phi +define i32 @test_noalias_3(i8* noalias %x, i8* noalias %y, i8* noalias %z, + i32 %count) { +entry: + br label %while.body + +while.body: + %num = phi i32 [ %count, %entry ], [ %dec, %while.body ] + %ptr_phi = phi i8* [ %x, %entry ], [ %z, %while.body ] + %ptr2_phi = phi i8* [ %y, %entry ], [ %ptr_phi, %while.body ] + %dec = add nsw i32 %num, -1 + %tobool = icmp eq i32 %dec, 0 + br i1 %tobool, label %the_exit, label %while.body + +the_exit: + ret i32 1 +} diff --git a/test/Analysis/BasicAA/pure-const-dce.ll b/test/Analysis/BasicAA/pure-const-dce.ll index 266e607b21a4..e48992860a60 100644 --- a/test/Analysis/BasicAA/pure-const-dce.ll +++ b/test/Analysis/BasicAA/pure-const-dce.ll @@ -4,11 +4,11 @@ ; CHECK: @test ; CHECK: entry -; CHECK: %tmp0 = call i32 @TestConst(i32 5) readnone -; CHECK-NEXT: %tmp1 = call i32 @TestPure(i32 6) readonly +; CHECK: %tmp0 = call i32 @TestConst(i32 5) [[READNONE:#[0-9]+]] +; CHECK-NEXT: %tmp1 = call i32 @TestPure(i32 6) [[READONLY:#[0-9]+]] ; CHECK-NEXT: %tmp2 = call i32 @TestNone(i32 7) ; CHECK-NEXT: store i32 1, i32* @g -; CHECK-NEXT: %tmp5 = call i32 @TestPure(i32 6) readonly +; CHECK-NEXT: %tmp5 = call i32 @TestPure(i32 6) [[READONLY]] ; CHECK-NEXT: %tmp7 = call i32 @TestNone(i32 7) ; CHECK-NEXT: %tmp8 = call i32 @TestNone(i32 7) ; CHECK-NEXT: %sum0 = add i32 %tmp0, %tmp1 @@ -49,3 +49,6 @@ declare i32 @TestConst(i32) readnone declare i32 @TestPure(i32) readonly declare i32 @TestNone(i32) + +; CHECK: attributes [[READNONE]] = { readnone } +; CHECK: attributes [[READONLY]] = { readonly } diff --git a/test/Analysis/CostModel/ARM/cast.ll b/test/Analysis/CostModel/ARM/cast.ll new file mode 100644 index 000000000000..ba9d84cf3e23 --- /dev/null +++ b/test/Analysis/CostModel/ARM/cast.ll @@ -0,0 +1,547 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -mcpu=cortex-a8 | FileCheck %s +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios6.0.0" + +define i32 @casts() { + + ; -- scalars -- + ; CHECK: cost of 1 {{.*}} sext + %r0 = sext i1 undef to i8 + ; CHECK: cost of 1 {{.*}} zext + %r1 = zext i1 undef to i8 + ; CHECK: cost of 1 {{.*}} sext + %r2 = sext i1 undef to i16 + ; CHECK: cost of 1 {{.*}} zext + %r3 = zext i1 undef to i16 + ; CHECK: cost of 1 {{.*}} sext + %r4 = sext i1 undef to i32 + ; CHECK: cost of 1 {{.*}} zext + %r5 = zext i1 undef to i32 + ; CHECK: cost of 1 {{.*}} sext + %r6 = sext i1 undef to i64 + ; CHECK: cost of 1 {{.*}} zext + %r7 = zext i1 undef to i64 + ; CHECK: cost of 0 {{.*}} trunc + %r8 = trunc i8 undef to i1 + ; CHECK: cost of 1 {{.*}} sext + %r9 = sext i8 undef to i16 + ; CHECK: cost of 1 {{.*}} zext + %r10 = zext i8 undef to i16 + ; CHECK: cost of 1 {{.*}} sext + %r11 = sext i8 undef to i32 + ; CHECK: cost of 1 {{.*}} zext + %r12 = zext i8 undef to i32 + ; CHECK: cost of 1 {{.*}} sext + %r13 = sext i8 undef to i64 + ; CHECK: cost of 1 {{.*}} zext + %r14 = zext i8 undef to i64 + ; CHECK: cost of 0 {{.*}} trunc + %r15 = trunc i16 undef to i1 + ; CHECK: cost of 0 {{.*}} trunc + %r16 = trunc i16 undef to i8 + ; CHECK: cost of 1 {{.*}} sext + %r17 = sext i16 undef to i32 + ; CHECK: cost of 1 {{.*}} zext + %r18 = zext i16 undef to i32 + ; CHECK: cost of 2 {{.*}} sext + %r19 = sext i16 undef to i64 + ; CHECK: cost of 1 {{.*}} zext + %r20 = zext i16 undef to i64 + ; CHECK: cost of 0 {{.*}} trunc + %r21 = trunc i32 undef to i1 + ; CHECK: cost of 0 {{.*}} trunc + %r22 = trunc i32 undef to i8 + ; CHECK: cost of 0 {{.*}} trunc + %r23 = trunc i32 undef to i16 + ; CHECK: cost of 1 {{.*}} sext + %r24 = sext i32 undef to i64 + ; CHECK: cost of 1 {{.*}} zext + %r25 = zext i32 undef to i64 + ; CHECK: cost of 0 {{.*}} trunc + %r26 = trunc i64 undef to i1 + ; CHECK: cost of 0 {{.*}} trunc + %r27 = trunc i64 undef to i8 + ; CHECK: cost of 0 {{.*}} trunc + %r28 = trunc i64 undef to i16 + ; CHECK: cost of 0 {{.*}} trunc + %r29 = trunc i64 undef to i32 + + ; -- floating point conversions -- + ; Moves between scalar and NEON registers. + ; CHECK: cost of 2 {{.*}} fptoui + %r30 = fptoui float undef to i1 + ; CHECK: cost of 2 {{.*}} fptosi + %r31 = fptosi float undef to i1 + ; CHECK: cost of 2 {{.*}} fptoui + %r32 = fptoui float undef to i8 + ; CHECK: cost of 2 {{.*}} fptosi + %r33 = fptosi float undef to i8 + ; CHECK: cost of 2 {{.*}} fptoui + %r34 = fptoui float undef to i16 + ; CHECK: cost of 2 {{.*}} fptosi + %r35 = fptosi float undef to i16 + ; CHECK: cost of 2 {{.*}} fptoui + %r36 = fptoui float undef to i32 + ; CHECK: cost of 2 {{.*}} fptosi + %r37 = fptosi float undef to i32 + ; CHECK: cost of 10 {{.*}} fptoui + %r38 = fptoui float undef to i64 + ; CHECK: cost of 10 {{.*}} fptosi + %r39 = fptosi float undef to i64 + ; CHECK: cost of 2 {{.*}} fptoui + %r40 = fptoui double undef to i1 + ; CHECK: cost of 2 {{.*}} fptosi + %r41 = fptosi double undef to i1 + ; CHECK: cost of 2 {{.*}} fptoui + %r42 = fptoui double undef to i8 + ; CHECK: cost of 2 {{.*}} fptosi + %r43 = fptosi double undef to i8 + ; CHECK: cost of 2 {{.*}} fptoui + %r44 = fptoui double undef to i16 + ; CHECK: cost of 2 {{.*}} fptosi + %r45 = fptosi double undef to i16 + ; CHECK: cost of 2 {{.*}} fptoui + %r46 = fptoui double undef to i32 + ; CHECK: cost of 2 {{.*}} fptosi + %r47 = fptosi double undef to i32 + ; Function call + ; CHECK: cost of 10 {{.*}} fptoui + %r48 = fptoui double undef to i64 + ; CHECK: cost of 10 {{.*}} fptosi + %r49 = fptosi double undef to i64 + + ; CHECK: cost of 2 {{.*}} sitofp + %r50 = sitofp i1 undef to float + ; CHECK: cost of 2 {{.*}} uitofp + %r51 = uitofp i1 undef to float + ; CHECK: cost of 2 {{.*}} sitofp + %r52 = sitofp i1 undef to double + ; CHECK: cost of 2 {{.*}} uitofp + %r53 = uitofp i1 undef to double + ; CHECK: cost of 2 {{.*}} sitofp + %r54 = sitofp i8 undef to float + ; CHECK: cost of 2 {{.*}} uitofp + %r55 = uitofp i8 undef to float + ; CHECK: cost of 2 {{.*}} sitofp + %r56 = sitofp i8 undef to double + ; CHECK: cost of 2 {{.*}} uitofp + %r57 = uitofp i8 undef to double + ; CHECK: cost of 2 {{.*}} sitofp + %r58 = sitofp i16 undef to float + ; CHECK: cost of 2 {{.*}} uitofp + %r59 = uitofp i16 undef to float + ; CHECK: cost of 2 {{.*}} sitofp + %r60 = sitofp i16 undef to double + ; CHECK: cost of 2 {{.*}} uitofp + %r61 = uitofp i16 undef to double + ; CHECK: cost of 2 {{.*}} sitofp + %r62 = sitofp i32 undef to float + ; CHECK: cost of 2 {{.*}} uitofp + %r63 = uitofp i32 undef to float + ; CHECK: cost of 2 {{.*}} sitofp + %r64 = sitofp i32 undef to double + ; CHECK: cost of 2 {{.*}} uitofp + %r65 = uitofp i32 undef to double + ; Function call + ; CHECK: cost of 10 {{.*}} sitofp + %r66 = sitofp i64 undef to float + ; CHECK: cost of 10 {{.*}} uitofp + %r67 = uitofp i64 undef to float + ; CHECK: cost of 10 {{.*}} sitofp + %r68 = sitofp i64 undef to double + ; CHECK: cost of 10 {{.*}} uitofp + %r69 = uitofp i64 undef to double + + ; CHECK: cost of 3 {{.*}} sext + %r70 = sext <8 x i8> undef to <8 x i32> + ; CHECK: cost of 6 {{.*}} sext + %r71 = sext <16 x i8> undef to <16 x i32> + ; CHECK: cost of 3 {{.*}} zext + %r72 = zext <8 x i8> undef to <8 x i32> + ; CHECK: cost of 6 {{.*}} zext + %r73 = zext <16 x i8> undef to <16 x i32> + + ; CHECK: cost of 7 {{.*}} sext + %rext_0 = sext <8 x i8> undef to <8 x i64> + ; CHECK: cost of 7 {{.*}} zext + %rext_1 = zext <8 x i8> undef to <8 x i64> + ; CHECK: cost of 6 {{.*}} sext + %rext_2 = sext <8 x i16> undef to <8 x i64> + ; CHECK: cost of 6 {{.*}} zext + %rext_3 = zext <8 x i16> undef to <8 x i64> + ; CHECK: cost of 3 {{.*}} sext + %rext_4 = sext <4 x i16> undef to <4 x i64> + ; CHECK: cost of 3 {{.*}} zext + %rext_5 = zext <4 x i16> undef to <4 x i64> + + ; Vector cast cost of instructions lowering the cast to the stack. + ; CHECK: cost of 19 {{.*}} trunc + %r74 = trunc <8 x i32> undef to <8 x i8> + ; CHECK: cost of 38 {{.*}} trunc + %r75 = trunc <16 x i32> undef to <16 x i8> + + ; Floating point truncation costs. + ; CHECK: cost of 1 {{.*}} fptrunc double + %r80 = fptrunc double undef to float + ; CHECK: cost of 2 {{.*}} fptrunc <2 x double + %r81 = fptrunc <2 x double> undef to <2 x float> + ; CHECK: cost of 4 {{.*}} fptrunc <4 x double + %r82 = fptrunc <4 x double> undef to <4 x float> + ; CHECK: cost of 8 {{.*}} fptrunc <8 x double + %r83 = fptrunc <8 x double> undef to <8 x float> + ; CHECK: cost of 16 {{.*}} fptrunc <16 x double + %r84 = fptrunc <16 x double> undef to <16 x float> + + ; Floating point extension costs. + ; CHECK: cost of 1 {{.*}} fpext float + %r85 = fpext float undef to double + ; CHECK: cost of 2 {{.*}} fpext <2 x float + %r86 = fpext <2 x float> undef to <2 x double> + ; CHECK: cost of 4 {{.*}} fpext <4 x float + %r87 = fpext <4 x float> undef to <4 x double> + ; CHECK: cost of 8 {{.*}} fpext <8 x float + %r88 = fpext <8 x float> undef to <8 x double> + ; CHECK: cost of 16 {{.*}} fpext <16 x float + %r89 = fpext <16 x float> undef to <16 x double> + + ;; Floating point to integer vector casts. + ; CHECK: cost of 1 {{.*}} fptoui + %r90 = fptoui <2 x float> undef to <2 x i1> + ; CHECK: cost of 1 {{.*}} fptosi + %r91 = fptosi <2 x float> undef to <2 x i1> + ; CHECK: cost of 1 {{.*}} fptoui + %r92 = fptoui <2 x float> undef to <2 x i8> + ; CHECK: cost of 1 {{.*}} fptosi + %r93 = fptosi <2 x float> undef to <2 x i8> + ; CHECK: cost of 1 {{.*}} fptoui + %r94 = fptoui <2 x float> undef to <2 x i16> + ; CHECK: cost of 1 {{.*}} fptosi + %r95 = fptosi <2 x float> undef to <2 x i16> + ; CHECK: cost of 1 {{.*}} fptoui + %r96 = fptoui <2 x float> undef to <2 x i32> + ; CHECK: cost of 1 {{.*}} fptosi + %r97 = fptosi <2 x float> undef to <2 x i32> + ; CHECK: cost of 24 {{.*}} fptoui + %r98 = fptoui <2 x float> undef to <2 x i64> + ; CHECK: cost of 24 {{.*}} fptosi + %r99 = fptosi <2 x float> undef to <2 x i64> + + ; CHECK: cost of 8 {{.*}} fptoui + %r100 = fptoui <2 x double> undef to <2 x i1> + ; CHECK: cost of 8 {{.*}} fptosi + %r101 = fptosi <2 x double> undef to <2 x i1> + ; CHECK: cost of 8 {{.*}} fptoui + %r102 = fptoui <2 x double> undef to <2 x i8> + ; CHECK: cost of 8 {{.*}} fptosi + %r103 = fptosi <2 x double> undef to <2 x i8> + ; CHECK: cost of 8 {{.*}} fptoui + %r104 = fptoui <2 x double> undef to <2 x i16> + ; CHECK: cost of 8 {{.*}} fptosi + %r105 = fptosi <2 x double> undef to <2 x i16> + ; CHECK: cost of 2 {{.*}} fptoui + %r106 = fptoui <2 x double> undef to <2 x i32> + ; CHECK: cost of 2 {{.*}} fptosi + %r107 = fptosi <2 x double> undef to <2 x i32> + ; CHECK: cost of 24 {{.*}} fptoui + %r108 = fptoui <2 x double> undef to <2 x i64> + ; CHECK: cost of 24 {{.*}} fptosi + %r109 = fptosi <2 x double> undef to <2 x i64> + + ; CHECK: cost of 16 {{.*}} fptoui + %r110 = fptoui <4 x float> undef to <4 x i1> + ; CHECK: cost of 16 {{.*}} fptosi + %r111 = fptosi <4 x float> undef to <4 x i1> + ; CHECK: cost of 3 {{.*}} fptoui + %r112 = fptoui <4 x float> undef to <4 x i8> + ; CHECK: cost of 3 {{.*}} fptosi + %r113 = fptosi <4 x float> undef to <4 x i8> + ; CHECK: cost of 2 {{.*}} fptoui + %r114 = fptoui <4 x float> undef to <4 x i16> + ; CHECK: cost of 2 {{.*}} fptosi + %r115 = fptosi <4 x float> undef to <4 x i16> + ; CHECK: cost of 1 {{.*}} fptoui + %r116 = fptoui <4 x float> undef to <4 x i32> + ; CHECK: cost of 1 {{.*}} fptosi + %r117 = fptosi <4 x float> undef to <4 x i32> + ; CHECK: cost of 48 {{.*}} fptoui + %r118 = fptoui <4 x float> undef to <4 x i64> + ; CHECK: cost of 48 {{.*}} fptosi + %r119 = fptosi <4 x float> undef to <4 x i64> + + ; CHECK: cost of 16 {{.*}} fptoui + %r120 = fptoui <4 x double> undef to <4 x i1> + ; CHECK: cost of 16 {{.*}} fptosi + %r121 = fptosi <4 x double> undef to <4 x i1> + ; CHECK: cost of 16 {{.*}} fptoui + %r122 = fptoui <4 x double> undef to <4 x i8> + ; CHECK: cost of 16 {{.*}} fptosi + %r123 = fptosi <4 x double> undef to <4 x i8> + ; CHECK: cost of 16 {{.*}} fptoui + %r124 = fptoui <4 x double> undef to <4 x i16> + ; CHECK: cost of 16 {{.*}} fptosi + %r125 = fptosi <4 x double> undef to <4 x i16> + ; CHECK: cost of 16 {{.*}} fptoui + %r126 = fptoui <4 x double> undef to <4 x i32> + ; CHECK: cost of 16 {{.*}} fptosi + %r127 = fptosi <4 x double> undef to <4 x i32> + ; CHECK: cost of 48 {{.*}} fptoui + %r128 = fptoui <4 x double> undef to <4 x i64> + ; CHECK: cost of 48 {{.*}} fptosi + %r129 = fptosi <4 x double> undef to <4 x i64> + + ; CHECK: cost of 32 {{.*}} fptoui + %r130 = fptoui <8 x float> undef to <8 x i1> + ; CHECK: cost of 32 {{.*}} fptosi + %r131 = fptosi <8 x float> undef to <8 x i1> + ; CHECK: cost of 32 {{.*}} fptoui + %r132 = fptoui <8 x float> undef to <8 x i8> + ; CHECK: cost of 32 {{.*}} fptosi + %r133 = fptosi <8 x float> undef to <8 x i8> + ; CHECK: cost of 4 {{.*}} fptoui + %r134 = fptoui <8 x float> undef to <8 x i16> + ; CHECK: cost of 4 {{.*}} fptosi + %r135 = fptosi <8 x float> undef to <8 x i16> + ; CHECK: cost of 2 {{.*}} fptoui + %r136 = fptoui <8 x float> undef to <8 x i32> + ; CHECK: cost of 2 {{.*}} fptosi + %r137 = fptosi <8 x float> undef to <8 x i32> + ; CHECK: cost of 96 {{.*}} fptoui + %r138 = fptoui <8 x float> undef to <8 x i64> + ; CHECK: cost of 96 {{.*}} fptosi + %r139 = fptosi <8 x float> undef to <8 x i64> + + ; CHECK: cost of 32 {{.*}} fptoui + %r140 = fptoui <8 x double> undef to <8 x i1> + ; CHECK: cost of 32 {{.*}} fptosi + %r141 = fptosi <8 x double> undef to <8 x i1> + ; CHECK: cost of 32 {{.*}} fptoui + %r142 = fptoui <8 x double> undef to <8 x i8> + ; CHECK: cost of 32 {{.*}} fptosi + %r143 = fptosi <8 x double> undef to <8 x i8> + ; CHECK: cost of 32 {{.*}} fptoui + %r144 = fptoui <8 x double> undef to <8 x i16> + ; CHECK: cost of 32 {{.*}} fptosi + %r145 = fptosi <8 x double> undef to <8 x i16> + ; CHECK: cost of 32 {{.*}} fptoui + %r146 = fptoui <8 x double> undef to <8 x i32> + ; CHECK: cost of 32 {{.*}} fptosi + %r147 = fptosi <8 x double> undef to <8 x i32> + ; CHECK: cost of 96 {{.*}} fptoui + %r148 = fptoui <8 x double> undef to <8 x i64> + ; CHECK: cost of 96 {{.*}} fptosi + %r149 = fptosi <8 x double> undef to <8 x i64> + + ; CHECK: cost of 64 {{.*}} fptoui + %r150 = fptoui <16 x float> undef to <16 x i1> + ; CHECK: cost of 64 {{.*}} fptosi + %r151 = fptosi <16 x float> undef to <16 x i1> + ; CHECK: cost of 64 {{.*}} fptoui + %r152 = fptoui <16 x float> undef to <16 x i8> + ; CHECK: cost of 64 {{.*}} fptosi + %r153 = fptosi <16 x float> undef to <16 x i8> + ; CHECK: cost of 8 {{.*}} fptoui + %r154 = fptoui <16 x float> undef to <16 x i16> + ; CHECK: cost of 8 {{.*}} fptosi + %r155 = fptosi <16 x float> undef to <16 x i16> + ; CHECK: cost of 4 {{.*}} fptoui + %r156 = fptoui <16 x float> undef to <16 x i32> + ; CHECK: cost of 4 {{.*}} fptosi + %r157 = fptosi <16 x float> undef to <16 x i32> + ; CHECK: cost of 192 {{.*}} fptoui + %r158 = fptoui <16 x float> undef to <16 x i64> + ; CHECK: cost of 192 {{.*}} fptosi + %r159 = fptosi <16 x float> undef to <16 x i64> + + ; CHECK: cost of 64 {{.*}} fptoui + %r160 = fptoui <16 x double> undef to <16 x i1> + ; CHECK: cost of 64 {{.*}} fptosi + %r161 = fptosi <16 x double> undef to <16 x i1> + ; CHECK: cost of 64 {{.*}} fptoui + %r162 = fptoui <16 x double> undef to <16 x i8> + ; CHECK: cost of 64 {{.*}} fptosi + %r163 = fptosi <16 x double> undef to <16 x i8> + ; CHECK: cost of 64 {{.*}} fptoui + %r164 = fptoui <16 x double> undef to <16 x i16> + ; CHECK: cost of 64 {{.*}} fptosi + %r165 = fptosi <16 x double> undef to <16 x i16> + ; CHECK: cost of 64 {{.*}} fptoui + %r166 = fptoui <16 x double> undef to <16 x i32> + ; CHECK: cost of 64 {{.*}} fptosi + %r167 = fptosi <16 x double> undef to <16 x i32> + ; CHECK: cost of 192 {{.*}} fptoui + %r168 = fptoui <16 x double> undef to <16 x i64> + ; CHECK: cost of 192 {{.*}} fptosi + %r169 = fptosi <16 x double> undef to <16 x i64> + + ; CHECK: cost of 8 {{.*}} uitofp + %r170 = uitofp <2 x i1> undef to <2 x float> + ; CHECK: cost of 8 {{.*}} sitofp + %r171 = sitofp <2 x i1> undef to <2 x float> + ; CHECK: cost of 3 {{.*}} uitofp + %r172 = uitofp <2 x i8> undef to <2 x float> + ; CHECK: cost of 3 {{.*}} sitofp + %r173 = sitofp <2 x i8> undef to <2 x float> + ; CHECK: cost of 2 {{.*}} uitofp + %r174 = uitofp <2 x i16> undef to <2 x float> + ; CHECK: cost of 2 {{.*}} sitofp + %r175 = sitofp <2 x i16> undef to <2 x float> + ; CHECK: cost of 1 {{.*}} uitofp + %r176 = uitofp <2 x i32> undef to <2 x float> + ; CHECK: cost of 1 {{.*}} sitofp + %r177 = sitofp <2 x i32> undef to <2 x float> + ; CHECK: cost of 24 {{.*}} uitofp + %r178 = uitofp <2 x i64> undef to <2 x float> + ; CHECK: cost of 24 {{.*}} sitofp + %r179 = sitofp <2 x i64> undef to <2 x float> + + ; CHECK: cost of 8 {{.*}} uitofp + %r180 = uitofp <2 x i1> undef to <2 x double> + ; CHECK: cost of 8 {{.*}} sitofp + %r181 = sitofp <2 x i1> undef to <2 x double> + ; CHECK: cost of 4 {{.*}} uitofp + %r182 = uitofp <2 x i8> undef to <2 x double> + ; CHECK: cost of 4 {{.*}} sitofp + %r183 = sitofp <2 x i8> undef to <2 x double> + ; CHECK: cost of 3 {{.*}} uitofp + %r184 = uitofp <2 x i16> undef to <2 x double> + ; CHECK: cost of 3 {{.*}} sitofp + %r185 = sitofp <2 x i16> undef to <2 x double> + ; CHECK: cost of 2 {{.*}} uitofp + %r186 = uitofp <2 x i32> undef to <2 x double> + ; CHECK: cost of 2 {{.*}} sitofp + %r187 = sitofp <2 x i32> undef to <2 x double> + ; CHECK: cost of 24 {{.*}} uitofp + %r188 = uitofp <2 x i64> undef to <2 x double> + ; CHECK: cost of 24 {{.*}} sitofp + %r189 = sitofp <2 x i64> undef to <2 x double> + + ; CHECK: cost of 3 {{.*}} uitofp + %r190 = uitofp <4 x i1> undef to <4 x float> + ; CHECK: cost of 3 {{.*}} sitofp + %r191 = sitofp <4 x i1> undef to <4 x float> + ; CHECK: cost of 3 {{.*}} uitofp + %r192 = uitofp <4 x i8> undef to <4 x float> + ; CHECK: cost of 3 {{.*}} sitofp + %r193 = sitofp <4 x i8> undef to <4 x float> + ; CHECK: cost of 2 {{.*}} uitofp + %r194 = uitofp <4 x i16> undef to <4 x float> + ; CHECK: cost of 2 {{.*}} sitofp + %r195 = sitofp <4 x i16> undef to <4 x float> + ; CHECK: cost of 1 {{.*}} uitofp + %r196 = uitofp <4 x i32> undef to <4 x float> + ; CHECK: cost of 1 {{.*}} sitofp + %r197 = sitofp <4 x i32> undef to <4 x float> + ; CHECK: cost of 48 {{.*}} uitofp + %r198 = uitofp <4 x i64> undef to <4 x float> + ; CHECK: cost of 48 {{.*}} sitofp + %r199 = sitofp <4 x i64> undef to <4 x float> + + ; CHECK: cost of 16 {{.*}} uitofp + %r200 = uitofp <4 x i1> undef to <4 x double> + ; CHECK: cost of 16 {{.*}} sitofp + %r201 = sitofp <4 x i1> undef to <4 x double> + ; CHECK: cost of 16 {{.*}} uitofp + %r202 = uitofp <4 x i8> undef to <4 x double> + ; CHECK: cost of 16 {{.*}} sitofp + %r203 = sitofp <4 x i8> undef to <4 x double> + ; CHECK: cost of 16 {{.*}} uitofp + %r204 = uitofp <4 x i16> undef to <4 x double> + ; CHECK: cost of 16 {{.*}} sitofp + %r205 = sitofp <4 x i16> undef to <4 x double> + ; CHECK: cost of 16 {{.*}} uitofp + %r206 = uitofp <4 x i32> undef to <4 x double> + ; CHECK: cost of 16 {{.*}} sitofp + %r207 = sitofp <4 x i32> undef to <4 x double> + ; CHECK: cost of 48 {{.*}} uitofp + %r208 = uitofp <4 x i64> undef to <4 x double> + ; CHECK: cost of 48 {{.*}} sitofp + %r209 = sitofp <4 x i64> undef to <4 x double> + + ; CHECK: cost of 32 {{.*}} uitofp + %r210 = uitofp <8 x i1> undef to <8 x float> + ; CHECK: cost of 32 {{.*}} sitofp + %r211 = sitofp <8 x i1> undef to <8 x float> + ; CHECK: cost of 32 {{.*}} uitofp + %r212 = uitofp <8 x i8> undef to <8 x float> + ; CHECK: cost of 32 {{.*}} sitofp + %r213 = sitofp <8 x i8> undef to <8 x float> + ; CHECK: cost of 4 {{.*}} uitofp + %r214 = uitofp <8 x i16> undef to <8 x float> + ; CHECK: cost of 4 {{.*}} sitofp + %r215 = sitofp <8 x i16> undef to <8 x float> + ; CHECK: cost of 2 {{.*}} uitofp + %r216 = uitofp <8 x i32> undef to <8 x float> + ; CHECK: cost of 2 {{.*}} sitofp + %r217 = sitofp <8 x i32> undef to <8 x float> + ; CHECK: cost of 96 {{.*}} uitofp + %r218 = uitofp <8 x i64> undef to <8 x float> + ; CHECK: cost of 96 {{.*}} sitofp + %r219 = sitofp <8 x i64> undef to <8 x float> + + ; CHECK: cost of 32 {{.*}} uitofp + %r220 = uitofp <8 x i1> undef to <8 x double> + ; CHECK: cost of 32 {{.*}} sitofp + %r221 = sitofp <8 x i1> undef to <8 x double> + ; CHECK: cost of 32 {{.*}} uitofp + %r222 = uitofp <8 x i8> undef to <8 x double> + ; CHECK: cost of 32 {{.*}} sitofp + %r223 = sitofp <8 x i8> undef to <8 x double> + ; CHECK: cost of 32 {{.*}} uitofp + %r224 = uitofp <8 x i16> undef to <8 x double> + ; CHECK: cost of 32 {{.*}} sitofp + %r225 = sitofp <8 x i16> undef to <8 x double> + ; CHECK: cost of 32 {{.*}} uitofp + %r226 = uitofp <8 x i16> undef to <8 x double> + ; CHECK: cost of 32 {{.*}} sitofp + %r227 = sitofp <8 x i16> undef to <8 x double> + ; CHECK: cost of 96 {{.*}} uitofp + %r228 = uitofp <8 x i64> undef to <8 x double> + ; CHECK: cost of 96 {{.*}} sitofp + %r229 = sitofp <8 x i64> undef to <8 x double> + + ; CHECK: cost of 64 {{.*}} uitofp + %r230 = uitofp <16 x i1> undef to <16 x float> + ; CHECK: cost of 64 {{.*}} sitofp + %r231 = sitofp <16 x i1> undef to <16 x float> + ; CHECK: cost of 64 {{.*}} uitofp + %r232 = uitofp <16 x i8> undef to <16 x float> + ; CHECK: cost of 64 {{.*}} sitofp + %r233 = sitofp <16 x i8> undef to <16 x float> + ; CHECK: cost of 8 {{.*}} uitofp + %r234 = uitofp <16 x i16> undef to <16 x float> + ; CHECK: cost of 8 {{.*}} sitofp + %r235 = sitofp <16 x i16> undef to <16 x float> + ; CHECK: cost of 4 {{.*}} uitofp + %r236 = uitofp <16 x i32> undef to <16 x float> + ; CHECK: cost of 4 {{.*}} sitofp + %r237 = sitofp <16 x i32> undef to <16 x float> + ; CHECK: cost of 192 {{.*}} uitofp + %r238 = uitofp <16 x i64> undef to <16 x float> + ; CHECK: cost of 192 {{.*}} sitofp + %r239 = sitofp <16 x i64> undef to <16 x float> + + ; CHECK: cost of 64 {{.*}} uitofp + %r240 = uitofp <16 x i1> undef to <16 x double> + ; CHECK: cost of 64 {{.*}} sitofp + %r241 = sitofp <16 x i1> undef to <16 x double> + ; CHECK: cost of 64 {{.*}} uitofp + %r242 = uitofp <16 x i8> undef to <16 x double> + ; CHECK: cost of 64 {{.*}} sitofp + %r243 = sitofp <16 x i8> undef to <16 x double> + ; C4ECK: cost of 64 {{.*}} uitofp + %r244 = uitofp <16 x i16> undef to <16 x double> + ; CHECK: cost of 64 {{.*}} sitofp + %r245 = sitofp <16 x i16> undef to <16 x double> + ; CHECK: cost of 64 {{.*}} uitofp + %r246 = uitofp <16 x i16> undef to <16 x double> + ; CHECK: cost of 64 {{.*}} sitofp + %r247 = sitofp <16 x i16> undef to <16 x double> + ; CHECK: cost of 192 {{.*}} uitofp + %r248 = uitofp <16 x i64> undef to <16 x double> + ; CHECK: cost of 192 {{.*}} sitofp + %r249 = sitofp <16 x i64> undef to <16 x double> + + ;CHECK: cost of 0 {{.*}} ret + ret i32 undef +} + diff --git a/test/Analysis/CostModel/ARM/gep.ll b/test/Analysis/CostModel/ARM/gep.ll new file mode 100644 index 000000000000..a63b87d2ad11 --- /dev/null +++ b/test/Analysis/CostModel/ARM/gep.ll @@ -0,0 +1,43 @@ +; RUN: opt -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -mcpu=swift < %s | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios6.0.0" + +define void @test_geps() { + ; Cost of scalar integer geps should be one. We can't always expect it to be + ; folded into the instruction addressing mode. +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds i8* + %a0 = getelementptr inbounds i8* undef, i32 0 +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds i16* + %a1 = getelementptr inbounds i16* undef, i32 0 +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds i32* + %a2 = getelementptr inbounds i32* undef, i32 0 + +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds i64* + %a3 = getelementptr inbounds i64* undef, i32 0 + + ; Cost of scalar floating point geps should be one. We cannot fold the address + ; computation. +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds float* + %a4 = getelementptr inbounds float* undef, i32 0 +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds double* + %a5 = getelementptr inbounds double* undef, i32 0 + + + ; Cost of vector geps should be one. We cannot fold the address computation. +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds <4 x i8>* + %a7 = getelementptr inbounds <4 x i8>* undef, i32 0 +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds <4 x i16>* + %a8 = getelementptr inbounds <4 x i16>* undef, i32 0 +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds <4 x i32>* + %a9 = getelementptr inbounds <4 x i32>* undef, i32 0 +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds <4 x i64>* + %a10 = getelementptr inbounds <4 x i64>* undef, i32 0 +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds <4 x float>* + %a11 = getelementptr inbounds <4 x float>* undef, i32 0 +;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds <4 x double>* + %a12 = getelementptr inbounds <4 x double>* undef, i32 0 + + + ret void +} diff --git a/test/Analysis/CostModel/ARM/insertelement.ll b/test/Analysis/CostModel/ARM/insertelement.ll new file mode 100644 index 000000000000..f951b08f9baa --- /dev/null +++ b/test/Analysis/CostModel/ARM/insertelement.ll @@ -0,0 +1,46 @@ +; RUN: opt -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -mcpu=swift < %s | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios6.0.0" + +; Multiple insert elements from loads into d subregisters are expensive on swift +; due to renaming constraints. +%T_i8v = type <8 x i8> +%T_i8 = type i8 +; CHECK: insertelement_i8 +define void @insertelement_i8(%T_i8* %saddr, + %T_i8v* %vaddr) { + %v0 = load %T_i8v* %vaddr + %v1 = load %T_i8* %saddr +;CHECK: estimated cost of 3 for {{.*}} insertelement <8 x i8> + %v2 = insertelement %T_i8v %v0, %T_i8 %v1, i32 1 + store %T_i8v %v2, %T_i8v* %vaddr + ret void +} + + +%T_i16v = type <4 x i16> +%T_i16 = type i16 +; CHECK: insertelement_i16 +define void @insertelement_i16(%T_i16* %saddr, + %T_i16v* %vaddr) { + %v0 = load %T_i16v* %vaddr + %v1 = load %T_i16* %saddr +;CHECK: estimated cost of 3 for {{.*}} insertelement <4 x i16> + %v2 = insertelement %T_i16v %v0, %T_i16 %v1, i32 1 + store %T_i16v %v2, %T_i16v* %vaddr + ret void +} + +%T_i32v = type <2 x i32> +%T_i32 = type i32 +; CHECK: insertelement_i32 +define void @insertelement_i32(%T_i32* %saddr, + %T_i32v* %vaddr) { + %v0 = load %T_i32v* %vaddr + %v1 = load %T_i32* %saddr +;CHECK: estimated cost of 3 for {{.*}} insertelement <2 x i32> + %v2 = insertelement %T_i32v %v0, %T_i32 %v1, i32 1 + store %T_i32v %v2, %T_i32v* %vaddr + ret void +} diff --git a/test/CodeGen/CellSPU/lit.local.cfg b/test/Analysis/CostModel/ARM/lit.local.cfg index ea00867701b2..cb77b09ef4ad 100644 --- a/test/CodeGen/CellSPU/lit.local.cfg +++ b/test/Analysis/CostModel/ARM/lit.local.cfg @@ -1,6 +1,6 @@ config.suffixes = ['.ll', '.c', '.cpp'] targets = set(config.root.targets_to_build.split()) -if not 'CellSPU' in targets: +if not 'ARM' in targets: config.unsupported = True diff --git a/test/Analysis/CostModel/ARM/select.ll b/test/Analysis/CostModel/ARM/select.ll new file mode 100644 index 000000000000..34ed1eefdaf4 --- /dev/null +++ b/test/Analysis/CostModel/ARM/select.ll @@ -0,0 +1,67 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -mcpu=swift | FileCheck %s +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios6.0.0" + +; CHECK: casts +define void @casts() { + ; Scalar values + ; CHECK: cost of 1 {{.*}} select + %v1 = select i1 undef, i8 undef, i8 undef + ; CHECK: cost of 1 {{.*}} select + %v2 = select i1 undef, i16 undef, i16 undef + ; CHECK: cost of 1 {{.*}} select + %v3 = select i1 undef, i32 undef, i32 undef + ; CHECK: cost of 2 {{.*}} select + %v4 = select i1 undef, i64 undef, i64 undef + ; CHECK: cost of 1 {{.*}} select + %v5 = select i1 undef, float undef, float undef + ; CHECK: cost of 1 {{.*}} select + %v6 = select i1 undef, double undef, double undef + + ; Vector values + ; CHECK: cost of 1 {{.*}} select + %v7 = select <2 x i1> undef, <2 x i8> undef, <2 x i8> undef + ; CHECK: cost of 1 {{.*}} select + %v8 = select <4 x i1> undef, <4 x i8> undef, <4 x i8> undef + ; CHECK: cost of 1 {{.*}} select + %v9 = select <8 x i1> undef, <8 x i8> undef, <8 x i8> undef + ; CHECK: cost of 1 {{.*}} select + %v10 = select <16 x i1> undef, <16 x i8> undef, <16 x i8> undef + + ; CHECK: cost of 1 {{.*}} select + %v11 = select <2 x i1> undef, <2 x i16> undef, <2 x i16> undef + ; CHECK: cost of 1 {{.*}} select + %v12 = select <4 x i1> undef, <4 x i16> undef, <4 x i16> undef + ; CHECK: cost of 1 {{.*}} select + %v13 = select <8 x i1> undef, <8 x i16> undef, <8 x i16> undef + ; CHECK: cost of 40 {{.*}} select + %v13b = select <16 x i1> undef, <16 x i16> undef, <16 x i16> undef + + ; CHECK: cost of 1 {{.*}} select + %v14 = select <2 x i1> undef, <2 x i32> undef, <2 x i32> undef + ; CHECK: cost of 1 {{.*}} select + %v15 = select <4 x i1> undef, <4 x i32> undef, <4 x i32> undef + ; CHECK: cost of 41 {{.*}} select + %v15b = select <8 x i1> undef, <8 x i32> undef, <8 x i32> undef + ; CHECK: cost of 82 {{.*}} select + %v15c = select <16 x i1> undef, <16 x i32> undef, <16 x i32> undef + + ; CHECK: cost of 1 {{.*}} select + %v16 = select <2 x i1> undef, <2 x i64> undef, <2 x i64> undef + ; CHECK: cost of 19 {{.*}} select + %v16a = select <4 x i1> undef, <4 x i64> undef, <4 x i64> undef + ; CHECK: cost of 50 {{.*}} select + %v16b = select <8 x i1> undef, <8 x i64> undef, <8 x i64> undef + ; CHECK: cost of 100 {{.*}} select + %v16c = select <16 x i1> undef, <16 x i64> undef, <16 x i64> undef + + ; CHECK: cost of 1 {{.*}} select + %v17 = select <2 x i1> undef, <2 x float> undef, <2 x float> undef + ; CHECK: cost of 1 {{.*}} select + %v18 = select <4 x i1> undef, <4 x float> undef, <4 x float> undef + + ; CHECK: cost of 1 {{.*}} select + %v19 = select <2 x i1> undef, <2 x double> undef, <2 x double> undef + + ret void +} diff --git a/test/Analysis/CostModel/ARM/shuffle.ll b/test/Analysis/CostModel/ARM/shuffle.ll new file mode 100644 index 000000000000..c92d66880464 --- /dev/null +++ b/test/Analysis/CostModel/ARM/shuffle.ll @@ -0,0 +1,40 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -mcpu=swift | FileCheck %s +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios6.0.0" + +; CHECK: shuffle +define void @shuffle() { + + + ;; Reverse shuffles should be lowered to vrev and possibly a vext (for + ;; quadwords) + + ; Vector values + ; CHECK: cost of 1 {{.*}} shuffle + %v7 = shufflevector <2 x i8> undef, <2 x i8>undef, <2 x i32> <i32 1, i32 0> + ; CHECK: cost of 1 {{.*}} shuffle + %v8 = shufflevector <4 x i8> undef, <4 x i8>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + ; CHECK: cost of 1 {{.*}} shuffle + %v9 = shufflevector <8 x i8> undef, <8 x i8>undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + ; CHECK: cost of 2 {{.*}} shuffle + %v10 = shufflevector <16 x i8> undef, <16 x i8>undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + + ; CHECK: cost of 1 {{.*}} shuffle + %v11 = shufflevector <2 x i16> undef, <2 x i16>undef, <2 x i32> <i32 1, i32 0> + ; CHECK: cost of 1 {{.*}} shuffle + %v12 = shufflevector <4 x i16> undef, <4 x i16>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + ; CHECK: cost of 2 {{.*}} shuffle + %v13 = shufflevector <8 x i16> undef, <8 x i16>undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + + ; CHECK: cost of 1 {{.*}} shuffle + %v14 = shufflevector <2 x i32> undef, <2 x i32>undef, <2 x i32> <i32 1, i32 0> + ; CHECK: cost of 2 {{.*}} shuffle + %v15 = shufflevector <4 x i32> undef, <4 x i32>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + + ; CHECK: cost of 1 {{.*}} shuffle + %v16 = shufflevector <2 x float> undef, <2 x float>undef, <2 x i32> <i32 1, i32 0> + ; CHECK: cost of 2 {{.*}} shuffle + %v17 = shufflevector <4 x float> undef, <4 x float>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + + ret void +} diff --git a/test/Analysis/CostModel/PowerPC/insert_extract.ll b/test/Analysis/CostModel/PowerPC/insert_extract.ll new file mode 100644 index 000000000000..f51963d56fde --- /dev/null +++ b/test/Analysis/CostModel/PowerPC/insert_extract.ll @@ -0,0 +1,16 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i32 @insert(i32 %arg) { + ; CHECK: cost of 13 {{.*}} insertelement + %x = insertelement <4 x i32> undef, i32 %arg, i32 0 + ret i32 undef +} + +define i32 @extract(<4 x i32> %arg) { + ; CHECK: cost of 13 {{.*}} extractelement + %x = extractelement <4 x i32> %arg, i32 0 + ret i32 %x +} + diff --git a/test/Analysis/CostModel/PowerPC/lit.local.cfg b/test/Analysis/CostModel/PowerPC/lit.local.cfg new file mode 100644 index 000000000000..4019eca0bb88 --- /dev/null +++ b/test/Analysis/CostModel/PowerPC/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.ll', '.c', '.cpp'] + +targets = set(config.root.targets_to_build.split()) +if not 'PowerPC' in targets: + config.unsupported = True + diff --git a/test/Analysis/CostModel/PowerPC/load_store.ll b/test/Analysis/CostModel/PowerPC/load_store.ll new file mode 100644 index 000000000000..c77cce955abf --- /dev/null +++ b/test/Analysis/CostModel/PowerPC/load_store.ll @@ -0,0 +1,34 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i32 @stores(i32 %arg) { + + ; CHECK: cost of 1 {{.*}} store + store i8 undef, i8* undef, align 4 + ; CHECK: cost of 1 {{.*}} store + store i16 undef, i16* undef, align 4 + ; CHECK: cost of 1 {{.*}} store + store i32 undef, i32* undef, align 4 + ; CHECK: cost of 2 {{.*}} store + store i64 undef, i64* undef, align 4 + ; CHECK: cost of 4 {{.*}} store + store i128 undef, i128* undef, align 4 + + ret i32 undef +} +define i32 @loads(i32 %arg) { + ; CHECK: cost of 1 {{.*}} load + load i8* undef, align 4 + ; CHECK: cost of 1 {{.*}} load + load i16* undef, align 4 + ; CHECK: cost of 1 {{.*}} load + load i32* undef, align 4 + ; CHECK: cost of 2 {{.*}} load + load i64* undef, align 4 + ; CHECK: cost of 4 {{.*}} load + load i128* undef, align 4 + + ret i32 undef +} + diff --git a/test/Analysis/CostModel/X86/arith.ll b/test/Analysis/CostModel/X86/arith.ll index 37cca8d54067..85b442533f41 100644 --- a/test/Analysis/CostModel/X86/arith.ll +++ b/test/Analysis/CostModel/X86/arith.ll @@ -1,4 +1,6 @@ ; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s +; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core2 | FileCheck %s --check-prefix=SSE3 +; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core-avx2 | FileCheck %s --check-prefix=AVX2 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" @@ -14,7 +16,7 @@ define i32 @add(i32 %arg) { %D = add <4 x i64> undef, undef ;CHECK: cost of 8 {{.*}} add %E = add <8 x i64> undef, undef - ;CHECK: cost of 1 {{.*}} ret + ;CHECK: cost of 0 {{.*}} ret ret i32 undef } @@ -28,11 +30,41 @@ define i32 @xor(i32 %arg) { %C = xor <2 x i64> undef, undef ;CHECK: cost of 1 {{.*}} xor %D = xor <4 x i64> undef, undef - ;CHECK: cost of 1 {{.*}} ret + ;CHECK: cost of 0 {{.*}} ret ret i32 undef } +; CHECK: mul +define void @mul() { + ; A <2 x i32> gets expanded to a <2 x i64> vector. + ; A <2 x i64> vector multiply is implemented using + ; 3 PMULUDQ and 2 PADDS and 4 shifts. + ;CHECK: cost of 9 {{.*}} mul + %A0 = mul <2 x i32> undef, undef + ;CHECK: cost of 9 {{.*}} mul + %A1 = mul <2 x i64> undef, undef + ;CHECK: cost of 18 {{.*}} mul + %A2 = mul <4 x i64> undef, undef + ret void +} + +; SSE3: sse3mull +define void @sse3mull() { + ; SSE3: cost of 6 {{.*}} mul + %A0 = mul <4 x i32> undef, undef + ret void + ; SSE3: avx2mull +} + +; AVX2: avx2mull +define void @avx2mull() { + ; AVX2: cost of 9 {{.*}} mul + %A0 = mul <4 x i64> undef, undef + ret void + ; AVX2: fmul +} +; CHECK: fmul define i32 @fmul(i32 %arg) { ;CHECK: cost of 1 {{.*}} fmul %A = fmul <4 x float> undef, undef @@ -40,3 +72,57 @@ define i32 @fmul(i32 %arg) { %B = fmul <8 x float> undef, undef ret i32 undef } + +; AVX: shift +; AVX2: shift +define void @shift() { + ; AVX: cost of 2 {{.*}} shl + ; AVX2: cost of 1 {{.*}} shl + %A0 = shl <4 x i32> undef, undef + ; AVX: cost of 2 {{.*}} shl + ; AVX2: cost of 1 {{.*}} shl + %A1 = shl <2 x i64> undef, undef + + ; AVX: cost of 2 {{.*}} lshr + ; AVX2: cost of 1 {{.*}} lshr + %B0 = lshr <4 x i32> undef, undef + ; AVX: cost of 2 {{.*}} lshr + ; AVX2: cost of 1 {{.*}} lshr + %B1 = lshr <2 x i64> undef, undef + + ; AVX: cost of 2 {{.*}} ashr + ; AVX2: cost of 1 {{.*}} ashr + %C0 = ashr <4 x i32> undef, undef + ; AVX: cost of 6 {{.*}} ashr + ; AVX2: cost of 20 {{.*}} ashr + %C1 = ashr <2 x i64> undef, undef + + ret void +} + +; AVX: avx2shift +; AVX2: avx2shift +define void @avx2shift() { + ; AVX: cost of 2 {{.*}} shl + ; AVX2: cost of 1 {{.*}} shl + %A0 = shl <8 x i32> undef, undef + ; AVX: cost of 2 {{.*}} shl + ; AVX2: cost of 1 {{.*}} shl + %A1 = shl <4 x i64> undef, undef + + ; AVX: cost of 2 {{.*}} lshr + ; AVX2: cost of 1 {{.*}} lshr + %B0 = lshr <8 x i32> undef, undef + ; AVX: cost of 2 {{.*}} lshr + ; AVX2: cost of 1 {{.*}} lshr + %B1 = lshr <4 x i64> undef, undef + + ; AVX: cost of 2 {{.*}} ashr + ; AVX2: cost of 1 {{.*}} ashr + %C0 = ashr <8 x i32> undef, undef + ; AVX: cost of 12 {{.*}} ashr + ; AVX2: cost of 40 {{.*}} ashr + %C1 = ashr <4 x i64> undef, undef + + ret void +} diff --git a/test/Analysis/CostModel/X86/cast.ll b/test/Analysis/CostModel/X86/cast.ll index 75c97a781e7f..b69b3bf6304c 100644 --- a/test/Analysis/CostModel/X86/cast.ll +++ b/test/Analysis/CostModel/X86/cast.ll @@ -28,7 +28,7 @@ define i32 @add(i32 %arg) { ;CHECK: cost of 0 {{.*}} trunc %H = trunc i32 undef to i1 - ;CHECK: cost of 1 {{.*}} ret + ;CHECK: cost of 0 {{.*}} ret ret i32 undef } @@ -44,6 +44,10 @@ define i32 @zext_sext(<8 x i1> %in) { %B = zext <8 x i16> undef to <8 x i32> ;CHECK: cost of 1 {{.*}} sext %C = sext <4 x i32> undef to <4 x i64> + ;CHECK: cost of 6 {{.*}} sext + %C1 = sext <4 x i8> undef to <4 x i64> + ;CHECK: cost of 6 {{.*}} sext + %C2 = sext <4 x i16> undef to <4 x i64> ;CHECK: cost of 1 {{.*}} zext %D = zext <4 x i32> undef to <4 x i64> @@ -59,7 +63,7 @@ define i32 @zext_sext(<8 x i1> %in) { ret i32 undef } -define i32 @masks(<8 x i1> %in) { +define i32 @masks8(<8 x i1> %in) { ;CHECK: cost of 6 {{.*}} zext %Z = zext <8 x i1> %in to <8 x i32> ;CHECK: cost of 9 {{.*}} sext @@ -67,3 +71,84 @@ define i32 @masks(<8 x i1> %in) { ret i32 undef } +define i32 @masks4(<4 x i1> %in) { + ;CHECK: cost of 8 {{.*}} sext + %S = sext <4 x i1> %in to <4 x i64> + ret i32 undef +} + +define void @sitofp4(<4 x i1> %a, <4 x i8> %b, <4 x i16> %c, <4 x i32> %d) { + ; CHECK: cost of 3 {{.*}} sitofp + %A1 = sitofp <4 x i1> %a to <4 x float> + ; CHECK: cost of 3 {{.*}} sitofp + %A2 = sitofp <4 x i1> %a to <4 x double> + + ; CHECK: cost of 3 {{.*}} sitofp + %B1 = sitofp <4 x i8> %b to <4 x float> + ; CHECK: cost of 3 {{.*}} sitofp + %B2 = sitofp <4 x i8> %b to <4 x double> + + ; CHECK: cost of 3 {{.*}} sitofp + %C1 = sitofp <4 x i16> %c to <4 x float> + ; CHECK: cost of 3 {{.*}} sitofp + %C2 = sitofp <4 x i16> %c to <4 x double> + + ; CHECK: cost of 1 {{.*}} sitofp + %D1 = sitofp <4 x i32> %d to <4 x float> + ; CHECK: cost of 1 {{.*}} sitofp + %D2 = sitofp <4 x i32> %d to <4 x double> + ret void +} + +define void @sitofp8(<8 x i1> %a, <8 x i8> %b, <8 x i16> %c, <8 x i32> %d) { + ; CHECK: cost of 8 {{.*}} sitofp + %A1 = sitofp <8 x i1> %a to <8 x float> + + ; CHECK: cost of 8 {{.*}} sitofp + %B1 = sitofp <8 x i8> %b to <8 x float> + + ; CHECK: cost of 5 {{.*}} sitofp + %C1 = sitofp <8 x i16> %c to <8 x float> + + ; CHECK: cost of 1 {{.*}} sitofp + %D1 = sitofp <8 x i32> %d to <8 x float> + ret void +} + +define void @uitofp4(<4 x i1> %a, <4 x i8> %b, <4 x i16> %c, <4 x i32> %d) { + ; CHECK: cost of 7 {{.*}} uitofp + %A1 = uitofp <4 x i1> %a to <4 x float> + ; CHECK: cost of 7 {{.*}} uitofp + %A2 = uitofp <4 x i1> %a to <4 x double> + + ; CHECK: cost of 2 {{.*}} uitofp + %B1 = uitofp <4 x i8> %b to <4 x float> + ; CHECK: cost of 2 {{.*}} uitofp + %B2 = uitofp <4 x i8> %b to <4 x double> + + ; CHECK: cost of 2 {{.*}} uitofp + %C1 = uitofp <4 x i16> %c to <4 x float> + ; CHECK: cost of 2 {{.*}} uitofp + %C2 = uitofp <4 x i16> %c to <4 x double> + + ; CHECK: cost of 6 {{.*}} uitofp + %D1 = uitofp <4 x i32> %d to <4 x float> + ; CHECK: cost of 6 {{.*}} uitofp + %D2 = uitofp <4 x i32> %d to <4 x double> + ret void +} + +define void @uitofp8(<8 x i1> %a, <8 x i8> %b, <8 x i16> %c, <8 x i32> %d) { + ; CHECK: cost of 6 {{.*}} uitofp + %A1 = uitofp <8 x i1> %a to <8 x float> + + ; CHECK: cost of 5 {{.*}} uitofp + %B1 = uitofp <8 x i8> %b to <8 x float> + + ; CHECK: cost of 5 {{.*}} uitofp + %C1 = uitofp <8 x i16> %c to <8 x float> + + ; CHECK: cost of 9 {{.*}} uitofp + %D1 = uitofp <8 x i32> %d to <8 x float> + ret void +} diff --git a/test/Analysis/CostModel/X86/cmp.ll b/test/Analysis/CostModel/X86/cmp.ll index f868bd18b54f..713b3742e920 100644 --- a/test/Analysis/CostModel/X86/cmp.ll +++ b/test/Analysis/CostModel/X86/cmp.ll @@ -1,41 +1,55 @@ -; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s +; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck --check-prefix=AVX1 %s +; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core-avx2 | FileCheck --check-prefix=AVX2 %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" define i32 @cmp(i32 %arg) { ; -- floats -- - ;CHECK: cost of 1 {{.*}} fcmp + ;AVX1: cost of 1 {{.*}} fcmp + ;AVX2: cost of 1 {{.*}} fcmp %A = fcmp olt <2 x float> undef, undef - ;CHECK: cost of 1 {{.*}} fcmp + ;AVX1: cost of 1 {{.*}} fcmp + ;AVX2: cost of 1 {{.*}} fcmp %B = fcmp olt <4 x float> undef, undef - ;CHECK: cost of 1 {{.*}} fcmp + ;AVX1: cost of 1 {{.*}} fcmp + ;AVX2: cost of 1 {{.*}} fcmp %C = fcmp olt <8 x float> undef, undef - ;CHECK: cost of 1 {{.*}} fcmp + ;AVX1: cost of 1 {{.*}} fcmp + ;AVX2: cost of 1 {{.*}} fcmp %D = fcmp olt <2 x double> undef, undef - ;CHECK: cost of 1 {{.*}} fcmp + ;AVX1: cost of 1 {{.*}} fcmp + ;AVX2: cost of 1 {{.*}} fcmp %E = fcmp olt <4 x double> undef, undef ; -- integers -- - ;CHECK: cost of 1 {{.*}} icmp + ;AVX1: cost of 1 {{.*}} icmp + ;AVX2: cost of 1 {{.*}} icmp %F = icmp eq <16 x i8> undef, undef - ;CHECK: cost of 1 {{.*}} icmp + ;AVX1: cost of 1 {{.*}} icmp + ;AVX2: cost of 1 {{.*}} icmp %G = icmp eq <8 x i16> undef, undef - ;CHECK: cost of 1 {{.*}} icmp + ;AVX1: cost of 1 {{.*}} icmp + ;AVX2: cost of 1 {{.*}} icmp %H = icmp eq <4 x i32> undef, undef - ;CHECK: cost of 1 {{.*}} icmp + ;AVX1: cost of 1 {{.*}} icmp + ;AVX2: cost of 1 {{.*}} icmp %I = icmp eq <2 x i64> undef, undef - ;CHECK: cost of 4 {{.*}} icmp + ;AVX1: cost of 4 {{.*}} icmp + ;AVX2: cost of 1 {{.*}} icmp %J = icmp eq <4 x i64> undef, undef - ;CHECK: cost of 4 {{.*}} icmp + ;AVX1: cost of 4 {{.*}} icmp + ;AVX2: cost of 1 {{.*}} icmp %K = icmp eq <8 x i32> undef, undef - ;CHECK: cost of 4 {{.*}} icmp + ;AVX1: cost of 4 {{.*}} icmp + ;AVX2: cost of 1 {{.*}} icmp %L = icmp eq <16 x i16> undef, undef - ;CHECK: cost of 4 {{.*}} icmp + ;AVX1: cost of 4 {{.*}} icmp + ;AVX2: cost of 1 {{.*}} icmp %M = icmp eq <32 x i8> undef, undef - ;CHECK: cost of 1 {{.*}} ret + ;CHECK: cost of 0 {{.*}} ret ret i32 undef } diff --git a/test/Analysis/CostModel/X86/gep.ll b/test/Analysis/CostModel/X86/gep.ll new file mode 100644 index 000000000000..877184a3eaa8 --- /dev/null +++ b/test/Analysis/CostModel/X86/gep.ll @@ -0,0 +1,40 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + + +define void @test_geps() { + ; Cost of should be zero. We expect it to be folded into + ; the instruction addressing mode. +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds i8* + %a0 = getelementptr inbounds i8* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds i16* + %a1 = getelementptr inbounds i16* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds i32* + %a2 = getelementptr inbounds i32* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds i64* + %a3 = getelementptr inbounds i64* undef, i32 0 + +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds float* + %a4 = getelementptr inbounds float* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds double* + %a5 = getelementptr inbounds double* undef, i32 0 + + ; Vector geps should also have zero cost. +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds <4 x i8>* + %a7 = getelementptr inbounds <4 x i8>* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds <4 x i16>* + %a8 = getelementptr inbounds <4 x i16>* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds <4 x i32>* + %a9 = getelementptr inbounds <4 x i32>* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds <4 x i64>* + %a10 = getelementptr inbounds <4 x i64>* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds <4 x float>* + %a11 = getelementptr inbounds <4 x float>* undef, i32 0 +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds <4 x double>* + %a12 = getelementptr inbounds <4 x double>* undef, i32 0 + + + ret void +} diff --git a/test/Analysis/CostModel/X86/i32.ll b/test/Analysis/CostModel/X86/i32.ll index 4015e0b1eef4..c2dce762a091 100644 --- a/test/Analysis/CostModel/X86/i32.ll +++ b/test/Analysis/CostModel/X86/i32.ll @@ -1,8 +1,6 @@ ; RUN: opt < %s -cost-model -analyze -mtriple=i386 -mcpu=corei7-avx | FileCheck %s - -;CHECK: cost of 2 {{.*}} add -;CHECK: cost of 1 {{.*}} ret +;CHECK: cost of 0 {{.*}} ret define i32 @no_info(i32 %arg) { %e = add i64 undef, undef ret i32 undef diff --git a/test/Analysis/CostModel/X86/intrinsic-cost.ll b/test/Analysis/CostModel/X86/intrinsic-cost.ll new file mode 100644 index 000000000000..e235a36222a7 --- /dev/null +++ b/test/Analysis/CostModel/X86/intrinsic-cost.ll @@ -0,0 +1,32 @@ +; RUN: opt -S -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck %s -check-prefix=CORE2 +; RUN: opt -S -mtriple=x86_64-apple-darwin -mcpu=corei7 -cost-model -analyze < %s | FileCheck %s -check-prefix=COREI7 + +; If SSE4.1 roundps instruction is available it is cheap to lower, otherwise +; it'll be scalarized into calls which are expensive. +define void @test1(float* nocapture %f) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds float* %f, i64 %index + %1 = bitcast float* %0 to <4 x float>* + %wide.load = load <4 x float>* %1, align 4 + %2 = call <4 x float> @llvm.ceil.v4f32(<4 x float> %wide.load) + store <4 x float> %2, <4 x float>* %1, align 4 + %index.next = add i64 %index, 4 + %3 = icmp eq i64 %index.next, 1024 + br i1 %3, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; CORE2: Printing analysis 'Cost Model Analysis' for function 'test1': +; CORE2: Cost Model: Found an estimated cost of 400 for instruction: %2 = call <4 x float> @llvm.ceil.v4f32(<4 x float> %wide.load) + +; COREI7: Printing analysis 'Cost Model Analysis' for function 'test1': +; COREI7: Cost Model: Found an estimated cost of 1 for instruction: %2 = call <4 x float> @llvm.ceil.v4f32(<4 x float> %wide.load) + +} + +declare <4 x float> @llvm.ceil.v4f32(<4 x float>) nounwind readnone diff --git a/test/Analysis/CostModel/X86/load_store.ll b/test/Analysis/CostModel/X86/load_store.ll new file mode 100644 index 000000000000..4195b1d879a1 --- /dev/null +++ b/test/Analysis/CostModel/X86/load_store.ll @@ -0,0 +1,64 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +define i32 @stores(i32 %arg) { + + ;CHECK: cost of 1 {{.*}} store + store i8 undef, i8* undef, align 4 + ;CHECK: cost of 1 {{.*}} store + store i16 undef, i16* undef, align 4 + ;CHECK: cost of 1 {{.*}} store + store i32 undef, i32* undef, align 4 + ;CHECK: cost of 1 {{.*}} store + store i64 undef, i64* undef, align 4 + ;CHECK: cost of 2 {{.*}} store + store i128 undef, i128* undef, align 4 + + ;CHECK: cost of 1 {{.*}} store + store <4 x i16> undef, <4 x i16>* undef, align 4 + ;CHECK: cost of 1 {{.*}} store + store <4 x i32> undef, <4 x i32>* undef, align 4 + ;CHECK: cost of 2 {{.*}} store + store <4 x i64> undef, <4 x i64>* undef, align 4 + + ;CHECK: cost of 1 {{.*}} store + store <8 x i16> undef, <8 x i16>* undef, align 4 + ;CHECK: cost of 2 {{.*}} store + store <8 x i32> undef, <8 x i32>* undef, align 4 + ;CHECK: cost of 4 {{.*}} store + store <8 x i64> undef, <8 x i64>* undef, align 4 + + ret i32 undef +} +define i32 @loads(i32 %arg) { + ;CHECK: cost of 1 {{.*}} load + load i8* undef, align 4 + ;CHECK: cost of 1 {{.*}} load + load i16* undef, align 4 + ;CHECK: cost of 1 {{.*}} load + load i32* undef, align 4 + ;CHECK: cost of 1 {{.*}} load + load i64* undef, align 4 + ;CHECK: cost of 2 {{.*}} load + load i128* undef, align 4 + + ;CHECK: cost of 1 {{.*}} load + load <2 x i32>* undef, align 4 + ;CHECK: cost of 1 {{.*}} load + load <4 x i32>* undef, align 4 + ;CHECK: cost of 2 {{.*}} load + load <8 x i32>* undef, align 4 + + + ;CHECK: cost of 1 {{.*}} load + load <2 x i64>* undef, align 4 + ;CHECK: cost of 2 {{.*}} load + load <4 x i64>* undef, align 4 + ;CHECK: cost of 4 {{.*}} load + load <8 x i64>* undef, align 4 + + ret i32 undef +} + diff --git a/test/Analysis/CostModel/X86/testshiftashr.ll b/test/Analysis/CostModel/X86/testshiftashr.ll new file mode 100644 index 000000000000..f35eea87164c --- /dev/null +++ b/test/Analysis/CostModel/X86/testshiftashr.ll @@ -0,0 +1,531 @@ +; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=core2 < %s | FileCheck --check-prefix=SSE2-CODEGEN %s +; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s + +%shifttype = type <2 x i16> +define %shifttype @shift2i16(%shifttype %a, %shifttype %b) { +entry: + ; SSE2: shift2i16 + ; SSE2: cost of 20 {{.*}} ashr + ; SSE2-CODEGEN: shift2i16 + ; SSE2-CODEGEN: sarq %cl + + %0 = ashr %shifttype %a , %b + ret %shifttype %0 +} + +%shifttype4i16 = type <4 x i16> +define %shifttype4i16 @shift4i16(%shifttype4i16 %a, %shifttype4i16 %b) { +entry: + ; SSE2: shift4i16 + ; SSE2: cost of 40 {{.*}} ashr + ; SSE2-CODEGEN: shift4i16 + ; SSE2-CODEGEN: sarl %cl + + %0 = ashr %shifttype4i16 %a , %b + ret %shifttype4i16 %0 +} + +%shifttype8i16 = type <8 x i16> +define %shifttype8i16 @shift8i16(%shifttype8i16 %a, %shifttype8i16 %b) { +entry: + ; SSE2: shift8i16 + ; SSE2: cost of 80 {{.*}} ashr + ; SSE2-CODEGEN: shift8i16 + ; SSE2-CODEGEN: sarw %cl + + %0 = ashr %shifttype8i16 %a , %b + ret %shifttype8i16 %0 +} + +%shifttype16i16 = type <16 x i16> +define %shifttype16i16 @shift16i16(%shifttype16i16 %a, %shifttype16i16 %b) { +entry: + ; SSE2: shift16i16 + ; SSE2: cost of 160 {{.*}} ashr + ; SSE2-CODEGEN: shift16i16 + ; SSE2-CODEGEN: sarw %cl + + %0 = ashr %shifttype16i16 %a , %b + ret %shifttype16i16 %0 +} + +%shifttype32i16 = type <32 x i16> +define %shifttype32i16 @shift32i16(%shifttype32i16 %a, %shifttype32i16 %b) { +entry: + ; SSE2: shift32i16 + ; SSE2: cost of 320 {{.*}} ashr + ; SSE2-CODEGEN: shift32i16 + ; SSE2-CODEGEN: sarw %cl + + %0 = ashr %shifttype32i16 %a , %b + ret %shifttype32i16 %0 +} + +%shifttype2i32 = type <2 x i32> +define %shifttype2i32 @shift2i32(%shifttype2i32 %a, %shifttype2i32 %b) { +entry: + ; SSE2: shift2i32 + ; SSE2: cost of 20 {{.*}} ashr + ; SSE2-CODEGEN: shift2i32 + ; SSE2-CODEGEN: sarq %cl + + %0 = ashr %shifttype2i32 %a , %b + ret %shifttype2i32 %0 +} + +%shifttype4i32 = type <4 x i32> +define %shifttype4i32 @shift4i32(%shifttype4i32 %a, %shifttype4i32 %b) { +entry: + ; SSE2: shift4i32 + ; SSE2: cost of 40 {{.*}} ashr + ; SSE2-CODEGEN: shift4i32 + ; SSE2-CODEGEN: sarl %cl + + %0 = ashr %shifttype4i32 %a , %b + ret %shifttype4i32 %0 +} + +%shifttype8i32 = type <8 x i32> +define %shifttype8i32 @shift8i32(%shifttype8i32 %a, %shifttype8i32 %b) { +entry: + ; SSE2: shift8i32 + ; SSE2: cost of 80 {{.*}} ashr + ; SSE2-CODEGEN: shift8i32 + ; SSE2-CODEGEN: sarl %cl + + %0 = ashr %shifttype8i32 %a , %b + ret %shifttype8i32 %0 +} + +%shifttype16i32 = type <16 x i32> +define %shifttype16i32 @shift16i32(%shifttype16i32 %a, %shifttype16i32 %b) { +entry: + ; SSE2: shift16i32 + ; SSE2: cost of 160 {{.*}} ashr + ; SSE2-CODEGEN: shift16i32 + ; SSE2-CODEGEN: sarl %cl + + %0 = ashr %shifttype16i32 %a , %b + ret %shifttype16i32 %0 +} + +%shifttype32i32 = type <32 x i32> +define %shifttype32i32 @shift32i32(%shifttype32i32 %a, %shifttype32i32 %b) { +entry: + ; SSE2: shift32i32 + ; SSE2: cost of 256 {{.*}} ashr + ; SSE2-CODEGEN: shift32i32 + ; SSE2-CODEGEN: sarl %cl + + %0 = ashr %shifttype32i32 %a , %b + ret %shifttype32i32 %0 +} + +%shifttype2i64 = type <2 x i64> +define %shifttype2i64 @shift2i64(%shifttype2i64 %a, %shifttype2i64 %b) { +entry: + ; SSE2: shift2i64 + ; SSE2: cost of 20 {{.*}} ashr + ; SSE2-CODEGEN: shift2i64 + ; SSE2-CODEGEN: sarq %cl + + %0 = ashr %shifttype2i64 %a , %b + ret %shifttype2i64 %0 +} + +%shifttype4i64 = type <4 x i64> +define %shifttype4i64 @shift4i64(%shifttype4i64 %a, %shifttype4i64 %b) { +entry: + ; SSE2: shift4i64 + ; SSE2: cost of 40 {{.*}} ashr + ; SSE2-CODEGEN: shift4i64 + ; SSE2-CODEGEN: sarq %cl + + %0 = ashr %shifttype4i64 %a , %b + ret %shifttype4i64 %0 +} + +%shifttype8i64 = type <8 x i64> +define %shifttype8i64 @shift8i64(%shifttype8i64 %a, %shifttype8i64 %b) { +entry: + ; SSE2: shift8i64 + ; SSE2: cost of 80 {{.*}} ashr + ; SSE2-CODEGEN: shift8i64 + ; SSE2-CODEGEN: sarq %cl + + %0 = ashr %shifttype8i64 %a , %b + ret %shifttype8i64 %0 +} + +%shifttype16i64 = type <16 x i64> +define %shifttype16i64 @shift16i64(%shifttype16i64 %a, %shifttype16i64 %b) { +entry: + ; SSE2: shift16i64 + ; SSE2: cost of 160 {{.*}} ashr + ; SSE2-CODEGEN: shift16i64 + ; SSE2-CODEGEN: sarq %cl + + %0 = ashr %shifttype16i64 %a , %b + ret %shifttype16i64 %0 +} + +%shifttype32i64 = type <32 x i64> +define %shifttype32i64 @shift32i64(%shifttype32i64 %a, %shifttype32i64 %b) { +entry: + ; SSE2: shift32i64 + ; SSE2: cost of 256 {{.*}} ashr + ; SSE2-CODEGEN: shift32i64 + ; SSE2-CODEGEN: sarq %cl + + %0 = ashr %shifttype32i64 %a , %b + ret %shifttype32i64 %0 +} + +%shifttype2i8 = type <2 x i8> +define %shifttype2i8 @shift2i8(%shifttype2i8 %a, %shifttype2i8 %b) { +entry: + ; SSE2: shift2i8 + ; SSE2: cost of 20 {{.*}} ashr + ; SSE2-CODEGEN: shift2i8 + ; SSE2-CODEGEN: sarq %cl + + %0 = ashr %shifttype2i8 %a , %b + ret %shifttype2i8 %0 +} + +%shifttype4i8 = type <4 x i8> +define %shifttype4i8 @shift4i8(%shifttype4i8 %a, %shifttype4i8 %b) { +entry: + ; SSE2: shift4i8 + ; SSE2: cost of 40 {{.*}} ashr + ; SSE2-CODEGEN: shift4i8 + ; SSE2-CODEGEN: sarl %cl + + %0 = ashr %shifttype4i8 %a , %b + ret %shifttype4i8 %0 +} + +%shifttype8i8 = type <8 x i8> +define %shifttype8i8 @shift8i8(%shifttype8i8 %a, %shifttype8i8 %b) { +entry: + ; SSE2: shift8i8 + ; SSE2: cost of 80 {{.*}} ashr + ; SSE2-CODEGEN: shift8i8 + ; SSE2-CODEGEN: sarw %cl + + %0 = ashr %shifttype8i8 %a , %b + ret %shifttype8i8 %0 +} + +%shifttype16i8 = type <16 x i8> +define %shifttype16i8 @shift16i8(%shifttype16i8 %a, %shifttype16i8 %b) { +entry: + ; SSE2: shift16i8 + ; SSE2: cost of 160 {{.*}} ashr + ; SSE2-CODEGEN: shift16i8 + ; SSE2-CODEGEN: sarb %cl + + %0 = ashr %shifttype16i8 %a , %b + ret %shifttype16i8 %0 +} + +%shifttype32i8 = type <32 x i8> +define %shifttype32i8 @shift32i8(%shifttype32i8 %a, %shifttype32i8 %b) { +entry: + ; SSE2: shift32i8 + ; SSE2: cost of 320 {{.*}} ashr + ; SSE2-CODEGEN: shift32i8 + ; SSE2-CODEGEN: sarb %cl + + %0 = ashr %shifttype32i8 %a , %b + ret %shifttype32i8 %0 +} + +; Test shift by a constant a value. + +%shifttypec = type <2 x i16> +define %shifttypec @shift2i16const(%shifttypec %a, %shifttypec %b) { +entry: + ; SSE2: shift2i16const + ; SSE2: cost of 20 {{.*}} ashr + ; SSE2-CODEGEN: shift2i16const + ; SSE2-CODEGEN: sarq $ + + %0 = ashr %shifttypec %a , <i16 3, i16 3> + ret %shifttypec %0 +} + +%shifttypec4i16 = type <4 x i16> +define %shifttypec4i16 @shift4i16const(%shifttypec4i16 %a, %shifttypec4i16 %b) { +entry: + ; SSE2: shift4i16const + ; SSE2: cost of 1 {{.*}} ashr + ; SSE2-CODEGEN: shift4i16const + ; SSE2-CODEGEN: psrad $3 + + %0 = ashr %shifttypec4i16 %a , <i16 3, i16 3, i16 3, i16 3> + ret %shifttypec4i16 %0 +} + +%shifttypec8i16 = type <8 x i16> +define %shifttypec8i16 @shift8i16const(%shifttypec8i16 %a, %shifttypec8i16 %b) { +entry: + ; SSE2: shift8i16const + ; SSE2: cost of 1 {{.*}} ashr + ; SSE2-CODEGEN: shift8i16const + ; SSE2-CODEGEN: psraw $3 + + %0 = ashr %shifttypec8i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec8i16 %0 +} + +%shifttypec16i16 = type <16 x i16> +define %shifttypec16i16 @shift16i16const(%shifttypec16i16 %a, + %shifttypec16i16 %b) { +entry: + ; SSE2: shift16i16const + ; SSE2: cost of 2 {{.*}} ashr + ; SSE2-CODEGEN: shift16i16const + ; SSE2-CODEGEN: psraw $3 + + %0 = ashr %shifttypec16i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec16i16 %0 +} + +%shifttypec32i16 = type <32 x i16> +define %shifttypec32i16 @shift32i16const(%shifttypec32i16 %a, + %shifttypec32i16 %b) { +entry: + ; SSE2: shift32i16const + ; SSE2: cost of 4 {{.*}} ashr + ; SSE2-CODEGEN: shift32i16const + ; SSE2-CODEGEN: psraw $3 + + %0 = ashr %shifttypec32i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec32i16 %0 +} + +%shifttypec2i32 = type <2 x i32> +define %shifttypec2i32 @shift2i32c(%shifttypec2i32 %a, %shifttypec2i32 %b) { +entry: + ; SSE2: shift2i32c + ; SSE2: cost of 20 {{.*}} ashr + ; SSE2-CODEGEN: shift2i32c + ; SSE2-CODEGEN: sarq $3 + + %0 = ashr %shifttypec2i32 %a , <i32 3, i32 3> + ret %shifttypec2i32 %0 +} + +%shifttypec4i32 = type <4 x i32> +define %shifttypec4i32 @shift4i32c(%shifttypec4i32 %a, %shifttypec4i32 %b) { +entry: + ; SSE2: shift4i32c + ; SSE2: cost of 1 {{.*}} ashr + ; SSE2-CODEGEN: shift4i32c + ; SSE2-CODEGEN: psrad $3 + + %0 = ashr %shifttypec4i32 %a , <i32 3, i32 3, i32 3, i32 3> + ret %shifttypec4i32 %0 +} + +%shifttypec8i32 = type <8 x i32> +define %shifttypec8i32 @shift8i32c(%shifttypec8i32 %a, %shifttypec8i32 %b) { +entry: + ; SSE2: shift8i32c + ; SSE2: cost of 2 {{.*}} ashr + ; SSE2-CODEGEN: shift8i32c + ; SSE2-CODEGEN: psrad $3 + + %0 = ashr %shifttypec8i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec8i32 %0 +} + +%shifttypec16i32 = type <16 x i32> +define %shifttypec16i32 @shift16i32c(%shifttypec16i32 %a, %shifttypec16i32 %b) { +entry: + ; SSE2: shift16i32c + ; SSE2: cost of 4 {{.*}} ashr + ; SSE2-CODEGEN: shift16i32c + ; SSE2-CODEGEN: psrad $3 + + %0 = ashr %shifttypec16i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec16i32 %0 +} + +%shifttypec32i32 = type <32 x i32> +define %shifttypec32i32 @shift32i32c(%shifttypec32i32 %a, %shifttypec32i32 %b) { +entry: + ; SSE2: shift32i32c + ; getTypeConversion fails here and promotes this to a i64. + ; SSE2: cost of 256 {{.*}} ashr + ; SSE2-CODEGEN: shift32i32c + ; SSE2-CODEGEN: psrad $3 + %0 = ashr %shifttypec32i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec32i32 %0 +} + +%shifttypec2i64 = type <2 x i64> +define %shifttypec2i64 @shift2i64c(%shifttypec2i64 %a, %shifttypec2i64 %b) { +entry: + ; SSE2: shift2i64c + ; SSE2: cost of 20 {{.*}} ashr + ; SSE2-CODEGEN: shift2i64c + ; SSE2-CODEGEN: sarq $3 + + %0 = ashr %shifttypec2i64 %a , <i64 3, i64 3> + ret %shifttypec2i64 %0 +} + +%shifttypec4i64 = type <4 x i64> +define %shifttypec4i64 @shift4i64c(%shifttypec4i64 %a, %shifttypec4i64 %b) { +entry: + ; SSE2: shift4i64c + ; SSE2: cost of 40 {{.*}} ashr + ; SSE2-CODEGEN: shift4i64c + ; SSE2-CODEGEN: sarq $3 + + %0 = ashr %shifttypec4i64 %a , <i64 3, i64 3, i64 3, i64 3> + ret %shifttypec4i64 %0 +} + +%shifttypec8i64 = type <8 x i64> +define %shifttypec8i64 @shift8i64c(%shifttypec8i64 %a, %shifttypec8i64 %b) { +entry: + ; SSE2: shift8i64c + ; SSE2: cost of 80 {{.*}} ashr + ; SSE2-CODEGEN: shift8i64c + ; SSE2-CODEGEN: sarq $3 + + %0 = ashr %shifttypec8i64 %a , <i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec8i64 %0 +} + +%shifttypec16i64 = type <16 x i64> +define %shifttypec16i64 @shift16i64c(%shifttypec16i64 %a, %shifttypec16i64 %b) { +entry: + ; SSE2: shift16i64c + ; SSE2: cost of 160 {{.*}} ashr + ; SSE2-CODEGEN: shift16i64c + ; SSE2-CODEGEN: sarq $3 + + %0 = ashr %shifttypec16i64 %a , <i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec16i64 %0 +} + +%shifttypec32i64 = type <32 x i64> +define %shifttypec32i64 @shift32i64c(%shifttypec32i64 %a, %shifttypec32i64 %b) { +entry: + ; SSE2: shift32i64c + ; SSE2: cost of 256 {{.*}} ashr + ; SSE2-CODEGEN: shift32i64c + ; SSE2-CODEGEN: sarq $3 + + %0 = ashr %shifttypec32i64 %a ,<i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec32i64 %0 +} + +%shifttypec2i8 = type <2 x i8> +define %shifttypec2i8 @shift2i8c(%shifttypec2i8 %a, %shifttypec2i8 %b) { +entry: + ; SSE2: shift2i8c + ; SSE2: cost of 20 {{.*}} ashr + ; SSE2-CODEGEN: shift2i8c + ; SSE2-CODEGEN: sarq $3 + + %0 = ashr %shifttypec2i8 %a , <i8 3, i8 3> + ret %shifttypec2i8 %0 +} + +%shifttypec4i8 = type <4 x i8> +define %shifttypec4i8 @shift4i8c(%shifttypec4i8 %a, %shifttypec4i8 %b) { +entry: + ; SSE2: shift4i8c + ; SSE2: cost of 1 {{.*}} ashr + ; SSE2-CODEGEN: shift4i8c + ; SSE2-CODEGEN: psrad $3 + + %0 = ashr %shifttypec4i8 %a , <i8 3, i8 3, i8 3, i8 3> + ret %shifttypec4i8 %0 +} + +%shifttypec8i8 = type <8 x i8> +define %shifttypec8i8 @shift8i8c(%shifttypec8i8 %a, %shifttypec8i8 %b) { +entry: + ; SSE2: shift8i8c + ; SSE2: cost of 1 {{.*}} ashr + ; SSE2-CODEGEN: shift8i8c + ; SSE2-CODEGEN: psraw $3 + + %0 = ashr %shifttypec8i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec8i8 %0 +} + +%shifttypec16i8 = type <16 x i8> +define %shifttypec16i8 @shift16i8c(%shifttypec16i8 %a, %shifttypec16i8 %b) { +entry: + ; SSE2: shift16i8c + ; SSE2: cost of 4 {{.*}} ashr + ; SSE2-CODEGEN: shift16i8c + ; SSE2-CODEGEN: psrlw $3 + + %0 = ashr %shifttypec16i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec16i8 %0 +} + +%shifttypec32i8 = type <32 x i8> +define %shifttypec32i8 @shift32i8c(%shifttypec32i8 %a, %shifttypec32i8 %b) { +entry: + ; SSE2: shift32i8c + ; SSE2: cost of 8 {{.*}} ashr + ; SSE2-CODEGEN: shift32i8c + ; SSE2-CODEGEN: psrlw $3 + + %0 = ashr %shifttypec32i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec32i8 %0 +} + diff --git a/test/Analysis/CostModel/X86/testshiftlshr.ll b/test/Analysis/CostModel/X86/testshiftlshr.ll new file mode 100644 index 000000000000..8d6ef3874208 --- /dev/null +++ b/test/Analysis/CostModel/X86/testshiftlshr.ll @@ -0,0 +1,530 @@ +; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=core2 < %s | FileCheck --check-prefix=SSE2-CODEGEN %s +; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s + +%shifttype = type <2 x i16> +define %shifttype @shift2i16(%shifttype %a, %shifttype %b) { +entry: + ; SSE2: shift2i16 + ; SSE2: cost of 20 {{.*}} lshr + ; SSE2-CODEGEN: shift2i16 + ; SSE2-CODEGEN: shrq %cl + + %0 = lshr %shifttype %a , %b + ret %shifttype %0 +} + +%shifttype4i16 = type <4 x i16> +define %shifttype4i16 @shift4i16(%shifttype4i16 %a, %shifttype4i16 %b) { +entry: + ; SSE2: shift4i16 + ; SSE2: cost of 40 {{.*}} lshr + ; SSE2-CODEGEN: shift4i16 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype4i16 %a , %b + ret %shifttype4i16 %0 +} + +%shifttype8i16 = type <8 x i16> +define %shifttype8i16 @shift8i16(%shifttype8i16 %a, %shifttype8i16 %b) { +entry: + ; SSE2: shift8i16 + ; SSE2: cost of 80 {{.*}} lshr + ; SSE2-CODEGEN: shift8i16 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype8i16 %a , %b + ret %shifttype8i16 %0 +} + +%shifttype16i16 = type <16 x i16> +define %shifttype16i16 @shift16i16(%shifttype16i16 %a, %shifttype16i16 %b) { +entry: + ; SSE2: shift16i16 + ; SSE2: cost of 160 {{.*}} lshr + ; SSE2-CODEGEN: shift16i16 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype16i16 %a , %b + ret %shifttype16i16 %0 +} + +%shifttype32i16 = type <32 x i16> +define %shifttype32i16 @shift32i16(%shifttype32i16 %a, %shifttype32i16 %b) { +entry: + ; SSE2: shift32i16 + ; SSE2: cost of 320 {{.*}} lshr + ; SSE2-CODEGEN: shift32i16 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype32i16 %a , %b + ret %shifttype32i16 %0 +} + +%shifttype2i32 = type <2 x i32> +define %shifttype2i32 @shift2i32(%shifttype2i32 %a, %shifttype2i32 %b) { +entry: + ; SSE2: shift2i32 + ; SSE2: cost of 20 {{.*}} lshr + ; SSE2-CODEGEN: shift2i32 + ; SSE2-CODEGEN: shrq %cl + + %0 = lshr %shifttype2i32 %a , %b + ret %shifttype2i32 %0 +} + +%shifttype4i32 = type <4 x i32> +define %shifttype4i32 @shift4i32(%shifttype4i32 %a, %shifttype4i32 %b) { +entry: + ; SSE2: shift4i32 + ; SSE2: cost of 40 {{.*}} lshr + ; SSE2-CODEGEN: shift4i32 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype4i32 %a , %b + ret %shifttype4i32 %0 +} + +%shifttype8i32 = type <8 x i32> +define %shifttype8i32 @shift8i32(%shifttype8i32 %a, %shifttype8i32 %b) { +entry: + ; SSE2: shift8i32 + ; SSE2: cost of 80 {{.*}} lshr + ; SSE2-CODEGEN: shift8i32 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype8i32 %a , %b + ret %shifttype8i32 %0 +} + +%shifttype16i32 = type <16 x i32> +define %shifttype16i32 @shift16i32(%shifttype16i32 %a, %shifttype16i32 %b) { +entry: + ; SSE2: shift16i32 + ; SSE2: cost of 160 {{.*}} lshr + ; SSE2-CODEGEN: shift16i32 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype16i32 %a , %b + ret %shifttype16i32 %0 +} + +%shifttype32i32 = type <32 x i32> +define %shifttype32i32 @shift32i32(%shifttype32i32 %a, %shifttype32i32 %b) { +entry: + ; SSE2: shift32i32 + ; SSE2: cost of 256 {{.*}} lshr + ; SSE2-CODEGEN: shift32i32 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype32i32 %a , %b + ret %shifttype32i32 %0 +} + +%shifttype2i64 = type <2 x i64> +define %shifttype2i64 @shift2i64(%shifttype2i64 %a, %shifttype2i64 %b) { +entry: + ; SSE2: shift2i64 + ; SSE2: cost of 20 {{.*}} lshr + ; SSE2-CODEGEN: shift2i64 + ; SSE2-CODEGEN: shrq %cl + + %0 = lshr %shifttype2i64 %a , %b + ret %shifttype2i64 %0 +} + +%shifttype4i64 = type <4 x i64> +define %shifttype4i64 @shift4i64(%shifttype4i64 %a, %shifttype4i64 %b) { +entry: + ; SSE2: shift4i64 + ; SSE2: cost of 40 {{.*}} lshr + ; SSE2-CODEGEN: shift4i64 + ; SSE2-CODEGEN: shrq %cl + + %0 = lshr %shifttype4i64 %a , %b + ret %shifttype4i64 %0 +} + +%shifttype8i64 = type <8 x i64> +define %shifttype8i64 @shift8i64(%shifttype8i64 %a, %shifttype8i64 %b) { +entry: + ; SSE2: shift8i64 + ; SSE2: cost of 80 {{.*}} lshr + ; SSE2-CODEGEN: shift8i64 + ; SSE2-CODEGEN: shrq %cl + + %0 = lshr %shifttype8i64 %a , %b + ret %shifttype8i64 %0 +} + +%shifttype16i64 = type <16 x i64> +define %shifttype16i64 @shift16i64(%shifttype16i64 %a, %shifttype16i64 %b) { +entry: + ; SSE2: shift16i64 + ; SSE2: cost of 160 {{.*}} lshr + ; SSE2-CODEGEN: shift16i64 + ; SSE2-CODEGEN: shrq %cl + + %0 = lshr %shifttype16i64 %a , %b + ret %shifttype16i64 %0 +} + +%shifttype32i64 = type <32 x i64> +define %shifttype32i64 @shift32i64(%shifttype32i64 %a, %shifttype32i64 %b) { +entry: + ; SSE2: shift32i64 + ; SSE2: cost of 256 {{.*}} lshr + ; SSE2-CODEGEN: shift32i64 + ; SSE2-CODEGEN: shrq %cl + + %0 = lshr %shifttype32i64 %a , %b + ret %shifttype32i64 %0 +} + +%shifttype2i8 = type <2 x i8> +define %shifttype2i8 @shift2i8(%shifttype2i8 %a, %shifttype2i8 %b) { +entry: + ; SSE2: shift2i8 + ; SSE2: cost of 20 {{.*}} lshr + ; SSE2-CODEGEN: shift2i8 + ; SSE2-CODEGEN: shrq %cl + + %0 = lshr %shifttype2i8 %a , %b + ret %shifttype2i8 %0 +} + +%shifttype4i8 = type <4 x i8> +define %shifttype4i8 @shift4i8(%shifttype4i8 %a, %shifttype4i8 %b) { +entry: + ; SSE2: shift4i8 + ; SSE2: cost of 40 {{.*}} lshr + ; SSE2-CODEGEN: shift4i8 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype4i8 %a , %b + ret %shifttype4i8 %0 +} + +%shifttype8i8 = type <8 x i8> +define %shifttype8i8 @shift8i8(%shifttype8i8 %a, %shifttype8i8 %b) { +entry: + ; SSE2: shift8i8 + ; SSE2: cost of 80 {{.*}} lshr + ; SSE2-CODEGEN: shift8i8 + ; SSE2-CODEGEN: shrl %cl + + %0 = lshr %shifttype8i8 %a , %b + ret %shifttype8i8 %0 +} + +%shifttype16i8 = type <16 x i8> +define %shifttype16i8 @shift16i8(%shifttype16i8 %a, %shifttype16i8 %b) { +entry: + ; SSE2: shift16i8 + ; SSE2: cost of 160 {{.*}} lshr + ; SSE2-CODEGEN: shift16i8 + ; SSE2-CODEGEN: shrb %cl + + %0 = lshr %shifttype16i8 %a , %b + ret %shifttype16i8 %0 +} + +%shifttype32i8 = type <32 x i8> +define %shifttype32i8 @shift32i8(%shifttype32i8 %a, %shifttype32i8 %b) { +entry: + ; SSE2: shift32i8 + ; SSE2: cost of 320 {{.*}} lshr + ; SSE2-CODEGEN: shift32i8 + ; SSE2-CODEGEN: shrb %cl + + %0 = lshr %shifttype32i8 %a , %b + ret %shifttype32i8 %0 +} + +; Test shift by a constant vector. + +%shifttypec = type <2 x i16> +define %shifttypec @shift2i16const(%shifttypec %a, %shifttypec %b) { +entry: + ; SSE2: shift2i16const + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift2i16const + ; SSE2-CODEGEN: psrlq $3 + + %0 = lshr %shifttypec %a , <i16 3, i16 3> + ret %shifttypec %0 +} + +%shifttypec4i16 = type <4 x i16> +define %shifttypec4i16 @shift4i16const(%shifttypec4i16 %a, %shifttypec4i16 %b) { +entry: + ; SSE2: shift4i16const + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift4i16const + ; SSE2-CODEGEN: psrld $3 + + %0 = lshr %shifttypec4i16 %a , <i16 3, i16 3, i16 3, i16 3> + ret %shifttypec4i16 %0 +} + +%shifttypec8i16 = type <8 x i16> +define %shifttypec8i16 @shift8i16const(%shifttypec8i16 %a, %shifttypec8i16 %b) { +entry: + ; SSE2: shift8i16const + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift8i16const + ; SSE2-CODEGEN: psrlw $3 + + %0 = lshr %shifttypec8i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec8i16 %0 +} + +%shifttypec16i16 = type <16 x i16> +define %shifttypec16i16 @shift16i16const(%shifttypec16i16 %a, + %shifttypec16i16 %b) { +entry: + ; SSE2: shift16i16const + ; SSE2: cost of 2 {{.*}} lshr + ; SSE2-CODEGEN: shift16i16const + ; SSE2-CODEGEN: psrlw $3 + + %0 = lshr %shifttypec16i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec16i16 %0 +} + +%shifttypec32i16 = type <32 x i16> +define %shifttypec32i16 @shift32i16const(%shifttypec32i16 %a, + %shifttypec32i16 %b) { +entry: + ; SSE2: shift32i16const + ; SSE2: cost of 4 {{.*}} lshr + ; SSE2-CODEGEN: shift32i16const + ; SSE2-CODEGEN: psrlw $3 + + %0 = lshr %shifttypec32i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec32i16 %0 +} + +%shifttypec2i32 = type <2 x i32> +define %shifttypec2i32 @shift2i32c(%shifttypec2i32 %a, %shifttypec2i32 %b) { +entry: + ; SSE2: shift2i32c + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift2i32c + ; SSE2-CODEGEN: psrlq $3 + + %0 = lshr %shifttypec2i32 %a , <i32 3, i32 3> + ret %shifttypec2i32 %0 +} + +%shifttypec4i32 = type <4 x i32> +define %shifttypec4i32 @shift4i32c(%shifttypec4i32 %a, %shifttypec4i32 %b) { +entry: + ; SSE2: shift4i32c + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift4i32c + ; SSE2-CODEGEN: psrld $3 + + %0 = lshr %shifttypec4i32 %a , <i32 3, i32 3, i32 3, i32 3> + ret %shifttypec4i32 %0 +} + +%shifttypec8i32 = type <8 x i32> +define %shifttypec8i32 @shift8i32c(%shifttypec8i32 %a, %shifttypec8i32 %b) { +entry: + ; SSE2: shift8i32c + ; SSE2: cost of 2 {{.*}} lshr + ; SSE2-CODEGEN: shift8i32c + ; SSE2-CODEGEN: psrld $3 + + %0 = lshr %shifttypec8i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec8i32 %0 +} + +%shifttypec16i32 = type <16 x i32> +define %shifttypec16i32 @shift16i32c(%shifttypec16i32 %a, %shifttypec16i32 %b) { +entry: + ; SSE2: shift16i32c + ; SSE2: cost of 4 {{.*}} lshr + ; SSE2-CODEGEN: shift16i32c + ; SSE2-CODEGEN: psrld $3 + + %0 = lshr %shifttypec16i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec16i32 %0 +} + +%shifttypec32i32 = type <32 x i32> +define %shifttypec32i32 @shift32i32c(%shifttypec32i32 %a, %shifttypec32i32 %b) { +entry: + ; SSE2: shift32i32c + ; getTypeConversion fails here and promotes this to a i64. + ; SSE2: cost of 256 {{.*}} lshr + ; SSE2-CODEGEN: shift32i32c + ; SSE2-CODEGEN: psrld $3 + %0 = lshr %shifttypec32i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec32i32 %0 +} + +%shifttypec2i64 = type <2 x i64> +define %shifttypec2i64 @shift2i64c(%shifttypec2i64 %a, %shifttypec2i64 %b) { +entry: + ; SSE2: shift2i64c + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift2i64c + ; SSE2-CODEGEN: psrlq $3 + + %0 = lshr %shifttypec2i64 %a , <i64 3, i64 3> + ret %shifttypec2i64 %0 +} + +%shifttypec4i64 = type <4 x i64> +define %shifttypec4i64 @shift4i64c(%shifttypec4i64 %a, %shifttypec4i64 %b) { +entry: + ; SSE2: shift4i64c + ; SSE2: cost of 2 {{.*}} lshr + ; SSE2-CODEGEN: shift4i64c + ; SSE2-CODEGEN: psrlq $3 + + %0 = lshr %shifttypec4i64 %a , <i64 3, i64 3, i64 3, i64 3> + ret %shifttypec4i64 %0 +} + +%shifttypec8i64 = type <8 x i64> +define %shifttypec8i64 @shift8i64c(%shifttypec8i64 %a, %shifttypec8i64 %b) { +entry: + ; SSE2: shift8i64c + ; SSE2: cost of 4 {{.*}} lshr + ; SSE2-CODEGEN: shift8i64c + ; SSE2-CODEGEN: psrlq $3 + + %0 = lshr %shifttypec8i64 %a , <i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec8i64 %0 +} + +%shifttypec16i64 = type <16 x i64> +define %shifttypec16i64 @shift16i64c(%shifttypec16i64 %a, %shifttypec16i64 %b) { +entry: + ; SSE2: shift16i64c + ; SSE2: cost of 8 {{.*}} lshr + ; SSE2-CODEGEN: shift16i64c + ; SSE2-CODEGEN: psrlq $3 + + %0 = lshr %shifttypec16i64 %a , <i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec16i64 %0 +} + +%shifttypec32i64 = type <32 x i64> +define %shifttypec32i64 @shift32i64c(%shifttypec32i64 %a, %shifttypec32i64 %b) { +entry: + ; SSE2: shift32i64c + ; SSE2: cost of 256 {{.*}} lshr + ; SSE2-CODEGEN: shift32i64c + ; SSE2-CODEGEN: psrlq $3 + + %0 = lshr %shifttypec32i64 %a ,<i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec32i64 %0 +} + +%shifttypec2i8 = type <2 x i8> +define %shifttypec2i8 @shift2i8c(%shifttypec2i8 %a, %shifttypec2i8 %b) { +entry: + ; SSE2: shift2i8c + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift2i8c + ; SSE2-CODEGEN: psrlq $3 + + %0 = lshr %shifttypec2i8 %a , <i8 3, i8 3> + ret %shifttypec2i8 %0 +} + +%shifttypec4i8 = type <4 x i8> +define %shifttypec4i8 @shift4i8c(%shifttypec4i8 %a, %shifttypec4i8 %b) { +entry: + ; SSE2: shift4i8c + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift4i8c + ; SSE2-CODEGEN: psrld $3 + + %0 = lshr %shifttypec4i8 %a , <i8 3, i8 3, i8 3, i8 3> + ret %shifttypec4i8 %0 +} + +%shifttypec8i8 = type <8 x i8> +define %shifttypec8i8 @shift8i8c(%shifttypec8i8 %a, %shifttypec8i8 %b) { +entry: + ; SSE2: shift8i8c + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift8i8c + ; SSE2-CODEGEN: psrlw $3 + + %0 = lshr %shifttypec8i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec8i8 %0 +} + +%shifttypec16i8 = type <16 x i8> +define %shifttypec16i8 @shift16i8c(%shifttypec16i8 %a, %shifttypec16i8 %b) { +entry: + ; SSE2: shift16i8c + ; SSE2: cost of 1 {{.*}} lshr + ; SSE2-CODEGEN: shift16i8c + ; SSE2-CODEGEN: psrlw $3 + + %0 = lshr %shifttypec16i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec16i8 %0 +} + +%shifttypec32i8 = type <32 x i8> +define %shifttypec32i8 @shift32i8c(%shifttypec32i8 %a, %shifttypec32i8 %b) { +entry: + ; SSE2: shift32i8c + ; SSE2: cost of 2 {{.*}} lshr + ; SSE2-CODEGEN: shift32i8c + ; SSE2-CODEGEN: psrlw $3 + + %0 = lshr %shifttypec32i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec32i8 %0 +} diff --git a/test/Analysis/CostModel/X86/testshiftshl.ll b/test/Analysis/CostModel/X86/testshiftshl.ll new file mode 100644 index 000000000000..f45a69879210 --- /dev/null +++ b/test/Analysis/CostModel/X86/testshiftshl.ll @@ -0,0 +1,530 @@ +; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=core2 < %s | FileCheck --check-prefix=SSE2-CODEGEN %s +; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s + +%shifttype = type <2 x i16> +define %shifttype @shift2i16(%shifttype %a, %shifttype %b) { +entry: + ; SSE2: shift2i16 + ; SSE2: cost of 20 {{.*}} shl + ; SSE2-CODEGEN: shift2i16 + ; SSE2-CODEGEN: shlq %cl + + %0 = shl %shifttype %a , %b + ret %shifttype %0 +} + +%shifttype4i16 = type <4 x i16> +define %shifttype4i16 @shift4i16(%shifttype4i16 %a, %shifttype4i16 %b) { +entry: + ; SSE2: shift4i16 + ; SSE2: cost of 10 {{.*}} shl + ; SSE2-CODEGEN: shift4i16 + ; SSE2-CODEGEN: pmuludq + + %0 = shl %shifttype4i16 %a , %b + ret %shifttype4i16 %0 +} + +%shifttype8i16 = type <8 x i16> +define %shifttype8i16 @shift8i16(%shifttype8i16 %a, %shifttype8i16 %b) { +entry: + ; SSE2: shift8i16 + ; SSE2: cost of 80 {{.*}} shl + ; SSE2-CODEGEN: shift8i16 + ; SSE2-CODEGEN: shll %cl + + %0 = shl %shifttype8i16 %a , %b + ret %shifttype8i16 %0 +} + +%shifttype16i16 = type <16 x i16> +define %shifttype16i16 @shift16i16(%shifttype16i16 %a, %shifttype16i16 %b) { +entry: + ; SSE2: shift16i16 + ; SSE2: cost of 160 {{.*}} shl + ; SSE2-CODEGEN: shift16i16 + ; SSE2-CODEGEN: shll %cl + + %0 = shl %shifttype16i16 %a , %b + ret %shifttype16i16 %0 +} + +%shifttype32i16 = type <32 x i16> +define %shifttype32i16 @shift32i16(%shifttype32i16 %a, %shifttype32i16 %b) { +entry: + ; SSE2: shift32i16 + ; SSE2: cost of 320 {{.*}} shl + ; SSE2-CODEGEN: shift32i16 + ; SSE2-CODEGEN: shll %cl + + %0 = shl %shifttype32i16 %a , %b + ret %shifttype32i16 %0 +} + +%shifttype2i32 = type <2 x i32> +define %shifttype2i32 @shift2i32(%shifttype2i32 %a, %shifttype2i32 %b) { +entry: + ; SSE2: shift2i32 + ; SSE2: cost of 20 {{.*}} shl + ; SSE2-CODEGEN: shift2i32 + ; SSE2-CODEGEN: shlq %cl + + %0 = shl %shifttype2i32 %a , %b + ret %shifttype2i32 %0 +} + +%shifttype4i32 = type <4 x i32> +define %shifttype4i32 @shift4i32(%shifttype4i32 %a, %shifttype4i32 %b) { +entry: + ; SSE2: shift4i32 + ; SSE2: cost of 10 {{.*}} shl + ; SSE2-CODEGEN: shift4i32 + ; SSE2-CODEGEN: pmuludq + + %0 = shl %shifttype4i32 %a , %b + ret %shifttype4i32 %0 +} + +%shifttype8i32 = type <8 x i32> +define %shifttype8i32 @shift8i32(%shifttype8i32 %a, %shifttype8i32 %b) { +entry: + ; SSE2: shift8i32 + ; SSE2: cost of 20 {{.*}} shl + ; SSE2-CODEGEN: shift8i32 + ; SSE2-CODEGEN: pmuludq + + %0 = shl %shifttype8i32 %a , %b + ret %shifttype8i32 %0 +} + +%shifttype16i32 = type <16 x i32> +define %shifttype16i32 @shift16i32(%shifttype16i32 %a, %shifttype16i32 %b) { +entry: + ; SSE2: shift16i32 + ; SSE2: cost of 40 {{.*}} shl + ; SSE2-CODEGEN: shift16i32 + ; SSE2-CODEGEN: pmuludq + + %0 = shl %shifttype16i32 %a , %b + ret %shifttype16i32 %0 +} + +%shifttype32i32 = type <32 x i32> +define %shifttype32i32 @shift32i32(%shifttype32i32 %a, %shifttype32i32 %b) { +entry: + ; SSE2: shift32i32 + ; SSE2: cost of 256 {{.*}} shl + ; SSE2-CODEGEN: shift32i32 + ; SSE2-CODEGEN: pmuludq + + %0 = shl %shifttype32i32 %a , %b + ret %shifttype32i32 %0 +} + +%shifttype2i64 = type <2 x i64> +define %shifttype2i64 @shift2i64(%shifttype2i64 %a, %shifttype2i64 %b) { +entry: + ; SSE2: shift2i64 + ; SSE2: cost of 20 {{.*}} shl + ; SSE2-CODEGEN: shift2i64 + ; SSE2-CODEGEN: shlq %cl + + %0 = shl %shifttype2i64 %a , %b + ret %shifttype2i64 %0 +} + +%shifttype4i64 = type <4 x i64> +define %shifttype4i64 @shift4i64(%shifttype4i64 %a, %shifttype4i64 %b) { +entry: + ; SSE2: shift4i64 + ; SSE2: cost of 40 {{.*}} shl + ; SSE2-CODEGEN: shift4i64 + ; SSE2-CODEGEN: shlq %cl + + %0 = shl %shifttype4i64 %a , %b + ret %shifttype4i64 %0 +} + +%shifttype8i64 = type <8 x i64> +define %shifttype8i64 @shift8i64(%shifttype8i64 %a, %shifttype8i64 %b) { +entry: + ; SSE2: shift8i64 + ; SSE2: cost of 80 {{.*}} shl + ; SSE2-CODEGEN: shift8i64 + ; SSE2-CODEGEN: shlq %cl + + %0 = shl %shifttype8i64 %a , %b + ret %shifttype8i64 %0 +} + +%shifttype16i64 = type <16 x i64> +define %shifttype16i64 @shift16i64(%shifttype16i64 %a, %shifttype16i64 %b) { +entry: + ; SSE2: shift16i64 + ; SSE2: cost of 160 {{.*}} shl + ; SSE2-CODEGEN: shift16i64 + ; SSE2-CODEGEN: shlq %cl + + %0 = shl %shifttype16i64 %a , %b + ret %shifttype16i64 %0 +} + +%shifttype32i64 = type <32 x i64> +define %shifttype32i64 @shift32i64(%shifttype32i64 %a, %shifttype32i64 %b) { +entry: + ; SSE2: shift32i64 + ; SSE2: cost of 256 {{.*}} shl + ; SSE2-CODEGEN: shift32i64 + ; SSE2-CODEGEN: shlq %cl + + %0 = shl %shifttype32i64 %a , %b + ret %shifttype32i64 %0 +} + +%shifttype2i8 = type <2 x i8> +define %shifttype2i8 @shift2i8(%shifttype2i8 %a, %shifttype2i8 %b) { +entry: + ; SSE2: shift2i8 + ; SSE2: cost of 20 {{.*}} shl + ; SSE2-CODEGEN: shift2i8 + ; SSE2-CODEGEN: shlq %cl + + %0 = shl %shifttype2i8 %a , %b + ret %shifttype2i8 %0 +} + +%shifttype4i8 = type <4 x i8> +define %shifttype4i8 @shift4i8(%shifttype4i8 %a, %shifttype4i8 %b) { +entry: + ; SSE2: shift4i8 + ; SSE2: cost of 10 {{.*}} shl + ; SSE2-CODEGEN: shift4i8 + ; SSE2-CODEGEN: pmuludq + + %0 = shl %shifttype4i8 %a , %b + ret %shifttype4i8 %0 +} + +%shifttype8i8 = type <8 x i8> +define %shifttype8i8 @shift8i8(%shifttype8i8 %a, %shifttype8i8 %b) { +entry: + ; SSE2: shift8i8 + ; SSE2: cost of 80 {{.*}} shl + ; SSE2-CODEGEN: shift8i8 + ; SSE2-CODEGEN: shll + + %0 = shl %shifttype8i8 %a , %b + ret %shifttype8i8 %0 +} + +%shifttype16i8 = type <16 x i8> +define %shifttype16i8 @shift16i8(%shifttype16i8 %a, %shifttype16i8 %b) { +entry: + ; SSE2: shift16i8 + ; SSE2: cost of 30 {{.*}} shl + ; SSE2-CODEGEN: shift16i8 + ; SSE2-CODEGEN: cmpeqb + + %0 = shl %shifttype16i8 %a , %b + ret %shifttype16i8 %0 +} + +%shifttype32i8 = type <32 x i8> +define %shifttype32i8 @shift32i8(%shifttype32i8 %a, %shifttype32i8 %b) { +entry: + ; SSE2: shift32i8 + ; SSE2: cost of 60 {{.*}} shl + ; SSE2-CODEGEN: shift32i8 + ; SSE2-CODEGEN: cmpeqb + + %0 = shl %shifttype32i8 %a , %b + ret %shifttype32i8 %0 +} + +; Test shift by a constant vector. + +%shifttypec = type <2 x i16> +define %shifttypec @shift2i16const(%shifttypec %a, %shifttypec %b) { +entry: + ; SSE2: shift2i16const + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift2i16const + ; SSE2-CODEGEN: psllq $3 + + %0 = shl %shifttypec %a , <i16 3, i16 3> + ret %shifttypec %0 +} + +%shifttypec4i16 = type <4 x i16> +define %shifttypec4i16 @shift4i16const(%shifttypec4i16 %a, %shifttypec4i16 %b) { +entry: + ; SSE2: shift4i16const + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift4i16const + ; SSE2-CODEGEN: pslld $3 + + %0 = shl %shifttypec4i16 %a , <i16 3, i16 3, i16 3, i16 3> + ret %shifttypec4i16 %0 +} + +%shifttypec8i16 = type <8 x i16> +define %shifttypec8i16 @shift8i16const(%shifttypec8i16 %a, %shifttypec8i16 %b) { +entry: + ; SSE2: shift8i16const + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift8i16const + ; SSE2-CODEGEN: psllw $3 + + %0 = shl %shifttypec8i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec8i16 %0 +} + +%shifttypec16i16 = type <16 x i16> +define %shifttypec16i16 @shift16i16const(%shifttypec16i16 %a, + %shifttypec16i16 %b) { +entry: + ; SSE2: shift16i16const + ; SSE2: cost of 2 {{.*}} shl + ; SSE2-CODEGEN: shift16i16const + ; SSE2-CODEGEN: psllw $3 + + %0 = shl %shifttypec16i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec16i16 %0 +} + +%shifttypec32i16 = type <32 x i16> +define %shifttypec32i16 @shift32i16const(%shifttypec32i16 %a, + %shifttypec32i16 %b) { +entry: + ; SSE2: shift32i16const + ; SSE2: cost of 4 {{.*}} shl + ; SSE2-CODEGEN: shift32i16const + ; SSE2-CODEGEN: psllw $3 + + %0 = shl %shifttypec32i16 %a , <i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3, + i16 3, i16 3, i16 3, i16 3> + ret %shifttypec32i16 %0 +} + +%shifttypec2i32 = type <2 x i32> +define %shifttypec2i32 @shift2i32c(%shifttypec2i32 %a, %shifttypec2i32 %b) { +entry: + ; SSE2: shift2i32c + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift2i32c + ; SSE2-CODEGEN: psllq $3 + + %0 = shl %shifttypec2i32 %a , <i32 3, i32 3> + ret %shifttypec2i32 %0 +} + +%shifttypec4i32 = type <4 x i32> +define %shifttypec4i32 @shift4i32c(%shifttypec4i32 %a, %shifttypec4i32 %b) { +entry: + ; SSE2: shift4i32c + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift4i32c + ; SSE2-CODEGEN: pslld $3 + + %0 = shl %shifttypec4i32 %a , <i32 3, i32 3, i32 3, i32 3> + ret %shifttypec4i32 %0 +} + +%shifttypec8i32 = type <8 x i32> +define %shifttypec8i32 @shift8i32c(%shifttypec8i32 %a, %shifttypec8i32 %b) { +entry: + ; SSE2: shift8i32c + ; SSE2: cost of 2 {{.*}} shl + ; SSE2-CODEGEN: shift8i32c + ; SSE2-CODEGEN: pslld $3 + + %0 = shl %shifttypec8i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec8i32 %0 +} + +%shifttypec16i32 = type <16 x i32> +define %shifttypec16i32 @shift16i32c(%shifttypec16i32 %a, %shifttypec16i32 %b) { +entry: + ; SSE2: shift16i32c + ; SSE2: cost of 4 {{.*}} shl + ; SSE2-CODEGEN: shift16i32c + ; SSE2-CODEGEN: pslld $3 + + %0 = shl %shifttypec16i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec16i32 %0 +} + +%shifttypec32i32 = type <32 x i32> +define %shifttypec32i32 @shift32i32c(%shifttypec32i32 %a, %shifttypec32i32 %b) { +entry: + ; SSE2: shift32i32c + ; getTypeConversion fails here and promotes this to a i64. + ; SSE2: cost of 256 {{.*}} shl + ; SSE2-CODEGEN: shift32i32c + ; SSE2-CODEGEN: pslld $3 + %0 = shl %shifttypec32i32 %a , <i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3, + i32 3, i32 3, i32 3, i32 3> + ret %shifttypec32i32 %0 +} + +%shifttypec2i64 = type <2 x i64> +define %shifttypec2i64 @shift2i64c(%shifttypec2i64 %a, %shifttypec2i64 %b) { +entry: + ; SSE2: shift2i64c + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift2i64c + ; SSE2-CODEGEN: psllq $3 + + %0 = shl %shifttypec2i64 %a , <i64 3, i64 3> + ret %shifttypec2i64 %0 +} + +%shifttypec4i64 = type <4 x i64> +define %shifttypec4i64 @shift4i64c(%shifttypec4i64 %a, %shifttypec4i64 %b) { +entry: + ; SSE2: shift4i64c + ; SSE2: cost of 2 {{.*}} shl + ; SSE2-CODEGEN: shift4i64c + ; SSE2-CODEGEN: psllq $3 + + %0 = shl %shifttypec4i64 %a , <i64 3, i64 3, i64 3, i64 3> + ret %shifttypec4i64 %0 +} + +%shifttypec8i64 = type <8 x i64> +define %shifttypec8i64 @shift8i64c(%shifttypec8i64 %a, %shifttypec8i64 %b) { +entry: + ; SSE2: shift8i64c + ; SSE2: cost of 4 {{.*}} shl + ; SSE2-CODEGEN: shift8i64c + ; SSE2-CODEGEN: psllq $3 + + %0 = shl %shifttypec8i64 %a , <i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec8i64 %0 +} + +%shifttypec16i64 = type <16 x i64> +define %shifttypec16i64 @shift16i64c(%shifttypec16i64 %a, %shifttypec16i64 %b) { +entry: + ; SSE2: shift16i64c + ; SSE2: cost of 8 {{.*}} shl + ; SSE2-CODEGEN: shift16i64c + ; SSE2-CODEGEN: psllq $3 + + %0 = shl %shifttypec16i64 %a , <i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec16i64 %0 +} + +%shifttypec32i64 = type <32 x i64> +define %shifttypec32i64 @shift32i64c(%shifttypec32i64 %a, %shifttypec32i64 %b) { +entry: + ; SSE2: shift32i64c + ; SSE2: cost of 256 {{.*}} shl + ; SSE2-CODEGEN: shift32i64c + ; SSE2-CODEGEN: psllq $3 + + %0 = shl %shifttypec32i64 %a ,<i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3, + i64 3, i64 3, i64 3, i64 3> + ret %shifttypec32i64 %0 +} + +%shifttypec2i8 = type <2 x i8> +define %shifttypec2i8 @shift2i8c(%shifttypec2i8 %a, %shifttypec2i8 %b) { +entry: + ; SSE2: shift2i8c + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift2i8c + ; SSE2-CODEGEN: psllq $3 + + %0 = shl %shifttypec2i8 %a , <i8 3, i8 3> + ret %shifttypec2i8 %0 +} + +%shifttypec4i8 = type <4 x i8> +define %shifttypec4i8 @shift4i8c(%shifttypec4i8 %a, %shifttypec4i8 %b) { +entry: + ; SSE2: shift4i8c + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift4i8c + ; SSE2-CODEGEN: pslld $3 + + %0 = shl %shifttypec4i8 %a , <i8 3, i8 3, i8 3, i8 3> + ret %shifttypec4i8 %0 +} + +%shifttypec8i8 = type <8 x i8> +define %shifttypec8i8 @shift8i8c(%shifttypec8i8 %a, %shifttypec8i8 %b) { +entry: + ; SSE2: shift8i8c + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift8i8c + ; SSE2-CODEGEN: psllw $3 + + %0 = shl %shifttypec8i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec8i8 %0 +} + +%shifttypec16i8 = type <16 x i8> +define %shifttypec16i8 @shift16i8c(%shifttypec16i8 %a, %shifttypec16i8 %b) { +entry: + ; SSE2: shift16i8c + ; SSE2: cost of 1 {{.*}} shl + ; SSE2-CODEGEN: shift16i8c + ; SSE2-CODEGEN: psllw $3 + + %0 = shl %shifttypec16i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec16i8 %0 +} + +%shifttypec32i8 = type <32 x i8> +define %shifttypec32i8 @shift32i8c(%shifttypec32i8 %a, %shifttypec32i8 %b) { +entry: + ; SSE2: shift32i8c + ; SSE2: cost of 2 {{.*}} shl + ; SSE2-CODEGEN: shift32i8c + ; SSE2-CODEGEN: psllw $3 + + %0 = shl %shifttypec32i8 %a , <i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3, + i8 3, i8 3, i8 3, i8 3> + ret %shifttypec32i8 %0 +} diff --git a/test/Analysis/CostModel/X86/tiny.ll b/test/Analysis/CostModel/X86/tiny.ll index cc7b443a7dfc..0dafdadb5b15 100644 --- a/test/Analysis/CostModel/X86/tiny.ll +++ b/test/Analysis/CostModel/X86/tiny.ll @@ -4,7 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-macosx10.8.0" ;CHECK: cost of 1 {{.*}} add -;CHECK: cost of 1 {{.*}} ret +;CHECK: cost of 0 {{.*}} ret define i32 @no_info(i32 %arg) { %e = add i32 %arg, %arg ret i32 %e diff --git a/test/Analysis/CostModel/X86/vectorized-loop.ll b/test/Analysis/CostModel/X86/vectorized-loop.ll index 7919a9ca9a64..25b11145c661 100644 --- a/test/Analysis/CostModel/X86/vectorized-loop.ll +++ b/test/Analysis/CostModel/X86/vectorized-loop.ll @@ -28,20 +28,21 @@ vector.body: ; preds = %for.body.lr.ph, %ve %4 = getelementptr inbounds i32* %B, i64 %3 ;CHECK: cost of 0 {{.*}} bitcast %5 = bitcast i32* %4 to <8 x i32>* - ;CHECK: cost of 1 {{.*}} load + ;CHECK: cost of 2 {{.*}} load %6 = load <8 x i32>* %5, align 4 ;CHECK: cost of 4 {{.*}} mul %7 = mul nsw <8 x i32> %6, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> %8 = getelementptr inbounds i32* %A, i64 %index %9 = bitcast i32* %8 to <8 x i32>* + ;CHECK: cost of 2 {{.*}} load %10 = load <8 x i32>* %9, align 4 ;CHECK: cost of 4 {{.*}} add %11 = add nsw <8 x i32> %10, %7 - ;CHECK: cost of 1 {{.*}} store + ;CHECK: cost of 2 {{.*}} store store <8 x i32> %11, <8 x i32>* %9, align 4 %index.next = add i64 %index, 8 %12 = icmp eq i64 %index.next, %end.idx.rnd.down - ;CHECK: cost of 1 {{.*}} br + ;CHECK: cost of 0 {{.*}} br br i1 %12, label %middle.block, label %vector.body middle.block: ; preds = %vector.body, %for.body.lr.ph @@ -65,11 +66,11 @@ for.body: ; preds = %middle.block, %for. ;CHECK: cost of 0 {{.*}} trunc %16 = trunc i64 %indvars.iv.next to i32 %cmp = icmp slt i32 %16, %end - ;CHECK: cost of 1 {{.*}} br + ;CHECK: cost of 0 {{.*}} br br i1 %cmp, label %for.body, label %for.end for.end: ; preds = %middle.block, %for.body, %entry - ;CHECK: cost of 1 {{.*}} ret + ;CHECK: cost of 0 {{.*}} ret ret i32 undef } diff --git a/test/Analysis/CostModel/no_info.ll b/test/Analysis/CostModel/no_info.ll index d20d56b79a7f..f3f165b1b52a 100644 --- a/test/Analysis/CostModel/no_info.ll +++ b/test/Analysis/CostModel/no_info.ll @@ -1,11 +1,8 @@ ; RUN: opt < %s -cost-model -analyze | FileCheck %s ; The cost model does not have any target information so it can't make a decision. -; Notice that OPT does not read the triple information from the module itself, only through the command line. -; This info ignored: -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -target triple = "x86_64-apple-macosx10.8.0" +; -- No triple in this module -- ;CHECK: Unknown cost {{.*}} add ;CHECK: Unknown cost {{.*}} ret diff --git a/test/Analysis/DependenceAnalysis/Banerjee.ll b/test/Analysis/DependenceAnalysis/Banerjee.ll index 8865ee94016f..003ee03ab0be 100644 --- a/test/Analysis/DependenceAnalysis/Banerjee.ll +++ b/test/Analysis/DependenceAnalysis/Banerjee.ll @@ -7,13 +7,20 @@ target triple = "x86_64-apple-macosx10.6.0" ;; for (long int i = 1; i <= 10; i++) ;; for (long int j = 1; j <= 10; j++) { -;; A[10*i + j] = ... -;; ... = A[10*i + j - 1]; +;; A[10*i + j] = 0; +;; *B++ = A[10*i + j - 1]; define void @banerjee0(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [<= <>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc7 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ] %i.03 = phi i64 [ 1, %entry ], [ %inc8, %for.inc7 ] @@ -31,7 +38,6 @@ for.body3: ; preds = %for.cond1.preheader %sub = add nsw i64 %add5, -1 %arrayidx6 = getelementptr inbounds i64* %A, i64 %sub %0 = load i64* %arrayidx6, align 8 -; CHECK: da analyze - flow [<= <>]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -51,14 +57,21 @@ for.end9: ; preds = %for.inc7 ;; for (long int i = 1; i <= n; i++) ;; for (long int j = 1; j <= m; j++) { -;; A[10*i + j] = ... -;; ... = A[10*i + j - 1]; +;; A[10*i + j] = 0; +;; *B++ = A[10*i + j - 1]; define void @banerjee1(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: %cmp4 = icmp sgt i64 %n, 0 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end9 +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - flow [* <>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - output [* *]! + for.cond1.preheader.preheader: ; preds = %entry %0 = add i64 %n, 1 br label %for.cond1.preheader @@ -85,7 +98,6 @@ for.body3: ; preds = %for.body3.preheader %sub = add nsw i64 %add5, -1 %arrayidx6 = getelementptr inbounds i64* %A, i64 %sub %2 = load i64* %arrayidx6, align 8 -; CHECK: da analyze - flow [* <>]! %incdec.ptr = getelementptr inbounds i64* %B.addr.12, i64 1 store i64 %2, i64* %B.addr.12, align 8 %inc = add nsw i64 %j.03, 1 @@ -119,6 +131,13 @@ define void @banerjee2(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc8 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ] %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] @@ -136,7 +155,6 @@ for.body3: ; preds = %for.cond1.preheader %add6 = add nsw i64 %add5, 100 %arrayidx7 = getelementptr inbounds i64* %A, i64 %add6 %0 = load i64* %arrayidx7, align 8 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -156,13 +174,20 @@ for.end10: ; preds = %for.inc8 ;; for (long int i = 0; i < 10; i++) ;; for (long int j = 0; j < 10; j++) { -;; A[10*i + j] = ... -;; ... = A[10*i + j + 99]; +;; A[10*i + j] = 0; +;; *B++ = A[10*i + j + 99]; define void @banerjee3(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [> >]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc8 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ] %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] @@ -180,7 +205,6 @@ for.body3: ; preds = %for.cond1.preheader %add6 = add nsw i64 %add5, 99 %arrayidx7 = getelementptr inbounds i64* %A, i64 %add6 %0 = load i64* %arrayidx7, align 8 -; CHECK: da analyze - flow [> >]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -200,13 +224,20 @@ for.end10: ; preds = %for.inc8 ;; for (long int i = 0; i < 10; i++) ;; for (long int j = 0; j < 10; j++) { -;; A[10*i + j] = ... -;; ... = A[10*i + j - 100]; +;; A[10*i + j] = 0; +;; *B++ = A[10*i + j - 100]; define void @banerjee4(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc7 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ] %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ] @@ -224,7 +255,6 @@ for.body3: ; preds = %for.cond1.preheader %sub = add nsw i64 %add5, -100 %arrayidx6 = getelementptr inbounds i64* %A, i64 %sub %0 = load i64* %arrayidx6, align 8 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -244,13 +274,20 @@ for.end9: ; preds = %for.inc7 ;; for (long int i = 0; i < 10; i++) ;; for (long int j = 0; j < 10; j++) { -;; A[10*i + j] = ... -;; ... = A[10*i + j - 99]; +;; A[10*i + j] = 0; +;; *B++ = A[10*i + j - 99]; define void @banerjee5(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [< <]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc7 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ] %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ] @@ -268,7 +305,6 @@ for.body3: ; preds = %for.cond1.preheader %sub = add nsw i64 %add5, -99 %arrayidx6 = getelementptr inbounds i64* %A, i64 %sub %0 = load i64* %arrayidx6, align 8 -; CHECK: da analyze - flow [< <]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -288,13 +324,20 @@ for.end9: ; preds = %for.inc7 ;; for (long int i = 0; i < 10; i++) ;; for (long int j = 0; j < 10; j++) { -;; A[10*i + j] = ... -;; ... = A[10*i + j + 9]; +;; A[10*i + j] = 0; +;; *B++ = A[10*i + j + 9]; define void @banerjee6(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=> <>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc8 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ] %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] @@ -312,7 +355,6 @@ for.body3: ; preds = %for.cond1.preheader %add6 = add nsw i64 %add5, 9 %arrayidx7 = getelementptr inbounds i64* %A, i64 %add6 %0 = load i64* %arrayidx7, align 8 -; CHECK: da analyze - flow [=> <>]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -332,13 +374,20 @@ for.end10: ; preds = %for.inc8 ;; for (long int i = 0; i < 10; i++) ;; for (long int j = 0; j < 10; j++) { -;; A[10*i + j] = ... -;; ... = A[10*i + j + 10]; +;; A[10*i + j] = 0; +;; *B++ = A[10*i + j + 10]; define void @banerjee7(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [> <=]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc8 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ] %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] @@ -356,7 +405,6 @@ for.body3: ; preds = %for.cond1.preheader %add6 = add nsw i64 %add5, 10 %arrayidx7 = getelementptr inbounds i64* %A, i64 %add6 %0 = load i64* %arrayidx7, align 8 -; CHECK: da analyze - flow [> <=]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -376,13 +424,20 @@ for.end10: ; preds = %for.inc8 ;; for (long int i = 0; i < 10; i++) ;; for (long int j = 0; j < 10; j++) { -;; A[10*i + j] = ... -;; ... = A[10*i + j + 11]; +;; A[10*i + j] = 0; +;; *B++ = A[10*i + j + 11]; define void @banerjee8(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [> <>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc8 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ] %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] @@ -400,7 +455,6 @@ for.body3: ; preds = %for.cond1.preheader %add6 = add nsw i64 %add5, 11 %arrayidx7 = getelementptr inbounds i64* %A, i64 %add6 %0 = load i64* %arrayidx7, align 8 -; CHECK: da analyze - flow [> <>]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -420,13 +474,20 @@ for.end10: ; preds = %for.inc8 ;; for (long int i = 0; i < 20; i++) ;; for (long int j = 0; j < 20; j++) { -;; A[30*i + 500*j] = ... -;; ... = A[i - 500*j + 11]; +;; A[30*i + 500*j] = 0; +;; *B++ = A[i - 500*j + 11]; define void @banerjee9(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - flow [<= =|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc8 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ] %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] @@ -445,7 +506,6 @@ for.body3: ; preds = %for.cond1.preheader %add6 = add nsw i64 %sub, 11 %arrayidx7 = getelementptr inbounds i64* %A, i64 %add6 %1 = load i64* %arrayidx7, align 8 -; CHECK: da analyze - flow [<= =|<]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %1, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -465,13 +525,20 @@ for.end10: ; preds = %for.inc8 ;; for (long int i = 0; i < 20; i++) ;; for (long int j = 0; j < 20; j++) { -;; A[i + 500*j] = ... -;; ... = A[i - 500*j + 11]; +;; A[i + 500*j] = 0; +;; *B++ = A[i - 500*j + 11]; define void @banerjee10(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [<> =]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc7 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ] %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ] @@ -489,7 +556,6 @@ for.body3: ; preds = %for.cond1.preheader %add5 = add nsw i64 %sub, 11 %arrayidx6 = getelementptr inbounds i64* %A, i64 %add5 %1 = load i64* %arrayidx6, align 8 -; CHECK: da analyze - flow [<> =]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %1, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -509,13 +575,20 @@ for.end9: ; preds = %for.inc7 ;; for (long int i = 0; i < 20; i++) ;; for (long int j = 0; j < 20; j++) { -;; A[300*i + j] = ... -;; ... = A[250*i - j + 11]; +;; A[300*i + j] = 0; +;; *B++ = A[250*i - j + 11]; define void @banerjee11(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [<= <>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc7 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ] %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ] @@ -533,7 +606,6 @@ for.body3: ; preds = %for.cond1.preheader %add5 = add nsw i64 %sub, 11 %arrayidx6 = getelementptr inbounds i64* %A, i64 %add5 %0 = load i64* %arrayidx6, align 8 -; CHECK: da analyze - flow [<= <>]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 @@ -553,13 +625,20 @@ for.end9: ; preds = %for.inc7 ;; for (long int i = 0; i < 20; i++) ;; for (long int j = 0; j < 20; j++) { -;; A[100*i + j] = ... -;; ... = A[100*i - j + 11]; +;; A[100*i + j] = 0; +;; *B++ = A[100*i - j + 11]; define void @banerjee12(i64* %A, i64* %B, i64 %m, i64 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [= <>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc7 %B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ] %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ] @@ -577,7 +656,6 @@ for.body3: ; preds = %for.cond1.preheader %add5 = add nsw i64 %sub, 11 %arrayidx6 = getelementptr inbounds i64* %A, i64 %add5 %0 = load i64* %arrayidx6, align 8 -; CHECK: da analyze - flow [= <>]! %incdec.ptr = getelementptr inbounds i64* %B.addr.11, i64 1 store i64 %0, i64* %B.addr.11, align 8 %inc = add nsw i64 %j.02, 1 diff --git a/test/Analysis/DependenceAnalysis/Coupled.ll b/test/Analysis/DependenceAnalysis/Coupled.ll index 60163fe7c2d0..8c77849ae847 100644 --- a/test/Analysis/DependenceAnalysis/Coupled.ll +++ b/test/Analysis/DependenceAnalysis/Coupled.ll @@ -5,15 +5,22 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-macosx10.6.0" -;; for (long int i = 0; i < 50; i++) -;; A[i][i] = ... -;; ... = A[i + 10][i + 9] +;; for (long int i = 0; i < 50; i++) { +;; A[i][i] = i; +;; *B++ = A[i + 10][i + 9]; define void @couple0([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -23,27 +30,33 @@ for.body: ; preds = %for.body, %entry %add2 = add nsw i64 %i.02, 10 %arrayidx4 = getelementptr inbounds [100 x i32]* %A, i64 %add2, i64 %add %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 50 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 50; i++) -;; A[i][i] = ... -;; ... = A[i + 9][i + 9] +;; for (long int i = 0; i < 50; i++) { +;; A[i][i] = i; +;; *B++ = A[i + 9][i + 9]; define void @couple1([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [-9]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -53,27 +66,33 @@ for.body: ; preds = %for.body, %entry %add2 = add nsw i64 %i.02, 9 %arrayidx4 = getelementptr inbounds [100 x i32]* %A, i64 %add2, i64 %add %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - consistent flow [-9]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 50 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 50; i++) -;; A[3*i - 6][3*i - 6] = ... -;; ... = A[i][i] +;; for (long int i = 0; i < 50; i++) { +;; A[3*i - 6][3*i - 6] = i; +;; *B++ = A[i][i]; define void @couple2([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [*|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -85,27 +104,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx3, align 4 %arrayidx5 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - flow [*|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 50 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 50; i++) -;; A[3*i - 6][3*i - 5] = ... -;; ... = A[i][i] +;; for (long int i = 0; i < 50; i++) { +;; A[3*i - 6][3*i - 5] = i; +;; *B++ = A[i][i]; define void @couple3([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -117,27 +142,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx3, align 4 %arrayidx5 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 50 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 50; i++) -;; A[3*i - 6][3*i - n] = ... -;; ... = A[i][i] +;; for (long int i = 0; i < 50; i++) { +;; A[3*i - 6][3*i - n] = i; +;; *B++ = A[i][i]; define void @couple4([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [*|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -150,27 +181,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx4, align 4 %arrayidx6 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx6, align 4 -; CHECK: da analyze - flow [*|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 50 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 50; i++) -;; A[3*i - n + 1][3*i - n] = ... -;; ... = A[i][i] +;; for (long int i = 0; i < 50; i++) { +;; A[3*i - n + 1][3*i - n] = i; +;; *B++ = A[i][i]; define void @couple5([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -185,27 +222,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx5, align 4 %arrayidx7 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx7, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 50 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 50; i++) -;; A[i][3*i - 6] = ... -;; ... = A[i][i] +;; for (long int i = 0; i < 50; i++) { +;; A[i][3*i - 6] = i; +;; *B++ = A[i][i]; define void @couple6([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -215,27 +258,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx1, align 4 %arrayidx3 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx3, align 4 -; CHECK: da analyze - flow [=|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 50 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 50; i++) -;; A[i][3*i - 5] = ... -;; ... = A[i][i] +;; for (long int i = 0; i < 50; i++) { +;; A[i][3*i - 5] = i; +;; *B++ = A[i][i]; define void @couple7([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -245,27 +294,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx1, align 4 %arrayidx3 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx3, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 50 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i <= 15; i++) -;; A[3*i - 18][3 - i] = ... -;; ... = A[i][i] +;; for (long int i = 0; i <= 15; i++) { +;; A[3*i - 18][3 - i] = i; +;; *B++ = A[i][i]; define void @couple8([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -276,27 +331,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx2, align 4 %arrayidx4 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 16 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 16 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i <= 15; i++) -;; A[3*i - 18][2 - i] = ... -;; ... = A[i][i] +;; for (long int i = 0; i <= 15; i++) { +;; A[3*i - 18][2 - i] = i; +;; *B++ = A[i][i]; define void @couple9([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -307,27 +368,34 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx2, align 4 %arrayidx4 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 16 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 16 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i <= 15; i++) -;; A[3*i - 18][6 - i] = ... -;; ... = A[i][i] +;; for (long int i = 0; i <= 15; i++) { +;; A[3*i - 18][6 - i] = i; +;; *B++ = A[i][i]; define void @couple10([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [>] splitable! +; CHECK: da analyze - split level = 1, iteration = 3! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -338,28 +406,34 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx2, align 4 %arrayidx4 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - flow [>] splitable! -; CHECK: da analyze - split level = 1, iteration = 3! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 16 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 16 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i <= 15; i++) -;; A[3*i - 18][18 - i] = ... -;; ... = A[i][i] +;; for (long int i = 0; i <= 15; i++) { +;; A[3*i - 18][18 - i] = i; +;; *B++ = A[i][i]; define void @couple11([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=|<] splitable! +; CHECK: da analyze - split level = 1, iteration = 9! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -370,28 +444,34 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx2, align 4 %arrayidx4 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - flow [=|<] splitable! -; CHECK: da analyze - split level = 1, iteration = 9! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 16 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 16 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i <= 12; i++) -;; A[3*i - 18][22 - i] = ... -;; ... = A[i][i] +;; for (long int i = 0; i <= 12; i++) { +;; A[3*i - 18][22 - i] = i; +;; *B++ = A[i][i]; define void @couple12([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [<] splitable! +; CHECK: da analyze - split level = 1, iteration = 11! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -402,28 +482,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx2, align 4 %arrayidx4 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - flow [<] splitable! -; CHECK: da analyze - split level = 1, iteration = 11! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 13 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 13 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 12; i++) -;; A[3*i - 18][22 - i] = ... -;; ... = A[i][i] +;; for (long int i = 0; i < 12; i++) { +;; A[3*i - 18][22 - i] = i; +;; *B++ = A[i][i]; define void @couple13([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -434,27 +519,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx2, align 4 %arrayidx4 = getelementptr inbounds [100 x i32]* %A, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 12 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 12 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } - -;; for (long int i = 0; i < 100; i++) -;; A[3*i - 18][18 - i][i] = ... -;; ... = A[i][i][i] +;; for (long int i = 0; i < 100; i++) { +;; A[3*i - 18][18 - i][i] = i; +;; *B++ = A[i][i][i]; define void @couple14([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=|<] splitable! +; CHECK: da analyze - split level = 1, iteration = 9! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -465,28 +556,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx3, align 4 %arrayidx6 = getelementptr inbounds [100 x [100 x i32]]* %A, i64 %i.02, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx6, align 4 -; CHECK: da analyze - flow [=|<] splitable! -; CHECK: da analyze - split level = 1, iteration = 9! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 100 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long int i = 0; i < 100; i++) -;; A[3*i - 18][22 - i][i] = ... -;; ... = A[i][i][i] +;; for (long int i = 0; i < 100; i++) { +;; A[3*i - 18][22 - i][i] = i; +;; *B++ = A[i][i][i]; define void @couple15([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -497,12 +593,11 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx3, align 4 %arrayidx6 = getelementptr inbounds [100 x [100 x i32]]* %A, i64 %i.02, i64 %i.02, i64 %i.02 %0 = load i32* %arrayidx6, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add nsw i64 %i.02, 1 - %cmp = icmp slt i64 %inc, 100 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void diff --git a/test/Analysis/DependenceAnalysis/ExactRDIV.ll b/test/Analysis/DependenceAnalysis/ExactRDIV.ll index aa5d254a0ce2..81f55161c0df 100644 --- a/test/Analysis/DependenceAnalysis/ExactRDIV.ll +++ b/test/Analysis/DependenceAnalysis/ExactRDIV.ll @@ -6,15 +6,22 @@ target triple = "x86_64-apple-macosx10.6.0" ;; for (long int i = 0; i < 10; i++) -;; A[4*i + 10] = ... +;; A[4*i + 10] = i; ;; for (long int j = 0; j < 10; j++) -;; ... = A[2*j + 1]; +;; *B++ = A[2*j + 1]; define void @rdiv0(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = shl nsw i64 %i.03, 2 @@ -22,22 +29,24 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 10 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond5 = icmp ne i64 %inc, 10 + br i1 %exitcond5, label %for.body, label %for.body4.preheader + +for.body4.preheader: ; preds = %for.body + br label %for.body4 -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %mul5 = shl nsw i64 %j.02, 1 %add64 = or i64 %mul5, 1 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add64 %0 = load i32* %arrayidx7, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc9 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc9, 10 - br i1 %cmp2, label %for.body4, label %for.end10 + %exitcond = icmp ne i64 %inc9, 10 + br i1 %exitcond, label %for.body4, label %for.end10 for.end10: ; preds = %for.body4 ret void @@ -45,15 +54,22 @@ for.end10: ; preds = %for.body4 ;; for (long int i = 0; i < 5; i++) -;; A[11*i - 45] = ... +;; A[11*i - 45] = i; ;; for (long int j = 0; j < 10; j++) -;; ... = A[j]; +;; *B++ = A[j]; define void @rdiv1(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, 11 @@ -61,20 +77,22 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %sub store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 5 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond4 = icmp ne i64 %inc, 5 + br i1 %exitcond4, label %for.body, label %for.body4.preheader + +for.body4.preheader: ; preds = %for.body + br label %for.body4 -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc7 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc7, 10 - br i1 %cmp2, label %for.body4, label %for.end8 + %exitcond = icmp ne i64 %inc7, 10 + br i1 %exitcond, label %for.body4, label %for.end8 for.end8: ; preds = %for.body4 ret void @@ -82,15 +100,22 @@ for.end8: ; preds = %for.body4 ;; for (long int i = 0; i <= 5; i++) -;; A[11*i - 45] = ... +;; A[11*i - 45] = i; ;; for (long int j = 0; j < 10; j++) -;; ... = A[j]; +;; *B++ = A[j]; define void @rdiv2(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, 11 @@ -98,20 +123,22 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %sub store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 6 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond4 = icmp ne i64 %inc, 6 + br i1 %exitcond4, label %for.body, label %for.body4.preheader + +for.body4.preheader: ; preds = %for.body + br label %for.body4 -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc7 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc7, 10 - br i1 %cmp2, label %for.body4, label %for.end8 + %exitcond = icmp ne i64 %inc7, 10 + br i1 %exitcond, label %for.body4, label %for.end8 for.end8: ; preds = %for.body4 ret void @@ -119,15 +146,22 @@ for.end8: ; preds = %for.body4 ;; for (long int i = 0; i < 5; i++) -;; A[11*i - 45] = ... +;; A[11*i - 45] = i; ;; for (long int j = 0; j <= 10; j++) -;; ... = A[j]; +;; *B++ = A[j]; define void @rdiv3(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, 11 @@ -135,20 +169,22 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %sub store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 5 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond4 = icmp ne i64 %inc, 5 + br i1 %exitcond4, label %for.body, label %for.body4.preheader + +for.body4.preheader: ; preds = %for.body + br label %for.body4 -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc7 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc7, 11 - br i1 %cmp2, label %for.body4, label %for.end8 + %exitcond = icmp ne i64 %inc7, 11 + br i1 %exitcond, label %for.body4, label %for.end8 for.end8: ; preds = %for.body4 ret void @@ -156,15 +192,22 @@ for.end8: ; preds = %for.body4 ;; for (long int i = 0; i <= 5; i++) -;; A[11*i - 45] = ... +;; A[11*i - 45] = i; ;; for (long int j = 0; j <= 10; j++) -;; ... = A[j]; +;; *B++ = A[j]; define void @rdiv4(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, 11 @@ -172,20 +215,22 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %sub store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 6 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond4 = icmp ne i64 %inc, 6 + br i1 %exitcond4, label %for.body, label %for.body4.preheader + +for.body4.preheader: ; preds = %for.body + br label %for.body4 -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - flow! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc7 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc7, 11 - br i1 %cmp2, label %for.body4, label %for.end8 + %exitcond = icmp ne i64 %inc7, 11 + br i1 %exitcond, label %for.body4, label %for.end8 for.end8: ; preds = %for.body4 ret void @@ -193,15 +238,22 @@ for.end8: ; preds = %for.body4 ;; for (long int i = 0; i < 5; i++) -;; A[-11*i + 45] = ... +;; A[-11*i + 45] = i; ;; for (long int j = 0; j < 10; j++) -;; ... = A[-j]; +;; *B++ = A[-j]; define void @rdiv5(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, -11 @@ -209,21 +261,23 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 5 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond4 = icmp ne i64 %inc, 5 + br i1 %exitcond4, label %for.body, label %for.body4.preheader -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4.preheader: ; preds = %for.body + br label %for.body4 + +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %sub = sub nsw i64 0, %j.02 %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc7 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc7, 10 - br i1 %cmp2, label %for.body4, label %for.end8 + %exitcond = icmp ne i64 %inc7, 10 + br i1 %exitcond, label %for.body4, label %for.end8 for.end8: ; preds = %for.body4 ret void @@ -231,15 +285,22 @@ for.end8: ; preds = %for.body4 ;; for (long int i = 0; i <= 5; i++) -;; A[-11*i + 45] = ... +;; A[-11*i + 45] = i; ;; for (long int j = 0; j < 10; j++) -;; ... = A[-j]; +;; *B++ = A[-j]; define void @rdiv6(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, -11 @@ -247,21 +308,23 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 6 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond4 = icmp ne i64 %inc, 6 + br i1 %exitcond4, label %for.body, label %for.body4.preheader + +for.body4.preheader: ; preds = %for.body + br label %for.body4 -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %sub = sub nsw i64 0, %j.02 %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc7 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc7, 10 - br i1 %cmp2, label %for.body4, label %for.end8 + %exitcond = icmp ne i64 %inc7, 10 + br i1 %exitcond, label %for.body4, label %for.end8 for.end8: ; preds = %for.body4 ret void @@ -269,15 +332,22 @@ for.end8: ; preds = %for.body4 ;; for (long int i = 0; i < 5; i++) -;; A[-11*i + 45] = ... +;; A[-11*i + 45] = i; ;; for (long int j = 0; j <= 10; j++) -;; ... = A[-j]; +;; *B++ = A[-j]; define void @rdiv7(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, -11 @@ -285,21 +355,23 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 5 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond4 = icmp ne i64 %inc, 5 + br i1 %exitcond4, label %for.body, label %for.body4.preheader -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4.preheader: ; preds = %for.body + br label %for.body4 + +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %sub = sub nsw i64 0, %j.02 %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc7 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc7, 11 - br i1 %cmp2, label %for.body4, label %for.end8 + %exitcond = icmp ne i64 %inc7, 11 + br i1 %exitcond, label %for.body4, label %for.end8 for.end8: ; preds = %for.body4 ret void @@ -307,15 +379,22 @@ for.end8: ; preds = %for.body4 ;; for (long int i = 0; i <= 5; i++) -;; A[-11*i + 45] = ... +;; A[-11*i + 45] = i; ;; for (long int j = 0; j <= 10; j++) -;; ... = A[-j]; +;; *B++ = A[-j]; define void @rdiv8(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, -11 @@ -323,21 +402,23 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, 6 - br i1 %cmp, label %for.body, label %for.body4 + %exitcond4 = icmp ne i64 %inc, 6 + br i1 %exitcond4, label %for.body, label %for.body4.preheader + +for.body4.preheader: ; preds = %for.body + br label %for.body4 -for.body4: ; preds = %for.body4, %for.body - %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body ] - %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %sub = sub nsw i64 0, %j.02 %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - flow! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc7 = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc7, 11 - br i1 %cmp2, label %for.body4, label %for.end8 + %exitcond = icmp ne i64 %inc7, 11 + br i1 %exitcond, label %for.body4, label %for.end8 for.end8: ; preds = %for.body4 ret void @@ -345,20 +426,27 @@ for.end8: ; preds = %for.body4 ;; for (long int i = 0; i < 5; i++) -;; for (long int j = 0; j < 10; j++) -;; A[11*i - j] = ... -;; ... = A[45]; +;; for (long int j = 0; j < 10; j++) { +;; A[11*i - j] = i; +;; *B++ = A[45]; define void @rdiv9(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc5, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc5 ] +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc5 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ] %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -368,38 +456,46 @@ for.body3: ; preds = %for.body3, %for.con store i32 %conv, i32* %arrayidx, align 4 %arrayidx4 = getelementptr inbounds i32* %A, i64 45 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 10 - br i1 %cmp2, label %for.body3, label %for.inc5 + %exitcond = icmp ne i64 %inc, 10 + br i1 %exitcond, label %for.body3, label %for.inc5 for.inc5: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 10 %inc6 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc6, 5 - br i1 %cmp, label %for.cond1.preheader, label %for.end7 + %exitcond5 = icmp ne i64 %inc6, 5 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 for.end7: ; preds = %for.inc5 ret void } -;; for (long int i = 0; i < 5; i++) -;; for (long int j = 0; j <= 10; j++) -;; A[11*i - j] = ... -;; ... = A[45]; + +;; for (long int i = 0; i <= 5; i++) +;; for (long int j = 0; j < 10; j++) { +;; A[11*i - j] = i; +;; *B++ = A[45]; define void @rdiv10(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc5, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc5 ] +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc5 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ] %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -409,38 +505,45 @@ for.body3: ; preds = %for.body3, %for.con store i32 %conv, i32* %arrayidx, align 4 %arrayidx4 = getelementptr inbounds i32* %A, i64 45 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 10 - br i1 %cmp2, label %for.body3, label %for.inc5 + %exitcond = icmp ne i64 %inc, 10 + br i1 %exitcond, label %for.body3, label %for.inc5 for.inc5: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 10 %inc6 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc6, 6 - br i1 %cmp, label %for.cond1.preheader, label %for.end7 + %exitcond5 = icmp ne i64 %inc6, 6 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 for.end7: ; preds = %for.inc5 ret void } -;; for (long int i = 0; i <= 5; i++) -;; for (long int j = 0; j <= 10; j++) -;; A[11*i - j] = ... -;; ... = A[45]; +;; for (long int i = 0; i < 5; i++) +;; for (long int j = 0; j <= 10; j++) { +;; A[11*i - j] = i; +;; *B++ = A[45]; define void @rdiv11(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc5, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc5 ] +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc5 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ] %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -450,38 +553,45 @@ for.body3: ; preds = %for.body3, %for.con store i32 %conv, i32* %arrayidx, align 4 %arrayidx4 = getelementptr inbounds i32* %A, i64 45 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 11 - br i1 %cmp2, label %for.body3, label %for.inc5 + %exitcond = icmp ne i64 %inc, 11 + br i1 %exitcond, label %for.body3, label %for.inc5 for.inc5: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 11 %inc6 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc6, 5 - br i1 %cmp, label %for.cond1.preheader, label %for.end7 + %exitcond5 = icmp ne i64 %inc6, 5 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 for.end7: ; preds = %for.inc5 ret void } -;; for (long int i = 0; i < 5; i++) -;; for (long int j = 0; j < 10; j++) -;; A[11*i - j] = ... -;; ... = A[45]; +;; for (long int i = 0; i <= 5; i++) +;; for (long int j = 0; j <= 10; j++) { +;; A[11*i - j] = i; +;; *B++ = A[45]; define void @rdiv12(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc5, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc5 ] +; CHECK: da analyze - none! +; CHECK: da analyze - flow [* *|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc5 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ] %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -491,17 +601,17 @@ for.body3: ; preds = %for.body3, %for.con store i32 %conv, i32* %arrayidx, align 4 %arrayidx4 = getelementptr inbounds i32* %A, i64 45 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - flow [* *|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 11 - br i1 %cmp2, label %for.body3, label %for.inc5 + %exitcond = icmp ne i64 %inc, 11 + br i1 %exitcond, label %for.body3, label %for.inc5 for.inc5: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 11 %inc6 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc6, 6 - br i1 %cmp, label %for.cond1.preheader, label %for.end7 + %exitcond5 = icmp ne i64 %inc6, 6 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end7 for.end7: ; preds = %for.inc5 ret void diff --git a/test/Analysis/DependenceAnalysis/ExactSIV.ll b/test/Analysis/DependenceAnalysis/ExactSIV.ll index 71e050246291..586bbe5096d6 100644 --- a/test/Analysis/DependenceAnalysis/ExactSIV.ll +++ b/test/Analysis/DependenceAnalysis/ExactSIV.ll @@ -6,14 +6,21 @@ target triple = "x86_64-apple-macosx10.6.0" ;; for (long unsigned i = 0; i < 10; i++) { -;; A[i + 10] = ... -;; ... = A[2*i + 1]; +;; A[i + 10] = i; +;; *B++ = A[2*i + 1]; define void @exact0(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [<=|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -24,12 +31,11 @@ for.body: ; preds = %for.body, %entry %add13 = or i64 %mul, 1 %arrayidx2 = getelementptr inbounds i32* %A, i64 %add13 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [<=|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 10 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 10 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -37,14 +43,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i < 10; i++) { -;; A[4*i + 10] = ... -;; ... = A[2*i + 1]; +;; A[4*i + 10] = i; +;; *B++ = A[2*i + 1]; define void @exact1(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -56,12 +69,11 @@ for.body: ; preds = %for.body, %entry %add23 = or i64 %mul1, 1 %arrayidx3 = getelementptr inbounds i32* %A, i64 %add23 %0 = load i32* %arrayidx3, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 10 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 10 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -69,14 +81,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i < 10; i++) { -;; A[6*i] = ... -;; ... = A[i + 60]; +;; A[6*i] = i; +;; *B++ = A[i + 60]; define void @exact2(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -86,12 +105,11 @@ for.body: ; preds = %for.body, %entry %add = add i64 %i.02, 60 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 10 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 10 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -99,14 +117,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i <= 10; i++) { -;; A[6*i] = ... -;; ... = A[i + 60]; +;; A[6*i] = i; +;; *B++ = A[i + 60]; define void @exact3(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -116,12 +141,11 @@ for.body: ; preds = %for.body, %entry %add = add i64 %i.02, 60 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [>]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 11 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 11 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -129,14 +153,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i < 12; i++) { -;; A[6*i] = ... -;; ... = A[i + 60]; +;; A[6*i] = i; +;; *B++ = A[i + 60]; define void @exact4(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -146,12 +177,11 @@ for.body: ; preds = %for.body, %entry %add = add i64 %i.02, 60 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [>]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 12 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 12 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -159,14 +189,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i <= 12; i++) { -;; A[6*i] = ... -;; ... = A[i + 60]; +;; A[6*i] = i; +;; *B++ = A[i + 60]; define void @exact5(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=>|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -176,12 +213,11 @@ for.body: ; preds = %for.body, %entry %add = add i64 %i.02, 60 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [=>|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 13 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 13 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -189,14 +225,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i < 18; i++) { -;; A[6*i] = ... -;; ... = A[i + 60]; +;; A[6*i] = i; +;; *B++ = A[i + 60]; define void @exact6(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=>|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -206,12 +249,11 @@ for.body: ; preds = %for.body, %entry %add = add i64 %i.02, 60 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [=>|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 18 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 18 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -219,14 +261,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i <= 18; i++) { -;; A[6*i] = ... -;; ... = A[i + 60]; +;; A[6*i] = i; +;; *B++ = A[i + 60]; define void @exact7(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [*|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -236,12 +285,11 @@ for.body: ; preds = %for.body, %entry %add = add i64 %i.02, 60 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [*|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 19 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 19 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -249,14 +297,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i < 10; i++) { -;; A[-6*i] = ... -;; ... = A[-i - 60]; +;; A[-6*i] = i; +;; *B++ = A[-i - 60]; define void @exact8(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -266,12 +321,11 @@ for.body: ; preds = %for.body, %entry %sub1 = sub i64 -60, %i.02 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 10 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 10 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -279,14 +333,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i <= 10; i++) { -;; A[-6*i] = ... -;; ... = A[-i - 60]; +;; A[-6*i] = i; +;; *B++ = A[-i - 60]; define void @exact9(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -296,12 +357,11 @@ for.body: ; preds = %for.body, %entry %sub1 = sub i64 -60, %i.02 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [>]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 11 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 11 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -309,14 +369,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i < 12; i++) { -;; A[-6*i] = ... -;; ... = A[-i - 60]; +;; A[-6*i] = i; +;; *B++ = A[-i - 60]; define void @exact10(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -326,12 +393,11 @@ for.body: ; preds = %for.body, %entry %sub1 = sub i64 -60, %i.02 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [>]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 12 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 12 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -339,14 +405,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i <= 12; i++) { -;; A[-6*i] = ... -;; ... = A[-i - 60]; +;; A[-6*i] = i; +;; *B++ = A[-i - 60]; define void @exact11(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=>|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -356,12 +429,11 @@ for.body: ; preds = %for.body, %entry %sub1 = sub i64 -60, %i.02 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [=>|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 13 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 13 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -369,14 +441,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i < 18; i++) { -;; A[-6*i] = ... -;; ... = A[-i - 60]; +;; A[-6*i] = i; +;; *B++ = A[-i - 60]; define void @exact12(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=>|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -386,12 +465,11 @@ for.body: ; preds = %for.body, %entry %sub1 = sub i64 -60, %i.02 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [=>|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 18 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 18 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void @@ -399,14 +477,21 @@ for.end: ; preds = %for.body ;; for (long unsigned i = 0; i <= 18; i++) { -;; A[-6*i] = ... -;; ... = A[-i - 60]; +;; A[-6*i] = i; +;; *B++ = A[-i - 60]; define void @exact13(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [*|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -416,12 +501,11 @@ for.body: ; preds = %for.body, %entry %sub1 = sub i64 -60, %i.02 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [*|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 19 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 19 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void diff --git a/test/Analysis/DependenceAnalysis/GCD.ll b/test/Analysis/DependenceAnalysis/GCD.ll index 94c93a8a0dd4..a42212464f86 100644 --- a/test/Analysis/DependenceAnalysis/GCD.ll +++ b/test/Analysis/DependenceAnalysis/GCD.ll @@ -6,14 +6,21 @@ target triple = "x86_64-apple-macosx10.6.0" ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[2*i - 4*j] = ... -;; ... = A[6*i + 8*j]; +;; for (long int j = 0; j < 100; j++) { +;; A[2*i - 4*j] = i; +;; *B++ = A[6*i + 8*j]; define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - flow [=> *|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc8 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ] %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] @@ -33,7 +40,6 @@ for.body3: ; preds = %for.cond1.preheader %add = add nsw i64 %mul5, %mul6 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx7, align 4 -; CHECK: da analyze - flow [=> *|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 @@ -52,14 +58,21 @@ for.end10: ; preds = %for.inc8 ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[2*i - 4*j] = ... -;; ... = A[6*i + 8*j + 1]; +;; for (long int j = 0; j < 100; j++) { +;; A[2*i - 4*j] = i; +;; *B++ = A[6*i + 8*j + 1]; define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc9 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ] %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ] @@ -80,7 +93,6 @@ for.body3: ; preds = %for.cond1.preheader %add7 = or i64 %add, 1 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7 %0 = load i32* %arrayidx8, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 @@ -99,14 +111,21 @@ for.end11: ; preds = %for.inc9 ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[2*i - 4*j + 1] = ... -;; ... = A[6*i + 8*j]; +;; for (long int j = 0; j < 100; j++) { +;; A[2*i - 4*j + 1] = i; +;; *B++ = A[6*i + 8*j]; define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc9 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ] %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ] @@ -127,7 +146,6 @@ for.body3: ; preds = %for.cond1.preheader %add7 = add nsw i64 %mul5, %mul6 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7 %0 = load i32* %arrayidx8, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 @@ -146,14 +164,21 @@ for.end11: ; preds = %for.inc9 ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[i + 2*j] = ... -;; ... = A[i + 2*j - 1]; +;; for (long int j = 0; j < 100; j++) { +;; A[i + 2*j] = i; +;; *B++ = A[i + 2*j - 1]; define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - flow [<> *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc7 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ] %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ] @@ -172,7 +197,6 @@ for.body3: ; preds = %for.cond1.preheader %sub = add nsw i64 %add5, -1 %arrayidx6 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx6, align 4 -; CHECK: da analyze - flow [<> *]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 @@ -190,16 +214,22 @@ for.end9: ; preds = %for.inc7 } -;; void gcd4(int *A, int *B, long int M, long int N) { -;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) { -;; A[5*i + 10*j*M + 9*M*N] = i; -;; *B++ = A[15*i + 20*j*M - 21*N*M + 4]; +;; for (long int i = 0; i < 100; i++) +;; for (long int j = 0; j < 100; j++) { +;; A[5*i + 10*j*M + 9*M*N] = i; +;; *B++ = A[15*i + 20*j*M - 21*N*M + 4]; define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc17 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ] %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ] @@ -228,7 +258,6 @@ for.body3: ; preds = %for.cond1.preheader %add15 = add nsw i64 %sub, 4 %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15 %0 = load i32* %arrayidx16, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 @@ -246,16 +275,22 @@ for.end19: ; preds = %for.inc17 } -;; void gcd5(int *A, int *B, long int M, long int N) { -;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) { -;; A[5*i + 10*j*M + 9*M*N] = i; -;; *B++ = A[15*i + 20*j*M - 21*N*M + 5]; +;; for (long int i = 0; i < 100; i++) +;; for (long int j = 0; j < 100; j++) { +;; A[5*i + 10*j*M + 9*M*N] = i; +;; *B++ = A[15*i + 20*j*M - 21*N*M + 5]; define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp { entry: br label %for.cond1.preheader +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - flow [<> *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.cond1.preheader: ; preds = %entry, %for.inc17 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ] %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ] @@ -284,7 +319,6 @@ for.body3: ; preds = %for.cond1.preheader %add15 = add nsw i64 %sub, 5 %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15 %0 = load i32* %arrayidx16, align 4 -; CHECK: da analyze - flow [<> *]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 @@ -302,17 +336,23 @@ for.end19: ; preds = %for.inc17 } -;; void gcd6(long int n, int A[][n], int *B) { -;; for (long int i = 0; i < n; i++) -;; for (long int j = 0; j < n; j++) { -;; A[2*i][4*j] = i; -;; *B++ = A[8*i][6*j + 1]; +;; for (long int i = 0; i < n; i++) +;; for (long int j = 0; j < n; j++) { +;; A[2*i][4*j] = i; +;; *B++ = A[8*i][6*j + 1]; define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp { entry: %cmp4 = icmp sgt i64 %n, 0 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12 +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - output [* *]! + for.cond1.preheader.preheader: ; preds = %entry br label %for.cond1.preheader @@ -342,7 +382,6 @@ for.body3: ; preds = %for.body3.preheader %arrayidx8.sum = add i64 %1, %add7 %arrayidx9 = getelementptr inbounds i32* %A, i64 %arrayidx8.sum %2 = load i32* %arrayidx9, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1 store i32 %2, i32* %B.addr.12, align 4 %inc = add nsw i64 %j.03, 1 @@ -367,11 +406,10 @@ for.end12: ; preds = %for.end12.loopexit, } -;; void gcd7(int n, int A[][n], int *B) { -;; for (int i = 0; i < n; i++) -;; for (int j = 0; j < n; j++) { -;; A[2*i][4*j] = i; -;; *B++ = A[8*i][6*j + 1]; +;; for (int i = 0; i < n; i++) +;; for (int j = 0; j < n; j++) { +;; A[2*i][4*j] = i; +;; *B++ = A[8*i][6*j + 1]; define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp { entry: @@ -379,6 +417,13 @@ entry: %cmp4 = icmp sgt i32 %n, 0 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15 +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - flow [* *|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - output [* *]! + for.cond1.preheader.preheader: ; preds = %entry br label %for.cond1.preheader @@ -419,7 +464,6 @@ for.body3: ; preds = %for.body3.preheader %arrayidx11.sum = add i64 %10, %idxprom8 %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum %11 = load i32* %arrayidx12, align 4 -; CHECK: da analyze - flow [* *|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1 store i32 %11, i32* %B.addr.12, align 4 %indvars.iv.next = add i64 %indvars.iv, 1 @@ -446,17 +490,23 @@ for.end15: ; preds = %for.end15.loopexit, } -;; void gcd8(int n, int *A, int *B) { -;; for (int i = 0; i < n; i++) -;; for (int j = 0; j < n; j++) { -;; A[n*2*i + 4*j] = i; -;; *B++ = A[n*8*i + 6*j + 1]; +;; for (int i = 0; i < n; i++) +;; for (int j = 0; j < n; j++) { +;; A[n*2*i + 4*j] = i; +;; *B++ = A[n*8*i + 6*j + 1]; define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp { entry: %cmp4 = icmp sgt i32 %n, 0 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15 +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - output [* *]! + for.cond1.preheader.preheader: ; preds = %entry br label %for.cond1.preheader @@ -492,7 +542,6 @@ for.body3: ; preds = %for.body3.preheader %idxprom11 = sext i32 %add10 to i64 %arrayidx12 = getelementptr inbounds i32* %A, i64 %idxprom11 %5 = load i32* %arrayidx12, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1 store i32 %5, i32* %B.addr.12, align 4 %indvars.iv.next = add i64 %indvars.iv, 1 @@ -518,11 +567,10 @@ for.end15: ; preds = %for.end15.loopexit, } -;; void gcd9(unsigned n, int A[][n], int *B) { -;; for (unsigned i = 0; i < n; i++) -;; for (unsigned j = 0; j < n; j++) { -;; A[2*i][4*j] = i; -;; *B++ = A[8*i][6*j + 1]; +;; for (unsigned i = 0; i < n; i++) +;; for (unsigned j = 0; j < n; j++) { +;; A[2*i][4*j] = i; +;; *B++ = A[8*i][6*j + 1]; define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp { entry: @@ -530,6 +578,13 @@ entry: %cmp4 = icmp eq i32 %n, 0 br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - flow [* *|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [* *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - output [* *]! + for.cond1.preheader.preheader: ; preds = %entry br label %for.cond1.preheader @@ -570,7 +625,6 @@ for.body3: ; preds = %for.body3.preheader %arrayidx11.sum = add i64 %10, %idxprom8 %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum %11 = load i32* %arrayidx12, align 4 -; CHECK: da analyze - flow [* *|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1 store i32 %11, i32* %B.addr.12, align 4 %indvars.iv.next = add i64 %indvars.iv, 1 diff --git a/test/Analysis/DependenceAnalysis/Preliminary.ll b/test/Analysis/DependenceAnalysis/Preliminary.ll index 3ef63fd5592f..f36b85a5951e 100644 --- a/test/Analysis/DependenceAnalysis/Preliminary.ll +++ b/test/Analysis/DependenceAnalysis/Preliminary.ll @@ -1,111 +1,147 @@ -; RUN: opt < %s -analyze -basicaa -indvars -da | FileCheck %s - -; This series of tests is more interesting when debugging is enabled. +; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; ModuleID = 'Preliminary.bc' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.6.0" -;; may alias -;; int p0(int n, int *A, int *B) { +;;int p0(int n, int *A, int *B) { ;; A[0] = n; ;; return B[1]; define i32 @p0(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp { entry: store i32 %n, i32* %A, align 4 + +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + %arrayidx1 = getelementptr inbounds i32* %B, i64 1 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - confused! ret i32 %0 } -;; no alias -;; int p1(int n, int *restrict A, int *restrict B) { +;;int p1(int n, int *restrict A, int *restrict B) { ;; A[0] = n; ;; return B[1]; define i32 @p1(i32 %n, i32* noalias %A, i32* noalias %B) nounwind uwtable ssp { entry: store i32 %n, i32* %A, align 4 + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - none! + %arrayidx1 = getelementptr inbounds i32* %B, i64 1 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! ret i32 %0 } -;; check loop nesting levels -;; for (long int i = 0; i < n; i++) -;; for (long int j = 0; j < n; j++) -;; for (long int k = 0; k < n; k++) -;; A[i][j][k] = ... -;; for (long int k = 0; k < n; k++) -;; ... = A[i + 3][j + 2][k + 1]; + +;; for (long int i = 0; i < n; i++) { +;; for (long int j = 0; j < n; j++) { +;; for (long int k = 0; k < n; k++) { +;; A[i][j][k] = i; +;; } +;; for (long int k = 0; k < n; k++) { +;; *B++ = A[i + 3][j + 2][k + 1]; define void @p2(i64 %n, [100 x [100 x i64]]* %A, i64* %B) nounwind uwtable ssp { entry: %cmp10 = icmp sgt i64 %n, 0 - br i1 %cmp10, label %for.cond1.preheader, label %for.end26 + br i1 %cmp10, label %for.cond1.preheader.preheader, label %for.end26 + +; CHECK: da analyze - none! +; CHECK: da analyze - flow [-3 -2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - output [* * *]! -for.cond1.preheader: ; preds = %for.inc24, %entry - %B.addr.012 = phi i64* [ %B.addr.1.lcssa, %for.inc24 ], [ %B, %entry ] - %i.011 = phi i64 [ %inc25, %for.inc24 ], [ 0, %entry ] +for.cond1.preheader.preheader: ; preds = %entry + br label %for.cond1.preheader + +for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc24 + %B.addr.012 = phi i64* [ %B.addr.1.lcssa, %for.inc24 ], [ %B, %for.cond1.preheader.preheader ] + %i.011 = phi i64 [ %inc25, %for.inc24 ], [ 0, %for.cond1.preheader.preheader ] %cmp26 = icmp sgt i64 %n, 0 - br i1 %cmp26, label %for.cond4.preheader, label %for.inc24 + br i1 %cmp26, label %for.cond4.preheader.preheader, label %for.inc24 + +for.cond4.preheader.preheader: ; preds = %for.cond1.preheader + br label %for.cond4.preheader -for.cond4.preheader: ; preds = %for.inc21, %for.cond1.preheader - %B.addr.18 = phi i64* [ %B.addr.2.lcssa, %for.inc21 ], [ %B.addr.012, %for.cond1.preheader ] - %j.07 = phi i64 [ %inc22, %for.inc21 ], [ 0, %for.cond1.preheader ] +for.cond4.preheader: ; preds = %for.cond4.preheader.preheader, %for.inc21 + %B.addr.18 = phi i64* [ %B.addr.2.lcssa, %for.inc21 ], [ %B.addr.012, %for.cond4.preheader.preheader ] + %j.07 = phi i64 [ %inc22, %for.inc21 ], [ 0, %for.cond4.preheader.preheader ] %cmp51 = icmp sgt i64 %n, 0 - br i1 %cmp51, label %for.body6, label %for.cond10.loopexit + br i1 %cmp51, label %for.body6.preheader, label %for.cond10.loopexit -for.body6: ; preds = %for.body6, %for.cond4.preheader - %k.02 = phi i64 [ %inc, %for.body6 ], [ 0, %for.cond4.preheader ] +for.body6.preheader: ; preds = %for.cond4.preheader + br label %for.body6 + +for.body6: ; preds = %for.body6.preheader, %for.body6 + %k.02 = phi i64 [ %inc, %for.body6 ], [ 0, %for.body6.preheader ] %arrayidx8 = getelementptr inbounds [100 x [100 x i64]]* %A, i64 %i.011, i64 %j.07, i64 %k.02 store i64 %i.011, i64* %arrayidx8, align 8 %inc = add nsw i64 %k.02, 1 - %cmp5 = icmp slt i64 %inc, %n - br i1 %cmp5, label %for.body6, label %for.cond10.loopexit + %exitcond13 = icmp ne i64 %inc, %n + br i1 %exitcond13, label %for.body6, label %for.cond10.loopexit.loopexit + +for.cond10.loopexit.loopexit: ; preds = %for.body6 + br label %for.cond10.loopexit -for.cond10.loopexit: ; preds = %for.body6, %for.cond4.preheader +for.cond10.loopexit: ; preds = %for.cond10.loopexit.loopexit, %for.cond4.preheader %cmp113 = icmp sgt i64 %n, 0 - br i1 %cmp113, label %for.body12, label %for.inc21 + br i1 %cmp113, label %for.body12.preheader, label %for.inc21 -for.body12: ; preds = %for.body12, %for.cond10.loopexit - %k9.05 = phi i64 [ %inc19, %for.body12 ], [ 0, %for.cond10.loopexit ] - %B.addr.24 = phi i64* [ %incdec.ptr, %for.body12 ], [ %B.addr.18, %for.cond10.loopexit ] +for.body12.preheader: ; preds = %for.cond10.loopexit + br label %for.body12 + +for.body12: ; preds = %for.body12.preheader, %for.body12 + %k9.05 = phi i64 [ %inc19, %for.body12 ], [ 0, %for.body12.preheader ] + %B.addr.24 = phi i64* [ %incdec.ptr, %for.body12 ], [ %B.addr.18, %for.body12.preheader ] %add = add nsw i64 %k9.05, 1 %add13 = add nsw i64 %j.07, 2 %add14 = add nsw i64 %i.011, 3 %arrayidx17 = getelementptr inbounds [100 x [100 x i64]]* %A, i64 %add14, i64 %add13, i64 %add %0 = load i64* %arrayidx17, align 8 -; CHECK: da analyze - flow [-3 -2]! %incdec.ptr = getelementptr inbounds i64* %B.addr.24, i64 1 store i64 %0, i64* %B.addr.24, align 8 %inc19 = add nsw i64 %k9.05, 1 - %cmp11 = icmp slt i64 %inc19, %n - br i1 %cmp11, label %for.body12, label %for.inc21 + %exitcond = icmp ne i64 %inc19, %n + br i1 %exitcond, label %for.body12, label %for.inc21.loopexit -for.inc21: ; preds = %for.body12, %for.cond10.loopexit - %B.addr.2.lcssa = phi i64* [ %B.addr.18, %for.cond10.loopexit ], [ %incdec.ptr, %for.body12 ] +for.inc21.loopexit: ; preds = %for.body12 + %scevgep = getelementptr i64* %B.addr.18, i64 %n + br label %for.inc21 + +for.inc21: ; preds = %for.inc21.loopexit, %for.cond10.loopexit + %B.addr.2.lcssa = phi i64* [ %B.addr.18, %for.cond10.loopexit ], [ %scevgep, %for.inc21.loopexit ] %inc22 = add nsw i64 %j.07, 1 - %cmp2 = icmp slt i64 %inc22, %n - br i1 %cmp2, label %for.cond4.preheader, label %for.inc24 + %exitcond14 = icmp ne i64 %inc22, %n + br i1 %exitcond14, label %for.cond4.preheader, label %for.inc24.loopexit + +for.inc24.loopexit: ; preds = %for.inc21 + %B.addr.2.lcssa.lcssa = phi i64* [ %B.addr.2.lcssa, %for.inc21 ] + br label %for.inc24 -for.inc24: ; preds = %for.inc21, %for.cond1.preheader - %B.addr.1.lcssa = phi i64* [ %B.addr.012, %for.cond1.preheader ], [ %B.addr.2.lcssa, %for.inc21 ] +for.inc24: ; preds = %for.inc24.loopexit, %for.cond1.preheader + %B.addr.1.lcssa = phi i64* [ %B.addr.012, %for.cond1.preheader ], [ %B.addr.2.lcssa.lcssa, %for.inc24.loopexit ] %inc25 = add nsw i64 %i.011, 1 - %cmp = icmp slt i64 %inc25, %n - br i1 %cmp, label %for.cond1.preheader, label %for.end26 + %exitcond15 = icmp ne i64 %inc25, %n + br i1 %exitcond15, label %for.cond1.preheader, label %for.end26.loopexit + +for.end26.loopexit: ; preds = %for.inc24 + br label %for.end26 -for.end26: ; preds = %for.inc24, %entry +for.end26: ; preds = %for.end26.loopexit, %entry ret void } -;; classify subscripts ;; for (long int i = 0; i < n; i++) ;; for (long int j = 0; j < n; j++) ;; for (long int k = 0; k < n; k++) @@ -118,83 +154,127 @@ for.end26: ; preds = %for.inc24, %entry ;; for (long int s = 0; s < n; s++) ;; for (long int u = 0; u < n; u++) ;; for (long int t = 0; t < n; t++) { -;; A[i - 3] [j] [2] [k-1] [2*l + 1] [m] [p + q] [r + s] = ... -;; ... = A[i + 3] [2] [u] [1-k] [3*l - 1] [o] [1 + n] [t + 2]; +;; A[i - 3] [j] [2] [k-1] [2*l + 1] [m] [p + q] [r + s] = i; +;; *B++ = A[i + 3] [2] [u] [1-k] [3*l - 1] [o] [1 + n] [t + 2]; define void @p3(i64 %n, [100 x [100 x [100 x [100 x [100 x [100 x [100 x i64]]]]]]]* %A, i64* %B) nounwind uwtable ssp { entry: %cmp44 = icmp sgt i64 %n, 0 - br i1 %cmp44, label %for.cond1.preheader, label %for.end90 + br i1 %cmp44, label %for.cond1.preheader.preheader, label %for.end90 + +; CHECK: da analyze - output [0 0 0 0 0 S * * * * S S]! +; CHECK: da analyze - flow [-6 * * => * * * * * * * *] splitable! +; CHECK: da analyze - split level = 3, iteration = 1! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [0 S 0 0 S 0 S S S S 0 0]! +; CHECK: da analyze - confused! +; CHECK: da analyze - output [* * * * * * * * * * * *]! + +for.cond1.preheader.preheader: ; preds = %entry + br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc88, %entry - %B.addr.046 = phi i64* [ %B.addr.1.lcssa, %for.inc88 ], [ %B, %entry ] - %i.045 = phi i64 [ %inc89, %for.inc88 ], [ 0, %entry ] +for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc88 + %B.addr.046 = phi i64* [ %B.addr.1.lcssa, %for.inc88 ], [ %B, %for.cond1.preheader.preheader ] + %i.045 = phi i64 [ %inc89, %for.inc88 ], [ 0, %for.cond1.preheader.preheader ] %cmp240 = icmp sgt i64 %n, 0 - br i1 %cmp240, label %for.cond4.preheader, label %for.inc88 + br i1 %cmp240, label %for.cond4.preheader.preheader, label %for.inc88 -for.cond4.preheader: ; preds = %for.inc85, %for.cond1.preheader - %B.addr.142 = phi i64* [ %B.addr.2.lcssa, %for.inc85 ], [ %B.addr.046, %for.cond1.preheader ] - %j.041 = phi i64 [ %inc86, %for.inc85 ], [ 0, %for.cond1.preheader ] +for.cond4.preheader.preheader: ; preds = %for.cond1.preheader + br label %for.cond4.preheader + +for.cond4.preheader: ; preds = %for.cond4.preheader.preheader, %for.inc85 + %B.addr.142 = phi i64* [ %B.addr.2.lcssa, %for.inc85 ], [ %B.addr.046, %for.cond4.preheader.preheader ] + %j.041 = phi i64 [ %inc86, %for.inc85 ], [ 0, %for.cond4.preheader.preheader ] %cmp536 = icmp sgt i64 %n, 0 - br i1 %cmp536, label %for.cond7.preheader, label %for.inc85 + br i1 %cmp536, label %for.cond7.preheader.preheader, label %for.inc85 + +for.cond7.preheader.preheader: ; preds = %for.cond4.preheader + br label %for.cond7.preheader -for.cond7.preheader: ; preds = %for.inc82, %for.cond4.preheader - %B.addr.238 = phi i64* [ %B.addr.3.lcssa, %for.inc82 ], [ %B.addr.142, %for.cond4.preheader ] - %k.037 = phi i64 [ %inc83, %for.inc82 ], [ 0, %for.cond4.preheader ] +for.cond7.preheader: ; preds = %for.cond7.preheader.preheader, %for.inc82 + %B.addr.238 = phi i64* [ %B.addr.3.lcssa, %for.inc82 ], [ %B.addr.142, %for.cond7.preheader.preheader ] + %k.037 = phi i64 [ %inc83, %for.inc82 ], [ 0, %for.cond7.preheader.preheader ] %cmp832 = icmp sgt i64 %n, 0 - br i1 %cmp832, label %for.cond10.preheader, label %for.inc82 + br i1 %cmp832, label %for.cond10.preheader.preheader, label %for.inc82 + +for.cond10.preheader.preheader: ; preds = %for.cond7.preheader + br label %for.cond10.preheader -for.cond10.preheader: ; preds = %for.inc79, %for.cond7.preheader - %B.addr.334 = phi i64* [ %B.addr.4.lcssa, %for.inc79 ], [ %B.addr.238, %for.cond7.preheader ] - %l.033 = phi i64 [ %inc80, %for.inc79 ], [ 0, %for.cond7.preheader ] +for.cond10.preheader: ; preds = %for.cond10.preheader.preheader, %for.inc79 + %B.addr.334 = phi i64* [ %B.addr.4.lcssa, %for.inc79 ], [ %B.addr.238, %for.cond10.preheader.preheader ] + %l.033 = phi i64 [ %inc80, %for.inc79 ], [ 0, %for.cond10.preheader.preheader ] %cmp1128 = icmp sgt i64 %n, 0 - br i1 %cmp1128, label %for.cond13.preheader, label %for.inc79 + br i1 %cmp1128, label %for.cond13.preheader.preheader, label %for.inc79 -for.cond13.preheader: ; preds = %for.inc76, %for.cond10.preheader - %B.addr.430 = phi i64* [ %B.addr.5.lcssa, %for.inc76 ], [ %B.addr.334, %for.cond10.preheader ] - %m.029 = phi i64 [ %inc77, %for.inc76 ], [ 0, %for.cond10.preheader ] +for.cond13.preheader.preheader: ; preds = %for.cond10.preheader + br label %for.cond13.preheader + +for.cond13.preheader: ; preds = %for.cond13.preheader.preheader, %for.inc76 + %B.addr.430 = phi i64* [ %B.addr.5.lcssa, %for.inc76 ], [ %B.addr.334, %for.cond13.preheader.preheader ] + %m.029 = phi i64 [ %inc77, %for.inc76 ], [ 0, %for.cond13.preheader.preheader ] %cmp1424 = icmp sgt i64 %n, 0 - br i1 %cmp1424, label %for.cond16.preheader, label %for.inc76 + br i1 %cmp1424, label %for.cond16.preheader.preheader, label %for.inc76 + +for.cond16.preheader.preheader: ; preds = %for.cond13.preheader + br label %for.cond16.preheader -for.cond16.preheader: ; preds = %for.inc73, %for.cond13.preheader - %B.addr.526 = phi i64* [ %B.addr.6.lcssa, %for.inc73 ], [ %B.addr.430, %for.cond13.preheader ] - %o.025 = phi i64 [ %inc74, %for.inc73 ], [ 0, %for.cond13.preheader ] +for.cond16.preheader: ; preds = %for.cond16.preheader.preheader, %for.inc73 + %B.addr.526 = phi i64* [ %B.addr.6.lcssa, %for.inc73 ], [ %B.addr.430, %for.cond16.preheader.preheader ] + %o.025 = phi i64 [ %inc74, %for.inc73 ], [ 0, %for.cond16.preheader.preheader ] %cmp1720 = icmp sgt i64 %n, 0 - br i1 %cmp1720, label %for.cond19.preheader, label %for.inc73 + br i1 %cmp1720, label %for.cond19.preheader.preheader, label %for.inc73 -for.cond19.preheader: ; preds = %for.inc70, %for.cond16.preheader - %B.addr.622 = phi i64* [ %B.addr.7.lcssa, %for.inc70 ], [ %B.addr.526, %for.cond16.preheader ] - %p.021 = phi i64 [ %inc71, %for.inc70 ], [ 0, %for.cond16.preheader ] +for.cond19.preheader.preheader: ; preds = %for.cond16.preheader + br label %for.cond19.preheader + +for.cond19.preheader: ; preds = %for.cond19.preheader.preheader, %for.inc70 + %B.addr.622 = phi i64* [ %B.addr.7.lcssa, %for.inc70 ], [ %B.addr.526, %for.cond19.preheader.preheader ] + %p.021 = phi i64 [ %inc71, %for.inc70 ], [ 0, %for.cond19.preheader.preheader ] %cmp2016 = icmp sgt i64 %n, 0 - br i1 %cmp2016, label %for.cond22.preheader, label %for.inc70 + br i1 %cmp2016, label %for.cond22.preheader.preheader, label %for.inc70 + +for.cond22.preheader.preheader: ; preds = %for.cond19.preheader + br label %for.cond22.preheader -for.cond22.preheader: ; preds = %for.inc67, %for.cond19.preheader - %B.addr.718 = phi i64* [ %B.addr.8.lcssa, %for.inc67 ], [ %B.addr.622, %for.cond19.preheader ] - %q.017 = phi i64 [ %inc68, %for.inc67 ], [ 0, %for.cond19.preheader ] +for.cond22.preheader: ; preds = %for.cond22.preheader.preheader, %for.inc67 + %B.addr.718 = phi i64* [ %B.addr.8.lcssa, %for.inc67 ], [ %B.addr.622, %for.cond22.preheader.preheader ] + %q.017 = phi i64 [ %inc68, %for.inc67 ], [ 0, %for.cond22.preheader.preheader ] %cmp2312 = icmp sgt i64 %n, 0 - br i1 %cmp2312, label %for.cond25.preheader, label %for.inc67 + br i1 %cmp2312, label %for.cond25.preheader.preheader, label %for.inc67 -for.cond25.preheader: ; preds = %for.inc64, %for.cond22.preheader - %B.addr.814 = phi i64* [ %B.addr.9.lcssa, %for.inc64 ], [ %B.addr.718, %for.cond22.preheader ] - %r.013 = phi i64 [ %inc65, %for.inc64 ], [ 0, %for.cond22.preheader ] +for.cond25.preheader.preheader: ; preds = %for.cond22.preheader + br label %for.cond25.preheader + +for.cond25.preheader: ; preds = %for.cond25.preheader.preheader, %for.inc64 + %B.addr.814 = phi i64* [ %B.addr.9.lcssa, %for.inc64 ], [ %B.addr.718, %for.cond25.preheader.preheader ] + %r.013 = phi i64 [ %inc65, %for.inc64 ], [ 0, %for.cond25.preheader.preheader ] %cmp268 = icmp sgt i64 %n, 0 - br i1 %cmp268, label %for.cond28.preheader, label %for.inc64 + br i1 %cmp268, label %for.cond28.preheader.preheader, label %for.inc64 + +for.cond28.preheader.preheader: ; preds = %for.cond25.preheader + br label %for.cond28.preheader -for.cond28.preheader: ; preds = %for.inc61, %for.cond25.preheader - %B.addr.910 = phi i64* [ %B.addr.10.lcssa, %for.inc61 ], [ %B.addr.814, %for.cond25.preheader ] - %s.09 = phi i64 [ %inc62, %for.inc61 ], [ 0, %for.cond25.preheader ] +for.cond28.preheader: ; preds = %for.cond28.preheader.preheader, %for.inc61 + %B.addr.910 = phi i64* [ %B.addr.10.lcssa, %for.inc61 ], [ %B.addr.814, %for.cond28.preheader.preheader ] + %s.09 = phi i64 [ %inc62, %for.inc61 ], [ 0, %for.cond28.preheader.preheader ] %cmp294 = icmp sgt i64 %n, 0 - br i1 %cmp294, label %for.cond31.preheader, label %for.inc61 + br i1 %cmp294, label %for.cond31.preheader.preheader, label %for.inc61 -for.cond31.preheader: ; preds = %for.inc58, %for.cond28.preheader - %u.06 = phi i64 [ %inc59, %for.inc58 ], [ 0, %for.cond28.preheader ] - %B.addr.105 = phi i64* [ %B.addr.11.lcssa, %for.inc58 ], [ %B.addr.910, %for.cond28.preheader ] +for.cond31.preheader.preheader: ; preds = %for.cond28.preheader + br label %for.cond31.preheader + +for.cond31.preheader: ; preds = %for.cond31.preheader.preheader, %for.inc58 + %u.06 = phi i64 [ %inc59, %for.inc58 ], [ 0, %for.cond31.preheader.preheader ] + %B.addr.105 = phi i64* [ %B.addr.11.lcssa, %for.inc58 ], [ %B.addr.910, %for.cond31.preheader.preheader ] %cmp321 = icmp sgt i64 %n, 0 - br i1 %cmp321, label %for.body33, label %for.inc58 + br i1 %cmp321, label %for.body33.preheader, label %for.inc58 + +for.body33.preheader: ; preds = %for.cond31.preheader + br label %for.body33 -for.body33: ; preds = %for.body33, %for.cond31.preheader - %t.03 = phi i64 [ %inc, %for.body33 ], [ 0, %for.cond31.preheader ] - %B.addr.112 = phi i64* [ %incdec.ptr, %for.body33 ], [ %B.addr.105, %for.cond31.preheader ] +for.body33: ; preds = %for.body33.preheader, %for.body33 + %t.03 = phi i64 [ %inc, %for.body33 ], [ 0, %for.body33.preheader ] + %B.addr.112 = phi i64* [ %incdec.ptr, %for.body33 ], [ %B.addr.105, %for.body33.preheader ] %add = add nsw i64 %r.013, %s.09 %add34 = add nsw i64 %p.021, %q.017 %mul = shl nsw i64 %l.033, 1 @@ -211,99 +291,153 @@ for.body33: ; preds = %for.body33, %for.co %add49 = add nsw i64 %i.045, 3 %arrayidx57 = getelementptr inbounds [100 x [100 x [100 x [100 x [100 x [100 x [100 x i64]]]]]]]* %A, i64 %add49, i64 2, i64 %u.06, i64 %sub48, i64 %sub47, i64 %o.025, i64 %add45, i64 %add44 %0 = load i64* %arrayidx57, align 8 -; CHECK: da analyze - flow [-6 * * => * * * * * * * *] splitable! -; CHECK: da analyze - split level = 3, iteration = 1! %incdec.ptr = getelementptr inbounds i64* %B.addr.112, i64 1 store i64 %0, i64* %B.addr.112, align 8 %inc = add nsw i64 %t.03, 1 - %cmp32 = icmp slt i64 %inc, %n - br i1 %cmp32, label %for.body33, label %for.inc58 + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body33, label %for.inc58.loopexit + +for.inc58.loopexit: ; preds = %for.body33 + %scevgep = getelementptr i64* %B.addr.105, i64 %n + br label %for.inc58 -for.inc58: ; preds = %for.body33, %for.cond31.preheader - %B.addr.11.lcssa = phi i64* [ %B.addr.105, %for.cond31.preheader ], [ %incdec.ptr, %for.body33 ] +for.inc58: ; preds = %for.inc58.loopexit, %for.cond31.preheader + %B.addr.11.lcssa = phi i64* [ %B.addr.105, %for.cond31.preheader ], [ %scevgep, %for.inc58.loopexit ] %inc59 = add nsw i64 %u.06, 1 - %cmp29 = icmp slt i64 %inc59, %n - br i1 %cmp29, label %for.cond31.preheader, label %for.inc61 + %exitcond48 = icmp ne i64 %inc59, %n + br i1 %exitcond48, label %for.cond31.preheader, label %for.inc61.loopexit -for.inc61: ; preds = %for.inc58, %for.cond28.preheader - %B.addr.10.lcssa = phi i64* [ %B.addr.910, %for.cond28.preheader ], [ %B.addr.11.lcssa, %for.inc58 ] +for.inc61.loopexit: ; preds = %for.inc58 + %B.addr.11.lcssa.lcssa = phi i64* [ %B.addr.11.lcssa, %for.inc58 ] + br label %for.inc61 + +for.inc61: ; preds = %for.inc61.loopexit, %for.cond28.preheader + %B.addr.10.lcssa = phi i64* [ %B.addr.910, %for.cond28.preheader ], [ %B.addr.11.lcssa.lcssa, %for.inc61.loopexit ] %inc62 = add nsw i64 %s.09, 1 - %cmp26 = icmp slt i64 %inc62, %n - br i1 %cmp26, label %for.cond28.preheader, label %for.inc64 + %exitcond49 = icmp ne i64 %inc62, %n + br i1 %exitcond49, label %for.cond28.preheader, label %for.inc64.loopexit + +for.inc64.loopexit: ; preds = %for.inc61 + %B.addr.10.lcssa.lcssa = phi i64* [ %B.addr.10.lcssa, %for.inc61 ] + br label %for.inc64 -for.inc64: ; preds = %for.inc61, %for.cond25.preheader - %B.addr.9.lcssa = phi i64* [ %B.addr.814, %for.cond25.preheader ], [ %B.addr.10.lcssa, %for.inc61 ] +for.inc64: ; preds = %for.inc64.loopexit, %for.cond25.preheader + %B.addr.9.lcssa = phi i64* [ %B.addr.814, %for.cond25.preheader ], [ %B.addr.10.lcssa.lcssa, %for.inc64.loopexit ] %inc65 = add nsw i64 %r.013, 1 - %cmp23 = icmp slt i64 %inc65, %n - br i1 %cmp23, label %for.cond25.preheader, label %for.inc67 + %exitcond50 = icmp ne i64 %inc65, %n + br i1 %exitcond50, label %for.cond25.preheader, label %for.inc67.loopexit -for.inc67: ; preds = %for.inc64, %for.cond22.preheader - %B.addr.8.lcssa = phi i64* [ %B.addr.718, %for.cond22.preheader ], [ %B.addr.9.lcssa, %for.inc64 ] +for.inc67.loopexit: ; preds = %for.inc64 + %B.addr.9.lcssa.lcssa = phi i64* [ %B.addr.9.lcssa, %for.inc64 ] + br label %for.inc67 + +for.inc67: ; preds = %for.inc67.loopexit, %for.cond22.preheader + %B.addr.8.lcssa = phi i64* [ %B.addr.718, %for.cond22.preheader ], [ %B.addr.9.lcssa.lcssa, %for.inc67.loopexit ] %inc68 = add nsw i64 %q.017, 1 - %cmp20 = icmp slt i64 %inc68, %n - br i1 %cmp20, label %for.cond22.preheader, label %for.inc70 + %exitcond51 = icmp ne i64 %inc68, %n + br i1 %exitcond51, label %for.cond22.preheader, label %for.inc70.loopexit + +for.inc70.loopexit: ; preds = %for.inc67 + %B.addr.8.lcssa.lcssa = phi i64* [ %B.addr.8.lcssa, %for.inc67 ] + br label %for.inc70 -for.inc70: ; preds = %for.inc67, %for.cond19.preheader - %B.addr.7.lcssa = phi i64* [ %B.addr.622, %for.cond19.preheader ], [ %B.addr.8.lcssa, %for.inc67 ] +for.inc70: ; preds = %for.inc70.loopexit, %for.cond19.preheader + %B.addr.7.lcssa = phi i64* [ %B.addr.622, %for.cond19.preheader ], [ %B.addr.8.lcssa.lcssa, %for.inc70.loopexit ] %inc71 = add nsw i64 %p.021, 1 - %cmp17 = icmp slt i64 %inc71, %n - br i1 %cmp17, label %for.cond19.preheader, label %for.inc73 + %exitcond52 = icmp ne i64 %inc71, %n + br i1 %exitcond52, label %for.cond19.preheader, label %for.inc73.loopexit -for.inc73: ; preds = %for.inc70, %for.cond16.preheader - %B.addr.6.lcssa = phi i64* [ %B.addr.526, %for.cond16.preheader ], [ %B.addr.7.lcssa, %for.inc70 ] +for.inc73.loopexit: ; preds = %for.inc70 + %B.addr.7.lcssa.lcssa = phi i64* [ %B.addr.7.lcssa, %for.inc70 ] + br label %for.inc73 + +for.inc73: ; preds = %for.inc73.loopexit, %for.cond16.preheader + %B.addr.6.lcssa = phi i64* [ %B.addr.526, %for.cond16.preheader ], [ %B.addr.7.lcssa.lcssa, %for.inc73.loopexit ] %inc74 = add nsw i64 %o.025, 1 - %cmp14 = icmp slt i64 %inc74, %n - br i1 %cmp14, label %for.cond16.preheader, label %for.inc76 + %exitcond53 = icmp ne i64 %inc74, %n + br i1 %exitcond53, label %for.cond16.preheader, label %for.inc76.loopexit + +for.inc76.loopexit: ; preds = %for.inc73 + %B.addr.6.lcssa.lcssa = phi i64* [ %B.addr.6.lcssa, %for.inc73 ] + br label %for.inc76 -for.inc76: ; preds = %for.inc73, %for.cond13.preheader - %B.addr.5.lcssa = phi i64* [ %B.addr.430, %for.cond13.preheader ], [ %B.addr.6.lcssa, %for.inc73 ] +for.inc76: ; preds = %for.inc76.loopexit, %for.cond13.preheader + %B.addr.5.lcssa = phi i64* [ %B.addr.430, %for.cond13.preheader ], [ %B.addr.6.lcssa.lcssa, %for.inc76.loopexit ] %inc77 = add nsw i64 %m.029, 1 - %cmp11 = icmp slt i64 %inc77, %n - br i1 %cmp11, label %for.cond13.preheader, label %for.inc79 + %exitcond54 = icmp ne i64 %inc77, %n + br i1 %exitcond54, label %for.cond13.preheader, label %for.inc79.loopexit + +for.inc79.loopexit: ; preds = %for.inc76 + %B.addr.5.lcssa.lcssa = phi i64* [ %B.addr.5.lcssa, %for.inc76 ] + br label %for.inc79 -for.inc79: ; preds = %for.inc76, %for.cond10.preheader - %B.addr.4.lcssa = phi i64* [ %B.addr.334, %for.cond10.preheader ], [ %B.addr.5.lcssa, %for.inc76 ] +for.inc79: ; preds = %for.inc79.loopexit, %for.cond10.preheader + %B.addr.4.lcssa = phi i64* [ %B.addr.334, %for.cond10.preheader ], [ %B.addr.5.lcssa.lcssa, %for.inc79.loopexit ] %inc80 = add nsw i64 %l.033, 1 - %cmp8 = icmp slt i64 %inc80, %n - br i1 %cmp8, label %for.cond10.preheader, label %for.inc82 + %exitcond55 = icmp ne i64 %inc80, %n + br i1 %exitcond55, label %for.cond10.preheader, label %for.inc82.loopexit -for.inc82: ; preds = %for.inc79, %for.cond7.preheader - %B.addr.3.lcssa = phi i64* [ %B.addr.238, %for.cond7.preheader ], [ %B.addr.4.lcssa, %for.inc79 ] +for.inc82.loopexit: ; preds = %for.inc79 + %B.addr.4.lcssa.lcssa = phi i64* [ %B.addr.4.lcssa, %for.inc79 ] + br label %for.inc82 + +for.inc82: ; preds = %for.inc82.loopexit, %for.cond7.preheader + %B.addr.3.lcssa = phi i64* [ %B.addr.238, %for.cond7.preheader ], [ %B.addr.4.lcssa.lcssa, %for.inc82.loopexit ] %inc83 = add nsw i64 %k.037, 1 - %cmp5 = icmp slt i64 %inc83, %n - br i1 %cmp5, label %for.cond7.preheader, label %for.inc85 + %exitcond56 = icmp ne i64 %inc83, %n + br i1 %exitcond56, label %for.cond7.preheader, label %for.inc85.loopexit + +for.inc85.loopexit: ; preds = %for.inc82 + %B.addr.3.lcssa.lcssa = phi i64* [ %B.addr.3.lcssa, %for.inc82 ] + br label %for.inc85 -for.inc85: ; preds = %for.inc82, %for.cond4.preheader - %B.addr.2.lcssa = phi i64* [ %B.addr.142, %for.cond4.preheader ], [ %B.addr.3.lcssa, %for.inc82 ] +for.inc85: ; preds = %for.inc85.loopexit, %for.cond4.preheader + %B.addr.2.lcssa = phi i64* [ %B.addr.142, %for.cond4.preheader ], [ %B.addr.3.lcssa.lcssa, %for.inc85.loopexit ] %inc86 = add nsw i64 %j.041, 1 - %cmp2 = icmp slt i64 %inc86, %n - br i1 %cmp2, label %for.cond4.preheader, label %for.inc88 + %exitcond57 = icmp ne i64 %inc86, %n + br i1 %exitcond57, label %for.cond4.preheader, label %for.inc88.loopexit -for.inc88: ; preds = %for.inc85, %for.cond1.preheader - %B.addr.1.lcssa = phi i64* [ %B.addr.046, %for.cond1.preheader ], [ %B.addr.2.lcssa, %for.inc85 ] +for.inc88.loopexit: ; preds = %for.inc85 + %B.addr.2.lcssa.lcssa = phi i64* [ %B.addr.2.lcssa, %for.inc85 ] + br label %for.inc88 + +for.inc88: ; preds = %for.inc88.loopexit, %for.cond1.preheader + %B.addr.1.lcssa = phi i64* [ %B.addr.046, %for.cond1.preheader ], [ %B.addr.2.lcssa.lcssa, %for.inc88.loopexit ] %inc89 = add nsw i64 %i.045, 1 - %cmp = icmp slt i64 %inc89, %n - br i1 %cmp, label %for.cond1.preheader, label %for.end90 + %exitcond58 = icmp ne i64 %inc89, %n + br i1 %exitcond58, label %for.cond1.preheader, label %for.end90.loopexit + +for.end90.loopexit: ; preds = %for.inc88 + br label %for.end90 -for.end90: ; preds = %for.inc88, %entry +for.end90: ; preds = %for.end90.loopexit, %entry ret void } -;; cleanup around chars, shorts, ints -;;void p4(int *A, int *B, long int n) -;; for (char i = 0; i < n; i++) -;; A[i + 2] = ... -;; ... = A[i]; +;;void p4(int *A, int *B, long int n) { +;; for (char i = 0; i < n; i++) { +;; A[i + 2] = i; +;; *B++ = A[i]; define void @p4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp sgt i64 %n, 0 - br i1 %cmp1, label %for.body, label %for.end + br i1 %cmp1, label %for.body.preheader, label %for.end -for.body: ; preds = %for.body, %entry - %i.03 = phi i8 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +; CHECK: da analyze - output [*]! +; CHECK: da analyze - flow [*|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i8 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv2 = sext i8 %i.03 to i32 %conv3 = sext i8 %i.03 to i64 %add = add i64 %conv3, 2 @@ -312,32 +446,44 @@ for.body: ; preds = %for.body, %entry %idxprom4 = sext i8 %i.03 to i64 %arrayidx5 = getelementptr inbounds i32* %A, i64 %idxprom4 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - flow [*|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i8 %i.03, 1 %conv = sext i8 %inc to i64 %cmp = icmp slt i64 %conv, %n - br i1 %cmp, label %for.body, label %for.end + br i1 %cmp, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;;void p5(int *A, int *B, long int n) -;; for (short i = 0; i < n; i++) -;; A[i + 2] = ... -;; ... = A[i]; +;;void p5(int *A, int *B, long int n) { +;; for (short i = 0; i < n; i++) { +;; A[i + 2] = i; +;; *B++ = A[i]; define void @p5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp sgt i64 %n, 0 - br i1 %cmp1, label %for.body, label %for.end + br i1 %cmp1, label %for.body.preheader, label %for.end -for.body: ; preds = %for.body, %entry - %i.03 = phi i16 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +; CHECK: da analyze - output [*]! +; CHECK: da analyze - flow [*|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i16 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv2 = sext i16 %i.03 to i32 %conv3 = sext i16 %i.03 to i64 %add = add i64 %conv3, 2 @@ -346,124 +492,208 @@ for.body: ; preds = %for.body, %entry %idxprom4 = sext i16 %i.03 to i64 %arrayidx5 = getelementptr inbounds i32* %A, i64 %idxprom4 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - flow [*|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i16 %i.03, 1 %conv = sext i16 %inc to i64 %cmp = icmp slt i64 %conv, %n - br i1 %cmp, label %for.body, label %for.end + br i1 %cmp, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;;void p6(int *A, int *B, long int n) -;; for (int i = 0; i < n; i++) -;; A[i + 2] = ... -;; ... = A[i]; +;;void p6(int *A, int *B, long int n) { +;; for (int i = 0; i < n; i++) { +;; A[i + 2] = i; +;; *B++ = A[i]; define void @p6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp sgt i64 %n, 0 - br i1 %cmp1, label %for.body, label %for.end + br i1 %cmp1, label %for.body.preheader, label %for.end -for.body: ; preds = %for.body, %entry - %i.03 = phi i32 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] - %add = add nsw i32 %i.03, 2 - %idxprom = sext i32 %add to i64 - %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom - store i32 %i.03, i32* %arrayidx, align 4 - %idxprom2 = sext i32 %i.03 to i64 - %arrayidx3 = getelementptr inbounds i32* %A, i64 %idxprom2 - %0 = load i32* %arrayidx3, align 4 +; CHECK: da analyze - none! ; CHECK: da analyze - consistent flow [2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] + %0 = add nsw i64 %indvars.iv, 2 + %arrayidx = getelementptr inbounds i32* %A, i64 %0 + %1 = trunc i64 %indvars.iv to i32 + store i32 %1, i32* %arrayidx, align 4 + %arrayidx3 = getelementptr inbounds i32* %A, i64 %indvars.iv + %2 = load i32* %arrayidx3, align 4 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 - store i32 %0, i32* %B.addr.02, align 4 - %inc = add nsw i32 %i.03, 1 - %conv = sext i32 %inc to i64 - %cmp = icmp slt i64 %conv, %n - br i1 %cmp, label %for.body, label %for.end + store i32 %2, i32* %B.addr.02, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %exitcond = icmp ne i64 %indvars.iv.next, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;;void p7(unsigned *A, unsigned *B, char n) -;; A[n] = ... -;; ... = A[n + 1]; +;;void p7(unsigned *A, unsigned *B, char n) { +;; A[n] = 0; +;; *B = A[n + 1]; define void @p7(i32* %A, i32* %B, i8 signext %n) nounwind uwtable ssp { entry: %idxprom = sext i8 %n to i64 %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + store i32 0, i32* %arrayidx, align 4 %conv = sext i8 %n to i64 %add = add i64 %conv, 1 %arrayidx2 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - none! store i32 %0, i32* %B, align 4 ret void } - -;;void p8(unsigned *A, unsigned *B, short n) -;; A[n] = ... -;; ... = A[n + 1]; +;;void p8(unsigned *A, unsigned *B, short n) { +;; A[n] = 0; +;; *B = A[n + 1]; define void @p8(i32* %A, i32* %B, i16 signext %n) nounwind uwtable ssp { entry: %idxprom = sext i16 %n to i64 %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom store i32 0, i32* %arrayidx, align 4 + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + %conv = sext i16 %n to i64 %add = add i64 %conv, 1 %arrayidx2 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - none! store i32 %0, i32* %B, align 4 ret void } -;;void p9(unsigned *A, unsigned *B, int n) -;; A[n] = ... -;; ... = A[n + 1]; +;;void p9(unsigned *A, unsigned *B, int n) { +;; A[n] = 0; +;; *B = A[n + 1]; define void @p9(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: %idxprom = sext i32 %n to i64 %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom store i32 0, i32* %arrayidx, align 4 + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + %add = add nsw i32 %n, 1 %idxprom1 = sext i32 %add to i64 %arrayidx2 = getelementptr inbounds i32* %A, i64 %idxprom1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - none! store i32 %0, i32* %B, align 4 ret void } -;;void p10(unsigned *A, unsigned *B, unsigned n) -;; A[n] = ... -;; ... = A[n + 1]; +;;void p10(unsigned *A, unsigned *B, unsigned n) { +;; A[n] = 0; +;; *B = A[n + 1]; define void @p10(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: %idxprom = zext i32 %n to i64 %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom store i32 0, i32* %arrayidx, align 4 + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + %add = add i32 %n, 1 %idxprom1 = zext i32 %add to i64 %arrayidx2 = getelementptr inbounds i32* %A, i64 %idxprom1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - none! store i32 %0, i32* %B, align 4 ret void } + + +;;typedef struct { int v; } S; +;; +;;void f(S *s, unsigned size) { +;; S *i = s, *e = s + size - 1; +;; while (i != e) { +;; *i = *(i + 1); +;; ++i; + +%struct.S = type { i32 } + +define void @f(%struct.S* %s, i32 %size) nounwind uwtable ssp { +entry: + %idx.ext = zext i32 %size to i64 + %add.ptr.sum = add i64 %idx.ext, -1 + %add.ptr1 = getelementptr inbounds %struct.S* %s, i64 %add.ptr.sum + %cmp1 = icmp eq i64 %add.ptr.sum, 0 + br i1 %cmp1, label %while.end, label %while.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - consistent anti [1]! +; CHECK: da analyze - none! + +while.body.preheader: ; preds = %entry + br label %while.body + +while.body: ; preds = %while.body.preheader, %while.body + %i.02 = phi %struct.S* [ %incdec.ptr, %while.body ], [ %s, %while.body.preheader ] + %0 = getelementptr inbounds %struct.S* %i.02, i64 1, i32 0 + %1 = load i32* %0, align 4 + %2 = getelementptr inbounds %struct.S* %i.02, i64 0, i32 0 + store i32 %1, i32* %2, align 4 + %incdec.ptr = getelementptr inbounds %struct.S* %i.02, i64 1 + %cmp = icmp eq %struct.S* %incdec.ptr, %add.ptr1 + br i1 %cmp, label %while.end.loopexit, label %while.body + +while.end.loopexit: ; preds = %while.body + br label %while.end + +while.end: ; preds = %while.end.loopexit, %entry + ret void +} + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind diff --git a/test/Analysis/DependenceAnalysis/Propagating.ll b/test/Analysis/DependenceAnalysis/Propagating.ll index 076348c68dc8..f9034ede9d0b 100644 --- a/test/Analysis/DependenceAnalysis/Propagating.ll +++ b/test/Analysis/DependenceAnalysis/Propagating.ll @@ -6,7 +6,7 @@ target triple = "x86_64-apple-macosx10.6.0" ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) +;; for (long int j = 0; j < 100; j++) { ;; A[i + 1][i + j] = i; ;; *B++ = A[i][i + j]; @@ -14,12 +14,19 @@ define void @prop0([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc9, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc9 ] +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [1 -1]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc9 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ] %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -30,17 +37,17 @@ for.body3: ; preds = %for.body3, %for.con %add6 = add nsw i64 %i.03, %j.02 %arrayidx8 = getelementptr inbounds [100 x i32]* %A, i64 %i.03, i64 %add6 %0 = load i32* %arrayidx8, align 4 -; CHECK: da analyze - consistent flow [1 -1]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc9 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc9 for.inc9: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc10 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc10, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end11 + %exitcond5 = icmp ne i64 %inc10, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end11 for.end11: ; preds = %for.inc9 ret void @@ -49,25 +56,32 @@ for.end11: ; preds = %for.inc9 ;; for (long int i = 0; i < 100; i++) ;; for (long int j = 0; j < 100; j++) -;; for (long int k = 0; k < 100; k++) -;; A[j - i][i + 1][j + k] = ... -;; ... = A[j - i][i][j + k]; +;; for (long int k = 0; k < 100; k++) { +;; A[j - i][i + 1][j + k] = i; +;; *B++ = A[j - i][i][j + k]; define void @prop1([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc18, %entry - %B.addr.06 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc18 ] +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [1 1 -1]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc18 + %B.addr.06 = phi i32* [ %B, %entry ], [ %scevgep7, %for.inc18 ] %i.05 = phi i64 [ 0, %entry ], [ %inc19, %for.inc18 ] br label %for.cond4.preheader -for.cond4.preheader: ; preds = %for.inc15, %for.cond1.preheader - %B.addr.14 = phi i32* [ %B.addr.06, %for.cond1.preheader ], [ %incdec.ptr, %for.inc15 ] +for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc15 + %B.addr.14 = phi i32* [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc15 ] %j.03 = phi i64 [ 0, %for.cond1.preheader ], [ %inc16, %for.inc15 ] br label %for.body6 -for.body6: ; preds = %for.body6, %for.cond4.preheader +for.body6: ; preds = %for.cond4.preheader, %for.body6 %k.02 = phi i64 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ] %B.addr.21 = phi i32* [ %B.addr.14, %for.cond4.preheader ], [ %incdec.ptr, %for.body6 ] %conv = trunc i64 %i.05 to i32 @@ -80,22 +94,23 @@ for.body6: ; preds = %for.body6, %for.con %sub11 = sub nsw i64 %j.03, %i.05 %arrayidx14 = getelementptr inbounds [100 x [100 x i32]]* %A, i64 %sub11, i64 %i.05, i64 %add10 %0 = load i32* %arrayidx14, align 4 -; CHECK: da analyze - consistent flow [1 1 -1]! %incdec.ptr = getelementptr inbounds i32* %B.addr.21, i64 1 store i32 %0, i32* %B.addr.21, align 4 %inc = add nsw i64 %k.02, 1 - %cmp5 = icmp slt i64 %inc, 100 - br i1 %cmp5, label %for.body6, label %for.inc15 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body6, label %for.inc15 for.inc15: ; preds = %for.body6 + %scevgep = getelementptr i32* %B.addr.14, i64 100 %inc16 = add nsw i64 %j.03, 1 - %cmp2 = icmp slt i64 %inc16, 100 - br i1 %cmp2, label %for.cond4.preheader, label %for.inc18 + %exitcond8 = icmp ne i64 %inc16, 100 + br i1 %exitcond8, label %for.cond4.preheader, label %for.inc18 for.inc18: ; preds = %for.inc15 + %scevgep7 = getelementptr i32* %B.addr.06, i64 10000 %inc19 = add nsw i64 %i.05, 1 - %cmp = icmp slt i64 %inc19, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end20 + %exitcond9 = icmp ne i64 %inc19, 100 + br i1 %exitcond9, label %for.cond1.preheader, label %for.end20 for.end20: ; preds = %for.inc18 ret void @@ -103,20 +118,27 @@ for.end20: ; preds = %for.inc18 ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[i - 1][2*i] = ... -;; ... = A[i][i + j + 110]; +;; for (long int j = 0; j < 100; j++) { +;; A[i - 1][2*i] = i; +;; *B++ = A[i][i + j + 110]; define void @prop2([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc8, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc8 ] +; CHECK: da analyze - consistent output [0 S]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc8 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ] %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -128,17 +150,17 @@ for.body3: ; preds = %for.body3, %for.con %add5 = add nsw i64 %add, 110 %arrayidx7 = getelementptr inbounds [100 x i32]* %A, i64 %i.03, i64 %add5 %0 = load i32* %arrayidx7, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc8 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc8 for.inc8: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc9 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc9, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end10 + %exitcond5 = icmp ne i64 %inc9, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end10 for.end10: ; preds = %for.inc8 ret void @@ -146,20 +168,27 @@ for.end10: ; preds = %for.inc8 ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[i][2*j + i] = ... -;; ... = A[i][2*j - i + 5]; +;; for (long int j = 0; j < 100; j++) { +;; A[i][2*j + i] = i; +;; *B++ = A[i][2*j - i + 5]; define void @prop3([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc9, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc9 ] +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc9 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ] %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -172,39 +201,45 @@ for.body3: ; preds = %for.body3, %for.con %add6 = add nsw i64 %sub, 5 %arrayidx8 = getelementptr inbounds [100 x i32]* %A, i64 %i.03, i64 %add6 %0 = load i32* %arrayidx8, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc9 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc9 for.inc9: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc10 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc10, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end11 + %exitcond5 = icmp ne i64 %inc10, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end11 for.end11: ; preds = %for.inc9 ret void } -;; propagate Distance ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[i + 2][2*i + j + 1] = ... -;; ... = A[i][2*i + j]; +;; for (long int j = 0; j < 100; j++) { +;; A[i + 2][2*i + j + 1] = i; +;; *B++ = A[i][2*i + j]; define void @prop4([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc11, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc11 ] +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [2 -3]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc11 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc11 ] %i.03 = phi i64 [ 0, %entry ], [ %inc12, %for.inc11 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -218,39 +253,46 @@ for.body3: ; preds = %for.body3, %for.con %add8 = add nsw i64 %mul7, %j.02 %arrayidx10 = getelementptr inbounds [100 x i32]* %A, i64 %i.03, i64 %add8 %0 = load i32* %arrayidx10, align 4 -; CHECK: da analyze - consistent flow [2 -3]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc11 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc11 for.inc11: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc12 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc12, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end13 + %exitcond5 = icmp ne i64 %inc12, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end13 for.end13: ; preds = %for.inc11 ret void } -;; propagate Point ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[3*i - 18][22 - i][2*i + j] = ... -;; ... = A[i][i][3*i + j]; +;; for (long int j = 0; j < 100; j++) { +;; A[3*i - 18][22 - i][2*i + j] = i; +;; *B++ = A[i][i][3*i + j]; define void @prop5([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc13, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc13 ] +; CHECK: da analyze - none! +; CHECK: da analyze - flow [< -16] splitable! +; CHECK: da analyze - split level = 1, iteration = 11! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc13 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc13 ] %i.03 = phi i64 [ 0, %entry ], [ %inc14, %for.inc13 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -265,40 +307,45 @@ for.body3: ; preds = %for.body3, %for.con %add9 = add nsw i64 %mul8, %j.02 %arrayidx12 = getelementptr inbounds [100 x [100 x i32]]* %A, i64 %i.03, i64 %i.03, i64 %add9 %0 = load i32* %arrayidx12, align 4 -; CHECK: da analyze - flow [< -16] splitable! -; CHECK: da analyze - split level = 1, iteration = 11! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc13 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc13 for.inc13: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc14 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc14, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end15 + %exitcond5 = icmp ne i64 %inc14, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end15 for.end15: ; preds = %for.inc13 ret void } -;; propagate Line ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[i + 1][4*i + j + 2] = ... -;; ... = A[2*i][8*i + j]; +;; for (long int j = 0; j < 100; j++) { +;; A[i + 1][4*i + j + 2] = i; +;; *B++ = A[2*i][8*i + j]; define void @prop6([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc12, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc12 ] +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=> -2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc12 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc12 ] %i.03 = phi i64 [ 0, %entry ], [ %inc13, %for.inc12 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -313,17 +360,17 @@ for.body3: ; preds = %for.body3, %for.con %mul9 = shl nsw i64 %i.03, 1 %arrayidx11 = getelementptr inbounds [100 x i32]* %A, i64 %mul9, i64 %add8 %0 = load i32* %arrayidx11, align 4 -; CHECK: da analyze - flow [=> -2]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc12 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc12 for.inc12: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc13 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc13, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end14 + %exitcond5 = icmp ne i64 %inc13, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end14 for.end14: ; preds = %for.inc12 ret void @@ -331,20 +378,28 @@ for.end14: ; preds = %for.inc12 ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[2*i + 4][-5*i + j + 2] = ... -;; ... = A[-2*i + 20][5*i + j]; +;; for (long int j = 0; j < 100; j++) { +;; A[2*i + 4][-5*i + j + 2] = i; +;; *B++ = A[-2*i + 20][5*i + j]; define void @prop7([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc14, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc14 ] +; CHECK: da analyze - none! +; CHECK: da analyze - flow [* -38] splitable! +; CHECK: da analyze - split level = 1, iteration = 4! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc14 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc14 ] %i.03 = phi i64 [ 0, %entry ], [ %inc15, %for.inc14 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -361,18 +416,17 @@ for.body3: ; preds = %for.body3, %for.con %add11 = add nsw i64 %mul10, 20 %arrayidx13 = getelementptr inbounds [100 x i32]* %A, i64 %add11, i64 %add9 %0 = load i32* %arrayidx13, align 4 -; CHECK: da analyze - flow [* -38] splitable! -; CHECK: da analyze - split level = 1, iteration = 4! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc14 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc14 for.inc14: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc15 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc15, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end16 + %exitcond5 = icmp ne i64 %inc15, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end16 for.end16: ; preds = %for.inc14 ret void @@ -380,20 +434,27 @@ for.end16: ; preds = %for.inc14 ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[4][j + 2] = ... -;; ... = A[-2*i + 4][5*i + j]; +;; for (long int j = 0; j < 100; j++) { +;; A[4][j + 2] = i; +;; *B++ = A[-2*i + 4][5*i + j]; define void @prop8([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc10, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc10 ] +; CHECK: da analyze - consistent output [S 0]! +; CHECK: da analyze - flow [p<= 2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc10 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc10 ] %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -406,17 +467,17 @@ for.body3: ; preds = %for.body3, %for.con %add7 = add nsw i64 %mul6, 4 %arrayidx9 = getelementptr inbounds [100 x i32]* %A, i64 %add7, i64 %add5 %0 = load i32* %arrayidx9, align 4 -; CHECK: da analyze - flow [p<= 2]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc10 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc10 for.inc10: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc11 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc11, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end12 + %exitcond5 = icmp ne i64 %inc11, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end12 for.end12: ; preds = %for.inc10 ret void @@ -424,20 +485,27 @@ for.end12: ; preds = %for.inc10 ;; for (long int i = 0; i < 100; i++) -;; for (long int j = 0; j < 100; j++) -;; A[2*i + 4][5*i + j + 2] = ... -;; ... = A[4][j]; +;; for (long int j = 0; j < 100; j++) { +;; A[2*i + 4][5*i + j + 2] = i; +;; *B++ = A[4][j]; define void @prop9([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc10, %entry - %B.addr.04 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc10 ] +; CHECK: da analyze - none! +; CHECK: da analyze - flow [p<= 2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S 0]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc10 + %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc10 ] %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ] br label %for.body3 -for.body3: ; preds = %for.body3, %for.cond1.preheader +for.body3: ; preds = %for.cond1.preheader, %for.body3 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ] %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] %conv = trunc i64 %i.03 to i32 @@ -450,17 +518,17 @@ for.body3: ; preds = %for.body3, %for.con store i32 %conv, i32* %arrayidx7, align 4 %arrayidx9 = getelementptr inbounds [100 x i32]* %A, i64 4, i64 %j.02 %0 = load i32* %arrayidx9, align 4 -; CHECK: da analyze - flow [p<= 2]! %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1 store i32 %0, i32* %B.addr.11, align 4 %inc = add nsw i64 %j.02, 1 - %cmp2 = icmp slt i64 %inc, 100 - br i1 %cmp2, label %for.body3, label %for.inc10 + %exitcond = icmp ne i64 %inc, 100 + br i1 %exitcond, label %for.body3, label %for.inc10 for.inc10: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.04, i64 100 %inc11 = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc11, 100 - br i1 %cmp, label %for.cond1.preheader, label %for.end12 + %exitcond5 = icmp ne i64 %inc11, 100 + br i1 %exitcond5, label %for.cond1.preheader, label %for.end12 for.end12: ; preds = %for.inc10 ret void diff --git a/test/Analysis/DependenceAnalysis/Separability.ll b/test/Analysis/DependenceAnalysis/Separability.ll index d42d3cdb39e5..3dcaaec2ae85 100644 --- a/test/Analysis/DependenceAnalysis/Separability.ll +++ b/test/Analysis/DependenceAnalysis/Separability.ll @@ -8,30 +8,37 @@ target triple = "x86_64-apple-macosx10.6.0" ;; for (long int i = 0; i < 50; i++) ;; for (long int j = 0; j < 50; j++) ;; for (long int k = 0; k < 50; k++) -;; for (long int l = 0; l < 50; l++) -;; A[n][i][j + k] = ... -;; ... = A[10][i + 10][2*j - l]; +;; for (long int l = 0; l < 50; l++) { +;; A[n][i][j + k] = i; +;; *B++ = A[10][i + 10][2*j - l]; define void @sep0([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc22, %entry - %B.addr.08 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc22 ] +; CHECK: da analyze - output [0 * * S]! +; CHECK: da analyze - flow [-10 * * *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [0 * S *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc22 + %B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc22 ] %i.07 = phi i64 [ 0, %entry ], [ %inc23, %for.inc22 ] br label %for.cond4.preheader -for.cond4.preheader: ; preds = %for.inc19, %for.cond1.preheader - %B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %incdec.ptr, %for.inc19 ] +for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc19 + %B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %scevgep9, %for.inc19 ] %j.05 = phi i64 [ 0, %for.cond1.preheader ], [ %inc20, %for.inc19 ] br label %for.cond7.preheader -for.cond7.preheader: ; preds = %for.inc16, %for.cond4.preheader - %B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %incdec.ptr, %for.inc16 ] +for.cond7.preheader: ; preds = %for.cond4.preheader, %for.inc16 + %B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %scevgep, %for.inc16 ] %k.03 = phi i64 [ 0, %for.cond4.preheader ], [ %inc17, %for.inc16 ] br label %for.body9 -for.body9: ; preds = %for.body9, %for.cond7.preheader +for.body9: ; preds = %for.cond7.preheader, %for.body9 %l.02 = phi i64 [ 0, %for.cond7.preheader ], [ %inc, %for.body9 ] %B.addr.31 = phi i32* [ %B.addr.24, %for.cond7.preheader ], [ %incdec.ptr, %for.body9 ] %conv = trunc i64 %i.07 to i32 @@ -44,27 +51,29 @@ for.body9: ; preds = %for.body9, %for.con %add12 = add nsw i64 %i.07, 10 %arrayidx15 = getelementptr inbounds [100 x [100 x i32]]* %A, i64 10, i64 %add12, i64 %sub %0 = load i32* %arrayidx15, align 4 -; CHECK: da analyze - flow [-10 * * *]! %incdec.ptr = getelementptr inbounds i32* %B.addr.31, i64 1 store i32 %0, i32* %B.addr.31, align 4 %inc = add nsw i64 %l.02, 1 - %cmp8 = icmp slt i64 %inc, 50 - br i1 %cmp8, label %for.body9, label %for.inc16 + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body9, label %for.inc16 for.inc16: ; preds = %for.body9 + %scevgep = getelementptr i32* %B.addr.24, i64 50 %inc17 = add nsw i64 %k.03, 1 - %cmp5 = icmp slt i64 %inc17, 50 - br i1 %cmp5, label %for.cond7.preheader, label %for.inc19 + %exitcond10 = icmp ne i64 %inc17, 50 + br i1 %exitcond10, label %for.cond7.preheader, label %for.inc19 for.inc19: ; preds = %for.inc16 + %scevgep9 = getelementptr i32* %B.addr.16, i64 2500 %inc20 = add nsw i64 %j.05, 1 - %cmp2 = icmp slt i64 %inc20, 50 - br i1 %cmp2, label %for.cond4.preheader, label %for.inc22 + %exitcond12 = icmp ne i64 %inc20, 50 + br i1 %exitcond12, label %for.cond4.preheader, label %for.inc22 for.inc22: ; preds = %for.inc19 + %scevgep11 = getelementptr i32* %B.addr.08, i64 125000 %inc23 = add nsw i64 %i.07, 1 - %cmp = icmp slt i64 %inc23, 50 - br i1 %cmp, label %for.cond1.preheader, label %for.end24 + %exitcond13 = icmp ne i64 %inc23, 50 + br i1 %exitcond13, label %for.cond1.preheader, label %for.end24 for.end24: ; preds = %for.inc22 ret void @@ -74,30 +83,37 @@ for.end24: ; preds = %for.inc22 ;; for (long int i = 0; i < 50; i++) ;; for (long int j = 0; j < 50; j++) ;; for (long int k = 0; k < 50; k++) -;; for (long int l = 0; l < 50; l++) -;; A[i][i][j + k] = ... -;; ... = A[10][i + 10][2*j - l]; +;; for (long int l = 0; l < 50; l++) { +;; A[i][i][j + k] = i; +;; *B++ = A[10][i + 10][2*j - l]; define void @sep1([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc22, %entry - %B.addr.08 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc22 ] +; CHECK: da analyze - output [0 * * S]! +; CHECK: da analyze - flow [> * * *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [0 * S *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc22 + %B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc22 ] %i.07 = phi i64 [ 0, %entry ], [ %inc23, %for.inc22 ] br label %for.cond4.preheader -for.cond4.preheader: ; preds = %for.inc19, %for.cond1.preheader - %B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %incdec.ptr, %for.inc19 ] +for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc19 + %B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %scevgep9, %for.inc19 ] %j.05 = phi i64 [ 0, %for.cond1.preheader ], [ %inc20, %for.inc19 ] br label %for.cond7.preheader -for.cond7.preheader: ; preds = %for.inc16, %for.cond4.preheader - %B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %incdec.ptr, %for.inc16 ] +for.cond7.preheader: ; preds = %for.cond4.preheader, %for.inc16 + %B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %scevgep, %for.inc16 ] %k.03 = phi i64 [ 0, %for.cond4.preheader ], [ %inc17, %for.inc16 ] br label %for.body9 -for.body9: ; preds = %for.body9, %for.cond7.preheader +for.body9: ; preds = %for.cond7.preheader, %for.body9 %l.02 = phi i64 [ 0, %for.cond7.preheader ], [ %inc, %for.body9 ] %B.addr.31 = phi i32* [ %B.addr.24, %for.cond7.preheader ], [ %incdec.ptr, %for.body9 ] %conv = trunc i64 %i.07 to i32 @@ -109,27 +125,29 @@ for.body9: ; preds = %for.body9, %for.con %add12 = add nsw i64 %i.07, 10 %arrayidx15 = getelementptr inbounds [100 x [100 x i32]]* %A, i64 10, i64 %add12, i64 %sub %0 = load i32* %arrayidx15, align 4 -; CHECK: da analyze - flow [> * * *]! %incdec.ptr = getelementptr inbounds i32* %B.addr.31, i64 1 store i32 %0, i32* %B.addr.31, align 4 %inc = add nsw i64 %l.02, 1 - %cmp8 = icmp slt i64 %inc, 50 - br i1 %cmp8, label %for.body9, label %for.inc16 + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body9, label %for.inc16 for.inc16: ; preds = %for.body9 + %scevgep = getelementptr i32* %B.addr.24, i64 50 %inc17 = add nsw i64 %k.03, 1 - %cmp5 = icmp slt i64 %inc17, 50 - br i1 %cmp5, label %for.cond7.preheader, label %for.inc19 + %exitcond10 = icmp ne i64 %inc17, 50 + br i1 %exitcond10, label %for.cond7.preheader, label %for.inc19 for.inc19: ; preds = %for.inc16 + %scevgep9 = getelementptr i32* %B.addr.16, i64 2500 %inc20 = add nsw i64 %j.05, 1 - %cmp2 = icmp slt i64 %inc20, 50 - br i1 %cmp2, label %for.cond4.preheader, label %for.inc22 + %exitcond12 = icmp ne i64 %inc20, 50 + br i1 %exitcond12, label %for.cond4.preheader, label %for.inc22 for.inc22: ; preds = %for.inc19 + %scevgep11 = getelementptr i32* %B.addr.08, i64 125000 %inc23 = add nsw i64 %i.07, 1 - %cmp = icmp slt i64 %inc23, 50 - br i1 %cmp, label %for.cond1.preheader, label %for.end24 + %exitcond13 = icmp ne i64 %inc23, 50 + br i1 %exitcond13, label %for.cond1.preheader, label %for.end24 for.end24: ; preds = %for.inc22 ret void @@ -139,30 +157,37 @@ for.end24: ; preds = %for.inc22 ;; for (long int i = 0; i < 50; i++) ;; for (long int j = 0; j < 50; j++) ;; for (long int k = 0; k < 50; k++) -;; for (long int l = 0; l < 50; l++) -;; A[i][i][i + k][l] = ... -;; ... = A[10][i + 10][j + k][l + 10]; +;; for (long int l = 0; l < 50; l++) { +;; A[i][i][i + k][l] = i; +;; *B++ = A[10][i + 10][j + k][l + 10]; define void @sep2([100 x [100 x [100 x i32]]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc26, %entry - %B.addr.08 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc26 ] +; CHECK: da analyze - consistent output [0 S 0 0]! +; CHECK: da analyze - flow [> * * -10]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [0 * * 0]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc26 + %B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc26 ] %i.07 = phi i64 [ 0, %entry ], [ %inc27, %for.inc26 ] br label %for.cond4.preheader -for.cond4.preheader: ; preds = %for.inc23, %for.cond1.preheader - %B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %incdec.ptr, %for.inc23 ] +for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc23 + %B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %scevgep9, %for.inc23 ] %j.05 = phi i64 [ 0, %for.cond1.preheader ], [ %inc24, %for.inc23 ] br label %for.cond7.preheader -for.cond7.preheader: ; preds = %for.inc20, %for.cond4.preheader - %B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %incdec.ptr, %for.inc20 ] +for.cond7.preheader: ; preds = %for.cond4.preheader, %for.inc20 + %B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %scevgep, %for.inc20 ] %k.03 = phi i64 [ 0, %for.cond4.preheader ], [ %inc21, %for.inc20 ] br label %for.body9 -for.body9: ; preds = %for.body9, %for.cond7.preheader +for.body9: ; preds = %for.cond7.preheader, %for.body9 %l.02 = phi i64 [ 0, %for.cond7.preheader ], [ %inc, %for.body9 ] %B.addr.31 = phi i32* [ %B.addr.24, %for.cond7.preheader ], [ %incdec.ptr, %for.body9 ] %conv = trunc i64 %i.07 to i32 @@ -174,27 +199,29 @@ for.body9: ; preds = %for.body9, %for.con %add15 = add nsw i64 %i.07, 10 %arrayidx19 = getelementptr inbounds [100 x [100 x [100 x i32]]]* %A, i64 10, i64 %add15, i64 %add14, i64 %add13 %0 = load i32* %arrayidx19, align 4 -; CHECK: da analyze - flow [> * * -10]! %incdec.ptr = getelementptr inbounds i32* %B.addr.31, i64 1 store i32 %0, i32* %B.addr.31, align 4 %inc = add nsw i64 %l.02, 1 - %cmp8 = icmp slt i64 %inc, 50 - br i1 %cmp8, label %for.body9, label %for.inc20 + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body9, label %for.inc20 for.inc20: ; preds = %for.body9 + %scevgep = getelementptr i32* %B.addr.24, i64 50 %inc21 = add nsw i64 %k.03, 1 - %cmp5 = icmp slt i64 %inc21, 50 - br i1 %cmp5, label %for.cond7.preheader, label %for.inc23 + %exitcond10 = icmp ne i64 %inc21, 50 + br i1 %exitcond10, label %for.cond7.preheader, label %for.inc23 for.inc23: ; preds = %for.inc20 + %scevgep9 = getelementptr i32* %B.addr.16, i64 2500 %inc24 = add nsw i64 %j.05, 1 - %cmp2 = icmp slt i64 %inc24, 50 - br i1 %cmp2, label %for.cond4.preheader, label %for.inc26 + %exitcond12 = icmp ne i64 %inc24, 50 + br i1 %exitcond12, label %for.cond4.preheader, label %for.inc26 for.inc26: ; preds = %for.inc23 + %scevgep11 = getelementptr i32* %B.addr.08, i64 125000 %inc27 = add nsw i64 %i.07, 1 - %cmp = icmp slt i64 %inc27, 50 - br i1 %cmp, label %for.cond1.preheader, label %for.end28 + %exitcond13 = icmp ne i64 %inc27, 50 + br i1 %exitcond13, label %for.cond1.preheader, label %for.end28 for.end28: ; preds = %for.inc26 ret void @@ -204,30 +231,37 @@ for.end28: ; preds = %for.inc26 ;; for (long int i = 0; i < 50; i++) ;; for (long int j = 0; j < 50; j++) ;; for (long int k = 0; k < 50; k++) -;; for (long int l = 0; l < 50; l++) -;; A[i][i][i + k][l + k] = ... -;; ... = A[10][i + 10][j + k][l + 10]; +;; for (long int l = 0; l < 50; l++) { +;; A[i][i][i + k][l + k] = i; +;; *B++ = A[10][i + 10][j + k][l + 10]; define void @sep3([100 x [100 x [100 x i32]]]* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc27, %entry - %B.addr.08 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.inc27 ] +; CHECK: da analyze - consistent output [0 S 0 0]! +; CHECK: da analyze - flow [> * * *]! +; CHECK: da analyze - confused! +; CHECK: da analyze - input [0 * * 0]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.cond1.preheader: ; preds = %entry, %for.inc27 + %B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc27 ] %i.07 = phi i64 [ 0, %entry ], [ %inc28, %for.inc27 ] br label %for.cond4.preheader -for.cond4.preheader: ; preds = %for.inc24, %for.cond1.preheader - %B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %incdec.ptr, %for.inc24 ] +for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc24 + %B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %scevgep9, %for.inc24 ] %j.05 = phi i64 [ 0, %for.cond1.preheader ], [ %inc25, %for.inc24 ] br label %for.cond7.preheader -for.cond7.preheader: ; preds = %for.inc21, %for.cond4.preheader - %B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %incdec.ptr, %for.inc21 ] +for.cond7.preheader: ; preds = %for.cond4.preheader, %for.inc21 + %B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %scevgep, %for.inc21 ] %k.03 = phi i64 [ 0, %for.cond4.preheader ], [ %inc22, %for.inc21 ] br label %for.body9 -for.body9: ; preds = %for.body9, %for.cond7.preheader +for.body9: ; preds = %for.cond7.preheader, %for.body9 %l.02 = phi i64 [ 0, %for.cond7.preheader ], [ %inc, %for.body9 ] %B.addr.31 = phi i32* [ %B.addr.24, %for.cond7.preheader ], [ %incdec.ptr, %for.body9 ] %conv = trunc i64 %i.07 to i32 @@ -240,27 +274,29 @@ for.body9: ; preds = %for.body9, %for.con %add16 = add nsw i64 %i.07, 10 %arrayidx20 = getelementptr inbounds [100 x [100 x [100 x i32]]]* %A, i64 10, i64 %add16, i64 %add15, i64 %add14 %0 = load i32* %arrayidx20, align 4 -; CHECK: da analyze - flow [> * * *]! %incdec.ptr = getelementptr inbounds i32* %B.addr.31, i64 1 store i32 %0, i32* %B.addr.31, align 4 %inc = add nsw i64 %l.02, 1 - %cmp8 = icmp slt i64 %inc, 50 - br i1 %cmp8, label %for.body9, label %for.inc21 + %exitcond = icmp ne i64 %inc, 50 + br i1 %exitcond, label %for.body9, label %for.inc21 for.inc21: ; preds = %for.body9 + %scevgep = getelementptr i32* %B.addr.24, i64 50 %inc22 = add nsw i64 %k.03, 1 - %cmp5 = icmp slt i64 %inc22, 50 - br i1 %cmp5, label %for.cond7.preheader, label %for.inc24 + %exitcond10 = icmp ne i64 %inc22, 50 + br i1 %exitcond10, label %for.cond7.preheader, label %for.inc24 for.inc24: ; preds = %for.inc21 + %scevgep9 = getelementptr i32* %B.addr.16, i64 2500 %inc25 = add nsw i64 %j.05, 1 - %cmp2 = icmp slt i64 %inc25, 50 - br i1 %cmp2, label %for.cond4.preheader, label %for.inc27 + %exitcond12 = icmp ne i64 %inc25, 50 + br i1 %exitcond12, label %for.cond4.preheader, label %for.inc27 for.inc27: ; preds = %for.inc24 + %scevgep11 = getelementptr i32* %B.addr.08, i64 125000 %inc28 = add nsw i64 %i.07, 1 - %cmp = icmp slt i64 %inc28, 50 - br i1 %cmp, label %for.cond1.preheader, label %for.end29 + %exitcond13 = icmp ne i64 %inc28, 50 + br i1 %exitcond13, label %for.cond1.preheader, label %for.end29 for.end29: ; preds = %for.inc27 ret void diff --git a/test/Analysis/DependenceAnalysis/StrongSIV.ll b/test/Analysis/DependenceAnalysis/StrongSIV.ll index be336c3580ce..f499e84d4844 100644 --- a/test/Analysis/DependenceAnalysis/StrongSIV.ll +++ b/test/Analysis/DependenceAnalysis/StrongSIV.ll @@ -1,143 +1,196 @@ -; RUN: opt < %s -analyze -basicaa -indvars -da | FileCheck %s +; RUN: opt < %s -analyze -basicaa -da | FileCheck %s ; ModuleID = 'StrongSIV.bc' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.6.0" -;; for (int i = 0; i < n; i++) -;; A[i + 2] = ... -;; ... = A[i]; +;; for (int i = 0; i < n; i++) { +;; A[i + 2] = i; +;; *B++ = A[i]; define void @strong0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp sgt i64 %n, 0 - br i1 %cmp1, label %for.body, label %for.end - -for.body: ; preds = %for.body, %entry - %i.03 = phi i32 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] - %add = add nsw i32 %i.03, 2 - %idxprom = sext i32 %add to i64 - %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom - store i32 %i.03, i32* %arrayidx, align 4 - %idxprom2 = sext i32 %i.03 to i64 - %arrayidx3 = getelementptr inbounds i32* %A, i64 %idxprom2 - %0 = load i32* %arrayidx3, align 4 + br i1 %cmp1, label %for.body.preheader, label %for.end + +; CHECK: da analyze - none! ; CHECK: da analyze - consistent flow [2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] + %0 = add nsw i64 %indvars.iv, 2 + %arrayidx = getelementptr inbounds i32* %A, i64 %0 + %1 = trunc i64 %indvars.iv to i32 + store i32 %1, i32* %arrayidx, align 4 + %arrayidx3 = getelementptr inbounds i32* %A, i64 %indvars.iv + %2 = load i32* %arrayidx3, align 4 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 - store i32 %0, i32* %B.addr.02, align 4 - %inc = add nsw i32 %i.03, 1 - %conv = sext i32 %inc to i64 - %cmp = icmp slt i64 %conv, %n - br i1 %cmp, label %for.body, label %for.end + store i32 %2, i32* %B.addr.02, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %exitcond = icmp ne i64 %indvars.iv.next, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long int i = 0; i < n; i++) -;; A[i + 2] = ... -;; ... = A[i]; +;; for (long int i = 0; i < n; i++) { +;; A[i + 2] = i; +;; *B++ = A[i]; define void @strong1(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: - %conv = sext i32 %n to i64 %cmp1 = icmp sgt i32 %n, 0 - br i1 %cmp1, label %for.body, label %for.end + br i1 %cmp1, label %for.body.preheader, label %for.end + +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + %0 = sext i32 %n to i64 + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv2 = trunc i64 %i.03 to i32 %add = add nsw i64 %i.03, 2 %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv2, i32* %arrayidx, align 4 %arrayidx3 = getelementptr inbounds i32* %A, i64 %i.03 - %0 = load i32* %arrayidx3, align 4 -; CHECK: da analyze - consistent flow [2]! + %1 = load i32* %arrayidx3, align 4 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 - store i32 %0, i32* %B.addr.02, align 4 + store i32 %1, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp slt i64 %inc, %conv - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %0 + br i1 %exitcond, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long unsigned i = 0; i < n; i++) -;; A[i + 2] = ... -;; ... = A[i]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[i + 2] = i; +;; *B++ = A[i]; define void @strong2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %add = add i64 %i.03, 2 %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 %i.03 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - consistent flow [2]! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (int i = 0; i < n; i++) -;; A[i + 2] = ... -;; ... = A[i]; +;; for (int i = 0; i < n; i++) { +;; A[i + 2] = i; +;; *B++ = A[i]; define void @strong3(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp { entry: %cmp1 = icmp sgt i32 %n, 0 - br i1 %cmp1, label %for.body, label %for.end - -for.body: ; preds = %for.body, %entry - %i.03 = phi i32 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] - %add = add nsw i32 %i.03, 2 - %idxprom = sext i32 %add to i64 - %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom - store i32 %i.03, i32* %arrayidx, align 4 - %idxprom1 = sext i32 %i.03 to i64 - %arrayidx2 = getelementptr inbounds i32* %A, i64 %idxprom1 - %0 = load i32* %arrayidx2, align 4 + br i1 %cmp1, label %for.body.preheader, label %for.end + +; CHECK: da analyze - none! ; CHECK: da analyze - consistent flow [2]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] + %0 = add nsw i64 %indvars.iv, 2 + %arrayidx = getelementptr inbounds i32* %A, i64 %0 + %1 = trunc i64 %indvars.iv to i32 + store i32 %1, i32* %arrayidx, align 4 + %arrayidx2 = getelementptr inbounds i32* %A, i64 %indvars.iv + %2 = load i32* %arrayidx2, align 4 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 - store i32 %0, i32* %B.addr.02, align 4 - %inc = add nsw i32 %i.03, 1 - %cmp = icmp slt i32 %inc, %n - br i1 %cmp, label %for.body, label %for.end + store i32 %2, i32* %B.addr.02, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp ne i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long unsigned i = 0; i < 19; i++) -;; A[i + 19] = ... -;; ... = A[i]; +;; for (long unsigned i = 0; i < 19; i++) { +;; A[i + 19] = i; +;; *B++ = A[i]; define void @strong4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -146,27 +199,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 %i.02 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 19 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 19 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 20; i++) -;; A[i + 19] = ... -;; ... = A[i]; +;; for (long unsigned i = 0; i < 20; i++) { +;; A[i + 19] = i; +;; *B++ = A[i]; define void @strong5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [19]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -175,27 +234,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 %i.02 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - consistent flow [19]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 20 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 20 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 20; i++) -;; A[2*i + 6] = ... -;; ... = A[2*i]; +;; for (long unsigned i = 0; i < 20; i++) { +;; A[2*i + 6] = i; +;; *B++ = A[2*i]; define void @strong6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [3]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -206,27 +271,33 @@ for.body: ; preds = %for.body, %entry %mul1 = shl i64 %i.02, 1 %arrayidx2 = getelementptr inbounds i32* %A, i64 %mul1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - consistent flow [3]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 20 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 20 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 20; i++) -;; A[2*i + 7] = ... -;; ... = A[2*i]; +;; for (long unsigned i = 0; i < 20; i++) { +;; A[2*i + 7] = i; +;; *B++ = A[2*i]; define void @strong7(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -237,27 +308,33 @@ for.body: ; preds = %for.body, %entry %mul1 = shl i64 %i.02, 1 %arrayidx2 = getelementptr inbounds i32* %A, i64 %mul1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 20 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 20 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 20; i++) -;; A[i + n] = ... -;; ... = A[i]; +;; for (long unsigned i = 0; i < 20; i++) { +;; A[i + n] = i; +;; *B++ = A[i]; define void @strong8(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [%n|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -266,30 +343,39 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 %i.02 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - consistent flow [%n|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 20 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 20 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < n; i++) -;; A[i + n] = ... -;; ... = A[i + 2*n]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[i + n] = i; +;; *B++ = A[i + 2*n]; define void @strong9(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %add = add i64 %i.03, %n %arrayidx = getelementptr inbounds i32* %A, i64 %add @@ -298,27 +384,36 @@ for.body: ; preds = %for.body, %entry %add1 = add i64 %i.03, %mul %arrayidx2 = getelementptr inbounds i32* %A, i64 %add1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long unsigned i = 0; i < 1000; i++) -;; A[n*i + 5] = ... -;; ... = A[n*i + 5]; +;; for (long unsigned i = 0; i < 1000; i++) { +;; A[n*i + 5] = i; +;; *B++ = A[n*i + 5]; define void @strong10(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [0|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -330,12 +425,11 @@ for.body: ; preds = %for.body, %entry %add2 = add i64 %mul1, 5 %arrayidx3 = getelementptr inbounds i32* %A, i64 %add2 %0 = load i32* %arrayidx3, align 4 -; CHECK: da analyze - consistent flow [0|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 1000 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 1000 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void diff --git a/test/Analysis/DependenceAnalysis/SymbolicRDIV.ll b/test/Analysis/DependenceAnalysis/SymbolicRDIV.ll index 2a1b4e7e971d..81e61892d8e8 100644 --- a/test/Analysis/DependenceAnalysis/SymbolicRDIV.ll +++ b/test/Analysis/DependenceAnalysis/SymbolicRDIV.ll @@ -6,65 +6,99 @@ target triple = "x86_64-apple-macosx10.6.0" ;; for (long int i = 0; i < n1; i++) -;; A[2*i + n1] = ... +;; A[2*i + n1] = i; ;; for (long int j = 0; j < n2; j++) -;; ... = A[3*j + 3*n1]; +;; *B++ = A[3*j + 3*n1]; define void @symbolicrdiv0(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp { entry: %cmp4 = icmp eq i64 %n1, 0 - br i1 %cmp4, label %for.cond1.preheader, label %for.body + br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader -for.cond1.preheader: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.cond1.preheader.loopexit: ; preds = %for.body + br label %for.cond1.preheader + +for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry %cmp21 = icmp eq i64 %n2, 0 - br i1 %cmp21, label %for.end11, label %for.body4 + br i1 %cmp21, label %for.end11, label %for.body4.preheader -for.body: ; preds = %for.body, %entry - %i.05 = phi i64 [ %inc, %for.body ], [ 0, %entry ] +for.body4.preheader: ; preds = %for.cond1.preheader + br label %for.body4 + +for.body: ; preds = %for.body.preheader, %for.body + %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] %conv = trunc i64 %i.05 to i32 %mul = shl nsw i64 %i.05, 1 %add = add i64 %mul, %n1 %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.05, 1 - %cmp = icmp ult i64 %inc, %n1 - br i1 %cmp, label %for.body, label %for.cond1.preheader + %exitcond = icmp ne i64 %inc, %n1 + br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit -for.body4: ; preds = %for.body4, %for.cond1.preheader - %j.03 = phi i64 [ %inc10, %for.body4 ], [ 0, %for.cond1.preheader ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.cond1.preheader ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.03 = phi i64 [ %inc10, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %mul56 = add i64 %j.03, %n1 %add7 = mul i64 %mul56, 3 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7 %0 = load i32* %arrayidx8, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc10 = add nsw i64 %j.03, 1 - %cmp2 = icmp ult i64 %inc10, %n2 - br i1 %cmp2, label %for.body4, label %for.end11 + %exitcond7 = icmp ne i64 %inc10, %n2 + br i1 %exitcond7, label %for.body4, label %for.end11.loopexit -for.end11: ; preds = %for.body4, %for.cond1.preheader +for.end11.loopexit: ; preds = %for.body4 + br label %for.end11 + +for.end11: ; preds = %for.end11.loopexit, %for.cond1.preheader ret void } ;; for (long int i = 0; i < n1; i++) -;; A[2*i + 5*n2] = ... +;; A[2*i + 5*n2] = i; ;; for (long int j = 0; j < n2; j++) -;; ... = A[3*j + 2*n2]; +;; *B++ = A[3*j + 2*n2]; define void @symbolicrdiv1(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp { entry: %cmp4 = icmp eq i64 %n1, 0 - br i1 %cmp4, label %for.cond2.preheader, label %for.body + br i1 %cmp4, label %for.cond2.preheader, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.cond2.preheader.loopexit: ; preds = %for.body + br label %for.cond2.preheader -for.cond2.preheader: ; preds = %for.body, %entry +for.cond2.preheader: ; preds = %for.cond2.preheader.loopexit, %entry %cmp31 = icmp eq i64 %n2, 0 - br i1 %cmp31, label %for.end12, label %for.body5 + br i1 %cmp31, label %for.end12, label %for.body5.preheader -for.body: ; preds = %for.body, %entry - %i.05 = phi i64 [ %inc, %for.body ], [ 0, %entry ] +for.body5.preheader: ; preds = %for.cond2.preheader + br label %for.body5 + +for.body: ; preds = %for.body.preheader, %for.body + %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] %conv = trunc i64 %i.05 to i32 %mul = shl nsw i64 %i.05, 1 %mul1 = mul i64 %n2, 5 @@ -72,220 +106,307 @@ for.body: ; preds = %for.body, %entry %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.05, 1 - %cmp = icmp ult i64 %inc, %n1 - br i1 %cmp, label %for.body, label %for.cond2.preheader + %exitcond = icmp ne i64 %inc, %n1 + br i1 %exitcond, label %for.body, label %for.cond2.preheader.loopexit -for.body5: ; preds = %for.body5, %for.cond2.preheader - %j.03 = phi i64 [ %inc11, %for.body5 ], [ 0, %for.cond2.preheader ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body5 ], [ %B, %for.cond2.preheader ] +for.body5: ; preds = %for.body5.preheader, %for.body5 + %j.03 = phi i64 [ %inc11, %for.body5 ], [ 0, %for.body5.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body5 ], [ %B, %for.body5.preheader ] %mul6 = mul nsw i64 %j.03, 3 %mul7 = shl i64 %n2, 1 %add8 = add i64 %mul6, %mul7 %arrayidx9 = getelementptr inbounds i32* %A, i64 %add8 %0 = load i32* %arrayidx9, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc11 = add nsw i64 %j.03, 1 - %cmp3 = icmp ult i64 %inc11, %n2 - br i1 %cmp3, label %for.body5, label %for.end12 + %exitcond6 = icmp ne i64 %inc11, %n2 + br i1 %exitcond6, label %for.body5, label %for.end12.loopexit + +for.end12.loopexit: ; preds = %for.body5 + br label %for.end12 -for.end12: ; preds = %for.body5, %for.cond2.preheader +for.end12: ; preds = %for.end12.loopexit, %for.cond2.preheader ret void } ;; for (long int i = 0; i < n1; i++) -;; A[2*i - n2] = ... +;; A[2*i - n2] = i; ;; for (long int j = 0; j < n2; j++) -;; ... = A[-j + 2*n1]; +;; *B++ = A[-j + 2*n1]; define void @symbolicrdiv2(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp { entry: %cmp4 = icmp eq i64 %n1, 0 - br i1 %cmp4, label %for.cond1.preheader, label %for.body + br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.cond1.preheader: ; preds = %for.body, %entry +for.cond1.preheader.loopexit: ; preds = %for.body + br label %for.cond1.preheader + +for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry %cmp21 = icmp eq i64 %n2, 0 - br i1 %cmp21, label %for.end10, label %for.body4 + br i1 %cmp21, label %for.end10, label %for.body4.preheader + +for.body4.preheader: ; preds = %for.cond1.preheader + br label %for.body4 -for.body: ; preds = %for.body, %entry - %i.05 = phi i64 [ %inc, %for.body ], [ 0, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] %conv = trunc i64 %i.05 to i32 %mul = shl nsw i64 %i.05, 1 %sub = sub i64 %mul, %n2 %arrayidx = getelementptr inbounds i32* %A, i64 %sub store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.05, 1 - %cmp = icmp ult i64 %inc, %n1 - br i1 %cmp, label %for.body, label %for.cond1.preheader + %exitcond = icmp ne i64 %inc, %n1 + br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit -for.body4: ; preds = %for.body4, %for.cond1.preheader - %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.cond1.preheader ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.cond1.preheader ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %mul6 = shl i64 %n1, 1 %add = sub i64 %mul6, %j.03 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx7, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc9 = add nsw i64 %j.03, 1 - %cmp2 = icmp ult i64 %inc9, %n2 - br i1 %cmp2, label %for.body4, label %for.end10 + %exitcond6 = icmp ne i64 %inc9, %n2 + br i1 %exitcond6, label %for.body4, label %for.end10.loopexit + +for.end10.loopexit: ; preds = %for.body4 + br label %for.end10 -for.end10: ; preds = %for.body4, %for.cond1.preheader +for.end10: ; preds = %for.end10.loopexit, %for.cond1.preheader ret void } ;; for (long int i = 0; i < n1; i++) -;; A[-i + n2] = ... +;; A[-i + n2] = i; ;; for (long int j = 0; j < n2; j++) -;; ... = A[j - n1]; +;; *B++ = A[j - n1]; define void @symbolicrdiv3(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp { entry: %cmp4 = icmp eq i64 %n1, 0 - br i1 %cmp4, label %for.cond1.preheader, label %for.body + br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader -for.cond1.preheader: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.cond1.preheader.loopexit: ; preds = %for.body + br label %for.cond1.preheader + +for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry %cmp21 = icmp eq i64 %n2, 0 - br i1 %cmp21, label %for.end9, label %for.body4 + br i1 %cmp21, label %for.end9, label %for.body4.preheader -for.body: ; preds = %for.body, %entry - %i.05 = phi i64 [ %inc, %for.body ], [ 0, %entry ] +for.body4.preheader: ; preds = %for.cond1.preheader + br label %for.body4 + +for.body: ; preds = %for.body.preheader, %for.body + %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] %conv = trunc i64 %i.05 to i32 %add = sub i64 %n2, %i.05 %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.05, 1 - %cmp = icmp ult i64 %inc, %n1 - br i1 %cmp, label %for.body, label %for.cond1.preheader + %exitcond = icmp ne i64 %inc, %n1 + br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit -for.body4: ; preds = %for.body4, %for.cond1.preheader - %j.03 = phi i64 [ %inc8, %for.body4 ], [ 0, %for.cond1.preheader ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.cond1.preheader ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.03 = phi i64 [ %inc8, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %sub5 = sub i64 %j.03, %n1 %arrayidx6 = getelementptr inbounds i32* %A, i64 %sub5 %0 = load i32* %arrayidx6, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc8 = add nsw i64 %j.03, 1 - %cmp2 = icmp ult i64 %inc8, %n2 - br i1 %cmp2, label %for.body4, label %for.end9 + %exitcond6 = icmp ne i64 %inc8, %n2 + br i1 %exitcond6, label %for.body4, label %for.end9.loopexit -for.end9: ; preds = %for.body4, %for.cond1.preheader +for.end9.loopexit: ; preds = %for.body4 + br label %for.end9 + +for.end9: ; preds = %for.end9.loopexit, %for.cond1.preheader ret void } ;; for (long int i = 0; i < n1; i++) -;; A[-i + 2*n1] = ... +;; A[-i + 2*n1] = i; ;; for (long int j = 0; j < n2; j++) -;; ... = A[-j + n1]; +;; *B++ = A[-j + n1]; define void @symbolicrdiv4(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp { entry: %cmp4 = icmp eq i64 %n1, 0 - br i1 %cmp4, label %for.cond1.preheader, label %for.body + br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader -for.cond1.preheader: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.cond1.preheader.loopexit: ; preds = %for.body + br label %for.cond1.preheader + +for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry %cmp21 = icmp eq i64 %n2, 0 - br i1 %cmp21, label %for.end10, label %for.body4 + br i1 %cmp21, label %for.end10, label %for.body4.preheader -for.body: ; preds = %for.body, %entry - %i.05 = phi i64 [ %inc, %for.body ], [ 0, %entry ] +for.body4.preheader: ; preds = %for.cond1.preheader + br label %for.body4 + +for.body: ; preds = %for.body.preheader, %for.body + %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] %conv = trunc i64 %i.05 to i32 %mul = shl i64 %n1, 1 %add = sub i64 %mul, %i.05 %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.05, 1 - %cmp = icmp ult i64 %inc, %n1 - br i1 %cmp, label %for.body, label %for.cond1.preheader + %exitcond = icmp ne i64 %inc, %n1 + br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit -for.body4: ; preds = %for.body4, %for.cond1.preheader - %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.cond1.preheader ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.cond1.preheader ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %add6 = sub i64 %n1, %j.03 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add6 %0 = load i32* %arrayidx7, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc9 = add nsw i64 %j.03, 1 - %cmp2 = icmp ult i64 %inc9, %n2 - br i1 %cmp2, label %for.body4, label %for.end10 + %exitcond6 = icmp ne i64 %inc9, %n2 + br i1 %exitcond6, label %for.body4, label %for.end10.loopexit -for.end10: ; preds = %for.body4, %for.cond1.preheader +for.end10.loopexit: ; preds = %for.body4 + br label %for.end10 + +for.end10: ; preds = %for.end10.loopexit, %for.cond1.preheader ret void } ;; for (long int i = 0; i < n1; i++) -;; A[-i + n2] = ... +;; A[-i + n2] = i; ;; for (long int j = 0; j < n2; j++) -;; ... = A[-j + 2*n2]; +;; *B++ = A[-j + 2*n2]; define void @symbolicrdiv5(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp { entry: %cmp4 = icmp eq i64 %n1, 0 - br i1 %cmp4, label %for.cond1.preheader, label %for.body + br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader -for.cond1.preheader: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.cond1.preheader.loopexit: ; preds = %for.body + br label %for.cond1.preheader + +for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry %cmp21 = icmp eq i64 %n2, 0 - br i1 %cmp21, label %for.end10, label %for.body4 + br i1 %cmp21, label %for.end10, label %for.body4.preheader -for.body: ; preds = %for.body, %entry - %i.05 = phi i64 [ %inc, %for.body ], [ 0, %entry ] +for.body4.preheader: ; preds = %for.cond1.preheader + br label %for.body4 + +for.body: ; preds = %for.body.preheader, %for.body + %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] %conv = trunc i64 %i.05 to i32 %add = sub i64 %n2, %i.05 %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 %conv, i32* %arrayidx, align 4 %inc = add nsw i64 %i.05, 1 - %cmp = icmp ult i64 %inc, %n1 - br i1 %cmp, label %for.body, label %for.cond1.preheader + %exitcond = icmp ne i64 %inc, %n1 + br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit -for.body4: ; preds = %for.body4, %for.cond1.preheader - %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.cond1.preheader ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.cond1.preheader ] +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ] %mul = shl i64 %n2, 1 %add6 = sub i64 %mul, %j.03 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add6 %0 = load i32* %arrayidx7, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc9 = add nsw i64 %j.03, 1 - %cmp2 = icmp ult i64 %inc9, %n2 - br i1 %cmp2, label %for.body4, label %for.end10 + %exitcond6 = icmp ne i64 %inc9, %n2 + br i1 %exitcond6, label %for.body4, label %for.end10.loopexit -for.end10: ; preds = %for.body4, %for.cond1.preheader +for.end10.loopexit: ; preds = %for.body4 + br label %for.end10 + +for.end10: ; preds = %for.end10.loopexit, %for.cond1.preheader ret void } ;; for (long int i = 0; i < n1; i++) -;; for (long int j = 0; j < n2; j++) -;; A[j -i + n2] = ... -;; ... = A[2*n2]; +;; for (long int j = 0; j < n2; j++) { +;; A[j -i + n2] = i; +;; *B++ = A[2*n2]; define void @symbolicrdiv6(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp { entry: %cmp4 = icmp eq i64 %n1, 0 - br i1 %cmp4, label %for.end7, label %for.cond1.preheader + br i1 %cmp4, label %for.end7, label %for.cond1.preheader.preheader + +; CHECK: da analyze - output [* *]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - output [* *]! + +for.cond1.preheader.preheader: ; preds = %entry + br label %for.cond1.preheader -for.cond1.preheader: ; preds = %for.inc5, %entry - %B.addr.06 = phi i32* [ %B.addr.1.lcssa, %for.inc5 ], [ %B, %entry ] - %i.05 = phi i64 [ %inc6, %for.inc5 ], [ 0, %entry ] +for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc5 + %B.addr.06 = phi i32* [ %B.addr.1.lcssa, %for.inc5 ], [ %B, %for.cond1.preheader.preheader ] + %i.05 = phi i64 [ %inc6, %for.inc5 ], [ 0, %for.cond1.preheader.preheader ] %cmp21 = icmp eq i64 %n2, 0 - br i1 %cmp21, label %for.inc5, label %for.body3 + br i1 %cmp21, label %for.inc5, label %for.body3.preheader -for.body3: ; preds = %for.body3, %for.cond1.preheader - %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.cond1.preheader ] - %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.06, %for.cond1.preheader ] +for.body3.preheader: ; preds = %for.cond1.preheader + br label %for.body3 + +for.body3: ; preds = %for.body3.preheader, %for.body3 + %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ] + %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.06, %for.body3.preheader ] %conv = trunc i64 %i.05 to i32 %sub = sub nsw i64 %j.03, %i.05 %add = add i64 %sub, %n2 @@ -294,19 +415,25 @@ for.body3: ; preds = %for.body3, %for.con %mul = shl i64 %n2, 1 %arrayidx4 = getelementptr inbounds i32* %A, i64 %mul %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1 store i32 %0, i32* %B.addr.12, align 4 %inc = add nsw i64 %j.03, 1 - %cmp2 = icmp ult i64 %inc, %n2 - br i1 %cmp2, label %for.body3, label %for.inc5 + %exitcond = icmp ne i64 %inc, %n2 + br i1 %exitcond, label %for.body3, label %for.inc5.loopexit -for.inc5: ; preds = %for.body3, %for.cond1.preheader - %B.addr.1.lcssa = phi i32* [ %B.addr.06, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ] +for.inc5.loopexit: ; preds = %for.body3 + %scevgep = getelementptr i32* %B.addr.06, i64 %n2 + br label %for.inc5 + +for.inc5: ; preds = %for.inc5.loopexit, %for.cond1.preheader + %B.addr.1.lcssa = phi i32* [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc5.loopexit ] %inc6 = add nsw i64 %i.05, 1 - %cmp = icmp ult i64 %inc6, %n1 - br i1 %cmp, label %for.cond1.preheader, label %for.end7 + %exitcond7 = icmp ne i64 %inc6, %n1 + br i1 %exitcond7, label %for.cond1.preheader, label %for.end7.loopexit + +for.end7.loopexit: ; preds = %for.inc5 + br label %for.end7 -for.end7: ; preds = %for.inc5, %entry +for.end7: ; preds = %for.end7.loopexit, %entry ret void } diff --git a/test/Analysis/DependenceAnalysis/SymbolicSIV.ll b/test/Analysis/DependenceAnalysis/SymbolicSIV.ll index ee2343fa51e9..297096ce135d 100644 --- a/test/Analysis/DependenceAnalysis/SymbolicSIV.ll +++ b/test/Analysis/DependenceAnalysis/SymbolicSIV.ll @@ -5,18 +5,28 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-macosx10.6.0" -;; for (long int i = 0; i < n; i++) -;; A[2*i + n] = ... -;; ... = A[3*i + 3*n]; +;; for (long int i = 0; i < n; i++) { +;; A[2*i + n] = i; +;; *B++ = A[3*i + 3*n]; define void @symbolicsiv0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = shl nsw i64 %i.03, 1 %add = add i64 %mul, %n @@ -26,30 +36,42 @@ for.body: ; preds = %for.body, %entry %add3 = mul i64 %mul14, 3 %arrayidx4 = getelementptr inbounds i32* %A, i64 %add3 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long int i = 0; i < n; i++) -;; A[2*i + 5*n] = ... -;; ... = A[3*i + 2*n]; +;; for (long int i = 0; i < n; i++) { +;; A[2*i + 5*n] = i; +;; *B++ = A[3*i + 2*n]; define void @symbolicsiv1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = shl nsw i64 %i.03, 1 %mul1 = mul i64 %n, 5 @@ -61,30 +83,42 @@ for.body: ; preds = %for.body, %entry %add4 = add i64 %mul2, %mul3 %arrayidx5 = getelementptr inbounds i32* %A, i64 %add4 %0 = load i32* %arrayidx5, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long int i = 0; i < n; i++) -;; A[2*i - n] = ... -;; ... = A[-i + 2*n]; +;; for (long int i = 0; i < n; i++) { +;; A[2*i - n] = i; +;; *B++ = A[-i + 2*n]; define void @symbolicsiv2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = shl nsw i64 %i.03, 1 %sub = sub i64 %mul, %n @@ -94,30 +128,42 @@ for.body: ; preds = %for.body, %entry %add = sub i64 %mul2, %i.03 %arrayidx3 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx3, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long int i = 0; i < n; i++) -;; A[-2*i + n + 1] = ... -;; ... = A[i - 2*n]; +;; for (long int i = 0; i < n; i++) { +;; A[-2*i + n + 1] = i; +;; *B++ = A[i - 2*n]; define void @symbolicsiv3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, -2 %add = add i64 %mul, %n @@ -128,30 +174,42 @@ for.body: ; preds = %for.body, %entry %sub = sub i64 %i.03, %mul2 %arrayidx3 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx3, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long int i = 0; i < n; i++) -;; A[-2*i + 3*n] = ... -;; ... = A[-i + n]; +;; for (long int i = 0; i < n; i++) { +;; A[-2*i + 3*n] = i; +;; *B++ = A[-i + n]; define void @symbolicsiv4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, -2 %mul1 = mul i64 %n, 3 @@ -161,30 +219,42 @@ for.body: ; preds = %for.body, %entry %add2 = sub i64 %n, %i.03 %arrayidx3 = getelementptr inbounds i32* %A, i64 %add2 %0 = load i32* %arrayidx3, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long int i = 0; i < n; i++) -;; A[-2*i - 2*n] = ... -;; ... = A[-i - n]; +;; for (long int i = 0; i < n; i++) { +;; A[-2*i - 2*n] = i; +;; *B++ = A[-i - n]; define void @symbolicsiv5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = mul nsw i64 %i.03, -2 %mul1 = shl i64 %n, 1 @@ -195,32 +265,44 @@ for.body: ; preds = %for.body, %entry %sub3 = sub i64 %sub2, %n %arrayidx4 = getelementptr inbounds i32* %A, i64 %sub3 %0 = load i32* %arrayidx4, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } ;; why doesn't SCEV package understand that n >= 0? -;;void weaktest(int *A, int *B, long unsigned n) -;; for (long unsigned i = 0; i < n; i++) -;; A[i + n + 1] = ... -;; ... = A[-i]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[i + n + 1] = i; +;; *B++ = A[-i]; define void @weaktest(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - flow [*|<] splitable! +; CHECK: da analyze - split level = 1, iteration = ((0 smax (-1 + (-1 * %n))) /u 2)! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %add = add i64 %i.03, %n %add1 = add i64 %add, 1 @@ -229,29 +311,36 @@ for.body: ; preds = %for.body, %entry %sub = sub i64 0, %i.03 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [*|<] splitable! -; CHECK: da analyze - split level = 1, iteration = ((0 smax (-1 + (-1 * %n))) /u 2)! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; void symbolicsiv6(int *A, int *B, long unsigned n, long unsigned N, long unsigned M) { -;; for (long int i = 0; i < n; i++) { -;; A[4*N*i + M] = i; -;; *B++ = A[4*N*i + 3*M + 1]; +;; for (long int i = 0; i < n; i++) { +;; A[4*N*i + M] = i; +;; *B++ = A[4*N*i + 3*M + 1]; define void @symbolicsiv6(i32* %A, i32* %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 br i1 %cmp1, label %for.end, label %for.body.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.body.preheader: ; preds = %entry br label %for.body @@ -272,7 +361,6 @@ for.body: ; preds = %for.body.preheader, %arrayidx7 = getelementptr inbounds i32* %A, i64 %add6 %0 = load i32* %arrayidx7, align 4 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 -; CHECK: da analyze - none! store i32 %0, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 %exitcond = icmp ne i64 %inc, %n @@ -286,16 +374,22 @@ for.end: ; preds = %for.end.loopexit, % } -;; void symbolicsiv7(int *A, int *B, long unsigned n, long unsigned N, long unsigned M) { -;; for (long int i = 0; i < n; i++) { -;; A[2*N*i + M] = i; -;; *B++ = A[2*N*i - 3*M + 2]; +;; for (long int i = 0; i < n; i++) { +;; A[2*N*i + M] = i; +;; *B++ = A[2*N*i - 3*M + 2]; define void @symbolicsiv7(i32* %A, i32* %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 br i1 %cmp1, label %for.end, label %for.body.preheader +; CHECK: da analyze - none! +; CHECK: da analyze - flow [<>]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + for.body.preheader: ; preds = %entry br label %for.body @@ -316,7 +410,6 @@ for.body: ; preds = %for.body.preheader, %arrayidx6 = getelementptr inbounds i32* %A, i64 %add5 %1 = load i32* %arrayidx6, align 4 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 -; CHECK: da analyze - flow [<>]! store i32 %1, i32* %B.addr.02, align 4 %inc = add nsw i64 %i.03, 1 %exitcond = icmp ne i64 %inc, %n diff --git a/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll b/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll index 343e8f49bf9e..8b2e43f3d868 100644 --- a/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll +++ b/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll @@ -5,18 +5,28 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-macosx10.6.0" -;; for (long unsigned i = 0; i < n; i++) -;; A[1 + n*i] = ... -;; ... = A[1 - n*i]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[1 + n*i] = i; +;; *B++ = A[1 - n*i]; define void @weakcrossing0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body.preheader: ; preds = %entry + br label %for.body + +; CHECK: da analyze - none! +; CHECK: da analyze - flow [0|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = mul i64 %i.03, %n %add = add i64 %mul, 1 @@ -26,30 +36,43 @@ for.body: ; preds = %for.body, %entry %sub = sub i64 1, %mul1 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [0|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long unsigned i = 0; i < n; i++) -;; A[n + i] = ... -;; ... = A[1 + n - i]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[n + i] = i; +;; *B++ = A[1 + n - i]; define void @weakcrossing1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - flow [<>] splitable! +; CHECK: da analyze - split level = 1, iteration = 0! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %add = add i64 %i.03, %n %arrayidx = getelementptr inbounds i32* %A, i64 %add @@ -58,28 +81,36 @@ for.body: ; preds = %for.body, %entry %sub = sub i64 %add1, %i.03 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - flow [<>] splitable! -; CHECK: da analyze - split level = 1, iteration = 0! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long unsigned i = 0; i < 3; i++) -;; A[i] = ... -;; ... = A[6 - i]; +;; for (long unsigned i = 0; i < 3; i++) { +;; A[i] = i; +;; *B++ = A[6 - i]; define void @weakcrossing2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -88,27 +119,33 @@ for.body: ; preds = %for.body, %entry %sub = sub i64 6, %i.02 %arrayidx1 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 3 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 3 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 4; i++) -;; A[i] = ... -;; ... = A[6 - i]; +;; for (long unsigned i = 0; i < 4; i++) { +;; A[i] = i; +;; *B++ = A[6 - i]; define void @weakcrossing3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [0|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -117,27 +154,33 @@ for.body: ; preds = %for.body, %entry %sub = sub i64 6, %i.02 %arrayidx1 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [0|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 4 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 4 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 10; i++) -;; A[i] = ... -;; ... = A[-6 - i]; +;; for (long unsigned i = 0; i < 10; i++) { +;; A[i] = i; +;; *B++ = A[-6 - i]; define void @weakcrossing4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -146,30 +189,39 @@ for.body: ; preds = %for.body, %entry %sub = sub i64 -6, %i.02 %arrayidx1 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 10 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 10 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < n; i++) -;; A[3*i] = ... -;; ... = A[5 - 3*i]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[3*i] = i; +;; *B++ = A[5 - 3*i]; define void @weakcrossing5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = mul i64 %i.03, 3 %arrayidx = getelementptr inbounds i32* %A, i64 %mul @@ -178,27 +230,37 @@ for.body: ; preds = %for.body, %entry %sub = add i64 %0, 5 %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub %1 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %1, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit -for.end: ; preds = %for.body, %entry +for.end.loopexit: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long unsigned i = 0; i < 4; i++) -;; A[i] = ... -;; ... = A[5 - i]; +;; for (long unsigned i = 0; i < 4; i++) { +;; A[i] = i; +;; *B++ = A[5 - i]; define void @weakcrossing6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [<>] splitable! +; CHECK: da analyze - split level = 1, iteration = 2! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -207,13 +269,11 @@ for.body: ; preds = %for.body, %entry %sub = sub i64 5, %i.02 %arrayidx1 = getelementptr inbounds i32* %A, i64 %sub %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [<>] splitable! -; CHECK: da analyze - split level = 1, iteration = 2! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 4 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 4 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void diff --git a/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll b/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll index a59871602b6c..bc85e6c8b690 100644 --- a/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll +++ b/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll @@ -5,15 +5,22 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-macosx10.6.0" -;; for (long unsigned i = 0; i < 30; i++) -;; A[2*i + 10] = ... -;; ... = A[10]; +;; for (long unsigned i = 0; i < 30; i++) { +;; A[2*i + 10] = i; +;; *B++ = A[10]; define void @weakzerodst0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [p<=|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -23,30 +30,39 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 10 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [p<=|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 30 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 30 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < n; i++) -;; A[n*i + 10] = ... -;; ... = A[10]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[n*i + 10] = i; +;; *B++ = A[10]; define void @weakzerodst1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - flow [p<=|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = mul i64 %i.03, %n %add = add i64 %mul, 10 @@ -54,27 +70,36 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 10 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [p<=|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long unsigned i = 0; i < 5; i++) -;; A[2*i] = ... -;; ... = A[10]; +;; for (long unsigned i = 0; i < 5; i++) { +;; A[2*i] = i; +;; *B++ = A[10]; define void @weakzerodst2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -83,27 +108,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 10 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 5 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 5 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 6; i++) -;; A[2*i] = ... -;; ... = A[10]; +;; for (long unsigned i = 0; i < 6; i++) { +;; A[2*i] = i; +;; *B++ = A[10]; define void @weakzerodst3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [=>p|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -112,27 +143,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 10 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [=>p|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 6 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 6 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 7; i++) -;; A[2*i] = ... -;; ... = A[10]; +;; for (long unsigned i = 0; i < 7; i++) { +;; A[2*i] = i; +;; *B++ = A[10]; define void @weakzerodst4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - flow [*|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -141,27 +178,33 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 10 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [*|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 7 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 7 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 7; i++) -;; A[2*i] = ... -;; ... = A[-10]; +;; for (long unsigned i = 0; i < 7; i++) { +;; A[2*i] = i; +;; *B++ = A[-10]; define void @weakzerodst5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -170,43 +213,54 @@ for.body: ; preds = %for.body, %entry store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 -10 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 7 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 7 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < n; i++) -;; A[3*i] = ... -;; ... = A[10]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[3*i] = i; +;; *B++ = A[10]; define void @weakzerodst6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - consistent input [S]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %mul = mul i64 %i.03, 3 %arrayidx = getelementptr inbounds i32* %A, i64 %mul store i32 %conv, i32* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds i32* %A, i64 10 %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } diff --git a/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll b/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll index fd4f46269546..2b3b2d00ecac 100644 --- a/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll +++ b/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll @@ -5,15 +5,22 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-macosx10.6.0" -;; for (long unsigned i = 0; i < 30; i++) -;; A[10] = ... -;; ... = A[2*i + 10]; +;; for (long unsigned i = 0; i < 30; i++) { +;; A[10] = i; +;; *B++ = A[2*i + 10]; define void @weakzerosrc0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - consistent output [S]! +; CHECK: da analyze - flow [p<=|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -23,30 +30,39 @@ for.body: ; preds = %for.body, %entry %add = add i64 %mul, 10 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [p<=|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 30 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 30 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < n; i++) -;; A[10] = ... -;; ... = A[n*i + 10]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[10] = i; +;; *B++ = A[n*i + 10]; define void @weakzerosrc1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - consistent output [S]! +; CHECK: da analyze - flow [p<=|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %arrayidx = getelementptr inbounds i32* %A, i64 10 store i32 %conv, i32* %arrayidx, align 4 @@ -54,27 +70,36 @@ for.body: ; preds = %for.body, %entry %add = add i64 %mul, 10 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [p<=|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } -;; for (long unsigned i = 0; i < 5; i++) -;; A[10] = ... -;; ... = A[2*i]; +;; for (long unsigned i = 0; i < 5; i++) { +;; A[10] = i; +;; *B++ = A[2*i]; define void @weakzerosrc2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - consistent output [S]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -83,27 +108,33 @@ for.body: ; preds = %for.body, %entry %mul = shl i64 %i.02, 1 %arrayidx1 = getelementptr inbounds i32* %A, i64 %mul %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 5 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 5 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 6; i++) -;; A[10] = ... -;; ... = A[2*i]; +;; for (long unsigned i = 0; i < 6; i++) { +;; A[10] = i; +;; *B++ = A[2*i]; define void @weakzerosrc3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - consistent output [S]! +; CHECK: da analyze - flow [=>p|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -112,27 +143,33 @@ for.body: ; preds = %for.body, %entry %mul = shl i64 %i.02, 1 %arrayidx1 = getelementptr inbounds i32* %A, i64 %mul %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [=>p|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 6 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 6 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 7; i++) -;; A[10] = ... -;; ... = A[2*i]; +;; for (long unsigned i = 0; i < 7; i++) { +;; A[10] = i; +;; *B++ = A[2*i]; define void @weakzerosrc4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - consistent output [S]! +; CHECK: da analyze - flow [*|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -141,27 +178,33 @@ for.body: ; preds = %for.body, %entry %mul = shl i64 %i.02, 1 %arrayidx1 = getelementptr inbounds i32* %A, i64 %mul %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow [*|<]! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 7 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 7 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < 7; i++) -;; A[-10] = ... -;; ... = A[2*i]; +;; for (long unsigned i = 0; i < 7; i++) { +;; A[-10] = i; +;; *B++ = A[2*i]; define void @weakzerosrc5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: br label %for.body -for.body: ; preds = %for.body, %entry +; CHECK: da analyze - consistent output [S]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body: ; preds = %entry, %for.body %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ] %conv = trunc i64 %i.02 to i32 @@ -170,43 +213,54 @@ for.body: ; preds = %for.body, %entry %mul = shl i64 %i.02, 1 %arrayidx1 = getelementptr inbounds i32* %A, i64 %mul %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1 store i32 %0, i32* %B.addr.01, align 4 %inc = add i64 %i.02, 1 - %cmp = icmp ult i64 %inc, 7 - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, 7 + br i1 %exitcond, label %for.body, label %for.end for.end: ; preds = %for.body ret void } -;; for (long unsigned i = 0; i < n; i++) -;; A[10] = ... -;; ... = A[3*i]; +;; for (long unsigned i = 0; i < n; i++) { +;; A[10] = i; +;; *B++ = A[3*i]; define void @weakzerosrc6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %cmp1 = icmp eq i64 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + br i1 %cmp1, label %for.end, label %for.body.preheader + +; CHECK: da analyze - consistent output [S]! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + +for.body.preheader: ; preds = %entry + br label %for.body -for.body: ; preds = %for.body, %entry - %i.03 = phi i64 [ %inc, %for.body ], [ 0, %entry ] - %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %entry ] +for.body: ; preds = %for.body.preheader, %for.body + %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] %conv = trunc i64 %i.03 to i32 %arrayidx = getelementptr inbounds i32* %A, i64 10 store i32 %conv, i32* %arrayidx, align 4 %mul = mul i64 %i.03, 3 %arrayidx1 = getelementptr inbounds i32* %A, i64 %mul %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1 store i32 %0, i32* %B.addr.02, align 4 %inc = add i64 %i.03, 1 - %cmp = icmp ult i64 %inc, %n - br i1 %cmp, label %for.body, label %for.end + %exitcond = icmp ne i64 %inc, %n + br i1 %exitcond, label %for.body, label %for.end.loopexit + +for.end.loopexit: ; preds = %for.body + br label %for.end -for.end: ; preds = %for.body, %entry +for.end: ; preds = %for.end.loopexit, %entry ret void } diff --git a/test/Analysis/DependenceAnalysis/ZIV.ll b/test/Analysis/DependenceAnalysis/ZIV.ll index 42b2389df268..5463c63ba3fb 100644 --- a/test/Analysis/DependenceAnalysis/ZIV.ll +++ b/test/Analysis/DependenceAnalysis/ZIV.ll @@ -5,49 +5,70 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-macosx10.6.0" -;; A[n + 1] = ... -;; ... = A[1 + n]; +;; A[n + 1] = 0; +;; *B = A[1 + n]; define void @z0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %add = add i64 %n, 1 %arrayidx = getelementptr inbounds i32* %A, i64 %add store i32 0, i32* %arrayidx, align 4 + +; CHECK: da analyze - none! +; CHECK: da analyze - consistent flow [|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + %add1 = add i64 %n, 1 %arrayidx2 = getelementptr inbounds i32* %A, i64 %add1 %0 = load i32* %arrayidx2, align 4 -; CHECK: da analyze - consistent flow! store i32 %0, i32* %B, align 4 ret void } -;; A[n] = ... -;; ... = A[n + 1]; +;; A[n] = 0; +;; *B = A[n + 1]; define void @z1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp { entry: %arrayidx = getelementptr inbounds i32* %A, i64 %n store i32 0, i32* %arrayidx, align 4 + +; CHECK: da analyze - none! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + %add = add i64 %n, 1 %arrayidx1 = getelementptr inbounds i32* %A, i64 %add %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - none! store i32 %0, i32* %B, align 4 ret void } -;; A[n] = ... -;; ... = A[m]; +;; A[n] = 0; +;; *B = A[m]; define void @z2(i32* %A, i32* %B, i64 %n, i64 %m) nounwind uwtable ssp { entry: %arrayidx = getelementptr inbounds i32* %A, i64 %n store i32 0, i32* %arrayidx, align 4 + +; CHECK: da analyze - none! +; CHECK: da analyze - flow [|<]! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! + %arrayidx1 = getelementptr inbounds i32* %A, i64 %m %0 = load i32* %arrayidx1, align 4 -; CHECK: da analyze - flow! store i32 %0, i32* %B, align 4 ret void } diff --git a/test/Analysis/Dominators/invoke.ll b/test/Analysis/Dominators/invoke.ll index f935750c987e..da0b2461656c 100644 --- a/test/Analysis/Dominators/invoke.ll +++ b/test/Analysis/Dominators/invoke.ll @@ -1,4 +1,4 @@ -; RUN: opt -verify -disable-output %s +; RUN: opt -verify -disable-output < %s ; This tests that we handle unreachable blocks correctly define void @f() { diff --git a/test/Analysis/Profiling/lit.local.cfg b/test/Analysis/Profiling/lit.local.cfg index 19eebc0ac7ac..444b7dc27410 100644 --- a/test/Analysis/Profiling/lit.local.cfg +++ b/test/Analysis/Profiling/lit.local.cfg @@ -1 +1,16 @@ config.suffixes = ['.ll', '.c', '.cpp'] + +def getRoot(config): + if not config.parent: + return config + return getRoot(config.parent) + +root = getRoot(config) + +# Most profiling tests rely on a JIT being present to gather their data; AArch64 +# doesn't have any JIT at present so they will fail when run there. +if root.host_arch in ['AArch64']: + config.unsupported = True + +if 'hexagon' in root.target_triple: + config.unsupported = True diff --git a/test/Analysis/RegionInfo/20100809_bb_not_in_domtree.ll b/test/Analysis/RegionInfo/20100809_bb_not_in_domtree.ll index 218b4375f70c..0dfa0bf9cd8d 100644 --- a/test/Analysis/RegionInfo/20100809_bb_not_in_domtree.ll +++ b/test/Analysis/RegionInfo/20100809_bb_not_in_domtree.ll @@ -1,4 +1,4 @@ -; RUN: opt -regions %s +; RUN: opt -regions < %s define i32 @main() nounwind { entry: br label %for.cond diff --git a/test/Analysis/RegionInfo/block_sort.ll b/test/Analysis/RegionInfo/block_sort.ll index ac77ab36e6f5..d7ef79cf6b55 100644 --- a/test/Analysis/RegionInfo/block_sort.ll +++ b/test/Analysis/RegionInfo/block_sort.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats -analyze < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/cond_loop.ll b/test/Analysis/RegionInfo/cond_loop.ll index 1145ffdba039..0da4e5dca3d3 100644 --- a/test/Analysis/RegionInfo/cond_loop.ll +++ b/test/Analysis/RegionInfo/cond_loop.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/condition_complicated.ll b/test/Analysis/RegionInfo/condition_complicated.ll index 6b398800db9c..53f13c10eaf3 100644 --- a/test/Analysis/RegionInfo/condition_complicated.ll +++ b/test/Analysis/RegionInfo/condition_complicated.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/condition_complicated_2.ll b/test/Analysis/RegionInfo/condition_complicated_2.ll index f551108d6083..fd04afc20dca 100644 --- a/test/Analysis/RegionInfo/condition_complicated_2.ll +++ b/test/Analysis/RegionInfo/condition_complicated_2.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/condition_forward_edge.ll b/test/Analysis/RegionInfo/condition_forward_edge.ll index 5e4d9d2f8b23..88c45c2e6efd 100644 --- a/test/Analysis/RegionInfo/condition_forward_edge.ll +++ b/test/Analysis/RegionInfo/condition_forward_edge.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/condition_same_exit.ll b/test/Analysis/RegionInfo/condition_same_exit.ll index e48413a4c2dd..bfb0df84b44d 100644 --- a/test/Analysis/RegionInfo/condition_same_exit.ll +++ b/test/Analysis/RegionInfo/condition_same_exit.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/condition_simple.ll b/test/Analysis/RegionInfo/condition_simple.ll index 00d9ed24e17d..3f93a6ecd358 100644 --- a/test/Analysis/RegionInfo/condition_simple.ll +++ b/test/Analysis/RegionInfo/condition_simple.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/exit_in_condition.ll b/test/Analysis/RegionInfo/exit_in_condition.ll index b84abecc1649..ac409ec1bb25 100644 --- a/test/Analysis/RegionInfo/exit_in_condition.ll +++ b/test/Analysis/RegionInfo/exit_in_condition.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/infinite_loop.ll b/test/Analysis/RegionInfo/infinite_loop.ll index 8e588286a58a..61abef8ff7a9 100644 --- a/test/Analysis/RegionInfo/infinite_loop.ll +++ b/test/Analysis/RegionInfo/infinite_loop.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s diff --git a/test/Analysis/RegionInfo/infinite_loop_2.ll b/test/Analysis/RegionInfo/infinite_loop_2.ll index a8227e340c5e..56e83cfdebb9 100644 --- a/test/Analysis/RegionInfo/infinite_loop_2.ll +++ b/test/Analysis/RegionInfo/infinite_loop_2.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/infinite_loop_3.ll b/test/Analysis/RegionInfo/infinite_loop_3.ll index b09c9c1e5919..4538f0f78587 100644 --- a/test/Analysis/RegionInfo/infinite_loop_3.ll +++ b/test/Analysis/RegionInfo/infinite_loop_3.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s diff --git a/test/Analysis/RegionInfo/infinite_loop_4.ll b/test/Analysis/RegionInfo/infinite_loop_4.ll index 681c305ce971..4ac9068f0dd8 100644 --- a/test/Analysis/RegionInfo/infinite_loop_4.ll +++ b/test/Analysis/RegionInfo/infinite_loop_4.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/loop_with_condition.ll b/test/Analysis/RegionInfo/loop_with_condition.ll index 08d2ba8e35a9..4c1c8654ca4f 100644 --- a/test/Analysis/RegionInfo/loop_with_condition.ll +++ b/test/Analysis/RegionInfo/loop_with_condition.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s diff --git a/test/Analysis/RegionInfo/loops_1.ll b/test/Analysis/RegionInfo/loops_1.ll index 6449949df843..9efe619ad9d7 100644 --- a/test/Analysis/RegionInfo/loops_1.ll +++ b/test/Analysis/RegionInfo/loops_1.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/loops_2.ll b/test/Analysis/RegionInfo/loops_2.ll index dc4a1adffbac..ca7eca75affd 100644 --- a/test/Analysis/RegionInfo/loops_2.ll +++ b/test/Analysis/RegionInfo/loops_2.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/mix_1.ll b/test/Analysis/RegionInfo/mix_1.ll index 1474e033e574..55001c7f435c 100644 --- a/test/Analysis/RegionInfo/mix_1.ll +++ b/test/Analysis/RegionInfo/mix_1.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s diff --git a/test/Analysis/RegionInfo/nested_loops.ll b/test/Analysis/RegionInfo/nested_loops.ll index a3707a19872f..3e73b3a328f6 100644 --- a/test/Analysis/RegionInfo/nested_loops.ll +++ b/test/Analysis/RegionInfo/nested_loops.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s diff --git a/test/Analysis/RegionInfo/next.ll b/test/Analysis/RegionInfo/next.ll index 890b4f23001e..b22bbcc2b6d5 100644 --- a/test/Analysis/RegionInfo/next.ll +++ b/test/Analysis/RegionInfo/next.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/paper.ll b/test/Analysis/RegionInfo/paper.ll index 96c87e0559b4..0398d2baa225 100644 --- a/test/Analysis/RegionInfo/paper.ll +++ b/test/Analysis/RegionInfo/paper.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/RegionInfo/two_loops_same_header.ll b/test/Analysis/RegionInfo/two_loops_same_header.ll index e75661e8905b..25713420a3b7 100644 --- a/test/Analysis/RegionInfo/two_loops_same_header.ll +++ b/test/Analysis/RegionInfo/two_loops_same_header.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -regions -analyze < %s | FileCheck %s ; RUN: opt -regions -stats < %s 2>&1 | FileCheck -check-prefix=STAT %s ; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s diff --git a/test/Analysis/ScalarEvolution/2010-09-03-RequiredTransitive.ll b/test/Analysis/ScalarEvolution/2010-09-03-RequiredTransitive.ll index aba0ce74678f..5a0239810418 100644 --- a/test/Analysis/ScalarEvolution/2010-09-03-RequiredTransitive.ll +++ b/test/Analysis/ScalarEvolution/2010-09-03-RequiredTransitive.ll @@ -1,8 +1,10 @@ -; RUN: opt -indvars -scalar-evolution -analyze %s +; RUN: opt -indvars -scalar-evolution -analyze < %s | FileCheck %s ; This test checks if the SCEV analysis is printed out at all. ; It failed once as the RequiredTransitive option was not implemented ; correctly. +; CHECK: Classifying expressions for: @main + define i32 @main() nounwind { entry: br label %for.cond diff --git a/test/Analysis/ScalarEvolution/2011-03-09-ExactNoMaxBECount.ll b/test/Analysis/ScalarEvolution/2011-03-09-ExactNoMaxBECount.ll index 9f17e27577c2..49e944dcd266 100644 --- a/test/Analysis/ScalarEvolution/2011-03-09-ExactNoMaxBECount.ll +++ b/test/Analysis/ScalarEvolution/2011-03-09-ExactNoMaxBECount.ll @@ -1,4 +1,4 @@ -; RUN: opt -indvars %s +; RUN: opt -indvars < %s ; PR9424: Attempt to use a SCEVCouldNotCompute object! ; The inner loop computes the Step and Start of the outer loop. ; Call that Vexit. The outer End value is max(2,Vexit), because diff --git a/test/Analysis/ScalarEvolution/fold.ll b/test/Analysis/ScalarEvolution/fold.ll index 4e2adf187e8b..57006dd9bb42 100644 --- a/test/Analysis/ScalarEvolution/fold.ll +++ b/test/Analysis/ScalarEvolution/fold.ll @@ -1,4 +1,4 @@ -; RUN: opt -analyze -scalar-evolution %s -S | FileCheck %s +; RUN: opt -analyze -scalar-evolution -S < %s | FileCheck %s define i16 @test1(i8 %x) { %A = zext i8 %x to i12 diff --git a/test/Analysis/ScalarEvolution/scev-invalid.ll b/test/Analysis/ScalarEvolution/scev-invalid.ll new file mode 100644 index 000000000000..aac0d319ae84 --- /dev/null +++ b/test/Analysis/ScalarEvolution/scev-invalid.ll @@ -0,0 +1,34 @@ +; RUN: opt < %s -S -indvars -loop-unroll | FileCheck %s +; +; PR15570: SEGV: SCEV back-edge info invalid after dead code removal. +; +; Indvars creates a SCEV expression for the loop's back edge taken +; count, then determines that the comparison is always true and +; removes it. +; +; When loop-unroll asks for the expression, it contains a NULL +; SCEVUnknkown (as a CallbackVH). +; +; forgetMemoizedResults should invalidate the backedge taken count expression. + +; CHECK: @test +; CHECK-NOT: phi +; CHECK-NOT: icmp +; CHECK: ret void +define void @test() { +entry: + %xor1 = xor i32 0, 1 + br label %b17 + +b17: + br i1 undef, label %b22, label %b18 + +b18: + %phi1 = phi i32 [ %add1, %b18 ], [ %xor1, %b17 ] + %add1 = add nsw i32 %phi1, -1 + %cmp1 = icmp sgt i32 %add1, 0 + br i1 %cmp1, label %b18, label %b22 + +b22: + ret void +} diff --git a/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll b/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll index 1ac59278e7ea..c6cc26a24106 100644 --- a/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll +++ b/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll @@ -9,13 +9,13 @@ ; invalid, as it's possible that this only happens after optimization on a ; code path which isn't ever executed. -; CHECK: define void @test0_yes(i32* nocapture %p) nounwind readnone { +; CHECK: define void @test0_yes(i32* nocapture %p) #0 { define void @test0_yes(i32* %p) nounwind { store i32 0, i32* %p, !tbaa !1 ret void } -; CHECK: define void @test0_no(i32* nocapture %p) nounwind { +; CHECK: define void @test0_no(i32* nocapture %p) #1 { define void @test0_no(i32* %p) nounwind { store i32 0, i32* %p, !tbaa !2 ret void @@ -24,13 +24,13 @@ define void @test0_no(i32* %p) nounwind { ; Add the readonly attribute, since there's just a call to a function which ; TBAA says doesn't modify any memory. -; CHECK: define void @test1_yes(i32* nocapture %p) nounwind readonly { +; CHECK: define void @test1_yes(i32* nocapture %p) #2 { define void @test1_yes(i32* %p) nounwind { call void @callee(i32* %p), !tbaa !1 ret void } -; CHECK: define void @test1_no(i32* %p) nounwind { +; CHECK: define void @test1_no(i32* %p) #1 { define void @test1_no(i32* %p) nounwind { call void @callee(i32* %p), !tbaa !2 ret void @@ -43,13 +43,13 @@ define void @test1_no(i32* %p) nounwind { ; This is unusual, since the function is memcpy, but as above, this ; isn't necessarily invalid. -; CHECK: define void @test2_yes(i8* nocapture %p, i8* nocapture %q, i64 %n) nounwind readnone { +; CHECK: define void @test2_yes(i8* nocapture %p, i8* nocapture %q, i64 %n) #0 { define void @test2_yes(i8* %p, i8* %q, i64 %n) nounwind { call void @llvm.memcpy.p0i8.p0i8.i64(i8* %p, i8* %q, i64 %n, i32 1, i1 false), !tbaa !1 ret void } -; CHECK: define void @test2_no(i8* nocapture %p, i8* nocapture %q, i64 %n) nounwind { +; CHECK: define void @test2_no(i8* nocapture %p, i8* nocapture %q, i64 %n) #1 { define void @test2_no(i8* %p, i8* %q, i64 %n) nounwind { call void @llvm.memcpy.p0i8.p0i8.i64(i8* %p, i8* %q, i64 %n, i32 1, i1 false), !tbaa !2 ret void @@ -57,13 +57,13 @@ define void @test2_no(i8* %p, i8* %q, i64 %n) nounwind { ; Similar to the others, va_arg only accesses memory through its operand. -; CHECK: define i32 @test3_yes(i8* nocapture %p) nounwind readnone { +; CHECK: define i32 @test3_yes(i8* nocapture %p) #0 { define i32 @test3_yes(i8* %p) nounwind { %t = va_arg i8* %p, i32, !tbaa !1 ret i32 %t } -; CHECK: define i32 @test3_no(i8* nocapture %p) nounwind { +; CHECK: define i32 @test3_no(i8* nocapture %p) #1 { define i32 @test3_no(i8* %p) nounwind { %t = va_arg i8* %p, i32, !tbaa !2 ret i32 %t @@ -72,6 +72,10 @@ define i32 @test3_no(i8* %p) nounwind { declare void @callee(i32* %p) nounwind declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i32, i1) nounwind +; CHECK: attributes #0 = { nounwind readnone } +; CHECK: attributes #1 = { nounwind } +; CHECK: attributes #2 = { nounwind readonly } + ; Root note. !0 = metadata !{ } diff --git a/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll b/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll index 8f080e2108bd..6f1c22da3ac5 100644 --- a/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll +++ b/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll @@ -7,7 +7,7 @@ target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32- ; CHECK: define <8 x i16> @test0(i8* %p, i8* %q, <8 x i16> %y) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) nounwind +; CHECK-NEXT: %a = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %p, i32 16) [[NUW:#[0-9]+]] ; CHECK-NEXT: call void @llvm.arm.neon.vst1.v8i16(i8* %q, <8 x i16> %y, i32 16) ; CHECK-NEXT: %c = add <8 x i16> %a, %a define <8 x i16> @test0(i8* %p, i8* %q, <8 x i16> %y) { @@ -22,6 +22,9 @@ entry: declare <8 x i16> @llvm.arm.neon.vld1.v8i16(i8*, i32) nounwind readonly declare void @llvm.arm.neon.vst1.v8i16(i8*, <8 x i16>, i32) nounwind +; CHECK: attributes #0 = { nounwind readonly } +; CHECK: attributes [[NUW]] = { nounwind } + !0 = metadata !{metadata !"tbaa root", null} !1 = metadata !{metadata !"A", metadata !0} !2 = metadata !{metadata !"B", metadata !0} diff --git a/test/Analysis/TypeBasedAliasAnalysis/placement-tbaa.ll b/test/Analysis/TypeBasedAliasAnalysis/placement-tbaa.ll new file mode 100644 index 000000000000..f1edb4482cf1 --- /dev/null +++ b/test/Analysis/TypeBasedAliasAnalysis/placement-tbaa.ll @@ -0,0 +1,104 @@ +; RUN: opt < %s -tbaa -basicaa -aa-eval -evaluate-tbaa -print-no-aliases -print-may-aliases -disable-output 2>&1 | FileCheck %s + +; Generated with "clang -cc1 -disable-llvm-optzns -O1 -emit-llvm" +; #include <new> +; struct Foo { long i; }; +; struct Bar { void *p; }; +; long foo(int n) { +; Foo *f = new Foo; +; f->i = 1; +; for (int i=0; i<n; ++i) { +; Bar *b = new (f) Bar; +; b->p = 0; +; f = new (f) Foo; +; f->i = i; +; } +; return f->i; +; } + +; Basic AA says MayAlias, TBAA says NoAlias +; CHECK: MayAlias: i64* %i5, i8** %p +; CHECK: NoAlias: store i64 %conv, i64* %i5, align 8, !tbaa !4 <-> store i8* null, i8** %p, align 8, !tbaa !3 + +%struct.Foo = type { i64 } +%struct.Bar = type { i8* } + +define i64 @_Z3fooi(i32 %n) #0 { +entry: + %n.addr = alloca i32, align 4 + %f = alloca %struct.Foo*, align 8 + %i1 = alloca i32, align 4 + %b = alloca %struct.Bar*, align 8 + store i32 %n, i32* %n.addr, align 4, !tbaa !0 + %call = call noalias i8* @_Znwm(i64 8) + %0 = bitcast i8* %call to %struct.Foo* + store %struct.Foo* %0, %struct.Foo** %f, align 8, !tbaa !3 + %1 = load %struct.Foo** %f, align 8, !tbaa !3 + %i = getelementptr inbounds %struct.Foo* %1, i32 0, i32 0 + store i64 1, i64* %i, align 8, !tbaa !4 + store i32 0, i32* %i1, align 4, !tbaa !0 + br label %for.cond + +for.cond: + %2 = load i32* %i1, align 4, !tbaa !0 + %3 = load i32* %n.addr, align 4, !tbaa !0 + %cmp = icmp slt i32 %2, %3 + br i1 %cmp, label %for.body, label %for.end + +for.body: + %4 = load %struct.Foo** %f, align 8, !tbaa !3 + %5 = bitcast %struct.Foo* %4 to i8* + %new.isnull = icmp eq i8* %5, null + br i1 %new.isnull, label %new.cont, label %new.notnull + +new.notnull: + %6 = bitcast i8* %5 to %struct.Bar* + br label %new.cont + +new.cont: + %7 = phi %struct.Bar* [ %6, %new.notnull ], [ null, %for.body ] + store %struct.Bar* %7, %struct.Bar** %b, align 8, !tbaa !3 + %8 = load %struct.Bar** %b, align 8, !tbaa !3 + %p = getelementptr inbounds %struct.Bar* %8, i32 0, i32 0 + store i8* null, i8** %p, align 8, !tbaa !3 + %9 = load %struct.Foo** %f, align 8, !tbaa !3 + %10 = bitcast %struct.Foo* %9 to i8* + %new.isnull2 = icmp eq i8* %10, null + br i1 %new.isnull2, label %new.cont4, label %new.notnull3 + +new.notnull3: + %11 = bitcast i8* %10 to %struct.Foo* + br label %new.cont4 + +new.cont4: + %12 = phi %struct.Foo* [ %11, %new.notnull3 ], [ null, %new.cont ] + store %struct.Foo* %12, %struct.Foo** %f, align 8, !tbaa !3 + %13 = load i32* %i1, align 4, !tbaa !0 + %conv = sext i32 %13 to i64 + %14 = load %struct.Foo** %f, align 8, !tbaa !3 + %i5 = getelementptr inbounds %struct.Foo* %14, i32 0, i32 0 + store i64 %conv, i64* %i5, align 8, !tbaa !4 + br label %for.inc + +for.inc: + %15 = load i32* %i1, align 4, !tbaa !0 + %inc = add nsw i32 %15, 1 + store i32 %inc, i32* %i1, align 4, !tbaa !0 + br label %for.cond + +for.end: + %16 = load %struct.Foo** %f, align 8, !tbaa !3 + %i6 = getelementptr inbounds %struct.Foo* %16, i32 0, i32 0 + %17 = load i64* %i6, align 8, !tbaa !4 + ret i64 %17 +} + +declare noalias i8* @_Znwm(i64) + +attributes #0 = { nounwind } + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"any pointer", metadata !1} +!4 = metadata !{metadata !"long", metadata !1} diff --git a/test/Assembler/2008-09-02-FunctionNotes.ll b/test/Assembler/2008-09-02-FunctionNotes.ll index 761c91e864c4..11a0411ef79f 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 b2256b10a8da..df70149a33f6 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 000000000000..83e8909b5ebd --- /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 000000000000..4be6e629a1d0 --- /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 000000000000..3a116c507f48 --- /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 ce6866d54417..af03fca6d2c1 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 000000000000..d2479f44048a --- /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 000000000000..8b71ce3095b1 --- /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 000000000000..1f6c29b3ccc2 --- /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 000000000000..ec66836bac19 --- /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 3c94ca213081..35b3b39ce48f 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 } diff --git a/test/Bindings/Ocaml/vmcore.ml b/test/Bindings/Ocaml/vmcore.ml index 61be4b770358..b49bab9ab17b 100644 --- a/test/Bindings/Ocaml/vmcore.ml +++ b/test/Bindings/Ocaml/vmcore.ml @@ -860,7 +860,8 @@ let test_builder () = group "function attribute"; begin ignore (add_function_attr fn Attribute.UWTable); - (* RUN: grep "X7.*uwtable" < %t.ll + (* RUN: grep "X7.*#0" < %t.ll + * RUN: grep "attributes #0 = .*uwtable.*" < %t.ll *) insist ([Attribute.UWTable] = function_attr fn); end; diff --git a/test/Bitcode/attributes.ll b/test/Bitcode/attributes.ll index 502e96728230..6c46e94012a5 100644 --- a/test/Bitcode/attributes.ll +++ b/test/Bitcode/attributes.ll @@ -14,7 +14,7 @@ define void @f2(i8 signext) } define void @f3() noreturn -; CHECK: define void @f3() noreturn +; CHECK: define void @f3() #0 { ret void; } @@ -32,7 +32,7 @@ define void @f5(i8* sret) } define void @f6() nounwind -; CHECK: define void @f6() nounwind +; CHECK: define void @f6() #1 { ret void; } @@ -56,43 +56,43 @@ define void @f9(i8* nest) } define void @f10() readnone -; CHECK: define void @f10() readnone +; CHECK: define void @f10() #2 { ret void; } define void @f11() readonly -; CHECK: define void @f11() readonly +; CHECK: define void @f11() #3 { ret void; } define void @f12() noinline -; CHECK: define void @f12() noinline +; CHECK: define void @f12() #4 { ret void; } define void @f13() alwaysinline -; CHECK: define void @f13() alwaysinline +; CHECK: define void @f13() #5 { ret void; } define void @f14() optsize -; CHECK: define void @f14() optsize +; CHECK: define void @f14() #6 { ret void; } define void @f15() ssp -; CHECK: define void @f15() ssp +; CHECK: define void @f15() #7 { ret void; } define void @f16() sspreq -; CHECK: define void @f16() sspreq +; CHECK: define void @f16() #8 { ret void; } @@ -110,55 +110,93 @@ define void @f18(i8* nocapture) } define void @f19() noredzone -; CHECK: define void @f19() noredzone +; CHECK: define void @f19() #9 { ret void; } define void @f20() noimplicitfloat -; CHECK: define void @f20() noimplicitfloat +; CHECK: define void @f20() #10 { ret void; } define void @f21() naked -; CHECK: define void @f21() naked +; CHECK: define void @f21() #11 { ret void; } define void @f22() inlinehint -; CHECK: define void @f22() inlinehint +; CHECK: define void @f22() #12 { ret void; } define void @f23() alignstack(4) -; CHECK: define void @f23() alignstack(4) +; CHECK: define void @f23() #13 { ret void; } define void @f24() returns_twice -; CHECK: define void @f24() returns_twice +; CHECK: define void @f24() #14 { ret void; } define void @f25() uwtable -; CHECK: define void @f25() uwtable +; CHECK: define void @f25() #15 { ret void; } define void @f26() nonlazybind -; CHECK: define void @f26() nonlazybind +; CHECK: define void @f26() #16 { ret void; } -define void @f27() address_safety -; CHECK: define void @f27() address_safety +define void @f27() sanitize_address +; CHECK: define void @f27() #17 { ret void; } +define void @f28() sanitize_thread +; CHECK: define void @f28() #18 +{ + ret void; +} +define void @f29() sanitize_memory +; CHECK: define void @f29() #19 +{ + ret void; +} + +define void @f30() "cpu"="cortex-a8" +; CHECK: define void @f30() #20 +{ + ret void; +} + +; CHECK: attributes #0 = { noreturn } +; CHECK: attributes #1 = { nounwind } +; CHECK: attributes #2 = { readnone } +; CHECK: attributes #3 = { readonly } +; CHECK: attributes #4 = { noinline } +; CHECK: attributes #5 = { alwaysinline } +; CHECK: attributes #6 = { optsize } +; CHECK: attributes #7 = { ssp } +; CHECK: attributes #8 = { sspreq } +; CHECK: attributes #9 = { noredzone } +; CHECK: attributes #10 = { noimplicitfloat } +; CHECK: attributes #11 = { naked } +; CHECK: attributes #12 = { inlinehint } +; CHECK: attributes #13 = { alignstack=4 } +; CHECK: attributes #14 = { returns_twice } +; CHECK: attributes #15 = { uwtable } +; CHECK: attributes #16 = { nonlazybind } +; CHECK: attributes #17 = { sanitize_address } +; CHECK: attributes #18 = { sanitize_thread } +; CHECK: attributes #19 = { sanitize_memory } +; CHECK: attributes #20 = { "cpu"="cortex-a8" } diff --git a/test/Bitcode/ptest-new.ll b/test/Bitcode/ptest-new.ll index 276fb7ab6a13..735cc9c1cc44 100644 --- a/test/Bitcode/ptest-new.ll +++ b/test/Bitcode/ptest-new.ll @@ -13,10 +13,13 @@ entry: ret i32 %add2 } -; CHECK: declare i32 @llvm.x86.sse41.ptestc(<2 x i64>, <2 x i64>) nounwind readnone -; CHECK: declare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) nounwind readnone -; CHECK: declare i32 @llvm.x86.sse41.ptestnzc(<2 x i64>, <2 x i64>) nounwind readnone +; CHECK: declare i32 @llvm.x86.sse41.ptestc(<2 x i64>, <2 x i64>) #1 +; CHECK: declare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) #1 +; CHECK: declare i32 @llvm.x86.sse41.ptestnzc(<2 x i64>, <2 x i64>) #1 declare i32 @llvm.x86.sse41.ptestc(<2 x i64>, <2 x i64>) nounwind readnone declare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) nounwind readnone declare i32 @llvm.x86.sse41.ptestnzc(<2 x i64>, <2 x i64>) nounwind readnone + +; CHECK: attributes #0 = { nounwind } +; CHECK: attributes #1 = { nounwind readnone } diff --git a/test/Bitcode/ptest-old.ll b/test/Bitcode/ptest-old.ll index fc6ed8ef7b67..fbe962fae51a 100644 --- a/test/Bitcode/ptest-old.ll +++ b/test/Bitcode/ptest-old.ll @@ -13,10 +13,13 @@ entry: ret i32 %add2 } -; CHECK: declare i32 @llvm.x86.sse41.ptestc(<2 x i64>, <2 x i64>) nounwind readnone -; CHECK: declare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) nounwind readnone -; CHECK: declare i32 @llvm.x86.sse41.ptestnzc(<2 x i64>, <2 x i64>) nounwind readnone +; CHECK: declare i32 @llvm.x86.sse41.ptestc(<2 x i64>, <2 x i64>) #1 +; CHECK: declare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) #1 +; CHECK: declare i32 @llvm.x86.sse41.ptestnzc(<2 x i64>, <2 x i64>) #1 declare i32 @llvm.x86.sse41.ptestc(<4 x float>, <4 x float>) nounwind readnone declare i32 @llvm.x86.sse41.ptestz(<4 x float>, <4 x float>) nounwind readnone declare i32 @llvm.x86.sse41.ptestnzc(<4 x float>, <4 x float>) nounwind readnone + +; CHECK: attributes #0 = { nounwind } +; CHECK: attributes #1 = { nounwind readnone } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e10a532341e6..728213f6130a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -12,11 +12,8 @@ if(NOT LLVM_BUILD_TOOLS) set(EXCLUDE_FROM_ALL ON) endif() -add_lit_testsuite(check-llvm "Running the LLVM regression tests" - ${CMAKE_CURRENT_BINARY_DIR} - PARAMS llvm_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg - llvm_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg - DEPENDS UnitTests +# Set the depends list as a variable so that it can grow conditionally. +set(LLVM_TEST_DEPENDS UnitTests BugpointPasses LLVMHello llc lli llvm-ar llvm-as llvm-bcanalyzer llvm-diff @@ -27,10 +24,23 @@ add_lit_testsuite(check-llvm "Running the LLVM regression tests" llvm-nm llvm-objdump llvm-readobj + llvm-rtdyld + llvm-symbolizer macho-dump opt profile_rt-shared FileCheck count not - yaml2obj + yaml2obj obj2yaml) + +# If Intel JIT events are supported, depend on a tool that tests the listener. +if( LLVM_USE_INTEL_JITEVENTS ) + set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} llvm-jitlistener) +endif( LLVM_USE_INTEL_JITEVENTS ) + +add_lit_testsuite(check-llvm "Running the LLVM regression tests" + ${CMAKE_CURRENT_BINARY_DIR} + PARAMS llvm_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg + llvm_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg + DEPENDS ${LLVM_TEST_DEPENDS} ) set_target_properties(check-llvm PROPERTIES FOLDER "Tests") diff --git a/test/CodeGen/AArch64/adc.ll b/test/CodeGen/AArch64/adc.ll new file mode 100644 index 000000000000..7cb373232a2c --- /dev/null +++ b/test/CodeGen/AArch64/adc.ll @@ -0,0 +1,54 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +define i128 @test_simple(i128 %a, i128 %b, i128 %c) { +; CHECK: test_simple: + + %valadd = add i128 %a, %b +; CHECK: adds [[ADDLO:x[0-9]+]], x0, x2 +; CHECK-NEXT: adcs [[ADDHI:x[0-9]+]], x1, x3 + + %valsub = sub i128 %valadd, %c +; CHECK: subs x0, [[ADDLO]], x4 +; CHECK: sbcs x1, [[ADDHI]], x5 + + ret i128 %valsub +; CHECK: ret +} + +define i128 @test_imm(i128 %a) { +; CHECK: test_imm: + + %val = add i128 %a, 12 +; CHECK: adds x0, x0, #12 +; CHECK: adcs x1, x1, {{x[0-9]|xzr}} + + ret i128 %val +; CHECK: ret +} + +define i128 @test_shifted(i128 %a, i128 %b) { +; CHECK: test_shifted: + + %rhs = shl i128 %b, 45 + + %val = add i128 %a, %rhs +; CHECK: adds x0, x0, x2, lsl #45 +; CHECK: adcs x1, x1, {{x[0-9]}} + + ret i128 %val +; CHECK: ret +} + +define i128 @test_extended(i128 %a, i16 %b) { +; CHECK: test_extended: + + %ext = sext i16 %b to i128 + %rhs = shl i128 %ext, 3 + + %val = add i128 %a, %rhs +; CHECK: adds x0, x0, w2, sxth #3 +; CHECK: adcs x1, x1, {{x[0-9]}} + + ret i128 %val +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/addsub-shifted.ll b/test/CodeGen/AArch64/addsub-shifted.ll new file mode 100644 index 000000000000..f2c74f6952b0 --- /dev/null +++ b/test/CodeGen/AArch64/addsub-shifted.ll @@ -0,0 +1,295 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @test_lsl_arith(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { +; CHECK: test_lsl_arith: + + %rhs1 = load volatile i32* @var32 + %shift1 = shl i32 %rhs1, 18 + %val1 = add i32 %lhs32, %shift1 + store volatile i32 %val1, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #18 + + %rhs2 = load volatile i32* @var32 + %shift2 = shl i32 %rhs2, 31 + %val2 = add i32 %shift2, %lhs32 + store volatile i32 %val2, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #31 + + %rhs3 = load volatile i32* @var32 + %shift3 = shl i32 %rhs3, 5 + %val3 = sub i32 %lhs32, %shift3 + store volatile i32 %val3, i32* @var32 +; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #5 + +; Subtraction is not commutative! + %rhs4 = load volatile i32* @var32 + %shift4 = shl i32 %rhs4, 19 + %val4 = sub i32 %shift4, %lhs32 + store volatile i32 %val4, i32* @var32 +; CHECK-NOT: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #19 + + %lhs4a = load volatile i32* @var32 + %shift4a = shl i32 %lhs4a, 15 + %val4a = sub i32 0, %shift4a + store volatile i32 %val4a, i32* @var32 +; CHECK: sub {{w[0-9]+}}, wzr, {{w[0-9]+}}, lsl #15 + + %rhs5 = load volatile i64* @var64 + %shift5 = shl i64 %rhs5, 18 + %val5 = add i64 %lhs64, %shift5 + store volatile i64 %val5, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #18 + + %rhs6 = load volatile i64* @var64 + %shift6 = shl i64 %rhs6, 31 + %val6 = add i64 %shift6, %lhs64 + store volatile i64 %val6, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #31 + + %rhs7 = load volatile i64* @var64 + %shift7 = shl i64 %rhs7, 5 + %val7 = sub i64 %lhs64, %shift7 + store volatile i64 %val7, i64* @var64 +; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #5 + +; Subtraction is not commutative! + %rhs8 = load volatile i64* @var64 + %shift8 = shl i64 %rhs8, 19 + %val8 = sub i64 %shift8, %lhs64 + store volatile i64 %val8, i64* @var64 +; CHECK-NOT: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #19 + + %lhs8a = load volatile i64* @var64 + %shift8a = shl i64 %lhs8a, 60 + %val8a = sub i64 0, %shift8a + store volatile i64 %val8a, i64* @var64 +; CHECK: sub {{x[0-9]+}}, xzr, {{x[0-9]+}}, lsl #60 + + ret void +; CHECK: ret +} + +define void @test_lsr_arith(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { +; CHECK: test_lsr_arith: + + %shift1 = lshr i32 %rhs32, 18 + %val1 = add i32 %lhs32, %shift1 + store volatile i32 %val1, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #18 + + %shift2 = lshr i32 %rhs32, 31 + %val2 = add i32 %shift2, %lhs32 + store volatile i32 %val2, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #31 + + %shift3 = lshr i32 %rhs32, 5 + %val3 = sub i32 %lhs32, %shift3 + store volatile i32 %val3, i32* @var32 +; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #5 + +; Subtraction is not commutative! + %shift4 = lshr i32 %rhs32, 19 + %val4 = sub i32 %shift4, %lhs32 + store volatile i32 %val4, i32* @var32 +; CHECK-NOT: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #19 + + %shift4a = lshr i32 %lhs32, 15 + %val4a = sub i32 0, %shift4a + store volatile i32 %val4a, i32* @var32 +; CHECK: sub {{w[0-9]+}}, wzr, {{w[0-9]+}}, lsr #15 + + %shift5 = lshr i64 %rhs64, 18 + %val5 = add i64 %lhs64, %shift5 + store volatile i64 %val5, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #18 + + %shift6 = lshr i64 %rhs64, 31 + %val6 = add i64 %shift6, %lhs64 + store volatile i64 %val6, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #31 + + %shift7 = lshr i64 %rhs64, 5 + %val7 = sub i64 %lhs64, %shift7 + store volatile i64 %val7, i64* @var64 +; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #5 + +; Subtraction is not commutative! + %shift8 = lshr i64 %rhs64, 19 + %val8 = sub i64 %shift8, %lhs64 + store volatile i64 %val8, i64* @var64 +; CHECK-NOT: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #19 + + %shift8a = lshr i64 %lhs64, 45 + %val8a = sub i64 0, %shift8a + store volatile i64 %val8a, i64* @var64 +; CHECK: sub {{x[0-9]+}}, xzr, {{x[0-9]+}}, lsr #45 + + ret void +; CHECK: ret +} + +define void @test_asr_arith(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { +; CHECK: test_asr_arith: + + %shift1 = ashr i32 %rhs32, 18 + %val1 = add i32 %lhs32, %shift1 + store volatile i32 %val1, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #18 + + %shift2 = ashr i32 %rhs32, 31 + %val2 = add i32 %shift2, %lhs32 + store volatile i32 %val2, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #31 + + %shift3 = ashr i32 %rhs32, 5 + %val3 = sub i32 %lhs32, %shift3 + store volatile i32 %val3, i32* @var32 +; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #5 + +; Subtraction is not commutative! + %shift4 = ashr i32 %rhs32, 19 + %val4 = sub i32 %shift4, %lhs32 + store volatile i32 %val4, i32* @var32 +; CHECK-NOT: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #19 + + %shift4a = ashr i32 %lhs32, 15 + %val4a = sub i32 0, %shift4a + store volatile i32 %val4a, i32* @var32 +; CHECK: sub {{w[0-9]+}}, wzr, {{w[0-9]+}}, asr #15 + + %shift5 = ashr i64 %rhs64, 18 + %val5 = add i64 %lhs64, %shift5 + store volatile i64 %val5, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #18 + + %shift6 = ashr i64 %rhs64, 31 + %val6 = add i64 %shift6, %lhs64 + store volatile i64 %val6, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #31 + + %shift7 = ashr i64 %rhs64, 5 + %val7 = sub i64 %lhs64, %shift7 + store volatile i64 %val7, i64* @var64 +; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #5 + +; Subtraction is not commutative! + %shift8 = ashr i64 %rhs64, 19 + %val8 = sub i64 %shift8, %lhs64 + store volatile i64 %val8, i64* @var64 +; CHECK-NOT: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #19 + + %shift8a = ashr i64 %lhs64, 45 + %val8a = sub i64 0, %shift8a + store volatile i64 %val8a, i64* @var64 +; CHECK: sub {{x[0-9]+}}, xzr, {{x[0-9]+}}, asr #45 + + ret void +; CHECK: ret +} + +define i32 @test_cmp(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { +; CHECK: test_cmp: + + %shift1 = shl i32 %rhs32, 13 + %tst1 = icmp uge i32 %lhs32, %shift1 + br i1 %tst1, label %t2, label %end +; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, lsl #13 + +t2: + %shift2 = lshr i32 %rhs32, 20 + %tst2 = icmp ne i32 %lhs32, %shift2 + br i1 %tst2, label %t3, label %end +; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, lsr #20 + +t3: + %shift3 = ashr i32 %rhs32, 9 + %tst3 = icmp ne i32 %lhs32, %shift3 + br i1 %tst3, label %t4, label %end +; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, asr #9 + +t4: + %shift4 = shl i64 %rhs64, 43 + %tst4 = icmp uge i64 %lhs64, %shift4 + br i1 %tst4, label %t5, label %end +; CHECK: cmp {{x[0-9]+}}, {{x[0-9]+}}, lsl #43 + +t5: + %shift5 = lshr i64 %rhs64, 20 + %tst5 = icmp ne i64 %lhs64, %shift5 + br i1 %tst5, label %t6, label %end +; CHECK: cmp {{x[0-9]+}}, {{x[0-9]+}}, lsr #20 + +t6: + %shift6 = ashr i64 %rhs64, 59 + %tst6 = icmp ne i64 %lhs64, %shift6 + br i1 %tst6, label %t7, label %end +; CHECK: cmp {{x[0-9]+}}, {{x[0-9]+}}, asr #59 + +t7: + ret i32 1 +end: + + ret i32 0 +; CHECK: ret +} + +define i32 @test_cmn(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { +; CHECK: test_cmn: + + %shift1 = shl i32 %rhs32, 13 + %val1 = sub i32 0, %shift1 + %tst1 = icmp uge i32 %lhs32, %val1 + br i1 %tst1, label %t2, label %end + ; Important that this isn't lowered to a cmn instruction because if %rhs32 == + ; 0 then the results will differ. +; CHECK: sub [[RHS:w[0-9]+]], wzr, {{w[0-9]+}}, lsl #13 +; CHECK: cmp {{w[0-9]+}}, [[RHS]] + +t2: + %shift2 = lshr i32 %rhs32, 20 + %val2 = sub i32 0, %shift2 + %tst2 = icmp ne i32 %lhs32, %val2 + br i1 %tst2, label %t3, label %end +; CHECK: cmn {{w[0-9]+}}, {{w[0-9]+}}, lsr #20 + +t3: + %shift3 = ashr i32 %rhs32, 9 + %val3 = sub i32 0, %shift3 + %tst3 = icmp eq i32 %lhs32, %val3 + br i1 %tst3, label %t4, label %end +; CHECK: cmn {{w[0-9]+}}, {{w[0-9]+}}, asr #9 + +t4: + %shift4 = shl i64 %rhs64, 43 + %val4 = sub i64 0, %shift4 + %tst4 = icmp slt i64 %lhs64, %val4 + br i1 %tst4, label %t5, label %end + ; Again, it's important that cmn isn't used here in case %rhs64 == 0. +; CHECK: sub [[RHS:x[0-9]+]], xzr, {{x[0-9]+}}, lsl #43 +; CHECK: cmp {{x[0-9]+}}, [[RHS]] + +t5: + %shift5 = lshr i64 %rhs64, 20 + %val5 = sub i64 0, %shift5 + %tst5 = icmp ne i64 %lhs64, %val5 + br i1 %tst5, label %t6, label %end +; CHECK: cmn {{x[0-9]+}}, {{x[0-9]+}}, lsr #20 + +t6: + %shift6 = ashr i64 %rhs64, 59 + %val6 = sub i64 0, %shift6 + %tst6 = icmp ne i64 %lhs64, %val6 + br i1 %tst6, label %t7, label %end +; CHECK: cmn {{x[0-9]+}}, {{x[0-9]+}}, asr #59 + +t7: + ret i32 1 +end: + + ret i32 0 +; CHECK: ret +} + diff --git a/test/CodeGen/AArch64/addsub.ll b/test/CodeGen/AArch64/addsub.ll new file mode 100644 index 000000000000..5148807163c9 --- /dev/null +++ b/test/CodeGen/AArch64/addsub.ll @@ -0,0 +1,127 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +; Note that this should be refactored (for efficiency if nothing else) +; when the PCS is implemented so we don't have to worry about the +; loads and stores. + +@var_i32 = global i32 42 +@var_i64 = global i64 0 + +; Add pure 12-bit immediates: +define void @add_small() { +; CHECK: add_small: + +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, #4095 + %val32 = load i32* @var_i32 + %newval32 = add i32 %val32, 4095 + store i32 %newval32, i32* @var_i32 + +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, #52 + %val64 = load i64* @var_i64 + %newval64 = add i64 %val64, 52 + store i64 %newval64, i64* @var_i64 + + ret void +} + +; Add 12-bit immediates, shifted left by 12 bits +define void @add_med() { +; CHECK: add_med: + +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, #3567, lsl #12 + %val32 = load i32* @var_i32 + %newval32 = add i32 %val32, 14610432 ; =0xdef000 + store i32 %newval32, i32* @var_i32 + +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, #4095, lsl #12 + %val64 = load i64* @var_i64 + %newval64 = add i64 %val64, 16773120 ; =0xfff000 + store i64 %newval64, i64* @var_i64 + + ret void +} + +; Subtract 12-bit immediates +define void @sub_small() { +; CHECK: sub_small: + +; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, #4095 + %val32 = load i32* @var_i32 + %newval32 = sub i32 %val32, 4095 + store i32 %newval32, i32* @var_i32 + +; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, #52 + %val64 = load i64* @var_i64 + %newval64 = sub i64 %val64, 52 + store i64 %newval64, i64* @var_i64 + + ret void +} + +; Subtract 12-bit immediates, shifted left by 12 bits +define void @sub_med() { +; CHECK: sub_med: + +; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, #3567, lsl #12 + %val32 = load i32* @var_i32 + %newval32 = sub i32 %val32, 14610432 ; =0xdef000 + store i32 %newval32, i32* @var_i32 + +; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, #4095, lsl #12 + %val64 = load i64* @var_i64 + %newval64 = sub i64 %val64, 16773120 ; =0xfff000 + store i64 %newval64, i64* @var_i64 + + ret void +} + +define void @testing() { +; CHECK: testing: + %val = load i32* @var_i32 + +; CHECK: cmp {{w[0-9]+}}, #4095 +; CHECK: b.ne .LBB4_6 + %cmp_pos_small = icmp ne i32 %val, 4095 + br i1 %cmp_pos_small, label %ret, label %test2 + +test2: +; CHECK: cmp {{w[0-9]+}}, #3567, lsl #12 +; CHECK: b.lo .LBB4_6 + %newval2 = add i32 %val, 1 + store i32 %newval2, i32* @var_i32 + %cmp_pos_big = icmp ult i32 %val, 14610432 + br i1 %cmp_pos_big, label %ret, label %test3 + +test3: +; CHECK: cmp {{w[0-9]+}}, #123 +; CHECK: b.lt .LBB4_6 + %newval3 = add i32 %val, 2 + store i32 %newval3, i32* @var_i32 + %cmp_pos_slt = icmp slt i32 %val, 123 + br i1 %cmp_pos_slt, label %ret, label %test4 + +test4: +; CHECK: cmp {{w[0-9]+}}, #321 +; CHECK: b.gt .LBB4_6 + %newval4 = add i32 %val, 3 + store i32 %newval4, i32* @var_i32 + %cmp_pos_sgt = icmp sgt i32 %val, 321 + br i1 %cmp_pos_sgt, label %ret, label %test5 + +test5: +; CHECK: cmn {{w[0-9]+}}, #444 +; CHECK: b.gt .LBB4_6 + %newval5 = add i32 %val, 4 + store i32 %newval5, i32* @var_i32 + %cmp_neg_uge = icmp sgt i32 %val, -444 + br i1 %cmp_neg_uge, label %ret, label %test6 + +test6: + %newval6 = add i32 %val, 5 + store i32 %newval6, i32* @var_i32 + ret void + +ret: + ret void +} +; TODO: adds/subs diff --git a/test/CodeGen/AArch64/addsub_ext.ll b/test/CodeGen/AArch64/addsub_ext.ll new file mode 100644 index 000000000000..2dd16626ea9f --- /dev/null +++ b/test/CodeGen/AArch64/addsub_ext.ll @@ -0,0 +1,189 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var8 = global i8 0 +@var16 = global i16 0 +@var32 = global i32 0 +@var64 = global i64 0 + +define void @addsub_i8rhs() { +; CHECK: addsub_i8rhs: + %val8_tmp = load i8* @var8 + %lhs32 = load i32* @var32 + %lhs64 = load i64* @var64 + + ; Need this to prevent extension upon load and give a vanilla i8 operand. + %val8 = add i8 %val8_tmp, 123 + + +; Zero-extending to 32-bits + %rhs32_zext = zext i8 %val8 to i32 + %res32_zext = add i32 %lhs32, %rhs32_zext + store volatile i32 %res32_zext, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxtb + + %rhs32_zext_shift = shl i32 %rhs32_zext, 3 + %res32_zext_shift = add i32 %lhs32, %rhs32_zext_shift + store volatile i32 %res32_zext_shift, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxtb #3 + + +; Zero-extending to 64-bits + %rhs64_zext = zext i8 %val8 to i64 + %res64_zext = add i64 %lhs64, %rhs64_zext + store volatile i64 %res64_zext, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtb + + %rhs64_zext_shift = shl i64 %rhs64_zext, 1 + %res64_zext_shift = add i64 %lhs64, %rhs64_zext_shift + store volatile i64 %res64_zext_shift, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtb #1 + +; Sign-extending to 32-bits + %rhs32_sext = sext i8 %val8 to i32 + %res32_sext = add i32 %lhs32, %rhs32_sext + store volatile i32 %res32_sext, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxtb + + %rhs32_sext_shift = shl i32 %rhs32_sext, 1 + %res32_sext_shift = add i32 %lhs32, %rhs32_sext_shift + store volatile i32 %res32_sext_shift, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxtb #1 + +; Sign-extending to 64-bits + %rhs64_sext = sext i8 %val8 to i64 + %res64_sext = add i64 %lhs64, %rhs64_sext + store volatile i64 %res64_sext, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtb + + %rhs64_sext_shift = shl i64 %rhs64_sext, 4 + %res64_sext_shift = add i64 %lhs64, %rhs64_sext_shift + store volatile i64 %res64_sext_shift, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtb #4 + + +; CMP variants + %tst = icmp slt i32 %lhs32, %rhs32_zext + br i1 %tst, label %end, label %test2 +; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, uxtb + +test2: + %cmp_sext = sext i8 %val8 to i64 + %tst2 = icmp eq i64 %lhs64, %cmp_sext + br i1 %tst2, label %other, label %end +; CHECK: cmp {{x[0-9]+}}, {{w[0-9]+}}, sxtb + +other: + store volatile i32 %lhs32, i32* @var32 + ret void + +end: + ret void +} + +define void @addsub_i16rhs() { +; CHECK: addsub_i16rhs: + %val16_tmp = load i16* @var16 + %lhs32 = load i32* @var32 + %lhs64 = load i64* @var64 + + ; Need this to prevent extension upon load and give a vanilla i16 operand. + %val16 = add i16 %val16_tmp, 123 + + +; Zero-extending to 32-bits + %rhs32_zext = zext i16 %val16 to i32 + %res32_zext = add i32 %lhs32, %rhs32_zext + store volatile i32 %res32_zext, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxth + + %rhs32_zext_shift = shl i32 %rhs32_zext, 3 + %res32_zext_shift = add i32 %lhs32, %rhs32_zext_shift + store volatile i32 %res32_zext_shift, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxth #3 + + +; Zero-extending to 64-bits + %rhs64_zext = zext i16 %val16 to i64 + %res64_zext = add i64 %lhs64, %rhs64_zext + store volatile i64 %res64_zext, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxth + + %rhs64_zext_shift = shl i64 %rhs64_zext, 1 + %res64_zext_shift = add i64 %lhs64, %rhs64_zext_shift + store volatile i64 %res64_zext_shift, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxth #1 + +; Sign-extending to 32-bits + %rhs32_sext = sext i16 %val16 to i32 + %res32_sext = add i32 %lhs32, %rhs32_sext + store volatile i32 %res32_sext, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxth + + %rhs32_sext_shift = shl i32 %rhs32_sext, 1 + %res32_sext_shift = add i32 %lhs32, %rhs32_sext_shift + store volatile i32 %res32_sext_shift, i32* @var32 +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxth #1 + +; Sign-extending to 64-bits + %rhs64_sext = sext i16 %val16 to i64 + %res64_sext = add i64 %lhs64, %rhs64_sext + store volatile i64 %res64_sext, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxth + + %rhs64_sext_shift = shl i64 %rhs64_sext, 4 + %res64_sext_shift = add i64 %lhs64, %rhs64_sext_shift + store volatile i64 %res64_sext_shift, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxth #4 + + +; CMP variants + %tst = icmp slt i32 %lhs32, %rhs32_zext + br i1 %tst, label %end, label %test2 +; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, uxth + +test2: + %cmp_sext = sext i16 %val16 to i64 + %tst2 = icmp eq i64 %lhs64, %cmp_sext + br i1 %tst2, label %other, label %end +; CHECK: cmp {{x[0-9]+}}, {{w[0-9]+}}, sxth + +other: + store volatile i32 %lhs32, i32* @var32 + ret void + +end: + ret void +} + +; N.b. we could probably check more here ("add w2, w3, w1, uxtw" for +; example), but the remaining instructions are probably not idiomatic +; in the face of "add/sub (shifted register)" so I don't intend to. +define void @addsub_i32rhs() { +; CHECK: addsub_i32rhs: + %val32_tmp = load i32* @var32 + %lhs64 = load i64* @var64 + + %val32 = add i32 %val32_tmp, 123 + + %rhs64_zext = zext i32 %val32 to i64 + %res64_zext = add i64 %lhs64, %rhs64_zext + store volatile i64 %res64_zext, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtw + + %rhs64_zext_shift = shl i64 %rhs64_zext, 2 + %res64_zext_shift = add i64 %lhs64, %rhs64_zext_shift + store volatile i64 %res64_zext_shift, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtw #2 + + %rhs64_sext = sext i32 %val32 to i64 + %res64_sext = add i64 %lhs64, %rhs64_sext + store volatile i64 %res64_sext, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtw + + %rhs64_sext_shift = shl i64 %rhs64_sext, 2 + %res64_sext_shift = add i64 %lhs64, %rhs64_sext_shift + store volatile i64 %res64_sext_shift, i64* @var64 +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtw #2 + + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/adrp-relocation.ll b/test/CodeGen/AArch64/adrp-relocation.ll new file mode 100644 index 000000000000..c33b442624a5 --- /dev/null +++ b/test/CodeGen/AArch64/adrp-relocation.ll @@ -0,0 +1,35 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -filetype=obj < %s | elf-dump | FileCheck %s + +define i64 @testfn() nounwind { +entry: + ret i64 0 +} + +define i64 @foo() nounwind { +entry: + %bar = alloca i64 ()*, align 8 + store i64 ()* @testfn, i64 ()** %bar, align 8 + %call = call i64 @testfn() + ret i64 %call +} + +; The above should produce an ADRP/ADD pair to calculate the address of +; testfn. The important point is that LLVM shouldn't think it can deal with the +; relocation on the ADRP itself (even though it knows everything about the +; relative offsets of testfn and foo) because its value depends on where this +; object file's .text section gets relocated in memory. + +; CHECK: .rela.text + +; CHECK: # Relocation 0 +; CHECK-NEXT: (('r_offset', 0x0000000000000010) +; CHECK-NEXT: ('r_sym', 0x00000007) +; CHECK-NEXT: ('r_type', 0x00000113) +; CHECK-NEXT: ('r_addend', 0x0000000000000000) +; CHECK-NEXT: ), +; CHECK-NEXT: Relocation 1 +; CHECK-NEXT: (('r_offset', 0x0000000000000014) +; CHECK-NEXT: ('r_sym', 0x00000007) +; CHECK-NEXT: ('r_type', 0x00000115) +; CHECK-NEXT: ('r_addend', 0x0000000000000000) +; CHECK-NEXT: ), diff --git a/test/CodeGen/AArch64/alloca.ll b/test/CodeGen/AArch64/alloca.ll new file mode 100644 index 000000000000..c62edf6503c6 --- /dev/null +++ b/test/CodeGen/AArch64/alloca.ll @@ -0,0 +1,134 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +declare void @use_addr(i8*) + +define void @test_simple_alloca(i64 %n) { +; CHECK: test_simple_alloca: + + %buf = alloca i8, i64 %n + ; Make sure we align the stack change to 16 bytes: +; CHECK: add [[SPDELTA:x[0-9]+]], x0, #15 +; CHECK: and x0, [[SPDELTA]], #0xfffffffffffffff0 + + ; Make sure we change SP. It would be surprising if anything but x0 were used + ; for the final sp, but it could be if it was then moved into x0. +; CHECK: mov [[TMP:x[0-9]+]], sp +; CHECK: sub x0, [[TMP]], [[SPDELTA]] +; CHECK: mov sp, x0 + + call void @use_addr(i8* %buf) +; CHECK: bl use_addr + + ret void + ; Make sure epilogue restores sp from fp +; CHECK: sub sp, x29, #16 +; CHECK: ldp x29, x30, [sp, #16] +; CHECK: add sp, sp, #32 +; CHECK: ret +} + +declare void @use_addr_loc(i8*, i64*) + +define i64 @test_alloca_with_local(i64 %n) { +; CHECK: test_alloca_with_local: +; CHECK: sub sp, sp, #32 +; CHECK: stp x29, x30, [sp, #16] + + %loc = alloca i64 + %buf = alloca i8, i64 %n + ; Make sure we align the stack change to 16 bytes: +; CHECK: add [[SPDELTA:x[0-9]+]], x0, #15 +; CHECK: and x0, [[SPDELTA]], #0xfffffffffffffff0 + + ; Make sure we change SP. It would be surprising if anything but x0 were used + ; for the final sp, but it could be if it was then moved into x0. +; CHECK: mov [[TMP:x[0-9]+]], sp +; CHECK: sub x0, [[TMP]], [[SPDELTA]] +; CHECK: mov sp, x0 + + ; Obviously suboptimal code here, but it to get &local in x1 +; CHECK: sub [[TMP:x[0-9]+]], x29, [[LOC_FROM_FP:#[0-9]+]] +; CHECK: add x1, [[TMP]], #0 + + call void @use_addr_loc(i8* %buf, i64* %loc) +; CHECK: bl use_addr + + %val = load i64* %loc +; CHECK: sub x[[TMP:[0-9]+]], x29, [[LOC_FROM_FP]] +; CHECK: ldr x0, [x[[TMP]]] + + ret i64 %val + ; Make sure epilogue restores sp from fp +; CHECK: sub sp, x29, #16 +; CHECK: ldp x29, x30, [sp, #16] +; CHECK: add sp, sp, #32 +; CHECK: ret +} + +define void @test_variadic_alloca(i64 %n, ...) { +; CHECK: test_variadic_alloca: + +; CHECK: sub sp, sp, #208 +; CHECK: stp x29, x30, [sp, #192] +; CHECK: add x29, sp, #192 +; CHECK: sub [[TMP:x[0-9]+]], x29, #192 +; CHECK: add x8, [[TMP]], #0 +; CHECK: str q7, [x8, #112] +; [...] +; CHECK: str q1, [x8, #16] + + %addr = alloca i8, i64 %n + + call void @use_addr(i8* %addr) +; CHECK: bl use_addr + + ret void +; CHECK: sub sp, x29, #192 +; CHECK: ldp x29, x30, [sp, #192] +; CHECK: add sp, sp, #208 +} + +define void @test_alloca_large_frame(i64 %n) { +; CHECK: test_alloca_large_frame: + +; CHECK: sub sp, sp, #496 +; CHECK: stp x29, x30, [sp, #480] +; CHECK: add x29, sp, #480 +; CHECK: sub sp, sp, #48 +; CHECK: sub sp, sp, #1953, lsl #12 + + %addr1 = alloca i8, i64 %n + %addr2 = alloca i64, i64 1000000 + + call void @use_addr_loc(i8* %addr1, i64* %addr2) + + ret void +; CHECK: sub sp, x29, #480 +; CHECK: ldp x29, x30, [sp, #480] +; CHECK: add sp, sp, #496 +} + +declare i8* @llvm.stacksave() +declare void @llvm.stackrestore(i8*) + +define void @test_scoped_alloca(i64 %n) { +; CHECK: test_scoped_alloca +; CHECK: sub sp, sp, #32 + + %sp = call i8* @llvm.stacksave() +; CHECK: mov [[SAVED_SP:x[0-9]+]], sp + + %addr = alloca i8, i64 %n +; CHECK: and [[SPDELTA:x[0-9]+]], {{x[0-9]+}}, #0xfffffffffffffff0 +; CHECK: mov [[OLDSP:x[0-9]+]], sp +; CHECK: sub [[NEWSP:x[0-9]+]], [[OLDSP]], [[SPDELTA]] +; CHECK: mov sp, [[NEWSP]] + + call void @use_addr(i8* %addr) +; CHECK: bl use_addr + + call void @llvm.stackrestore(i8* %sp) +; CHECK: mov sp, [[SAVED_SP]] + + ret void +} diff --git a/test/CodeGen/AArch64/analyze-branch.ll b/test/CodeGen/AArch64/analyze-branch.ll new file mode 100644 index 000000000000..e10bbb0f8691 --- /dev/null +++ b/test/CodeGen/AArch64/analyze-branch.ll @@ -0,0 +1,231 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s + +; This test checks that LLVM can do basic stripping and reapplying of branches +; to basic blocks. + +declare void @test_true() +declare void @test_false() + +; !0 corresponds to a branch being taken, !1 to not being takne. +!0 = metadata !{metadata !"branch_weights", i32 64, i32 4} +!1 = metadata !{metadata !"branch_weights", i32 4, i32 64} + +define void @test_Bcc_fallthrough_taken(i32 %in) nounwind { +; CHECK: test_Bcc_fallthrough_taken: + %tst = icmp eq i32 %in, 42 + br i1 %tst, label %true, label %false, !prof !0 + +; CHECK: cmp {{w[0-9]+}}, #42 + +; CHECK: b.ne [[FALSE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_true + +; CHECK: [[FALSE]]: +; CHECK: bl test_false + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + +define void @test_Bcc_fallthrough_nottaken(i32 %in) nounwind { +; CHECK: test_Bcc_fallthrough_nottaken: + %tst = icmp eq i32 %in, 42 + br i1 %tst, label %true, label %false, !prof !1 + +; CHECK: cmp {{w[0-9]+}}, #42 + +; CHECK: b.eq [[TRUE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_false + +; CHECK: [[TRUE]]: +; CHECK: bl test_true + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + +define void @test_CBZ_fallthrough_taken(i32 %in) nounwind { +; CHECK: test_CBZ_fallthrough_taken: + %tst = icmp eq i32 %in, 0 + br i1 %tst, label %true, label %false, !prof !0 + +; CHECK: cbnz {{w[0-9]+}}, [[FALSE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_true + +; CHECK: [[FALSE]]: +; CHECK: bl test_false + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + +define void @test_CBZ_fallthrough_nottaken(i64 %in) nounwind { +; CHECK: test_CBZ_fallthrough_nottaken: + %tst = icmp eq i64 %in, 0 + br i1 %tst, label %true, label %false, !prof !1 + +; CHECK: cbz {{x[0-9]+}}, [[TRUE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_false + +; CHECK: [[TRUE]]: +; CHECK: bl test_true + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + +define void @test_CBNZ_fallthrough_taken(i32 %in) nounwind { +; CHECK: test_CBNZ_fallthrough_taken: + %tst = icmp ne i32 %in, 0 + br i1 %tst, label %true, label %false, !prof !0 + +; CHECK: cbz {{w[0-9]+}}, [[FALSE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_true + +; CHECK: [[FALSE]]: +; CHECK: bl test_false + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + +define void @test_CBNZ_fallthrough_nottaken(i64 %in) nounwind { +; CHECK: test_CBNZ_fallthrough_nottaken: + %tst = icmp ne i64 %in, 0 + br i1 %tst, label %true, label %false, !prof !1 + +; CHECK: cbnz {{x[0-9]+}}, [[TRUE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_false + +; CHECK: [[TRUE]]: +; CHECK: bl test_true + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + +define void @test_TBZ_fallthrough_taken(i32 %in) nounwind { +; CHECK: test_TBZ_fallthrough_taken: + %bit = and i32 %in, 32768 + %tst = icmp eq i32 %bit, 0 + br i1 %tst, label %true, label %false, !prof !0 + +; CHECK: tbnz {{w[0-9]+}}, #15, [[FALSE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_true + +; CHECK: [[FALSE]]: +; CHECK: bl test_false + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + +define void @test_TBZ_fallthrough_nottaken(i64 %in) nounwind { +; CHECK: test_TBZ_fallthrough_nottaken: + %bit = and i64 %in, 32768 + %tst = icmp eq i64 %bit, 0 + br i1 %tst, label %true, label %false, !prof !1 + +; CHECK: tbz {{x[0-9]+}}, #15, [[TRUE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_false + +; CHECK: [[TRUE]]: +; CHECK: bl test_true + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + + +define void @test_TBNZ_fallthrough_taken(i32 %in) nounwind { +; CHECK: test_TBNZ_fallthrough_taken: + %bit = and i32 %in, 32768 + %tst = icmp ne i32 %bit, 0 + br i1 %tst, label %true, label %false, !prof !0 + +; CHECK: tbz {{w[0-9]+}}, #15, [[FALSE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_true + +; CHECK: [[FALSE]]: +; CHECK: bl test_false + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + +define void @test_TBNZ_fallthrough_nottaken(i64 %in) nounwind { +; CHECK: test_TBNZ_fallthrough_nottaken: + %bit = and i64 %in, 32768 + %tst = icmp ne i64 %bit, 0 + br i1 %tst, label %true, label %false, !prof !1 + +; CHECK: tbnz {{x[0-9]+}}, #15, [[TRUE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: // BB# +; CHECK-NEXT: bl test_false + +; CHECK: [[TRUE]]: +; CHECK: bl test_true + +true: + call void @test_true() + ret void + +false: + call void @test_false() + ret void +} + diff --git a/test/CodeGen/AArch64/atomic-ops-not-barriers.ll b/test/CodeGen/AArch64/atomic-ops-not-barriers.ll new file mode 100644 index 000000000000..3c03e47147b0 --- /dev/null +++ b/test/CodeGen/AArch64/atomic-ops-not-barriers.ll @@ -0,0 +1,24 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s + +define i32 @foo(i32* %var, i1 %cond) { +; CHECK: foo: + br i1 %cond, label %atomic_ver, label %simple_ver +simple_ver: + %oldval = load i32* %var + %newval = add nsw i32 %oldval, -1 + store i32 %newval, i32* %var + br label %somewhere +atomic_ver: + %val = atomicrmw add i32* %var, i32 -1 seq_cst + br label %somewhere +; CHECK: dmb +; CHECK: ldxr +; CHECK: dmb + ; The key point here is that the second dmb isn't immediately followed by the + ; simple_ver basic block, which LLVM attempted to do when DMB had been marked + ; with isBarrier. For now, look for something that looks like "somewhere". +; CHECK-NEXT: mov +somewhere: + %combined = phi i32 [ %val, %atomic_ver ], [ %newval, %simple_ver] + ret i32 %combined +} diff --git a/test/CodeGen/AArch64/atomic-ops.ll b/test/CodeGen/AArch64/atomic-ops.ll new file mode 100644 index 000000000000..f3c16171cc83 --- /dev/null +++ b/test/CodeGen/AArch64/atomic-ops.ll @@ -0,0 +1,1055 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +@var8 = global i8 0 +@var16 = global i16 0 +@var32 = global i32 0 +@var64 = global i64 0 + +define i8 @test_atomic_load_add_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_add_i8: + %old = atomicrmw add i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_add_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_add_i16: + %old = atomicrmw add i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_add_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_add_i32: + %old = atomicrmw add i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_add_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_add_i64: + %old = atomicrmw add i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: add [[NEW:x[0-9]+]], x[[OLD]], x0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_sub_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_sub_i8: + %old = atomicrmw sub i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_sub_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_sub_i16: + %old = atomicrmw sub i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_sub_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_sub_i32: + %old = atomicrmw sub i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_sub_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_sub_i64: + %old = atomicrmw sub i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: sub [[NEW:x[0-9]+]], x[[OLD]], x0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_and_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_and_i8: + %old = atomicrmw and i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_and_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_and_i16: + %old = atomicrmw and i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_and_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_and_i32: + %old = atomicrmw and i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_and_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_and_i64: + %old = atomicrmw and i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: and [[NEW:x[0-9]+]], x[[OLD]], x0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_or_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_or_i8: + %old = atomicrmw or i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_or_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_or_i16: + %old = atomicrmw or i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_or_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_or_i32: + %old = atomicrmw or i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_or_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_or_i64: + %old = atomicrmw or i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: orr [[NEW:x[0-9]+]], x[[OLD]], x0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_xor_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_xor_i8: + %old = atomicrmw xor i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_xor_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_xor_i16: + %old = atomicrmw xor i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_xor_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_xor_i32: + %old = atomicrmw xor i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_xor_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_xor_i64: + %old = atomicrmw xor i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: eor [[NEW:x[0-9]+]], x[[OLD]], x0 +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_xchg_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_xchg_i8: + %old = atomicrmw xchg i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], w0, [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_xchg_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_xchg_i16: + %old = atomicrmw xchg i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], w0, [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_xchg_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_xchg_i32: + %old = atomicrmw xchg i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], w0, [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_xchg_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_xchg_i64: + %old = atomicrmw xchg i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], x0, [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + + +define i8 @test_atomic_load_min_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_min_i8: + %old = atomicrmw min i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]], sxtb +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_min_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_min_i16: + %old = atomicrmw min i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]], sxth +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_min_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_min_i32: + %old = atomicrmw min i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]] +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_min_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_min_i64: + %old = atomicrmw min i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp x0, x[[OLD]] +; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, gt +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_max_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_max_i8: + %old = atomicrmw max i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]], sxtb +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_max_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_max_i16: + %old = atomicrmw max i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]], sxth +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_max_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_max_i32: + %old = atomicrmw max i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]] +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_max_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_max_i64: + %old = atomicrmw max i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp x0, x[[OLD]] +; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lt +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_umin_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_umin_i8: + %old = atomicrmw umin i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]], uxtb +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_umin_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_umin_i16: + %old = atomicrmw umin i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]], uxth +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_umin_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_umin_i32: + %old = atomicrmw umin i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]] +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_umin_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_umin_i64: + %old = atomicrmw umin i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp x0, x[[OLD]] +; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, hi +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_umax_i8(i8 %offset) nounwind { +; CHECK: test_atomic_load_umax_i8: + %old = atomicrmw umax i8* @var8, i8 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]], uxtb +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo +; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_load_umax_i16(i16 %offset) nounwind { +; CHECK: test_atomic_load_umax_i16: + %old = atomicrmw umax i16* @var16, i16 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]], uxth +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo +; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_load_umax_i32(i32 %offset) nounwind { +; CHECK: test_atomic_load_umax_i32: + %old = atomicrmw umax i32* @var32, i32 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w0, w[[OLD]] +; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_load_umax_i64(i64 %offset) nounwind { +; CHECK: test_atomic_load_umax_i64: + %old = atomicrmw umax i64* @var64, i64 %offset seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: .LBB{{[0-9]+}}_1: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; x0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp x0, x[[OLD]] +; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lo +; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1 +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_cmpxchg_i8(i8 %wanted, i8 %new) nounwind { +; CHECK: test_atomic_cmpxchg_i8: + %old = cmpxchg i8* @var8, i8 %wanted, i8 %new seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]: +; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w[[OLD]], w0 +; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]] + ; As above, w1 is a reasonable guess. +; CHECK: stxrb [[STATUS:w[0-9]+]], w1, [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]] +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i8 %old +} + +define i16 @test_atomic_cmpxchg_i16(i16 %wanted, i16 %new) nounwind { +; CHECK: test_atomic_cmpxchg_i16: + %old = cmpxchg i16* @var16, i16 %wanted, i16 %new seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var16 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16 + +; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]: +; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w[[OLD]], w0 +; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]] + ; As above, w1 is a reasonable guess. +; CHECK: stxrh [[STATUS:w[0-9]+]], w1, [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]] +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i16 %old +} + +define i32 @test_atomic_cmpxchg_i32(i32 %wanted, i32 %new) nounwind { +; CHECK: test_atomic_cmpxchg_i32: + %old = cmpxchg i32* @var32, i32 %wanted, i32 %new seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32 + +; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]: +; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp w[[OLD]], w0 +; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]] + ; As above, w1 is a reasonable guess. +; CHECK: stxr [[STATUS:w[0-9]+]], w1, [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]] +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i32 %old +} + +define i64 @test_atomic_cmpxchg_i64(i64 %wanted, i64 %new) nounwind { +; CHECK: test_atomic_cmpxchg_i64: + %old = cmpxchg i64* @var64, i64 %wanted, i64 %new seq_cst +; CHECK: dmb ish +; CHECK: adrp [[TMPADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64 + +; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]: +; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]] + ; w0 below is a reasonable guess but could change: it certainly comes into the + ; function there. +; CHECK-NEXT: cmp x[[OLD]], x0 +; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]] + ; As above, w1 is a reasonable guess. +; CHECK: stxr [[STATUS:w[0-9]+]], x1, [x[[ADDR]]] +; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]] +; CHECK: dmb ish + +; CHECK: mov x0, x[[OLD]] + ret i64 %old +} + +define i8 @test_atomic_load_monotonic_i8() nounwind { +; CHECK: test_atomic_load_monotonic_i8: + %val = load atomic i8* @var8 monotonic, align 1 +; CHECK-NOT: dmb +; CHECK: adrp x[[HIADDR:[0-9]+]], var8 +; CHECK: ldrb w0, [x[[HIADDR]], #:lo12:var8] +; CHECK-NOT: dmb + + ret i8 %val +} + +define i8 @test_atomic_load_monotonic_regoff_i8(i64 %base, i64 %off) nounwind { +; CHECK: test_atomic_load_monotonic_regoff_i8: + %addr_int = add i64 %base, %off + %addr = inttoptr i64 %addr_int to i8* + + %val = load atomic i8* %addr monotonic, align 1 +; CHECK-NOT: dmb +; CHECK: ldrb w0, [x0, x1] +; CHECK-NOT: dmb + + ret i8 %val +} + +define i8 @test_atomic_load_acquire_i8() nounwind { +; CHECK: test_atomic_load_acquire_i8: + %val = load atomic i8* @var8 acquire, align 1 +; CHECK: adrp [[TMPADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8 + +; CHECK: ldarb w0, [x[[ADDR]]] + ret i8 %val +} + +define i8 @test_atomic_load_seq_cst_i8() nounwind { +; CHECK: test_atomic_load_seq_cst_i8: + %val = load atomic i8* @var8 seq_cst, align 1 +; CHECK: adrp x[[HIADDR:[0-9]+]], var8 +; CHECK: ldrb w0, [x[[HIADDR]], #:lo12:var8] +; CHECK: dmb ish + ret i8 %val +} + +define i16 @test_atomic_load_monotonic_i16() nounwind { +; CHECK: test_atomic_load_monotonic_i16: + %val = load atomic i16* @var16 monotonic, align 2 +; CHECK-NOT: dmb +; CHECK: adrp x[[HIADDR:[0-9]+]], var16 +; CHECK: ldrh w0, [x[[HIADDR]], #:lo12:var16] +; CHECK-NOT: dmb + + ret i16 %val +} + +define i32 @test_atomic_load_monotonic_regoff_i32(i64 %base, i64 %off) nounwind { +; CHECK: test_atomic_load_monotonic_regoff_i32: + %addr_int = add i64 %base, %off + %addr = inttoptr i64 %addr_int to i32* + + %val = load atomic i32* %addr monotonic, align 4 +; CHECK-NOT: dmb +; CHECK: ldr w0, [x0, x1] +; CHECK-NOT: dmb + + ret i32 %val +} + +define i64 @test_atomic_load_seq_cst_i64() nounwind { +; CHECK: test_atomic_load_seq_cst_i64: + %val = load atomic i64* @var64 seq_cst, align 8 +; CHECK: adrp x[[HIADDR:[0-9]+]], var64 +; CHECK: ldr x0, [x[[HIADDR]], #:lo12:var64] +; CHECK: dmb ish + ret i64 %val +} + +define void @test_atomic_store_monotonic_i8(i8 %val) nounwind { +; CHECK: test_atomic_store_monotonic_i8: + store atomic i8 %val, i8* @var8 monotonic, align 1 +; CHECK: adrp x[[HIADDR:[0-9]+]], var8 +; CHECK: strb w0, [x[[HIADDR]], #:lo12:var8] + + ret void +} + +define void @test_atomic_store_monotonic_regoff_i8(i64 %base, i64 %off, i8 %val) nounwind { +; CHECK: test_atomic_store_monotonic_regoff_i8: + + %addr_int = add i64 %base, %off + %addr = inttoptr i64 %addr_int to i8* + + store atomic i8 %val, i8* %addr monotonic, align 1 +; CHECK: strb w2, [x0, x1] + + ret void +} +define void @test_atomic_store_release_i8(i8 %val) nounwind { +; CHECK: test_atomic_store_release_i8: + store atomic i8 %val, i8* @var8 release, align 1 +; CHECK: adrp [[HIADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8 +; CHECK: stlrb w0, [x[[ADDR]]] + + ret void +} + +define void @test_atomic_store_seq_cst_i8(i8 %val) nounwind { +; CHECK: test_atomic_store_seq_cst_i8: + store atomic i8 %val, i8* @var8 seq_cst, align 1 +; CHECK: adrp [[HIADDR:x[0-9]+]], var8 +; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8 +; CHECK: stlrb w0, [x[[ADDR]]] +; CHECK: dmb ish + + ret void +} + +define void @test_atomic_store_monotonic_i16(i16 %val) nounwind { +; CHECK: test_atomic_store_monotonic_i16: + store atomic i16 %val, i16* @var16 monotonic, align 2 +; CHECK: adrp x[[HIADDR:[0-9]+]], var16 +; CHECK: strh w0, [x[[HIADDR]], #:lo12:var16] + + ret void +} + +define void @test_atomic_store_monotonic_regoff_i32(i64 %base, i64 %off, i32 %val) nounwind { +; CHECK: test_atomic_store_monotonic_regoff_i32: + + %addr_int = add i64 %base, %off + %addr = inttoptr i64 %addr_int to i32* + + store atomic i32 %val, i32* %addr monotonic, align 4 +; CHECK: str w2, [x0, x1] + + ret void +} + +define void @test_atomic_store_release_i64(i64 %val) nounwind { +; CHECK: test_atomic_store_release_i64: + store atomic i64 %val, i64* @var64 release, align 8 +; CHECK: adrp [[HIADDR:x[0-9]+]], var64 +; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var64 +; CHECK: stlr x0, [x[[ADDR]]] + + ret void +} diff --git a/test/CodeGen/AArch64/basic-pic.ll b/test/CodeGen/AArch64/basic-pic.ll new file mode 100644 index 000000000000..da94041c95ff --- /dev/null +++ b/test/CodeGen/AArch64/basic-pic.ll @@ -0,0 +1,70 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -relocation-model=pic %s -o - | FileCheck %s +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -relocation-model=pic -filetype=obj %s -o -| llvm-objdump -r - | FileCheck --check-prefix=CHECK-ELF %s + +@var = global i32 0 + +; CHECK-ELF: RELOCATION RECORDS FOR [.text] + +define i32 @get_globalvar() { +; CHECK: get_globalvar: + + %val = load i32* @var +; CHECK: adrp x[[GOTHI:[0-9]+]], :got:var +; CHECK: ldr x[[GOTLOC:[0-9]+]], [x[[GOTHI]], #:got_lo12:var] +; CHECK: ldr w0, [x[[GOTLOC]]] + +; CHECK-ELF: R_AARCH64_ADR_GOT_PAGE var +; CHECK-ELF: R_AARCH64_LD64_GOT_LO12_NC var + ret i32 %val +} + +define i32* @get_globalvaraddr() { +; CHECK: get_globalvaraddr: + + %val = load i32* @var +; CHECK: adrp x[[GOTHI:[0-9]+]], :got:var +; CHECK: ldr x0, [x[[GOTHI]], #:got_lo12:var] + +; CHECK-ELF: R_AARCH64_ADR_GOT_PAGE var +; CHECK-ELF: R_AARCH64_LD64_GOT_LO12_NC var + ret i32* @var +} + +@hiddenvar = hidden global i32 0 + +define i32 @get_hiddenvar() { +; CHECK: get_hiddenvar: + + %val = load i32* @hiddenvar +; CHECK: adrp x[[HI:[0-9]+]], hiddenvar +; CHECK: ldr w0, [x[[HI]], #:lo12:hiddenvar] + +; CHECK-ELF: R_AARCH64_ADR_PREL_PG_HI21 hiddenvar +; CHECK-ELF: R_AARCH64_LDST32_ABS_LO12_NC hiddenvar + ret i32 %val +} + +define i32* @get_hiddenvaraddr() { +; CHECK: get_hiddenvaraddr: + + %val = load i32* @hiddenvar +; CHECK: adrp [[HI:x[0-9]+]], hiddenvar +; CHECK: add x0, [[HI]], #:lo12:hiddenvar + +; CHECK-ELF: R_AARCH64_ADR_PREL_PG_HI21 hiddenvar +; CHECK-ELF: R_AARCH64_ADD_ABS_LO12_NC hiddenvar + ret i32* @hiddenvar +} + +define void()* @get_func() { +; CHECK: get_func: + + ret void()* bitcast(void()*()* @get_func to void()*) +; CHECK: adrp x[[GOTHI:[0-9]+]], :got:get_func +; CHECK: ldr x0, [x[[GOTHI]], #:got_lo12:get_func] + + ; Particularly important that the ADRP gets a relocation, LLVM tends to think + ; it can relax it because it knows where get_func is. It can't! +; CHECK-ELF: R_AARCH64_ADR_GOT_PAGE get_func +; CHECK-ELF: R_AARCH64_LD64_GOT_LO12_NC get_func +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/bitfield-insert-0.ll b/test/CodeGen/AArch64/bitfield-insert-0.ll new file mode 100644 index 000000000000..d1191f6aaa8a --- /dev/null +++ b/test/CodeGen/AArch64/bitfield-insert-0.ll @@ -0,0 +1,19 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -filetype=obj < %s | llvm-objdump -disassemble - | FileCheck %s + +; The encoding of lsb -> immr in the CGed bitfield instructions was wrong at one +; point, in the edge case where lsb = 0. Just make sure. + +define void @test_bfi0(i32* %existing, i32* %new) { +; CHECK: bfxil {{w[0-9]+}}, {{w[0-9]+}}, #0, #18 + + %oldval = load volatile i32* %existing + %oldval_keep = and i32 %oldval, 4294705152 ; 0xfffc_0000 + + %newval = load volatile i32* %new + %newval_masked = and i32 %newval, 262143 ; = 0x0003_ffff + + %combined = or i32 %newval_masked, %oldval_keep + store volatile i32 %combined, i32* %existing + + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/bitfield-insert.ll b/test/CodeGen/AArch64/bitfield-insert.ll new file mode 100644 index 000000000000..3e871b9a6d27 --- /dev/null +++ b/test/CodeGen/AArch64/bitfield-insert.ll @@ -0,0 +1,193 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s + +; First, a simple example from Clang. The registers could plausibly be +; different, but probably won't be. + +%struct.foo = type { i8, [2 x i8], i8 } + +define [1 x i64] @from_clang([1 x i64] %f.coerce, i32 %n) nounwind readnone { +; CHECK: from_clang: +; CHECK: bfi w0, w1, #3, #4 +; CHECK-NEXT: ret + +entry: + %f.coerce.fca.0.extract = extractvalue [1 x i64] %f.coerce, 0 + %tmp.sroa.0.0.extract.trunc = trunc i64 %f.coerce.fca.0.extract to i32 + %bf.value = shl i32 %n, 3 + %0 = and i32 %bf.value, 120 + %f.sroa.0.0.insert.ext.masked = and i32 %tmp.sroa.0.0.extract.trunc, 135 + %1 = or i32 %f.sroa.0.0.insert.ext.masked, %0 + %f.sroa.0.0.extract.trunc = zext i32 %1 to i64 + %tmp1.sroa.1.1.insert.insert = and i64 %f.coerce.fca.0.extract, 4294967040 + %tmp1.sroa.0.0.insert.insert = or i64 %f.sroa.0.0.extract.trunc, %tmp1.sroa.1.1.insert.insert + %.fca.0.insert = insertvalue [1 x i64] undef, i64 %tmp1.sroa.0.0.insert.insert, 0 + ret [1 x i64] %.fca.0.insert +} + +define void @test_whole32(i32* %existing, i32* %new) { +; CHECK: test_whole32: +; CHECK: bfi {{w[0-9]+}}, {{w[0-9]+}}, #26, #5 + + %oldval = load volatile i32* %existing + %oldval_keep = and i32 %oldval, 2214592511 ; =0x83ffffff + + %newval = load volatile i32* %new + %newval_shifted = shl i32 %newval, 26 + %newval_masked = and i32 %newval_shifted, 2080374784 ; = 0x7c000000 + + %combined = or i32 %oldval_keep, %newval_masked + store volatile i32 %combined, i32* %existing + + ret void +} + +define void @test_whole64(i64* %existing, i64* %new) { +; CHECK: test_whole64: +; CHECK: bfi {{x[0-9]+}}, {{x[0-9]+}}, #26, #14 +; CHECK-NOT: and +; CHECK: ret + + %oldval = load volatile i64* %existing + %oldval_keep = and i64 %oldval, 18446742974265032703 ; = 0xffffff0003ffffffL + + %newval = load volatile i64* %new + %newval_shifted = shl i64 %newval, 26 + %newval_masked = and i64 %newval_shifted, 1099444518912 ; = 0xfffc000000 + + %combined = or i64 %oldval_keep, %newval_masked + store volatile i64 %combined, i64* %existing + + ret void +} + +define void @test_whole32_from64(i64* %existing, i64* %new) { +; CHECK: test_whole32_from64: +; CHECK: bfi {{w[0-9]+}}, {{w[0-9]+}}, #{{0|16}}, #16 +; CHECK-NOT: and +; CHECK: ret + + %oldval = load volatile i64* %existing + %oldval_keep = and i64 %oldval, 4294901760 ; = 0xffff0000 + + %newval = load volatile i64* %new + %newval_masked = and i64 %newval, 65535 ; = 0xffff + + %combined = or i64 %oldval_keep, %newval_masked + store volatile i64 %combined, i64* %existing + + ret void +} + +define void @test_32bit_masked(i32 *%existing, i32 *%new) { +; CHECK: test_32bit_masked: +; CHECK: bfi [[INSERT:w[0-9]+]], {{w[0-9]+}}, #3, #4 +; CHECK: and {{w[0-9]+}}, [[INSERT]], #0xff + + %oldval = load volatile i32* %existing + %oldval_keep = and i32 %oldval, 135 ; = 0x87 + + %newval = load volatile i32* %new + %newval_shifted = shl i32 %newval, 3 + %newval_masked = and i32 %newval_shifted, 120 ; = 0x78 + + %combined = or i32 %oldval_keep, %newval_masked + store volatile i32 %combined, i32* %existing + + ret void +} + +define void @test_64bit_masked(i64 *%existing, i64 *%new) { +; CHECK: test_64bit_masked: +; CHECK: bfi [[INSERT:x[0-9]+]], {{x[0-9]+}}, #40, #8 +; CHECK: and {{x[0-9]+}}, [[INSERT]], #0xffff00000000 + + %oldval = load volatile i64* %existing + %oldval_keep = and i64 %oldval, 1095216660480 ; = 0xff_0000_0000 + + %newval = load volatile i64* %new + %newval_shifted = shl i64 %newval, 40 + %newval_masked = and i64 %newval_shifted, 280375465082880 ; = 0xff00_0000_0000 + + %combined = or i64 %newval_masked, %oldval_keep + store volatile i64 %combined, i64* %existing + + ret void +} + +; Mask is too complicated for literal ANDwwi, make sure other avenues are tried. +define void @test_32bit_complexmask(i32 *%existing, i32 *%new) { +; CHECK: test_32bit_complexmask: +; CHECK: bfi {{w[0-9]+}}, {{w[0-9]+}}, #3, #4 +; CHECK: and {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + + %oldval = load volatile i32* %existing + %oldval_keep = and i32 %oldval, 647 ; = 0x287 + + %newval = load volatile i32* %new + %newval_shifted = shl i32 %newval, 3 + %newval_masked = and i32 %newval_shifted, 120 ; = 0x278 + + %combined = or i32 %oldval_keep, %newval_masked + store volatile i32 %combined, i32* %existing + + ret void +} + +; Neither mask is is a contiguous set of 1s. BFI can't be used +define void @test_32bit_badmask(i32 *%existing, i32 *%new) { +; CHECK: test_32bit_badmask: +; CHECK-NOT: bfi +; CHECK: ret + + %oldval = load volatile i32* %existing + %oldval_keep = and i32 %oldval, 135 ; = 0x87 + + %newval = load volatile i32* %new + %newval_shifted = shl i32 %newval, 3 + %newval_masked = and i32 %newval_shifted, 632 ; = 0x278 + + %combined = or i32 %oldval_keep, %newval_masked + store volatile i32 %combined, i32* %existing + + ret void +} + +; Ditto +define void @test_64bit_badmask(i64 *%existing, i64 *%new) { +; CHECK: test_64bit_badmask: +; CHECK-NOT: bfi +; CHECK: ret + + %oldval = load volatile i64* %existing + %oldval_keep = and i64 %oldval, 135 ; = 0x87 + + %newval = load volatile i64* %new + %newval_shifted = shl i64 %newval, 3 + %newval_masked = and i64 %newval_shifted, 664 ; = 0x278 + + %combined = or i64 %oldval_keep, %newval_masked + store volatile i64 %combined, i64* %existing + + ret void +} + +; Bitfield insert where there's a left-over shr needed at the beginning +; (e.g. result of str.bf1 = str.bf2) +define void @test_32bit_with_shr(i32* %existing, i32* %new) { +; CHECK: test_32bit_with_shr: + + %oldval = load volatile i32* %existing + %oldval_keep = and i32 %oldval, 2214592511 ; =0x83ffffff + + %newval = load i32* %new + %newval_shifted = shl i32 %newval, 12 + %newval_masked = and i32 %newval_shifted, 2080374784 ; = 0x7c000000 + + %combined = or i32 %oldval_keep, %newval_masked + store volatile i32 %combined, i32* %existing +; CHECK: lsr [[BIT:w[0-9]+]], {{w[0-9]+}}, #14 +; CHECK: bfi {{w[0-9]}}, [[BIT]], #26, #5 + + ret void +} + diff --git a/test/CodeGen/AArch64/bitfield.ll b/test/CodeGen/AArch64/bitfield.ll new file mode 100644 index 000000000000..36d337ef05ef --- /dev/null +++ b/test/CodeGen/AArch64/bitfield.ll @@ -0,0 +1,218 @@ + +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @test_extendb(i8 %var) { +; CHECK: test_extendb: + + %sxt32 = sext i8 %var to i32 + store volatile i32 %sxt32, i32* @var32 +; CHECK: sxtb {{w[0-9]+}}, {{w[0-9]+}} + + %sxt64 = sext i8 %var to i64 + store volatile i64 %sxt64, i64* @var64 +; CHECK: sxtb {{x[0-9]+}}, {{w[0-9]+}} + +; N.b. this doesn't actually produce a bitfield instruction at the +; moment, but it's still a good test to have and the semantics are +; correct. + %uxt32 = zext i8 %var to i32 + store volatile i32 %uxt32, i32* @var32 +; CHECK: and {{w[0-9]+}}, {{w[0-9]+}}, #0xff + + %uxt64 = zext i8 %var to i64 + store volatile i64 %uxt64, i64* @var64 +; CHECK: uxtb {{x[0-9]+}}, {{w[0-9]+}} + ret void +} + +define void @test_extendh(i16 %var) { +; CHECK: test_extendh: + + %sxt32 = sext i16 %var to i32 + store volatile i32 %sxt32, i32* @var32 +; CHECK: sxth {{w[0-9]+}}, {{w[0-9]+}} + + %sxt64 = sext i16 %var to i64 + store volatile i64 %sxt64, i64* @var64 +; CHECK: sxth {{x[0-9]+}}, {{w[0-9]+}} + +; N.b. this doesn't actually produce a bitfield instruction at the +; moment, but it's still a good test to have and the semantics are +; correct. + %uxt32 = zext i16 %var to i32 + store volatile i32 %uxt32, i32* @var32 +; CHECK: and {{w[0-9]+}}, {{w[0-9]+}}, #0xffff + + %uxt64 = zext i16 %var to i64 + store volatile i64 %uxt64, i64* @var64 +; CHECK: uxth {{x[0-9]+}}, {{w[0-9]+}} + ret void +} + +define void @test_extendw(i32 %var) { +; CHECK: test_extendw: + + %sxt64 = sext i32 %var to i64 + store volatile i64 %sxt64, i64* @var64 +; CHECK: sxtw {{x[0-9]+}}, {{w[0-9]+}} + + %uxt64 = zext i32 %var to i64 + store volatile i64 %uxt64, i64* @var64 +; CHECK: ubfx {{w[0-9]+}}, {{w[0-9]+}}, #0, #32 + ret void +} + +define void @test_shifts(i32 %val32, i64 %val64) { +; CHECK: test_shifts: + + %shift1 = ashr i32 %val32, 31 + store volatile i32 %shift1, i32* @var32 +; CHECK: asr {{w[0-9]+}}, {{w[0-9]+}}, #31 + + %shift2 = lshr i32 %val32, 8 + store volatile i32 %shift2, i32* @var32 +; CHECK: lsr {{w[0-9]+}}, {{w[0-9]+}}, #8 + + %shift3 = shl i32 %val32, 1 + store volatile i32 %shift3, i32* @var32 +; CHECK: lsl {{w[0-9]+}}, {{w[0-9]+}}, #1 + + %shift4 = ashr i64 %val64, 31 + store volatile i64 %shift4, i64* @var64 +; CHECK: asr {{x[0-9]+}}, {{x[0-9]+}}, #31 + + %shift5 = lshr i64 %val64, 8 + store volatile i64 %shift5, i64* @var64 +; CHECK: lsr {{x[0-9]+}}, {{x[0-9]+}}, #8 + + %shift6 = shl i64 %val64, 63 + store volatile i64 %shift6, i64* @var64 +; CHECK: lsl {{x[0-9]+}}, {{x[0-9]+}}, #63 + + %shift7 = ashr i64 %val64, 63 + store volatile i64 %shift7, i64* @var64 +; CHECK: asr {{x[0-9]+}}, {{x[0-9]+}}, #63 + + %shift8 = lshr i64 %val64, 63 + store volatile i64 %shift8, i64* @var64 +; CHECK: lsr {{x[0-9]+}}, {{x[0-9]+}}, #63 + + %shift9 = lshr i32 %val32, 31 + store volatile i32 %shift9, i32* @var32 +; CHECK: lsr {{w[0-9]+}}, {{w[0-9]+}}, #31 + + %shift10 = shl i32 %val32, 31 + store volatile i32 %shift10, i32* @var32 +; CHECK: lsl {{w[0-9]+}}, {{w[0-9]+}}, #31 + + ret void +} + +; LLVM can produce in-register extensions taking place entirely with +; 64-bit registers too. +define void @test_sext_inreg_64(i64 %in) { +; CHECK: test_sext_inreg_64: + +; i1 doesn't have an official alias, but crops up and is handled by +; the bitfield ops. + %trunc_i1 = trunc i64 %in to i1 + %sext_i1 = sext i1 %trunc_i1 to i64 + store volatile i64 %sext_i1, i64* @var64 +; CHECK: sbfx {{x[0-9]+}}, {{x[0-9]+}}, #0, #1 + + %trunc_i8 = trunc i64 %in to i8 + %sext_i8 = sext i8 %trunc_i8 to i64 + store volatile i64 %sext_i8, i64* @var64 +; CHECK: sxtb {{x[0-9]+}}, {{w[0-9]+}} + + %trunc_i16 = trunc i64 %in to i16 + %sext_i16 = sext i16 %trunc_i16 to i64 + store volatile i64 %sext_i16, i64* @var64 +; CHECK: sxth {{x[0-9]+}}, {{w[0-9]+}} + + %trunc_i32 = trunc i64 %in to i32 + %sext_i32 = sext i32 %trunc_i32 to i64 + store volatile i64 %sext_i32, i64* @var64 +; CHECK: sxtw {{x[0-9]+}}, {{w[0-9]+}} + ret void +} + +; These instructions don't actually select to official bitfield +; operations, but it's important that we select them somehow: +define void @test_zext_inreg_64(i64 %in) { +; CHECK: test_zext_inreg_64: + + %trunc_i8 = trunc i64 %in to i8 + %zext_i8 = zext i8 %trunc_i8 to i64 + store volatile i64 %zext_i8, i64* @var64 +; CHECK: and {{x[0-9]+}}, {{x[0-9]+}}, #0xff + + %trunc_i16 = trunc i64 %in to i16 + %zext_i16 = zext i16 %trunc_i16 to i64 + store volatile i64 %zext_i16, i64* @var64 +; CHECK: and {{x[0-9]+}}, {{x[0-9]+}}, #0xffff + + %trunc_i32 = trunc i64 %in to i32 + %zext_i32 = zext i32 %trunc_i32 to i64 + store volatile i64 %zext_i32, i64* @var64 +; CHECK: and {{x[0-9]+}}, {{x[0-9]+}}, #0xffffffff + + ret void +} + +define i64 @test_sext_inreg_from_32(i32 %in) { +; CHECK: test_sext_inreg_from_32: + + %small = trunc i32 %in to i1 + %ext = sext i1 %small to i64 + + ; Different registers are of course, possible, though suboptimal. This is + ; making sure that a 64-bit "(sext_inreg (anyext GPR32), i1)" uses the 64-bit + ; sbfx rather than just 32-bits. +; CHECK: sbfx x0, x0, #0, #1 + ret i64 %ext +} + + +define i32 @test_ubfx32(i32* %addr) { +; CHECK: test_ubfx32: +; CHECK: ubfx {{w[0-9]+}}, {{w[0-9]+}}, #23, #3 + + %fields = load i32* %addr + %shifted = lshr i32 %fields, 23 + %masked = and i32 %shifted, 7 + ret i32 %masked +} + +define i64 @test_ubfx64(i64* %addr) { +; CHECK: test_ubfx64: +; CHECK: ubfx {{x[0-9]+}}, {{x[0-9]+}}, #25, #10 + + %fields = load i64* %addr + %shifted = lshr i64 %fields, 25 + %masked = and i64 %shifted, 1023 + ret i64 %masked +} + +define i32 @test_sbfx32(i32* %addr) { +; CHECK: test_sbfx32: +; CHECK: sbfx {{w[0-9]+}}, {{w[0-9]+}}, #6, #3 + + %fields = load i32* %addr + %shifted = shl i32 %fields, 23 + %extended = ashr i32 %shifted, 29 + ret i32 %extended +} + +define i64 @test_sbfx64(i64* %addr) { +; CHECK: test_sbfx64: +; CHECK: sbfx {{x[0-9]+}}, {{x[0-9]+}}, #0, #63 + + %fields = load i64* %addr + %shifted = shl i64 %fields, 1 + %extended = ashr i64 %shifted, 1 + ret i64 %extended +} diff --git a/test/CodeGen/AArch64/blockaddress.ll b/test/CodeGen/AArch64/blockaddress.ll new file mode 100644 index 000000000000..3d0a5cf96bcd --- /dev/null +++ b/test/CodeGen/AArch64/blockaddress.ll @@ -0,0 +1,18 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +@addr = global i8* null + +define void @test_blockaddress() { +; CHECK: test_blockaddress: + store volatile i8* blockaddress(@test_blockaddress, %block), i8** @addr + %val = load volatile i8** @addr + indirectbr i8* %val, [label %block] +; CHECK: adrp [[DEST_HI:x[0-9]+]], [[DEST_LBL:.Ltmp[0-9]+]] +; CHECK: add [[DEST:x[0-9]+]], [[DEST_HI]], #:lo12:[[DEST_LBL]] +; CHECK: str [[DEST]], +; CHECK: ldr [[NEWDEST:x[0-9]+]] +; CHECK: br [[NEWDEST]] + +block: + ret void +} diff --git a/test/CodeGen/AArch64/bool-loads.ll b/test/CodeGen/AArch64/bool-loads.ll new file mode 100644 index 000000000000..5c7640bc4218 --- /dev/null +++ b/test/CodeGen/AArch64/bool-loads.ll @@ -0,0 +1,55 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s + +@var = global i1 0 + +define i32 @test_sextloadi32() { +; CHECK: test_sextloadi32 + + %val = load i1* @var + %ret = sext i1 %val to i32 +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var] +; CHECK: sbfx {{x[0-9]+}}, {{x[0-9]+}}, #0, #1 + + ret i32 %ret +; CHECK: ret +} + +define i64 @test_sextloadi64() { +; CHECK: test_sextloadi64 + + %val = load i1* @var + %ret = sext i1 %val to i64 +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var] +; CHECK: sbfx {{x[0-9]+}}, {{x[0-9]+}}, #0, #1 + + ret i64 %ret +; CHECK: ret +} + +define i32 @test_zextloadi32() { +; CHECK: test_zextloadi32 + +; It's not actually necessary that "ret" is next, but as far as LLVM +; is concerned only 0 or 1 should be loadable so no extension is +; necessary. + %val = load i1* @var + %ret = zext i1 %val to i32 +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var] + + ret i32 %ret +; CHECK-NEXT: ret +} + +define i64 @test_zextloadi64() { +; CHECK: test_zextloadi64 + +; It's not actually necessary that "ret" is next, but as far as LLVM +; is concerned only 0 or 1 should be loadable so no extension is +; necessary. + %val = load i1* @var + %ret = zext i1 %val to i64 +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var] + + ret i64 %ret +; CHECK-NEXT: ret +} diff --git a/test/CodeGen/AArch64/breg.ll b/test/CodeGen/AArch64/breg.ll new file mode 100644 index 000000000000..38ed4734e1b4 --- /dev/null +++ b/test/CodeGen/AArch64/breg.ll @@ -0,0 +1,17 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@stored_label = global i8* null + +define void @foo() { +; CHECK: foo: + %lab = load i8** @stored_label + indirectbr i8* %lab, [label %otherlab, label %retlab] +; CHECK: adrp {{x[0-9]+}}, stored_label +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:stored_label] +; CHECK: br {{x[0-9]+}} + +otherlab: + ret void +retlab: + ret void +} diff --git a/test/CodeGen/AArch64/callee-save.ll b/test/CodeGen/AArch64/callee-save.ll new file mode 100644 index 000000000000..c66aa5bfc510 --- /dev/null +++ b/test/CodeGen/AArch64/callee-save.ll @@ -0,0 +1,86 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var = global float 0.0 + +define void @foo() { +; CHECK: foo: + +; CHECK: stp d14, d15, [sp +; CHECK: stp d12, d13, [sp +; CHECK: stp d10, d11, [sp +; CHECK: stp d8, d9, [sp + + ; Create lots of live variables to exhaust the supply of + ; caller-saved registers + %val1 = load volatile float* @var + %val2 = load volatile float* @var + %val3 = load volatile float* @var + %val4 = load volatile float* @var + %val5 = load volatile float* @var + %val6 = load volatile float* @var + %val7 = load volatile float* @var + %val8 = load volatile float* @var + %val9 = load volatile float* @var + %val10 = load volatile float* @var + %val11 = load volatile float* @var + %val12 = load volatile float* @var + %val13 = load volatile float* @var + %val14 = load volatile float* @var + %val15 = load volatile float* @var + %val16 = load volatile float* @var + %val17 = load volatile float* @var + %val18 = load volatile float* @var + %val19 = load volatile float* @var + %val20 = load volatile float* @var + %val21 = load volatile float* @var + %val22 = load volatile float* @var + %val23 = load volatile float* @var + %val24 = load volatile float* @var + %val25 = load volatile float* @var + %val26 = load volatile float* @var + %val27 = load volatile float* @var + %val28 = load volatile float* @var + %val29 = load volatile float* @var + %val30 = load volatile float* @var + %val31 = load volatile float* @var + %val32 = load volatile float* @var + + store volatile float %val1, float* @var + store volatile float %val2, float* @var + store volatile float %val3, float* @var + store volatile float %val4, float* @var + store volatile float %val5, float* @var + store volatile float %val6, float* @var + store volatile float %val7, float* @var + store volatile float %val8, float* @var + store volatile float %val9, float* @var + store volatile float %val10, float* @var + store volatile float %val11, float* @var + store volatile float %val12, float* @var + store volatile float %val13, float* @var + store volatile float %val14, float* @var + store volatile float %val15, float* @var + store volatile float %val16, float* @var + store volatile float %val17, float* @var + store volatile float %val18, float* @var + store volatile float %val19, float* @var + store volatile float %val20, float* @var + store volatile float %val21, float* @var + store volatile float %val22, float* @var + store volatile float %val23, float* @var + store volatile float %val24, float* @var + store volatile float %val25, float* @var + store volatile float %val26, float* @var + store volatile float %val27, float* @var + store volatile float %val28, float* @var + store volatile float %val29, float* @var + store volatile float %val30, float* @var + store volatile float %val31, float* @var + store volatile float %val32, float* @var + +; CHECK: ldp d8, d9, [sp +; CHECK: ldp d10, d11, [sp +; CHECK: ldp d12, d13, [sp +; CHECK: ldp d14, d15, [sp + ret void +} diff --git a/test/CodeGen/AArch64/compare-branch.ll b/test/CodeGen/AArch64/compare-branch.ll new file mode 100644 index 000000000000..4213110497d3 --- /dev/null +++ b/test/CodeGen/AArch64/compare-branch.ll @@ -0,0 +1,38 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @foo() { +; CHECK: foo: + + %val1 = load volatile i32* @var32 + %tst1 = icmp eq i32 %val1, 0 + br i1 %tst1, label %end, label %test2 +; CHECK: cbz {{w[0-9]+}}, .LBB + +test2: + %val2 = load volatile i32* @var32 + %tst2 = icmp ne i32 %val2, 0 + br i1 %tst2, label %end, label %test3 +; CHECK: cbnz {{w[0-9]+}}, .LBB + +test3: + %val3 = load volatile i64* @var64 + %tst3 = icmp eq i64 %val3, 0 + br i1 %tst3, label %end, label %test4 +; CHECK: cbz {{x[0-9]+}}, .LBB + +test4: + %val4 = load volatile i64* @var64 + %tst4 = icmp ne i64 %val4, 0 + br i1 %tst4, label %end, label %test5 +; CHECK: cbnz {{x[0-9]+}}, .LBB + +test5: + store volatile i64 %val4, i64* @var64 + ret void + +end: + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/cond-sel.ll b/test/CodeGen/AArch64/cond-sel.ll new file mode 100644 index 000000000000..3051cf53fdf8 --- /dev/null +++ b/test/CodeGen/AArch64/cond-sel.ll @@ -0,0 +1,213 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @test_csel(i32 %lhs32, i32 %rhs32, i64 %lhs64) { +; CHECK: test_csel: + + %tst1 = icmp ugt i32 %lhs32, %rhs32 + %val1 = select i1 %tst1, i32 42, i32 52 + store i32 %val1, i32* @var32 +; CHECK: movz [[W52:w[0-9]+]], #52 +; CHECK: movz [[W42:w[0-9]+]], #42 +; CHECK: csel {{w[0-9]+}}, [[W42]], [[W52]], hi + + %rhs64 = sext i32 %rhs32 to i64 + %tst2 = icmp sle i64 %lhs64, %rhs64 + %val2 = select i1 %tst2, i64 %lhs64, i64 %rhs64 + store i64 %val2, i64* @var64 +; CHECK: cmp [[LHS:x[0-9]+]], [[RHS:w[0-9]+]], sxtw +; CHECK: sxtw [[EXT_RHS:x[0-9]+]], [[RHS]] +; CHECK: csel {{x[0-9]+}}, [[LHS]], [[EXT_RHS]], le + + ret void +; CHECK: ret +} + +define void @test_floatcsel(float %lhs32, float %rhs32, double %lhs64, double %rhs64) { +; CHECK: test_floatcsel: + + %tst1 = fcmp one float %lhs32, %rhs32 +; CHECK: fcmp {{s[0-9]+}}, {{s[0-9]+}} + %val1 = select i1 %tst1, i32 42, i32 52 + store i32 %val1, i32* @var32 +; CHECK: movz [[W52:w[0-9]+]], #52 +; CHECK: movz [[W42:w[0-9]+]], #42 +; CHECK: csel [[MAYBETRUE:w[0-9]+]], [[W42]], [[W52]], mi +; CHECK: csel {{w[0-9]+}}, [[W42]], [[MAYBETRUE]], gt + + + %tst2 = fcmp ueq double %lhs64, %rhs64 +; CHECK: fcmp {{d[0-9]+}}, {{d[0-9]+}} + %val2 = select i1 %tst2, i64 9, i64 15 + store i64 %val2, i64* @var64 +; CHECK: movz [[CONST15:x[0-9]+]], #15 +; CHECK: movz [[CONST9:x[0-9]+]], #9 +; CHECK: csel [[MAYBETRUE:x[0-9]+]], [[CONST9]], [[CONST15]], eq +; CHECK: csel {{x[0-9]+}}, [[CONST9]], [[MAYBETRUE]], vs + + ret void +; CHECK: ret +} + + +define void @test_csinc(i32 %lhs32, i32 %rhs32, i64 %lhs64) { +; CHECK: test_csinc: + +; Note that commuting rhs and lhs in the select changes ugt to ule (i.e. hi to ls). + %tst1 = icmp ugt i32 %lhs32, %rhs32 + %inc1 = add i32 %rhs32, 1 + %val1 = select i1 %tst1, i32 %inc1, i32 %lhs32 + store volatile i32 %val1, i32* @var32 +; CHECK: cmp [[LHS:w[0-9]+]], [[RHS:w[0-9]+]] +; CHECK: csinc {{w[0-9]+}}, [[LHS]], [[RHS]], ls + + %rhs2 = add i32 %rhs32, 42 + %tst2 = icmp sle i32 %lhs32, %rhs2 + %inc2 = add i32 %rhs32, 1 + %val2 = select i1 %tst2, i32 %lhs32, i32 %inc2 + store volatile i32 %val2, i32* @var32 +; CHECK: cmp [[LHS:w[0-9]+]], {{w[0-9]+}} +; CHECK: csinc {{w[0-9]+}}, [[LHS]], {{w[0-9]+}}, le + +; Note that commuting rhs and lhs in the select changes ugt to ule (i.e. hi to ls). + %rhs3 = sext i32 %rhs32 to i64 + %tst3 = icmp ugt i64 %lhs64, %rhs3 + %inc3 = add i64 %rhs3, 1 + %val3 = select i1 %tst3, i64 %inc3, i64 %lhs64 + store volatile i64 %val3, i64* @var64 +; CHECK: cmp [[LHS:x[0-9]+]], {{w[0-9]+}} +; CHECK: csinc {{x[0-9]+}}, [[LHS]], {{x[0-9]+}}, ls + + %rhs4 = zext i32 %rhs32 to i64 + %tst4 = icmp sle i64 %lhs64, %rhs4 + %inc4 = add i64 %rhs4, 1 + %val4 = select i1 %tst4, i64 %lhs64, i64 %inc4 + store volatile i64 %val4, i64* @var64 +; CHECK: cmp [[LHS:x[0-9]+]], {{w[0-9]+}} +; CHECK: csinc {{x[0-9]+}}, [[LHS]], {{x[0-9]+}}, le + + ret void +; CHECK: ret +} + +define void @test_csinv(i32 %lhs32, i32 %rhs32, i64 %lhs64) { +; CHECK: test_csinv: + +; Note that commuting rhs and lhs in the select changes ugt to ule (i.e. hi to ls). + %tst1 = icmp ugt i32 %lhs32, %rhs32 + %inc1 = xor i32 -1, %rhs32 + %val1 = select i1 %tst1, i32 %inc1, i32 %lhs32 + store volatile i32 %val1, i32* @var32 +; CHECK: cmp [[LHS:w[0-9]+]], [[RHS:w[0-9]+]] +; CHECK: csinv {{w[0-9]+}}, [[LHS]], [[RHS]], ls + + %rhs2 = add i32 %rhs32, 42 + %tst2 = icmp sle i32 %lhs32, %rhs2 + %inc2 = xor i32 -1, %rhs32 + %val2 = select i1 %tst2, i32 %lhs32, i32 %inc2 + store volatile i32 %val2, i32* @var32 +; CHECK: cmp [[LHS:w[0-9]+]], {{w[0-9]+}} +; CHECK: csinv {{w[0-9]+}}, [[LHS]], {{w[0-9]+}}, le + +; Note that commuting rhs and lhs in the select changes ugt to ule (i.e. hi to ls). + %rhs3 = sext i32 %rhs32 to i64 + %tst3 = icmp ugt i64 %lhs64, %rhs3 + %inc3 = xor i64 -1, %rhs3 + %val3 = select i1 %tst3, i64 %inc3, i64 %lhs64 + store volatile i64 %val3, i64* @var64 +; CHECK: cmp [[LHS:x[0-9]+]], {{w[0-9]+}} +; CHECK: csinv {{x[0-9]+}}, [[LHS]], {{x[0-9]+}}, ls + + %rhs4 = zext i32 %rhs32 to i64 + %tst4 = icmp sle i64 %lhs64, %rhs4 + %inc4 = xor i64 -1, %rhs4 + %val4 = select i1 %tst4, i64 %lhs64, i64 %inc4 + store volatile i64 %val4, i64* @var64 +; CHECK: cmp [[LHS:x[0-9]+]], {{w[0-9]+}} +; CHECK: csinv {{x[0-9]+}}, [[LHS]], {{x[0-9]+}}, le + + ret void +; CHECK: ret +} + +define void @test_csneg(i32 %lhs32, i32 %rhs32, i64 %lhs64) { +; CHECK: test_csneg: + +; Note that commuting rhs and lhs in the select changes ugt to ule (i.e. hi to ls). + %tst1 = icmp ugt i32 %lhs32, %rhs32 + %inc1 = sub i32 0, %rhs32 + %val1 = select i1 %tst1, i32 %inc1, i32 %lhs32 + store volatile i32 %val1, i32* @var32 +; CHECK: cmp [[LHS:w[0-9]+]], [[RHS:w[0-9]+]] +; CHECK: csneg {{w[0-9]+}}, [[LHS]], [[RHS]], ls + + %rhs2 = add i32 %rhs32, 42 + %tst2 = icmp sle i32 %lhs32, %rhs2 + %inc2 = sub i32 0, %rhs32 + %val2 = select i1 %tst2, i32 %lhs32, i32 %inc2 + store volatile i32 %val2, i32* @var32 +; CHECK: cmp [[LHS:w[0-9]+]], {{w[0-9]+}} +; CHECK: csneg {{w[0-9]+}}, [[LHS]], {{w[0-9]+}}, le + +; Note that commuting rhs and lhs in the select changes ugt to ule (i.e. hi to ls). + %rhs3 = sext i32 %rhs32 to i64 + %tst3 = icmp ugt i64 %lhs64, %rhs3 + %inc3 = sub i64 0, %rhs3 + %val3 = select i1 %tst3, i64 %inc3, i64 %lhs64 + store volatile i64 %val3, i64* @var64 +; CHECK: cmp [[LHS:x[0-9]+]], {{w[0-9]+}} +; CHECK: csneg {{x[0-9]+}}, [[LHS]], {{x[0-9]+}}, ls + + %rhs4 = zext i32 %rhs32 to i64 + %tst4 = icmp sle i64 %lhs64, %rhs4 + %inc4 = sub i64 0, %rhs4 + %val4 = select i1 %tst4, i64 %lhs64, i64 %inc4 + store volatile i64 %val4, i64* @var64 +; CHECK: cmp [[LHS:x[0-9]+]], {{w[0-9]+}} +; CHECK: csneg {{x[0-9]+}}, [[LHS]], {{x[0-9]+}}, le + + ret void +; CHECK: ret +} + +define void @test_cset(i32 %lhs, i32 %rhs, i64 %lhs64) { +; CHECK: test_cset: + +; N.b. code is not optimal here (32-bit csinc would be better) but +; incoming DAG is too complex + %tst1 = icmp eq i32 %lhs, %rhs + %val1 = zext i1 %tst1 to i32 + store i32 %val1, i32* @var32 +; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} +; CHECK: csinc {{w[0-9]+}}, wzr, wzr, ne + + %rhs64 = sext i32 %rhs to i64 + %tst2 = icmp ule i64 %lhs64, %rhs64 + %val2 = zext i1 %tst2 to i64 + store i64 %val2, i64* @var64 +; CHECK: csinc {{w[0-9]+}}, wzr, wzr, hi + + ret void +; CHECK: ret +} + +define void @test_csetm(i32 %lhs, i32 %rhs, i64 %lhs64) { +; CHECK: test_csetm: + + %tst1 = icmp eq i32 %lhs, %rhs + %val1 = sext i1 %tst1 to i32 + store i32 %val1, i32* @var32 +; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} +; CHECK: csinv {{w[0-9]+}}, wzr, wzr, ne + + %rhs64 = sext i32 %rhs to i64 + %tst2 = icmp ule i64 %lhs64, %rhs64 + %val2 = sext i1 %tst2 to i64 + store i64 %val2, i64* @var64 +; CHECK: csinv {{x[0-9]+}}, xzr, xzr, hi + + ret void +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/directcond.ll b/test/CodeGen/AArch64/directcond.ll new file mode 100644 index 000000000000..f5d57593bfad --- /dev/null +++ b/test/CodeGen/AArch64/directcond.ll @@ -0,0 +1,84 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +define i32 @test_select_i32(i1 %bit, i32 %a, i32 %b) { +; CHECK: test_select_i32: + %val = select i1 %bit, i32 %a, i32 %b +; CHECK: movz [[ONE:w[0-9]+]], #1 +; CHECK: tst w0, [[ONE]] +; CHECK-NEXT: csel w0, w1, w2, ne + + ret i32 %val +} + +define i64 @test_select_i64(i1 %bit, i64 %a, i64 %b) { +; CHECK: test_select_i64: + %val = select i1 %bit, i64 %a, i64 %b +; CHECK: movz [[ONE:w[0-9]+]], #1 +; CHECK: tst w0, [[ONE]] +; CHECK-NEXT: csel x0, x1, x2, ne + + ret i64 %val +} + +define float @test_select_float(i1 %bit, float %a, float %b) { +; CHECK: test_select_float: + %val = select i1 %bit, float %a, float %b +; CHECK: movz [[ONE:w[0-9]+]], #1 +; CHECK: tst w0, [[ONE]] +; CHECK-NEXT: fcsel s0, s0, s1, ne + + ret float %val +} + +define double @test_select_double(i1 %bit, double %a, double %b) { +; CHECK: test_select_double: + %val = select i1 %bit, double %a, double %b +; CHECK: movz [[ONE:w[0-9]+]], #1 +; CHECK: tst w0, [[ONE]] +; CHECK-NEXT: fcsel d0, d0, d1, ne + + ret double %val +} + +define i32 @test_brcond(i1 %bit) { +; CHECK: test_brcond: + br i1 %bit, label %true, label %false +; CHECK: tbz {{w[0-9]+}}, #0, .LBB + +true: + ret i32 0 +false: + ret i32 42 +} + +define i1 @test_setcc_float(float %lhs, float %rhs) { +; CHECK: test_setcc_float + %val = fcmp oeq float %lhs, %rhs +; CHECK: fcmp s0, s1 +; CHECK: csinc w0, wzr, wzr, ne + ret i1 %val +} + +define i1 @test_setcc_double(double %lhs, double %rhs) { +; CHECK: test_setcc_double + %val = fcmp oeq double %lhs, %rhs +; CHECK: fcmp d0, d1 +; CHECK: csinc w0, wzr, wzr, ne + ret i1 %val +} + +define i1 @test_setcc_i32(i32 %lhs, i32 %rhs) { +; CHECK: test_setcc_i32 + %val = icmp ugt i32 %lhs, %rhs +; CHECK: cmp w0, w1 +; CHECK: csinc w0, wzr, wzr, ls + ret i1 %val +} + +define i1 @test_setcc_i64(i64 %lhs, i64 %rhs) { +; CHECK: test_setcc_i64 + %val = icmp ne i64 %lhs, %rhs +; CHECK: cmp x0, x1 +; CHECK: csinc w0, wzr, wzr, eq + ret i1 %val +} diff --git a/test/CodeGen/AArch64/dp-3source.ll b/test/CodeGen/AArch64/dp-3source.ll new file mode 100644 index 000000000000..c40d3933b44b --- /dev/null +++ b/test/CodeGen/AArch64/dp-3source.ll @@ -0,0 +1,163 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +define i32 @test_madd32(i32 %val0, i32 %val1, i32 %val2) { +; CHECK: test_madd32: + %mid = mul i32 %val1, %val2 + %res = add i32 %val0, %mid +; CHECK: madd {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + ret i32 %res +} + +define i64 @test_madd64(i64 %val0, i64 %val1, i64 %val2) { +; CHECK: test_madd64: + %mid = mul i64 %val1, %val2 + %res = add i64 %val0, %mid +; CHECK: madd {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + ret i64 %res +} + +define i32 @test_msub32(i32 %val0, i32 %val1, i32 %val2) { +; CHECK: test_msub32: + %mid = mul i32 %val1, %val2 + %res = sub i32 %val0, %mid +; CHECK: msub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + ret i32 %res +} + +define i64 @test_msub64(i64 %val0, i64 %val1, i64 %val2) { +; CHECK: test_msub64: + %mid = mul i64 %val1, %val2 + %res = sub i64 %val0, %mid +; CHECK: msub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + ret i64 %res +} + +define i64 @test_smaddl(i64 %acc, i32 %val1, i32 %val2) { +; CHECK: test_smaddl: + %ext1 = sext i32 %val1 to i64 + %ext2 = sext i32 %val2 to i64 + %prod = mul i64 %ext1, %ext2 + %res = add i64 %acc, %prod +; CHECK: smaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} + ret i64 %res +} + +define i64 @test_smsubl(i64 %acc, i32 %val1, i32 %val2) { +; CHECK: test_smsubl: + %ext1 = sext i32 %val1 to i64 + %ext2 = sext i32 %val2 to i64 + %prod = mul i64 %ext1, %ext2 + %res = sub i64 %acc, %prod +; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} + ret i64 %res +} + +define i64 @test_umaddl(i64 %acc, i32 %val1, i32 %val2) { +; CHECK: test_umaddl: + %ext1 = zext i32 %val1 to i64 + %ext2 = zext i32 %val2 to i64 + %prod = mul i64 %ext1, %ext2 + %res = add i64 %acc, %prod +; CHECK: umaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} + ret i64 %res +} + +define i64 @test_umsubl(i64 %acc, i32 %val1, i32 %val2) { +; CHECK: test_umsubl: + %ext1 = zext i32 %val1 to i64 + %ext2 = zext i32 %val2 to i64 + %prod = mul i64 %ext1, %ext2 + %res = sub i64 %acc, %prod +; CHECK: umsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} + ret i64 %res +} + +define i64 @test_smulh(i64 %lhs, i64 %rhs) { +; CHECK: test_smulh: + %ext1 = sext i64 %lhs to i128 + %ext2 = sext i64 %rhs to i128 + %res = mul i128 %ext1, %ext2 + %high = lshr i128 %res, 64 + %val = trunc i128 %high to i64 +; CHECK: smulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + ret i64 %val +} + +define i64 @test_umulh(i64 %lhs, i64 %rhs) { +; CHECK: test_umulh: + %ext1 = zext i64 %lhs to i128 + %ext2 = zext i64 %rhs to i128 + %res = mul i128 %ext1, %ext2 + %high = lshr i128 %res, 64 + %val = trunc i128 %high to i64 +; CHECK: umulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + ret i64 %val +} + +define i32 @test_mul32(i32 %lhs, i32 %rhs) { +; CHECK: test_mul32: + %res = mul i32 %lhs, %rhs +; CHECK: mul {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + ret i32 %res +} + +define i64 @test_mul64(i64 %lhs, i64 %rhs) { +; CHECK: test_mul64: + %res = mul i64 %lhs, %rhs +; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + ret i64 %res +} + +define i32 @test_mneg32(i32 %lhs, i32 %rhs) { +; CHECK: test_mneg32: + %prod = mul i32 %lhs, %rhs + %res = sub i32 0, %prod +; CHECK: mneg {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + ret i32 %res +} + +define i64 @test_mneg64(i64 %lhs, i64 %rhs) { +; CHECK: test_mneg64: + %prod = mul i64 %lhs, %rhs + %res = sub i64 0, %prod +; CHECK: mneg {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + ret i64 %res +} + +define i64 @test_smull(i32 %lhs, i32 %rhs) { +; CHECK: test_smull: + %ext1 = sext i32 %lhs to i64 + %ext2 = sext i32 %rhs to i64 + %res = mul i64 %ext1, %ext2 +; CHECK: smull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + ret i64 %res +} + +define i64 @test_umull(i32 %lhs, i32 %rhs) { +; CHECK: test_umull: + %ext1 = zext i32 %lhs to i64 + %ext2 = zext i32 %rhs to i64 + %res = mul i64 %ext1, %ext2 +; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + ret i64 %res +} + +define i64 @test_smnegl(i32 %lhs, i32 %rhs) { +; CHECK: test_smnegl: + %ext1 = sext i32 %lhs to i64 + %ext2 = sext i32 %rhs to i64 + %prod = mul i64 %ext1, %ext2 + %res = sub i64 0, %prod +; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + ret i64 %res +} + +define i64 @test_umnegl(i32 %lhs, i32 %rhs) { +; CHECK: test_umnegl: + %ext1 = zext i32 %lhs to i64 + %ext2 = zext i32 %rhs to i64 + %prod = mul i64 %ext1, %ext2 + %res = sub i64 0, %prod +; CHECK: umnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + ret i64 %res +} diff --git a/test/CodeGen/AArch64/dp1.ll b/test/CodeGen/AArch64/dp1.ll new file mode 100644 index 000000000000..83aa8b4f6631 --- /dev/null +++ b/test/CodeGen/AArch64/dp1.ll @@ -0,0 +1,152 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @rev_i32() { +; CHECK: rev_i32: + %val0_tmp = load i32* @var32 + %val1_tmp = call i32 @llvm.bswap.i32(i32 %val0_tmp) +; CHECK: rev {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val1_tmp, i32* @var32 + ret void +} + +define void @rev_i64() { +; CHECK: rev_i64: + %val0_tmp = load i64* @var64 + %val1_tmp = call i64 @llvm.bswap.i64(i64 %val0_tmp) +; CHECK: rev {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val1_tmp, i64* @var64 + ret void +} + +define void @rev32_i64() { +; CHECK: rev32_i64: + %val0_tmp = load i64* @var64 + %val1_tmp = shl i64 %val0_tmp, 32 + %val5_tmp = sub i64 64, 32 + %val2_tmp = lshr i64 %val0_tmp, %val5_tmp + %val3_tmp = or i64 %val1_tmp, %val2_tmp + %val4_tmp = call i64 @llvm.bswap.i64(i64 %val3_tmp) +; CHECK: rev32 {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val4_tmp, i64* @var64 + ret void +} + +define void @rev16_i32() { +; CHECK: rev16_i32: + %val0_tmp = load i32* @var32 + %val1_tmp = shl i32 %val0_tmp, 16 + %val2_tmp = lshr i32 %val0_tmp, 16 + %val3_tmp = or i32 %val1_tmp, %val2_tmp + %val4_tmp = call i32 @llvm.bswap.i32(i32 %val3_tmp) +; CHECK: rev16 {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val4_tmp, i32* @var32 + ret void +} + +define void @clz_zerodef_i32() { +; CHECK: clz_zerodef_i32: + %val0_tmp = load i32* @var32 + %val4_tmp = call i32 @llvm.ctlz.i32(i32 %val0_tmp, i1 0) +; CHECK: clz {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val4_tmp, i32* @var32 + ret void +} + +define void @clz_zerodef_i64() { +; CHECK: clz_zerodef_i64: + %val0_tmp = load i64* @var64 + %val4_tmp = call i64 @llvm.ctlz.i64(i64 %val0_tmp, i1 0) +; CHECK: clz {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val4_tmp, i64* @var64 + ret void +} + +define void @clz_zeroundef_i32() { +; CHECK: clz_zeroundef_i32: + %val0_tmp = load i32* @var32 + %val4_tmp = call i32 @llvm.ctlz.i32(i32 %val0_tmp, i1 1) +; CHECK: clz {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val4_tmp, i32* @var32 + ret void +} + +define void @clz_zeroundef_i64() { +; CHECK: clz_zeroundef_i64: + %val0_tmp = load i64* @var64 + %val4_tmp = call i64 @llvm.ctlz.i64(i64 %val0_tmp, i1 1) +; CHECK: clz {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val4_tmp, i64* @var64 + ret void +} + +define void @cttz_zerodef_i32() { +; CHECK: cttz_zerodef_i32: + %val0_tmp = load i32* @var32 + %val4_tmp = call i32 @llvm.cttz.i32(i32 %val0_tmp, i1 0) +; CHECK: rbit [[REVERSED:w[0-9]+]], {{w[0-9]+}} +; CHECK: clz {{w[0-9]+}}, [[REVERSED]] + store volatile i32 %val4_tmp, i32* @var32 + ret void +} + +define void @cttz_zerodef_i64() { +; CHECK: cttz_zerodef_i64: + %val0_tmp = load i64* @var64 + %val4_tmp = call i64 @llvm.cttz.i64(i64 %val0_tmp, i1 0) +; CHECK: rbit [[REVERSED:x[0-9]+]], {{x[0-9]+}} +; CHECK: clz {{x[0-9]+}}, [[REVERSED]] + store volatile i64 %val4_tmp, i64* @var64 + ret void +} + +define void @cttz_zeroundef_i32() { +; CHECK: cttz_zeroundef_i32: + %val0_tmp = load i32* @var32 + %val4_tmp = call i32 @llvm.cttz.i32(i32 %val0_tmp, i1 1) +; CHECK: rbit [[REVERSED:w[0-9]+]], {{w[0-9]+}} +; CHECK: clz {{w[0-9]+}}, [[REVERSED]] + store volatile i32 %val4_tmp, i32* @var32 + ret void +} + +define void @cttz_zeroundef_i64() { +; CHECK: cttz_zeroundef_i64: + %val0_tmp = load i64* @var64 + %val4_tmp = call i64 @llvm.cttz.i64(i64 %val0_tmp, i1 1) +; CHECK: rbit [[REVERSED:x[0-9]+]], {{x[0-9]+}} +; CHECK: clz {{x[0-9]+}}, [[REVERSED]] + store volatile i64 %val4_tmp, i64* @var64 + ret void +} + +; These two are just compilation tests really: the operation's set to Expand in +; ISelLowering. +define void @ctpop_i32() { +; CHECK: ctpop_i32: + %val0_tmp = load i32* @var32 + %val4_tmp = call i32 @llvm.ctpop.i32(i32 %val0_tmp) + store volatile i32 %val4_tmp, i32* @var32 + ret void +} + +define void @ctpop_i64() { +; CHECK: ctpop_i64: + %val0_tmp = load i64* @var64 + %val4_tmp = call i64 @llvm.ctpop.i64(i64 %val0_tmp) + store volatile i64 %val4_tmp, i64* @var64 + ret void +} + + +declare i32 @llvm.bswap.i32(i32) +declare i64 @llvm.bswap.i64(i64) +declare i32 @llvm.ctlz.i32 (i32, i1) +declare i64 @llvm.ctlz.i64 (i64, i1) +declare i32 @llvm.cttz.i32 (i32, i1) +declare i64 @llvm.cttz.i64 (i64, i1) +declare i32 @llvm.ctpop.i32 (i32) +declare i64 @llvm.ctpop.i64 (i64) + diff --git a/test/CodeGen/AArch64/dp2.ll b/test/CodeGen/AArch64/dp2.ll new file mode 100644 index 000000000000..4c740f6b8623 --- /dev/null +++ b/test/CodeGen/AArch64/dp2.ll @@ -0,0 +1,169 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32_0 = global i32 0 +@var32_1 = global i32 0 +@var64_0 = global i64 0 +@var64_1 = global i64 0 + +define void @rorv_i64() { +; CHECK: rorv_i64: + %val0_tmp = load i64* @var64_0 + %val1_tmp = load i64* @var64_1 + %val2_tmp = sub i64 64, %val1_tmp + %val3_tmp = shl i64 %val0_tmp, %val2_tmp + %val4_tmp = lshr i64 %val0_tmp, %val1_tmp + %val5_tmp = or i64 %val3_tmp, %val4_tmp +; CHECK: ror {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val5_tmp, i64* @var64_0 + ret void +} + +define void @asrv_i64() { +; CHECK: asrv_i64: + %val0_tmp = load i64* @var64_0 + %val1_tmp = load i64* @var64_1 + %val4_tmp = ashr i64 %val0_tmp, %val1_tmp +; CHECK: asr {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val4_tmp, i64* @var64_1 + ret void +} + +define void @lsrv_i64() { +; CHECK: lsrv_i64: + %val0_tmp = load i64* @var64_0 + %val1_tmp = load i64* @var64_1 + %val4_tmp = lshr i64 %val0_tmp, %val1_tmp +; CHECK: lsr {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val4_tmp, i64* @var64_0 + ret void +} + +define void @lslv_i64() { +; CHECK: lslv_i64: + %val0_tmp = load i64* @var64_0 + %val1_tmp = load i64* @var64_1 + %val4_tmp = shl i64 %val0_tmp, %val1_tmp +; CHECK: lsl {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val4_tmp, i64* @var64_1 + ret void +} + +define void @udiv_i64() { +; CHECK: udiv_i64: + %val0_tmp = load i64* @var64_0 + %val1_tmp = load i64* @var64_1 + %val4_tmp = udiv i64 %val0_tmp, %val1_tmp +; CHECK: udiv {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val4_tmp, i64* @var64_0 + ret void +} + +define void @sdiv_i64() { +; CHECK: sdiv_i64: + %val0_tmp = load i64* @var64_0 + %val1_tmp = load i64* @var64_1 + %val4_tmp = sdiv i64 %val0_tmp, %val1_tmp +; CHECK: sdiv {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %val4_tmp, i64* @var64_1 + ret void +} + + +define void @lsrv_i32() { +; CHECK: lsrv_i32: + %val0_tmp = load i32* @var32_0 + %val1_tmp = load i32* @var32_1 + %val2_tmp = add i32 1, %val1_tmp + %val4_tmp = lshr i32 %val0_tmp, %val2_tmp +; CHECK: lsr {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val4_tmp, i32* @var32_0 + ret void +} + +define void @lslv_i32() { +; CHECK: lslv_i32: + %val0_tmp = load i32* @var32_0 + %val1_tmp = load i32* @var32_1 + %val2_tmp = add i32 1, %val1_tmp + %val4_tmp = shl i32 %val0_tmp, %val2_tmp +; CHECK: lsl {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val4_tmp, i32* @var32_1 + ret void +} + +define void @rorv_i32() { +; CHECK: rorv_i32: + %val0_tmp = load i32* @var32_0 + %val6_tmp = load i32* @var32_1 + %val1_tmp = add i32 1, %val6_tmp + %val2_tmp = sub i32 32, %val1_tmp + %val3_tmp = shl i32 %val0_tmp, %val2_tmp + %val4_tmp = lshr i32 %val0_tmp, %val1_tmp + %val5_tmp = or i32 %val3_tmp, %val4_tmp +; CHECK: ror {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val5_tmp, i32* @var32_0 + ret void +} + +define void @asrv_i32() { +; CHECK: asrv_i32: + %val0_tmp = load i32* @var32_0 + %val1_tmp = load i32* @var32_1 + %val2_tmp = add i32 1, %val1_tmp + %val4_tmp = ashr i32 %val0_tmp, %val2_tmp +; CHECK: asr {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val4_tmp, i32* @var32_1 + ret void +} + +define void @sdiv_i32() { +; CHECK: sdiv_i32: + %val0_tmp = load i32* @var32_0 + %val1_tmp = load i32* @var32_1 + %val4_tmp = sdiv i32 %val0_tmp, %val1_tmp +; CHECK: sdiv {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val4_tmp, i32* @var32_1 + ret void +} + +define void @udiv_i32() { +; CHECK: udiv_i32: + %val0_tmp = load i32* @var32_0 + %val1_tmp = load i32* @var32_1 + %val4_tmp = udiv i32 %val0_tmp, %val1_tmp +; CHECK: udiv {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %val4_tmp, i32* @var32_0 + ret void +} + +; The point of this test is that we may not actually see (shl GPR32:$Val, (zext GPR32:$Val2)) +; in the DAG (the RHS may be natively 64-bit), but we should still use the lsl instructions. +define i32 @test_lsl32() { +; CHECK: test_lsl32: + + %val = load i32* @var32_0 + %ret = shl i32 1, %val +; CHECK: lsl {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + + ret i32 %ret +} + +define i32 @test_lsr32() { +; CHECK: test_lsr32: + + %val = load i32* @var32_0 + %ret = lshr i32 1, %val +; CHECK: lsr {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + + ret i32 %ret +} + +define i32 @test_asr32(i32 %in) { +; CHECK: test_asr32: + + %val = load i32* @var32_0 + %ret = ashr i32 %in, %val +; CHECK: asr {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + + ret i32 %ret +} diff --git a/test/CodeGen/AArch64/elf-extern.ll b/test/CodeGen/AArch64/elf-extern.ll new file mode 100644 index 000000000000..ee89d8d94ba4 --- /dev/null +++ b/test/CodeGen/AArch64/elf-extern.ll @@ -0,0 +1,21 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -filetype=obj | elf-dump | FileCheck %s + +; External symbols are a different concept to global variables but should still +; get relocations and so on when used. + +declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) + +define i32 @check_extern() { + call void @llvm.memcpy.p0i8.p0i8.i32(i8* undef, i8* undef, i32 undef, i32 4, i1 0) + ret i32 0 +} + +; CHECK: .rela.text +; CHECK: ('r_sym', 0x00000009) +; CHECK-NEXT: ('r_type', 0x0000011b) + +; CHECK: .symtab +; CHECK: Symbol 9 +; CHECK-NEXT: memcpy + + diff --git a/test/CodeGen/AArch64/extern-weak.ll b/test/CodeGen/AArch64/extern-weak.ll new file mode 100644 index 000000000000..3d3d8676818a --- /dev/null +++ b/test/CodeGen/AArch64/extern-weak.ll @@ -0,0 +1,35 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -o - < %s | FileCheck %s + +declare extern_weak i32 @var() + +define i32()* @foo() { +; The usual ADRP/ADD pair can't be used for a weak reference because it must +; evaluate to 0 if the symbol is undefined. We use a litpool entry. + ret i32()* @var +; CHECK: .LCPI0_0: +; CHECK-NEXT: .xword var + +; CHECK: ldr x0, [{{x[0-9]+}}, #:lo12:.LCPI0_0] + +} + + +@arr_var = extern_weak global [10 x i32] + +define i32* @bar() { + %addr = getelementptr [10 x i32]* @arr_var, i32 0, i32 5 +; CHECK: .LCPI1_0: +; CHECK-NEXT: .xword arr_var + +; CHECK: ldr [[BASE:x[0-9]+]], [{{x[0-9]+}}, #:lo12:.LCPI1_0] +; CHECK: add x0, [[BASE]], #20 + ret i32* %addr +} + +@defined_weak_var = internal unnamed_addr global i32 0 + +define i32* @wibble() { + ret i32* @defined_weak_var +; CHECK: adrp [[BASE:x[0-9]+]], defined_weak_var +; CHECK: add x0, [[BASE]], #:lo12:defined_weak_var +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/extract.ll b/test/CodeGen/AArch64/extract.ll new file mode 100644 index 000000000000..06267816a4e1 --- /dev/null +++ b/test/CodeGen/AArch64/extract.ll @@ -0,0 +1,57 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +define i64 @ror_i64(i64 %in) { +; CHECK: ror_i64: + %left = shl i64 %in, 19 + %right = lshr i64 %in, 45 + %val5 = or i64 %left, %right +; CHECK: extr {{x[0-9]+}}, x0, x0, #45 + ret i64 %val5 +} + +define i32 @ror_i32(i32 %in) { +; CHECK: ror_i32: + %left = shl i32 %in, 9 + %right = lshr i32 %in, 23 + %val5 = or i32 %left, %right +; CHECK: extr {{w[0-9]+}}, w0, w0, #23 + ret i32 %val5 +} + +define i32 @extr_i32(i32 %lhs, i32 %rhs) { +; CHECK: extr_i32: + %left = shl i32 %lhs, 6 + %right = lshr i32 %rhs, 26 + %val = or i32 %left, %right + ; Order of lhs and rhs matters here. Regalloc would have to be very odd to use + ; something other than w0 and w1. +; CHECK: extr {{w[0-9]+}}, w0, w1, #26 + + ret i32 %val +} + +define i64 @extr_i64(i64 %lhs, i64 %rhs) { +; CHECK: extr_i64: + %right = lshr i64 %rhs, 40 + %left = shl i64 %lhs, 24 + %val = or i64 %right, %left + ; Order of lhs and rhs matters here. Regalloc would have to be very odd to use + ; something other than w0 and w1. +; CHECK: extr {{x[0-9]+}}, x0, x1, #40 + + ret i64 %val +} + +; Regression test: a bad experimental pattern crept into git which optimised +; this pattern to a single EXTR. +define i32 @extr_regress(i32 %a, i32 %b) { +; CHECK: extr_regress: + + %sh1 = shl i32 %a, 14 + %sh2 = lshr i32 %b, 14 + %val = or i32 %sh2, %sh1 +; CHECK-NOT: extr {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, #{{[0-9]+}} + + ret i32 %val +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/fastcc-reserved.ll b/test/CodeGen/AArch64/fastcc-reserved.ll new file mode 100644 index 000000000000..e40aa3033bde --- /dev/null +++ b/test/CodeGen/AArch64/fastcc-reserved.ll @@ -0,0 +1,58 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -tailcallopt | FileCheck %s + +; This test is designed to be run in the situation where the +; call-frame is not reserved (hence disable-fp-elim), but where +; callee-pop can occur (hence tailcallopt). + +declare fastcc void @will_pop([8 x i32], i32 %val) + +define fastcc void @foo(i32 %in) { +; CHECK: foo: + + %addr = alloca i8, i32 %in + +; Normal frame setup stuff: +; CHECK: sub sp, sp, +; CHECK: stp x29, x30 + +; Reserve space for call-frame: +; CHECK: sub sp, sp, #16 + + call fastcc void @will_pop([8 x i32] undef, i32 42) +; CHECK: bl will_pop + +; Since @will_pop is fastcc with tailcallopt, it will put the stack +; back where it needs to be, we shouldn't duplicate that +; CHECK-NOT: sub sp, sp, #16 +; CHECK-NOT: add sp, sp, + +; CHECK: ldp x29, x30 +; CHECK: add sp, sp, + ret void +} + +declare void @wont_pop([8 x i32], i32 %val) + +define void @foo1(i32 %in) { +; CHECK: foo1: + + %addr = alloca i8, i32 %in +; Normal frame setup again +; CHECK: sub sp, sp, +; CHECK: stp x29, x30 + +; Reserve space for call-frame +; CHECK: sub sp, sp, #16 + + call void @wont_pop([8 x i32] undef, i32 42) +; CHECK: bl wont_pop + +; This time we *do* need to unreserve the call-frame +; CHECK: add sp, sp, #16 + +; Check for epilogue (primarily to make sure sp spotted above wasn't +; part of it). +; CHECK: ldp x29, x30 +; CHECK: add sp, sp, + ret void +} diff --git a/test/CodeGen/AArch64/fastcc.ll b/test/CodeGen/AArch64/fastcc.ll new file mode 100644 index 000000000000..41cde94edc1c --- /dev/null +++ b/test/CodeGen/AArch64/fastcc.ll @@ -0,0 +1,123 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -tailcallopt | FileCheck %s -check-prefix CHECK-TAIL +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +; Without tailcallopt fastcc still means the caller cleans up the +; stack, so try to make sure this is respected. + +define fastcc void @func_stack0() { +; CHECK: func_stack0: +; CHECK: sub sp, sp, #48 + +; CHECK-TAIL: func_stack0: +; CHECK-TAIL: sub sp, sp, #48 + + + call fastcc void @func_stack8([8 x i32] undef, i32 42) +; CHECK: bl func_stack8 +; CHECK-NOT: sub sp, sp, + +; CHECK-TAIL: bl func_stack8 +; CHECK-TAIL: sub sp, sp, #16 + + + call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9) +; CHECK: bl func_stack32 +; CHECK-NOT: sub sp, sp, + +; CHECK-TAIL: bl func_stack32 +; CHECK-TAIL: sub sp, sp, #32 + + + call fastcc void @func_stack0() +; CHECK: bl func_stack0 +; CHECK-NOT: sub sp, sp + +; CHECK-TAIL: bl func_stack0 +; CHECK-TAIL-NOT: sub sp, sp + + ret void +; CHECK: add sp, sp, #48 +; CHECK-NEXT: ret + +; CHECK-TAIL: add sp, sp, #48 +; CHECK-TAIL-NEXT: ret + +} + +define fastcc void @func_stack8([8 x i32], i32 %stacked) { +; CHECK: func_stack8: +; CHECK: sub sp, sp, #48 + +; CHECK-TAIL: func_stack8: +; CHECK-TAIL: sub sp, sp, #48 + + + call fastcc void @func_stack8([8 x i32] undef, i32 42) +; CHECK: bl func_stack8 +; CHECK-NOT: sub sp, sp, + +; CHECK-TAIL: bl func_stack8 +; CHECK-TAIL: sub sp, sp, #16 + + + call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9) +; CHECK: bl func_stack32 +; CHECK-NOT: sub sp, sp, + +; CHECK-TAIL: bl func_stack32 +; CHECK-TAIL: sub sp, sp, #32 + + + call fastcc void @func_stack0() +; CHECK: bl func_stack0 +; CHECK-NOT: sub sp, sp + +; CHECK-TAIL: bl func_stack0 +; CHECK-TAIL-NOT: sub sp, sp + + ret void +; CHECK: add sp, sp, #48 +; CHECK-NEXT: ret + +; CHECK-TAIL: add sp, sp, #64 +; CHECK-TAIL-NEXT: ret +} + +define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) { +; CHECK: func_stack32: +; CHECK: sub sp, sp, #48 + +; CHECK-TAIL: func_stack32: +; CHECK-TAIL: sub sp, sp, #48 + + + call fastcc void @func_stack8([8 x i32] undef, i32 42) +; CHECK: bl func_stack8 +; CHECK-NOT: sub sp, sp, + +; CHECK-TAIL: bl func_stack8 +; CHECK-TAIL: sub sp, sp, #16 + + + call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9) +; CHECK: bl func_stack32 +; CHECK-NOT: sub sp, sp, + +; CHECK-TAIL: bl func_stack32 +; CHECK-TAIL: sub sp, sp, #32 + + + call fastcc void @func_stack0() +; CHECK: bl func_stack0 +; CHECK-NOT: sub sp, sp + +; CHECK-TAIL: bl func_stack0 +; CHECK-TAIL-NOT: sub sp, sp + + ret void +; CHECK: add sp, sp, #48 +; CHECK-NEXT: ret + +; CHECK-TAIL: add sp, sp, #80 +; CHECK-TAIL-NEXT: ret +} diff --git a/test/CodeGen/AArch64/fcmp.ll b/test/CodeGen/AArch64/fcmp.ll new file mode 100644 index 000000000000..ad4a903c9b25 --- /dev/null +++ b/test/CodeGen/AArch64/fcmp.ll @@ -0,0 +1,81 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +declare void @bar(i32) + +define void @test_float(float %a, float %b) { +; CHECK: test_float: + + %tst1 = fcmp oeq float %a, %b + br i1 %tst1, label %end, label %t2 +; CHECK: fcmp {{s[0-9]+}}, {{s[0-9]+}} +; CHECK: b.eq .L + +t2: + %tst2 = fcmp une float %b, 0.0 + br i1 %tst2, label %t3, label %end +; CHECK: fcmp {{s[0-9]+}}, #0.0 +; CHECK: b.eq .L + + +t3: +; This test can't be implemented with just one A64 conditional +; branch. LLVM converts "ordered and not equal" to "unordered or +; equal" before instruction selection, which is what we currently +; test. Obviously, other sequences are valid. + %tst3 = fcmp one float %a, %b + br i1 %tst3, label %t4, label %end +; CHECK: fcmp {{s[0-9]+}}, {{s[0-9]+}} +; CHECK-NEXT: b.eq .[[T4:LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: b.vs .[[T4]] +t4: + %tst4 = fcmp uge float %a, -0.0 + br i1 %tst4, label %t5, label %end +; CHECK-NOT: fcmp {{s[0-9]+}}, #0.0 +; CHECK: b.mi .LBB + +t5: + call void @bar(i32 0) + ret void +end: + ret void + +} + +define void @test_double(double %a, double %b) { +; CHECK: test_double: + + %tst1 = fcmp oeq double %a, %b + br i1 %tst1, label %end, label %t2 +; CHECK: fcmp {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: b.eq .L + +t2: + %tst2 = fcmp une double %b, 0.0 + br i1 %tst2, label %t3, label %end +; CHECK: fcmp {{d[0-9]+}}, #0.0 +; CHECK: b.eq .L + + +t3: +; This test can't be implemented with just one A64 conditional +; branch. LLVM converts "ordered and not equal" to "unordered or +; equal" before instruction selection, which is what we currently +; test. Obviously, other sequences are valid. + %tst3 = fcmp one double %a, %b + br i1 %tst3, label %t4, label %end +; CHECK: fcmp {{d[0-9]+}}, {{d[0-9]+}} +; CHECK-NEXT: b.eq .[[T4:LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: b.vs .[[T4]] +t4: + %tst4 = fcmp uge double %a, -0.0 + br i1 %tst4, label %t5, label %end +; CHECK-NOT: fcmp {{d[0-9]+}}, #0.0 +; CHECK: b.mi .LBB + +t5: + call void @bar(i32 0) + ret void +end: + ret void + +} diff --git a/test/CodeGen/AArch64/fcvt-fixed.ll b/test/CodeGen/AArch64/fcvt-fixed.ll new file mode 100644 index 000000000000..0f7b95b2a48f --- /dev/null +++ b/test/CodeGen/AArch64/fcvt-fixed.ll @@ -0,0 +1,191 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -O0 | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @test_fcvtzs(float %flt, double %dbl) { +; CHECK: test_fcvtzs: + + %fix1 = fmul float %flt, 128.0 + %cvt1 = fptosi float %fix1 to i32 +; CHECK: fcvtzs {{w[0-9]+}}, {{s[0-9]+}}, #7 + store volatile i32 %cvt1, i32* @var32 + + %fix2 = fmul float %flt, 4294967296.0 + %cvt2 = fptosi float %fix2 to i32 +; CHECK: fcvtzs {{w[0-9]+}}, {{s[0-9]+}}, #32 + store volatile i32 %cvt2, i32* @var32 + + %fix3 = fmul float %flt, 128.0 + %cvt3 = fptosi float %fix3 to i64 +; CHECK: fcvtzs {{x[0-9]+}}, {{s[0-9]+}}, #7 + store volatile i64 %cvt3, i64* @var64 + + %fix4 = fmul float %flt, 18446744073709551616.0 + %cvt4 = fptosi float %fix4 to i64 +; CHECK: fcvtzs {{x[0-9]+}}, {{s[0-9]+}}, #64 + store volatile i64 %cvt4, i64* @var64 + + %fix5 = fmul double %dbl, 128.0 + %cvt5 = fptosi double %fix5 to i32 +; CHECK: fcvtzs {{w[0-9]+}}, {{d[0-9]+}}, #7 + store volatile i32 %cvt5, i32* @var32 + + %fix6 = fmul double %dbl, 4294967296.0 + %cvt6 = fptosi double %fix6 to i32 +; CHECK: fcvtzs {{w[0-9]+}}, {{d[0-9]+}}, #32 + store volatile i32 %cvt6, i32* @var32 + + %fix7 = fmul double %dbl, 128.0 + %cvt7 = fptosi double %fix7 to i64 +; CHECK: fcvtzs {{x[0-9]+}}, {{d[0-9]+}}, #7 + store volatile i64 %cvt7, i64* @var64 + + %fix8 = fmul double %dbl, 18446744073709551616.0 + %cvt8 = fptosi double %fix8 to i64 +; CHECK: fcvtzs {{x[0-9]+}}, {{d[0-9]+}}, #64 + store volatile i64 %cvt8, i64* @var64 + + ret void +} + +define void @test_fcvtzu(float %flt, double %dbl) { +; CHECK: test_fcvtzu: + + %fix1 = fmul float %flt, 128.0 + %cvt1 = fptoui float %fix1 to i32 +; CHECK: fcvtzu {{w[0-9]+}}, {{s[0-9]+}}, #7 + store volatile i32 %cvt1, i32* @var32 + + %fix2 = fmul float %flt, 4294967296.0 + %cvt2 = fptoui float %fix2 to i32 +; CHECK: fcvtzu {{w[0-9]+}}, {{s[0-9]+}}, #32 + store volatile i32 %cvt2, i32* @var32 + + %fix3 = fmul float %flt, 128.0 + %cvt3 = fptoui float %fix3 to i64 +; CHECK: fcvtzu {{x[0-9]+}}, {{s[0-9]+}}, #7 + store volatile i64 %cvt3, i64* @var64 + + %fix4 = fmul float %flt, 18446744073709551616.0 + %cvt4 = fptoui float %fix4 to i64 +; CHECK: fcvtzu {{x[0-9]+}}, {{s[0-9]+}}, #64 + store volatile i64 %cvt4, i64* @var64 + + %fix5 = fmul double %dbl, 128.0 + %cvt5 = fptoui double %fix5 to i32 +; CHECK: fcvtzu {{w[0-9]+}}, {{d[0-9]+}}, #7 + store volatile i32 %cvt5, i32* @var32 + + %fix6 = fmul double %dbl, 4294967296.0 + %cvt6 = fptoui double %fix6 to i32 +; CHECK: fcvtzu {{w[0-9]+}}, {{d[0-9]+}}, #32 + store volatile i32 %cvt6, i32* @var32 + + %fix7 = fmul double %dbl, 128.0 + %cvt7 = fptoui double %fix7 to i64 +; CHECK: fcvtzu {{x[0-9]+}}, {{d[0-9]+}}, #7 + store volatile i64 %cvt7, i64* @var64 + + %fix8 = fmul double %dbl, 18446744073709551616.0 + %cvt8 = fptoui double %fix8 to i64 +; CHECK: fcvtzu {{x[0-9]+}}, {{d[0-9]+}}, #64 + store volatile i64 %cvt8, i64* @var64 + + ret void +} + +@varfloat = global float 0.0 +@vardouble = global double 0.0 + +define void @test_scvtf(i32 %int, i64 %long) { +; CHECK: test_scvtf: + + %cvt1 = sitofp i32 %int to float + %fix1 = fdiv float %cvt1, 128.0 +; CHECK: scvtf {{s[0-9]+}}, {{w[0-9]+}}, #7 + store volatile float %fix1, float* @varfloat + + %cvt2 = sitofp i32 %int to float + %fix2 = fdiv float %cvt2, 4294967296.0 +; CHECK: scvtf {{s[0-9]+}}, {{w[0-9]+}}, #32 + store volatile float %fix2, float* @varfloat + + %cvt3 = sitofp i64 %long to float + %fix3 = fdiv float %cvt3, 128.0 +; CHECK: scvtf {{s[0-9]+}}, {{x[0-9]+}}, #7 + store volatile float %fix3, float* @varfloat + + %cvt4 = sitofp i64 %long to float + %fix4 = fdiv float %cvt4, 18446744073709551616.0 +; CHECK: scvtf {{s[0-9]+}}, {{x[0-9]+}}, #64 + store volatile float %fix4, float* @varfloat + + %cvt5 = sitofp i32 %int to double + %fix5 = fdiv double %cvt5, 128.0 +; CHECK: scvtf {{d[0-9]+}}, {{w[0-9]+}}, #7 + store volatile double %fix5, double* @vardouble + + %cvt6 = sitofp i32 %int to double + %fix6 = fdiv double %cvt6, 4294967296.0 +; CHECK: scvtf {{d[0-9]+}}, {{w[0-9]+}}, #32 + store volatile double %fix6, double* @vardouble + + %cvt7 = sitofp i64 %long to double + %fix7 = fdiv double %cvt7, 128.0 +; CHECK: scvtf {{d[0-9]+}}, {{x[0-9]+}}, #7 + store volatile double %fix7, double* @vardouble + + %cvt8 = sitofp i64 %long to double + %fix8 = fdiv double %cvt8, 18446744073709551616.0 +; CHECK: scvtf {{d[0-9]+}}, {{x[0-9]+}}, #64 + store volatile double %fix8, double* @vardouble + + ret void +} + +define void @test_ucvtf(i32 %int, i64 %long) { +; CHECK: test_ucvtf: + + %cvt1 = uitofp i32 %int to float + %fix1 = fdiv float %cvt1, 128.0 +; CHECK: ucvtf {{s[0-9]+}}, {{w[0-9]+}}, #7 + store volatile float %fix1, float* @varfloat + + %cvt2 = uitofp i32 %int to float + %fix2 = fdiv float %cvt2, 4294967296.0 +; CHECK: ucvtf {{s[0-9]+}}, {{w[0-9]+}}, #32 + store volatile float %fix2, float* @varfloat + + %cvt3 = uitofp i64 %long to float + %fix3 = fdiv float %cvt3, 128.0 +; CHECK: ucvtf {{s[0-9]+}}, {{x[0-9]+}}, #7 + store volatile float %fix3, float* @varfloat + + %cvt4 = uitofp i64 %long to float + %fix4 = fdiv float %cvt4, 18446744073709551616.0 +; CHECK: ucvtf {{s[0-9]+}}, {{x[0-9]+}}, #64 + store volatile float %fix4, float* @varfloat + + %cvt5 = uitofp i32 %int to double + %fix5 = fdiv double %cvt5, 128.0 +; CHECK: ucvtf {{d[0-9]+}}, {{w[0-9]+}}, #7 + store volatile double %fix5, double* @vardouble + + %cvt6 = uitofp i32 %int to double + %fix6 = fdiv double %cvt6, 4294967296.0 +; CHECK: ucvtf {{d[0-9]+}}, {{w[0-9]+}}, #32 + store volatile double %fix6, double* @vardouble + + %cvt7 = uitofp i64 %long to double + %fix7 = fdiv double %cvt7, 128.0 +; CHECK: ucvtf {{d[0-9]+}}, {{x[0-9]+}}, #7 + store volatile double %fix7, double* @vardouble + + %cvt8 = uitofp i64 %long to double + %fix8 = fdiv double %cvt8, 18446744073709551616.0 +; CHECK: ucvtf {{d[0-9]+}}, {{x[0-9]+}}, #64 + store volatile double %fix8, double* @vardouble + + ret void +} diff --git a/test/CodeGen/AArch64/fcvt-int.ll b/test/CodeGen/AArch64/fcvt-int.ll new file mode 100644 index 000000000000..c771d683a99c --- /dev/null +++ b/test/CodeGen/AArch64/fcvt-int.ll @@ -0,0 +1,151 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +define i32 @test_floattoi32(float %in) { +; CHECK: test_floattoi32: + + %signed = fptosi float %in to i32 + %unsigned = fptoui float %in to i32 +; CHECK: fcvtzu [[UNSIG:w[0-9]+]], {{s[0-9]+}} +; CHECK: fcvtzs [[SIG:w[0-9]+]], {{s[0-9]+}} + + %res = sub i32 %signed, %unsigned +; CHECK: sub {{w[0-9]+}}, [[SIG]], [[UNSIG]] + + ret i32 %res +; CHECK: ret +} + +define i32 @test_doubletoi32(double %in) { +; CHECK: test_doubletoi32: + + %signed = fptosi double %in to i32 + %unsigned = fptoui double %in to i32 +; CHECK: fcvtzu [[UNSIG:w[0-9]+]], {{d[0-9]+}} +; CHECK: fcvtzs [[SIG:w[0-9]+]], {{d[0-9]+}} + + %res = sub i32 %signed, %unsigned +; CHECK: sub {{w[0-9]+}}, [[SIG]], [[UNSIG]] + + ret i32 %res +; CHECK: ret +} + +define i64 @test_floattoi64(float %in) { +; CHECK: test_floattoi64: + + %signed = fptosi float %in to i64 + %unsigned = fptoui float %in to i64 +; CHECK: fcvtzu [[UNSIG:x[0-9]+]], {{s[0-9]+}} +; CHECK: fcvtzs [[SIG:x[0-9]+]], {{s[0-9]+}} + + %res = sub i64 %signed, %unsigned +; CHECK: sub {{x[0-9]+}}, [[SIG]], [[UNSIG]] + + ret i64 %res +; CHECK: ret +} + +define i64 @test_doubletoi64(double %in) { +; CHECK: test_doubletoi64: + + %signed = fptosi double %in to i64 + %unsigned = fptoui double %in to i64 +; CHECK: fcvtzu [[UNSIG:x[0-9]+]], {{d[0-9]+}} +; CHECK: fcvtzs [[SIG:x[0-9]+]], {{d[0-9]+}} + + %res = sub i64 %signed, %unsigned +; CHECK: sub {{x[0-9]+}}, [[SIG]], [[UNSIG]] + + ret i64 %res +; CHECK: ret +} + +define float @test_i32tofloat(i32 %in) { +; CHECK: test_i32tofloat: + + %signed = sitofp i32 %in to float + %unsigned = uitofp i32 %in to float +; CHECK: ucvtf [[UNSIG:s[0-9]+]], {{w[0-9]+}} +; CHECK: scvtf [[SIG:s[0-9]+]], {{w[0-9]+}} + + %res = fsub float %signed, %unsigned +; CHECL: fsub {{s[0-9]+}}, [[SIG]], [[UNSIG]] + ret float %res +; CHECK: ret +} + +define double @test_i32todouble(i32 %in) { +; CHECK: test_i32todouble: + + %signed = sitofp i32 %in to double + %unsigned = uitofp i32 %in to double +; CHECK: ucvtf [[UNSIG:d[0-9]+]], {{w[0-9]+}} +; CHECK: scvtf [[SIG:d[0-9]+]], {{w[0-9]+}} + + %res = fsub double %signed, %unsigned +; CHECK: fsub {{d[0-9]+}}, [[SIG]], [[UNSIG]] + ret double %res +; CHECK: ret +} + +define float @test_i64tofloat(i64 %in) { +; CHECK: test_i64tofloat: + + %signed = sitofp i64 %in to float + %unsigned = uitofp i64 %in to float +; CHECK: ucvtf [[UNSIG:s[0-9]+]], {{x[0-9]+}} +; CHECK: scvtf [[SIG:s[0-9]+]], {{x[0-9]+}} + + %res = fsub float %signed, %unsigned +; CHECK: fsub {{s[0-9]+}}, [[SIG]], [[UNSIG]] + ret float %res +; CHECK: ret +} + +define double @test_i64todouble(i64 %in) { +; CHECK: test_i64todouble: + + %signed = sitofp i64 %in to double + %unsigned = uitofp i64 %in to double +; CHECK: ucvtf [[UNSIG:d[0-9]+]], {{x[0-9]+}} +; CHECK: scvtf [[SIG:d[0-9]+]], {{x[0-9]+}} + + %res = fsub double %signed, %unsigned +; CHECK: sub {{d[0-9]+}}, [[SIG]], [[UNSIG]] + ret double %res +; CHECK: ret +} + +define i32 @test_bitcastfloattoi32(float %in) { +; CHECK: test_bitcastfloattoi32: + + %res = bitcast float %in to i32 +; CHECK: fmov {{w[0-9]+}}, {{s[0-9]+}} + ret i32 %res +} + +define i64 @test_bitcastdoubletoi64(double %in) { +; CHECK: test_bitcastdoubletoi64: + + %res = bitcast double %in to i64 +; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}} + ret i64 %res +} + +define float @test_bitcasti32tofloat(i32 %in) { +; CHECK: test_bitcasti32tofloat: + + %res = bitcast i32 %in to float +; CHECK: fmov {{s[0-9]+}}, {{w[0-9]+}} + ret float %res + +} + +define double @test_bitcasti64todouble(i64 %in) { +; CHECK: test_bitcasti64todouble: + + %res = bitcast i64 %in to double +; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}} + ret double %res + +} diff --git a/test/CodeGen/AArch64/flags-multiuse.ll b/test/CodeGen/AArch64/flags-multiuse.ll new file mode 100644 index 000000000000..940c146f0a9f --- /dev/null +++ b/test/CodeGen/AArch64/flags-multiuse.ll @@ -0,0 +1,35 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +; LLVM should be able to cope with multiple uses of the same flag-setting +; instruction at different points of a routine. Either by rematerializing the +; compare or by saving and restoring the flag register. + +declare void @bar() + +@var = global i32 0 + +define i32 @test_multiflag(i32 %n, i32 %m, i32 %o) { +; CHECK: test_multiflag: + + %test = icmp ne i32 %n, %m +; CHECK: cmp [[LHS:w[0-9]+]], [[RHS:w[0-9]+]] + + %val = zext i1 %test to i32 +; CHECK: csinc {{[xw][0-9]+}}, {{xzr|wzr}}, {{xzr|wzr}}, eq + + store i32 %val, i32* @var + + call void @bar() +; CHECK: bl bar + + ; Currently, the comparison is emitted again. An MSR/MRS pair would also be + ; acceptable, but assuming the call preserves NZCV is not. + br i1 %test, label %iftrue, label %iffalse +; CHECK: cmp [[LHS]], [[RHS]] +; CHECK: b.eq + +iftrue: + ret i32 42 +iffalse: + ret i32 0 +} diff --git a/test/CodeGen/AArch64/floatdp_1source.ll b/test/CodeGen/AArch64/floatdp_1source.ll new file mode 100644 index 000000000000..c94ba9b57b5a --- /dev/null +++ b/test/CodeGen/AArch64/floatdp_1source.ll @@ -0,0 +1,138 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@varhalf = global half 0.0 +@varfloat = global float 0.0 +@vardouble = global double 0.0 + +declare float @fabsf(float) readonly +declare double @fabs(double) readonly + +declare float @llvm.sqrt.f32(float %Val) +declare double @llvm.sqrt.f64(double %Val) + +declare float @ceilf(float) readonly +declare double @ceil(double) readonly + +declare float @floorf(float) readonly +declare double @floor(double) readonly + +declare float @truncf(float) readonly +declare double @trunc(double) readonly + +declare float @rintf(float) readonly +declare double @rint(double) readonly + +declare float @nearbyintf(float) readonly +declare double @nearbyint(double) readonly + +define void @simple_float() { +; CHECK: simple_float: + %val1 = load volatile float* @varfloat + + %valabs = call float @fabsf(float %val1) + store volatile float %valabs, float* @varfloat +; CHECK: fabs {{s[0-9]+}}, {{s[0-9]+}} + + %valneg = fsub float -0.0, %val1 + store volatile float %valneg, float* @varfloat +; CHECK: fneg {{s[0-9]+}}, {{s[0-9]+}} + + %valsqrt = call float @llvm.sqrt.f32(float %val1) + store volatile float %valsqrt, float* @varfloat +; CHECK: fsqrt {{s[0-9]+}}, {{s[0-9]+}} + + %valceil = call float @ceilf(float %val1) + store volatile float %valceil, float* @varfloat +; CHECK: frintp {{s[0-9]+}}, {{s[0-9]+}} + + %valfloor = call float @floorf(float %val1) + store volatile float %valfloor, float* @varfloat +; CHECK: frintm {{s[0-9]+}}, {{s[0-9]+}} + + %valtrunc = call float @truncf(float %val1) + store volatile float %valtrunc, float* @varfloat +; CHECK: frintz {{s[0-9]+}}, {{s[0-9]+}} + + %valrint = call float @rintf(float %val1) + store volatile float %valrint, float* @varfloat +; CHECK: frintx {{s[0-9]+}}, {{s[0-9]+}} + + %valnearbyint = call float @nearbyintf(float %val1) + store volatile float %valnearbyint, float* @varfloat +; CHECK: frinti {{s[0-9]+}}, {{s[0-9]+}} + + ret void +} + +define void @simple_double() { +; CHECK: simple_double: + %val1 = load volatile double* @vardouble + + %valabs = call double @fabs(double %val1) + store volatile double %valabs, double* @vardouble +; CHECK: fabs {{d[0-9]+}}, {{d[0-9]+}} + + %valneg = fsub double -0.0, %val1 + store volatile double %valneg, double* @vardouble +; CHECK: fneg {{d[0-9]+}}, {{d[0-9]+}} + + %valsqrt = call double @llvm.sqrt.f64(double %val1) + store volatile double %valsqrt, double* @vardouble +; CHECK: fsqrt {{d[0-9]+}}, {{d[0-9]+}} + + %valceil = call double @ceil(double %val1) + store volatile double %valceil, double* @vardouble +; CHECK: frintp {{d[0-9]+}}, {{d[0-9]+}} + + %valfloor = call double @floor(double %val1) + store volatile double %valfloor, double* @vardouble +; CHECK: frintm {{d[0-9]+}}, {{d[0-9]+}} + + %valtrunc = call double @trunc(double %val1) + store volatile double %valtrunc, double* @vardouble +; CHECK: frintz {{d[0-9]+}}, {{d[0-9]+}} + + %valrint = call double @rint(double %val1) + store volatile double %valrint, double* @vardouble +; CHECK: frintx {{d[0-9]+}}, {{d[0-9]+}} + + %valnearbyint = call double @nearbyint(double %val1) + store volatile double %valnearbyint, double* @vardouble +; CHECK: frinti {{d[0-9]+}}, {{d[0-9]+}} + + ret void +} + +define void @converts() { +; CHECK: converts: + + %val16 = load volatile half* @varhalf + %val32 = load volatile float* @varfloat + %val64 = load volatile double* @vardouble + + %val16to32 = fpext half %val16 to float + store volatile float %val16to32, float* @varfloat +; CHECK: fcvt {{s[0-9]+}}, {{h[0-9]+}} + + %val16to64 = fpext half %val16 to double + store volatile double %val16to64, double* @vardouble +; CHECK: fcvt {{d[0-9]+}}, {{h[0-9]+}} + + %val32to16 = fptrunc float %val32 to half + store volatile half %val32to16, half* @varhalf +; CHECK: fcvt {{h[0-9]+}}, {{s[0-9]+}} + + %val32to64 = fpext float %val32 to double + store volatile double %val32to64, double* @vardouble +; CHECK: fcvt {{d[0-9]+}}, {{s[0-9]+}} + + %val64to16 = fptrunc double %val64 to half + store volatile half %val64to16, half* @varhalf +; CHECK: fcvt {{h[0-9]+}}, {{d[0-9]+}} + + %val64to32 = fptrunc double %val64 to float + store volatile float %val64to32, float* @varfloat +; CHECK: fcvt {{s[0-9]+}}, {{d[0-9]+}} + + ret void +} diff --git a/test/CodeGen/AArch64/floatdp_2source.ll b/test/CodeGen/AArch64/floatdp_2source.ll new file mode 100644 index 000000000000..b2256b342acf --- /dev/null +++ b/test/CodeGen/AArch64/floatdp_2source.ll @@ -0,0 +1,60 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@varfloat = global float 0.0 +@vardouble = global double 0.0 + +define void @testfloat() { +; CHECK: testfloat: + %val1 = load float* @varfloat + + %val2 = fadd float %val1, %val1 +; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + + %val3 = fmul float %val2, %val1 +; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + + %val4 = fdiv float %val3, %val1 +; CHECK: fdiv {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + + %val5 = fsub float %val4, %val2 +; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + + store volatile float %val5, float* @varfloat + +; These will be enabled with the implementation of floating-point litpool entries. + %val6 = fmul float %val1, %val2 + %val7 = fsub float -0.0, %val6 +; CHECK: fnmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + + store volatile float %val7, float* @varfloat + + ret void +} + +define void @testdouble() { +; CHECK: testdouble: + %val1 = load double* @vardouble + + %val2 = fadd double %val1, %val1 +; CHECK: fadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + + %val3 = fmul double %val2, %val1 +; CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + + %val4 = fdiv double %val3, %val1 +; CHECK: fdiv {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + + %val5 = fsub double %val4, %val2 +; CHECK: fsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + + store volatile double %val5, double* @vardouble + +; These will be enabled with the implementation of doubleing-point litpool entries. + %val6 = fmul double %val1, %val2 + %val7 = fsub double -0.0, %val6 +; CHECK: fnmul {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + + store volatile double %val7, double* @vardouble + + ret void +} diff --git a/test/CodeGen/AArch64/fp-cond-sel.ll b/test/CodeGen/AArch64/fp-cond-sel.ll new file mode 100644 index 000000000000..56e8f16f9b36 --- /dev/null +++ b/test/CodeGen/AArch64/fp-cond-sel.ll @@ -0,0 +1,26 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@varfloat = global float 0.0 +@vardouble = global double 0.0 + +define void @test_csel(i32 %lhs32, i32 %rhs32, i64 %lhs64) { +; CHECK: test_csel: + + %tst1 = icmp ugt i32 %lhs32, %rhs32 + %val1 = select i1 %tst1, float 0.0, float 1.0 + store float %val1, float* @varfloat +; CHECK: ldr [[FLT0:s[0-9]+]], [{{x[0-9]+}}, #:lo12:.LCPI +; CHECK: fmov [[FLT1:s[0-9]+]], #1.0 +; CHECK: fcsel {{s[0-9]+}}, [[FLT0]], [[FLT1]], hi + + %rhs64 = sext i32 %rhs32 to i64 + %tst2 = icmp sle i64 %lhs64, %rhs64 + %val2 = select i1 %tst2, double 1.0, double 0.0 + store double %val2, double* @vardouble +; CHECK: ldr [[FLT0:d[0-9]+]], [{{x[0-9]+}}, #:lo12:.LCPI +; CHECK: fmov [[FLT1:d[0-9]+]], #1.0 +; CHECK: fcsel {{d[0-9]+}}, [[FLT1]], [[FLT0]], le + + ret void +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/fp-dp3.ll b/test/CodeGen/AArch64/fp-dp3.ll new file mode 100644 index 000000000000..39db9be15771 --- /dev/null +++ b/test/CodeGen/AArch64/fp-dp3.ll @@ -0,0 +1,102 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -fp-contract=fast | FileCheck %s + +declare float @llvm.fma.f32(float, float, float) +declare double @llvm.fma.f64(double, double, double) + +define float @test_fmadd(float %a, float %b, float %c) { +; CHECK: test_fmadd: + %val = call float @llvm.fma.f32(float %a, float %b, float %c) +; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + ret float %val +} + +define float @test_fmsub(float %a, float %b, float %c) { +; CHECK: test_fmsub: + %nega = fsub float -0.0, %a + %val = call float @llvm.fma.f32(float %nega, float %b, float %c) +; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + ret float %val +} + +define float @test_fnmadd(float %a, float %b, float %c) { +; CHECK: test_fnmadd: + %negc = fsub float -0.0, %c + %val = call float @llvm.fma.f32(float %a, float %b, float %negc) +; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + ret float %val +} + +define float @test_fnmsub(float %a, float %b, float %c) { +; CHECK: test_fnmsub: + %nega = fsub float -0.0, %a + %negc = fsub float -0.0, %c + %val = call float @llvm.fma.f32(float %nega, float %b, float %negc) +; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + ret float %val +} + +define double @testd_fmadd(double %a, double %b, double %c) { +; CHECK: testd_fmadd: + %val = call double @llvm.fma.f64(double %a, double %b, double %c) +; CHECK: fmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + ret double %val +} + +define double @testd_fmsub(double %a, double %b, double %c) { +; CHECK: testd_fmsub: + %nega = fsub double -0.0, %a + %val = call double @llvm.fma.f64(double %nega, double %b, double %c) +; CHECK: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + ret double %val +} + +define double @testd_fnmadd(double %a, double %b, double %c) { +; CHECK: testd_fnmadd: + %negc = fsub double -0.0, %c + %val = call double @llvm.fma.f64(double %a, double %b, double %negc) +; CHECK: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + ret double %val +} + +define double @testd_fnmsub(double %a, double %b, double %c) { +; CHECK: testd_fnmsub: + %nega = fsub double -0.0, %a + %negc = fsub double -0.0, %c + %val = call double @llvm.fma.f64(double %nega, double %b, double %negc) +; CHECK: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} + ret double %val +} + +define float @test_fmadd_unfused(float %a, float %b, float %c) { +; CHECK: test_fmadd_unfused: + %prod = fmul float %b, %c + %sum = fadd float %a, %prod +; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + ret float %sum +} + +define float @test_fmsub_unfused(float %a, float %b, float %c) { +; CHECK: test_fmsub_unfused: + %prod = fmul float %b, %c + %diff = fsub float %a, %prod +; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + ret float %diff +} + +define float @test_fnmadd_unfused(float %a, float %b, float %c) { +; CHECK: test_fnmadd_unfused: + %nega = fsub float -0.0, %a + %prod = fmul float %b, %c + %sum = fadd float %nega, %prod +; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + ret float %sum +} + +define float @test_fnmsub_unfused(float %a, float %b, float %c) { +; CHECK: test_fnmsub_unfused: + %nega = fsub float -0.0, %a + %prod = fmul float %b, %c + %diff = fsub float %nega, %prod +; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} + ret float %diff +} diff --git a/test/CodeGen/AArch64/fp128-folding.ll b/test/CodeGen/AArch64/fp128-folding.ll new file mode 100644 index 000000000000..b5bdcf4f37b4 --- /dev/null +++ b/test/CodeGen/AArch64/fp128-folding.ll @@ -0,0 +1,17 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s +declare void @bar(i8*, i8*, i32*) + +; SelectionDAG used to try to fold some fp128 operations using the ppc128 type, +; which is not supported. + +define fp128 @test_folding() { +; CHECK: test_folding: + %l = alloca i32 + store i32 42, i32* %l + %val = load i32* %l + %fpval = sitofp i32 %val to fp128 + ; If the value is loaded from a constant pool into an fp128, it's been folded + ; successfully. +; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, #:lo12:.LCPI + ret fp128 %fpval +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/fp128.ll b/test/CodeGen/AArch64/fp128.ll new file mode 100644 index 000000000000..258d34b8f81f --- /dev/null +++ b/test/CodeGen/AArch64/fp128.ll @@ -0,0 +1,280 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +@lhs = global fp128 zeroinitializer +@rhs = global fp128 zeroinitializer + +define fp128 @test_add() { +; CHECK: test_add: + + %lhs = load fp128* @lhs + %rhs = load fp128* @rhs +; CHECK: ldr q0, [{{x[0-9]+}}, #:lo12:lhs] +; CHECK: ldr q1, [{{x[0-9]+}}, #:lo12:rhs] + + %val = fadd fp128 %lhs, %rhs +; CHECK: bl __addtf3 + ret fp128 %val +} + +define fp128 @test_sub() { +; CHECK: test_sub: + + %lhs = load fp128* @lhs + %rhs = load fp128* @rhs +; CHECK: ldr q0, [{{x[0-9]+}}, #:lo12:lhs] +; CHECK: ldr q1, [{{x[0-9]+}}, #:lo12:rhs] + + %val = fsub fp128 %lhs, %rhs +; CHECK: bl __subtf3 + ret fp128 %val +} + +define fp128 @test_mul() { +; CHECK: test_mul: + + %lhs = load fp128* @lhs + %rhs = load fp128* @rhs +; CHECK: ldr q0, [{{x[0-9]+}}, #:lo12:lhs] +; CHECK: ldr q1, [{{x[0-9]+}}, #:lo12:rhs] + + %val = fmul fp128 %lhs, %rhs +; CHECK: bl __multf3 + ret fp128 %val +} + +define fp128 @test_div() { +; CHECK: test_div: + + %lhs = load fp128* @lhs + %rhs = load fp128* @rhs +; CHECK: ldr q0, [{{x[0-9]+}}, #:lo12:lhs] +; CHECK: ldr q1, [{{x[0-9]+}}, #:lo12:rhs] + + %val = fdiv fp128 %lhs, %rhs +; CHECK: bl __divtf3 + ret fp128 %val +} + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @test_fptosi() { +; CHECK: test_fptosi: + %val = load fp128* @lhs + + %val32 = fptosi fp128 %val to i32 + store i32 %val32, i32* @var32 +; CHECK: bl __fixtfsi + + %val64 = fptosi fp128 %val to i64 + store i64 %val64, i64* @var64 +; CHECK: bl __fixtfdi + + ret void +} + +define void @test_fptoui() { +; CHECK: test_fptoui: + %val = load fp128* @lhs + + %val32 = fptoui fp128 %val to i32 + store i32 %val32, i32* @var32 +; CHECK: bl __fixunstfsi + + %val64 = fptoui fp128 %val to i64 + store i64 %val64, i64* @var64 +; CHECK: bl __fixunstfdi + + ret void +} + +define void @test_sitofp() { +; CHECK: test_sitofp: + + %src32 = load i32* @var32 + %val32 = sitofp i32 %src32 to fp128 + store volatile fp128 %val32, fp128* @lhs +; CHECK: bl __floatsitf + + %src64 = load i64* @var64 + %val64 = sitofp i64 %src64 to fp128 + store volatile fp128 %val64, fp128* @lhs +; CHECK: bl __floatditf + + ret void +} + +define void @test_uitofp() { +; CHECK: test_uitofp: + + %src32 = load i32* @var32 + %val32 = uitofp i32 %src32 to fp128 + store volatile fp128 %val32, fp128* @lhs +; CHECK: bl __floatunsitf + + %src64 = load i64* @var64 + %val64 = uitofp i64 %src64 to fp128 + store volatile fp128 %val64, fp128* @lhs +; CHECK: bl __floatunditf + + ret void +} + +define i1 @test_setcc1() { +; CHECK: test_setcc1: + + %lhs = load fp128* @lhs + %rhs = load fp128* @rhs +; CHECK: ldr q0, [{{x[0-9]+}}, #:lo12:lhs] +; CHECK: ldr q1, [{{x[0-9]+}}, #:lo12:rhs] + +; Technically, everything after the call to __letf2 is redundant, but we'll let +; LLVM have its fun for now. + %val = fcmp ole fp128 %lhs, %rhs +; CHECK: bl __letf2 +; CHECK: cmp w0, #0 +; CHECK: csinc w0, wzr, wzr, gt + + ret i1 %val +; CHECK: ret +} + +define i1 @test_setcc2() { +; CHECK: test_setcc2: + + %lhs = load fp128* @lhs + %rhs = load fp128* @rhs +; CHECK: ldr q0, [{{x[0-9]+}}, #:lo12:lhs] +; CHECK: ldr q1, [{{x[0-9]+}}, #:lo12:rhs] + +; Technically, everything after the call to __letf2 is redundant, but we'll let +; LLVM have its fun for now. + %val = fcmp ugt fp128 %lhs, %rhs +; CHECK: bl __unordtf2 +; CHECK: mov x[[UNORDERED:[0-9]+]], x0 + +; CHECK: bl __gttf2 +; CHECK: cmp w0, #0 +; CHECK: csinc [[GT:w[0-9]+]], wzr, wzr, le +; CHECK: cmp w[[UNORDERED]], #0 +; CHECK: csinc [[UNORDERED:w[0-9]+]], wzr, wzr, eq +; CHECK: orr w0, [[UNORDERED]], [[GT]] + + ret i1 %val +; CHECK: ret +} + +define i32 @test_br_cc() { +; CHECK: test_br_cc: + + %lhs = load fp128* @lhs + %rhs = load fp128* @rhs +; CHECK: ldr q0, [{{x[0-9]+}}, #:lo12:lhs] +; CHECK: ldr q1, [{{x[0-9]+}}, #:lo12:rhs] + + ; olt == !uge, which LLVM unfortunately "optimizes" this to. + %cond = fcmp olt fp128 %lhs, %rhs +; CHECK: bl __unordtf2 +; CHECK: mov x[[UNORDERED:[0-9]+]], x0 + +; CHECK: bl __getf2 +; CHECK: cmp w0, #0 + +; CHECK: csinc [[OGE:w[0-9]+]], wzr, wzr, lt +; CHECK: cmp w[[UNORDERED]], #0 +; CHECK: csinc [[UNORDERED:w[0-9]+]], wzr, wzr, eq +; CHECK: orr [[UGE:w[0-9]+]], [[UNORDERED]], [[OGE]] +; CHECK: cbnz [[UGE]], [[RET29:.LBB[0-9]+_[0-9]+]] + br i1 %cond, label %iftrue, label %iffalse + +iftrue: + ret i32 42 +; CHECK-NEXT: BB# +; CHECK-NEXT: movz x0, #42 +; CHECK-NEXT: b [[REALRET:.LBB[0-9]+_[0-9]+]] + +iffalse: + ret i32 29 +; CHECK: [[RET29]]: +; CHECK-NEXT: movz x0, #29 +; CHECK-NEXT: [[REALRET]]: +; CHECK: ret +} + +define void @test_select(i1 %cond, fp128 %lhs, fp128 %rhs) { +; CHECK: test_select: + + %val = select i1 %cond, fp128 %lhs, fp128 %rhs + store fp128 %val, fp128* @lhs +; CHECK: cmp w0, #0 +; CHECK: str q1, [sp] +; CHECK-NEXT: b.eq [[IFFALSE:.LBB[0-9]+_[0-9]+]] +; CHECK-NEXT: BB# +; CHECK-NEXT: str q0, [sp] +; CHECK-NEXT: [[IFFALSE]]: +; CHECK-NEXT: ldr q0, [sp] +; CHECK: str q0, [{{x[0-9]+}}, #:lo12:lhs] + ret void +; CHECK: ret +} + +@varfloat = global float 0.0 +@vardouble = global double 0.0 + +define void @test_round() { +; CHECK: test_round: + + %val = load fp128* @lhs + + %float = fptrunc fp128 %val to float + store float %float, float* @varfloat +; CHECK: bl __trunctfsf2 +; CHECK: str s0, [{{x[0-9]+}}, #:lo12:varfloat] + + %double = fptrunc fp128 %val to double + store double %double, double* @vardouble +; CHECK: bl __trunctfdf2 +; CHECK: str d0, [{{x[0-9]+}}, #:lo12:vardouble] + + ret void +} + +define void @test_extend() { +; CHECK: test_extend: + + %val = load fp128* @lhs + + %float = load float* @varfloat + %fromfloat = fpext float %float to fp128 + store volatile fp128 %fromfloat, fp128* @lhs +; CHECK: bl __extendsftf2 +; CHECK: str q0, [{{x[0-9]+}}, #:lo12:lhs] + + %double = load double* @vardouble + %fromdouble = fpext double %double to fp128 + store volatile fp128 %fromdouble, fp128* @lhs +; CHECK: bl __extenddftf2 +; CHECK: str q0, [{{x[0-9]+}}, #:lo12:lhs] + + ret void +; CHECK: ret +} + +define fp128 @test_neg(fp128 %in) { +; CHECK: [[MINUS0:.LCPI[0-9]+_0]]: +; Make sure the weird hex constant below *is* -0.0 +; CHECK-NEXT: fp128 -0 + +; CHECK: test_neg: + + ; Could in principle be optimized to fneg which we can't select, this makes + ; sure that doesn't happen. + %ret = fsub fp128 0xL00000000000000008000000000000000, %in +; CHECK: str q0, [sp, #-16] +; CHECK-NEXT: ldr q1, [sp], #16 +; CHECK: ldr q0, [{{x[0-9]+}}, #:lo12:[[MINUS0]]] +; CHECK: bl __subtf3 + + ret fp128 %ret +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/fpimm.ll b/test/CodeGen/AArch64/fpimm.ll new file mode 100644 index 000000000000..fd28aeef9291 --- /dev/null +++ b/test/CodeGen/AArch64/fpimm.ll @@ -0,0 +1,34 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@varf32 = global float 0.0 +@varf64 = global double 0.0 + +define void @check_float() { +; CHECK: check_float: + + %val = load float* @varf32 + %newval1 = fadd float %val, 8.5 + store volatile float %newval1, float* @varf32 +; CHECK: fmov {{s[0-9]+}}, #8.5 + + %newval2 = fadd float %val, 128.0 + store volatile float %newval2, float* @varf32 +; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, #:lo12:.LCPI0_0 + + ret void +} + +define void @check_double() { +; CHECK: check_double: + + %val = load double* @varf64 + %newval1 = fadd double %val, 8.5 + store volatile double %newval1, double* @varf64 +; CHECK: fmov {{d[0-9]+}}, #8.5 + + %newval2 = fadd double %val, 128.0 + store volatile double %newval2, double* @varf64 +; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, #:lo12:.LCPI1_0 + + ret void +} diff --git a/test/CodeGen/AArch64/func-argpassing.ll b/test/CodeGen/AArch64/func-argpassing.ll new file mode 100644 index 000000000000..78fde6a3c33a --- /dev/null +++ b/test/CodeGen/AArch64/func-argpassing.ll @@ -0,0 +1,193 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +%myStruct = type { i64 , i8, i32 } + +@var8 = global i8 0 +@var32 = global i32 0 +@var64 = global i64 0 +@var128 = global i128 0 +@varfloat = global float 0.0 +@vardouble = global double 0.0 +@varstruct = global %myStruct zeroinitializer + +define void @take_i8s(i8 %val1, i8 %val2) { +; CHECK: take_i8s: + store i8 %val2, i8* @var8 + ; Not using w1 may be technically allowed, but it would indicate a + ; problem in itself. +; CHECK: strb w1, [{{x[0-9]+}}, #:lo12:var8] + ret void +} + +define void @add_floats(float %val1, float %val2) { +; CHECK: add_floats: + %newval = fadd float %val1, %val2 +; CHECK: fadd [[ADDRES:s[0-9]+]], s0, s1 + store float %newval, float* @varfloat +; CHECK: str [[ADDRES]], [{{x[0-9]+}}, #:lo12:varfloat] + ret void +} + +; byval pointers should be allocated to the stack and copied as if +; with memcpy. +define void @take_struct(%myStruct* byval %structval) { +; CHECK: take_struct: + %addr0 = getelementptr %myStruct* %structval, i64 0, i32 2 + %addr1 = getelementptr %myStruct* %structval, i64 0, i32 0 + + %val0 = load i32* %addr0 + ; Some weird move means x0 is used for one access +; CHECK: ldr [[REG32:w[0-9]+]], [{{x[0-9]+|sp}}, #12] + store i32 %val0, i32* @var32 +; CHECK: str [[REG32]], [{{x[0-9]+}}, #:lo12:var32] + + %val1 = load i64* %addr1 +; CHECK: ldr [[REG64:x[0-9]+]], [{{x[0-9]+|sp}}] + store i64 %val1, i64* @var64 +; CHECK: str [[REG64]], [{{x[0-9]+}}, #:lo12:var64] + + ret void +} + +; %structval should be at sp + 16 +define void @check_byval_align(i32* byval %ignore, %myStruct* byval align 16 %structval) { +; CHECK: check_byval_align: + + %addr0 = getelementptr %myStruct* %structval, i64 0, i32 2 + %addr1 = getelementptr %myStruct* %structval, i64 0, i32 0 + + %val0 = load i32* %addr0 + ; Some weird move means x0 is used for one access +; CHECK: add x[[STRUCTVAL_ADDR:[0-9]+]], sp, #16 +; CHECK: ldr [[REG32:w[0-9]+]], [x[[STRUCTVAL_ADDR]], #12] + store i32 %val0, i32* @var32 +; CHECK: str [[REG32]], [{{x[0-9]+}}, #:lo12:var32] + + %val1 = load i64* %addr1 +; CHECK: ldr [[REG64:x[0-9]+]], [sp, #16] + store i64 %val1, i64* @var64 +; CHECK: str [[REG64]], [{{x[0-9]+}}, #:lo12:var64] + + ret void +} + +define i32 @return_int() { +; CHECK: return_int: + %val = load i32* @var32 + ret i32 %val +; CHECK: ldr w0, [{{x[0-9]+}}, #:lo12:var32] + ; Make sure epilogue follows +; CHECK-NEXT: ret +} + +define double @return_double() { +; CHECK: return_double: + ret double 3.14 +; CHECK: ldr d0, [{{x[0-9]+}}, #:lo12:.LCPI +} + +; This is the kind of IR clang will produce for returning a struct +; small enough to go into registers. Not all that pretty, but it +; works. +define [2 x i64] @return_struct() { +; CHECK: return_struct: + %addr = bitcast %myStruct* @varstruct to [2 x i64]* + %val = load [2 x i64]* %addr + ret [2 x i64] %val +; CHECK: ldr x0, [{{x[0-9]+}}, #:lo12:varstruct] + ; Odd register regex below disallows x0 which we want to be live now. +; CHECK: add {{x[1-9][0-9]*}}, {{x[1-9][0-9]*}}, #:lo12:varstruct +; CHECK-NEXT: ldr x1, [{{x[1-9][0-9]*}}, #8] + ; Make sure epilogue immediately follows +; CHECK-NEXT: ret +} + +; Large structs are passed by reference (storage allocated by caller +; to preserve value semantics) in x8. Strictly this only applies to +; structs larger than 16 bytes, but C semantics can still be provided +; if LLVM does it to %myStruct too. So this is the simplest check +define void @return_large_struct(%myStruct* sret %retval) { +; CHECK: return_large_struct: + %addr0 = getelementptr %myStruct* %retval, i64 0, i32 0 + %addr1 = getelementptr %myStruct* %retval, i64 0, i32 1 + %addr2 = getelementptr %myStruct* %retval, i64 0, i32 2 + + store i64 42, i64* %addr0 + store i8 2, i8* %addr1 + store i32 9, i32* %addr2 +; CHECK: str {{x[0-9]+}}, [x8] +; CHECK: strb {{w[0-9]+}}, [x8, #8] +; CHECK: str {{w[0-9]+}}, [x8, #12] + + ret void +} + +; This struct is just too far along to go into registers: (only x7 is +; available, but it needs two). Also make sure that %stacked doesn't +; sneak into x7 behind. +define i32 @struct_on_stack(i8 %var0, i16 %var1, i32 %var2, i64 %var3, i128 %var45, + i32* %var6, %myStruct* byval %struct, i32* byval %stacked, + double %notstacked) { +; CHECK: struct_on_stack: + %addr = getelementptr %myStruct* %struct, i64 0, i32 0 + %val64 = load i64* %addr + store i64 %val64, i64* @var64 + ; Currently nothing on local stack, so struct should be at sp +; CHECK: ldr [[VAL64:x[0-9]+]], [sp] +; CHECK: str [[VAL64]], [{{x[0-9]+}}, #:lo12:var64] + + store double %notstacked, double* @vardouble +; CHECK-NOT: ldr d0 +; CHECK: str d0, [{{x[0-9]+}}, #:lo12:vardouble + + %retval = load i32* %stacked + ret i32 %retval +; CHECK: ldr w0, [sp, #16] +} + +define void @stacked_fpu(float %var0, double %var1, float %var2, float %var3, + float %var4, float %var5, float %var6, float %var7, + float %var8) { +; CHECK: stacked_fpu: + store float %var8, float* @varfloat + ; Beware as above: the offset would be different on big-endian + ; machines if the first ldr were changed to use s-registers. +; CHECK: ldr d[[VALFLOAT:[0-9]+]], [sp] +; CHECK: str s[[VALFLOAT]], [{{x[0-9]+}}, #:lo12:varfloat] + + ret void +} + +; 128-bit integer types should be passed in xEVEN, xODD rather than +; the reverse. In this case x2 and x3. Nothing should use x1. +define i32 @check_i128_regalign(i32 %val0, i128 %val1, i32 %val2) { +; CHECK: check_i128_regalign + store i128 %val1, i128* @var128 +; CHECK: str x2, [{{x[0-9]+}}, #:lo12:var128] +; CHECK: str x3, [{{x[0-9]+}}, #8] + + ret i32 %val2 +; CHECK: mov x0, x4 +} + +define void @check_i128_stackalign(i32 %val0, i32 %val1, i32 %val2, i32 %val3, + i32 %val4, i32 %val5, i32 %val6, i32 %val7, + i32 %stack1, i128 %stack2) { +; CHECK: check_i128_stackalign + store i128 %stack2, i128* @var128 + ; Nothing local on stack in current codegen, so first stack is 16 away +; CHECK: ldr {{x[0-9]+}}, [sp, #16] + ; Important point is that we address sp+24 for second dword +; CHECK: add [[REG:x[0-9]+]], sp, #16 +; CHECK: ldr {{x[0-9]+}}, {{\[}}[[REG]], #8] + ret void +} + +declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) + +define i32 @test_extern() { +; CHECK: test_extern: + call void @llvm.memcpy.p0i8.p0i8.i32(i8* undef, i8* undef, i32 undef, i32 4, i1 0) +; CHECK: bl memcpy + ret i32 0 +} diff --git a/test/CodeGen/AArch64/func-calls.ll b/test/CodeGen/AArch64/func-calls.ll new file mode 100644 index 000000000000..13b689c40886 --- /dev/null +++ b/test/CodeGen/AArch64/func-calls.ll @@ -0,0 +1,140 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +%myStruct = type { i64 , i8, i32 } + +@var8 = global i8 0 +@var8_2 = global i8 0 +@var32 = global i32 0 +@var64 = global i64 0 +@var128 = global i128 0 +@varfloat = global float 0.0 +@varfloat_2 = global float 0.0 +@vardouble = global double 0.0 +@varstruct = global %myStruct zeroinitializer +@varsmallstruct = global [2 x i64] zeroinitializer + +declare void @take_i8s(i8 %val1, i8 %val2) +declare void @take_floats(float %val1, float %val2) + +define void @simple_args() { +; CHECK: simple_args: + %char1 = load i8* @var8 + %char2 = load i8* @var8_2 + call void @take_i8s(i8 %char1, i8 %char2) +; CHECK: ldrb w0, [{{x[0-9]+}}, #:lo12:var8] +; CHECK: ldrb w1, [{{x[0-9]+}}, #:lo12:var8_2] +; CHECK: bl take_i8s + + %float1 = load float* @varfloat + %float2 = load float* @varfloat_2 + call void @take_floats(float %float1, float %float2) +; CHECK: ldr s1, [{{x[0-9]+}}, #:lo12:varfloat_2] +; CHECK: ldr s0, [{{x[0-9]+}}, #:lo12:varfloat] +; CHECK: bl take_floats + + ret void +} + +declare i32 @return_int() +declare double @return_double() +declare [2 x i64] @return_smallstruct() +declare void @return_large_struct(%myStruct* sret %retval) + +define void @simple_rets() { +; CHECK: simple_rets: + + %int = call i32 @return_int() + store i32 %int, i32* @var32 +; CHECK: bl return_int +; CHECK: str w0, [{{x[0-9]+}}, #:lo12:var32] + + %dbl = call double @return_double() + store double %dbl, double* @vardouble +; CHECK: bl return_double +; CHECK: str d0, [{{x[0-9]+}}, #:lo12:vardouble] + + %arr = call [2 x i64] @return_smallstruct() + store [2 x i64] %arr, [2 x i64]* @varsmallstruct +; CHECK: bl return_smallstruct +; CHECK: str x1, [{{x[0-9]+}}, #8] +; CHECK: str x0, [{{x[0-9]+}}, #:lo12:varsmallstruct] + + call void @return_large_struct(%myStruct* sret @varstruct) +; CHECK: add x8, {{x[0-9]+}}, #:lo12:varstruct +; CHECK: bl return_large_struct + + ret void +} + + +declare i32 @struct_on_stack(i8 %var0, i16 %var1, i32 %var2, i64 %var3, i128 %var45, + i32* %var6, %myStruct* byval %struct, i32 %stacked, + double %notstacked) +declare void @stacked_fpu(float %var0, double %var1, float %var2, float %var3, + float %var4, float %var5, float %var6, float %var7, + float %var8) + +define void @check_stack_args() { + call i32 @struct_on_stack(i8 0, i16 12, i32 42, i64 99, i128 1, + i32* @var32, %myStruct* byval @varstruct, + i32 999, double 1.0) + ; Want to check that the final double is passed in registers and + ; that varstruct is passed on the stack. Rather dependent on how a + ; memcpy gets created, but the following works for now. +; CHECK: mov x0, sp +; CHECK: str {{w[0-9]+}}, [x0] +; CHECK: str {{w[0-9]+}}, [x0, #12] +; CHECK: fmov d0, +; CHECK: bl struct_on_stack + + call void @stacked_fpu(float -1.0, double 1.0, float 4.0, float 2.0, + float -2.0, float -8.0, float 16.0, float 1.0, + float 64.0) +; CHECK: ldr s[[STACKEDREG:[0-9]+]], [{{x[0-9]+}}, #:lo12:.LCPI +; CHECK: mov x0, sp +; CHECK: str d[[STACKEDREG]], [x0] +; CHECK: bl stacked_fpu + ret void +} + + +declare void @check_i128_stackalign(i32 %val0, i32 %val1, i32 %val2, i32 %val3, + i32 %val4, i32 %val5, i32 %val6, i32 %val7, + i32 %stack1, i128 %stack2) + +declare void @check_i128_regalign(i32 %val0, i128 %val1) + + +define void @check_i128_align() { +; CHECK: check_i128_align: + %val = load i128* @var128 + call void @check_i128_stackalign(i32 0, i32 1, i32 2, i32 3, + i32 4, i32 5, i32 6, i32 7, + i32 42, i128 %val) +; CHECK: ldr [[I128LO:x[0-9]+]], [{{x[0-9]+}}, #:lo12:var128] +; CHECK: ldr [[I128HI:x[0-9]+]], [{{x[0-9]+}}, #8] +; CHECK: mov x[[SPREG:[0-9]+]], sp +; CHECK: str [[I128HI]], [x[[SPREG]], #24] +; CHECK: str [[I128LO]], [x[[SPREG]], #16] +; CHECK: bl check_i128_stackalign + + call void @check_i128_regalign(i32 0, i128 42) +; CHECK-NOT: mov x1 +; CHECK: movz x2, #42 +; CHECK: mov x3, xzr +; CHECK: bl check_i128_regalign + + ret void +} + +@fptr = global void()* null + +define void @check_indirect_call() { +; CHECK: check_indirect_call: + %func = load void()** @fptr + call void %func() +; CHECK: ldr [[FPTR:x[0-9]+]], [{{x[0-9]+}}, #:lo12:fptr] +; CHECK: blr [[FPTR]] + + ret void +} diff --git a/test/CodeGen/AArch64/global-alignment.ll b/test/CodeGen/AArch64/global-alignment.ll new file mode 100644 index 000000000000..8ed6e551cdeb --- /dev/null +++ b/test/CodeGen/AArch64/global-alignment.ll @@ -0,0 +1,69 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +@var32 = global [3 x i32] zeroinitializer +@var64 = global [3 x i64] zeroinitializer +@var32_align64 = global [3 x i32] zeroinitializer, align 8 + +define i64 @test_align32() { +; CHECK: test_align32: + %addr = bitcast [3 x i32]* @var32 to i64* + + ; Since @var32 is only guaranteed to be aligned to 32-bits, it's invalid to + ; emit an "LDR x0, [x0, #:lo12:var32] instruction to implement this load. + %val = load i64* %addr +; CHECK: adrp [[HIBITS:x[0-9]+]], var32 +; CHECK: add x[[ADDR:[0-9]+]], [[HIBITS]], #:lo12:var32 +; CHECK: ldr x0, [x[[ADDR]]] + + ret i64 %val +} + +define i64 @test_align64() { +; CHECK: test_align64: + %addr = bitcast [3 x i64]* @var64 to i64* + + ; However, var64 *is* properly aligned and emitting an adrp/add/ldr would be + ; inefficient. + %val = load i64* %addr +; CHECK: adrp x[[HIBITS:[0-9]+]], var64 +; CHECK-NOT: add x[[HIBITS]] +; CHECK: ldr x0, [x[[HIBITS]], #:lo12:var64] + + ret i64 %val +} + +define i64 @test_var32_align64() { +; CHECK: test_var32_align64: + %addr = bitcast [3 x i32]* @var32_align64 to i64* + + ; Since @var32 is only guaranteed to be aligned to 32-bits, it's invalid to + ; emit an "LDR x0, [x0, #:lo12:var32] instruction to implement this load. + %val = load i64* %addr +; CHECK: adrp x[[HIBITS:[0-9]+]], var32_align64 +; CHECK-NOT: add x[[HIBITS]] +; CHECK: ldr x0, [x[[HIBITS]], #:lo12:var32_align64] + + ret i64 %val +} + +@yet_another_var = external global {i32, i32} + +define i64 @test_yet_another_var() { +; CHECK: test_yet_another_var: + + ; @yet_another_var has a preferred alignment of 8, but that's not enough if + ; we're going to be linking against other things. Its ABI alignment is only 4 + ; so we can't fold the load. + %val = load i64* bitcast({i32, i32}* @yet_another_var to i64*) +; CHECK: adrp [[HIBITS:x[0-9]+]], yet_another_var +; CHECK: add x[[ADDR:[0-9]+]], [[HIBITS]], #:lo12:yet_another_var +; CHECK: ldr x0, [x[[ADDR]]] + ret i64 %val +} + +define i64()* @test_functions() { +; CHECK: test_functions: + ret i64()* @test_yet_another_var +; CHECK: adrp [[HIBITS:x[0-9]+]], test_yet_another_var +; CHECK: add x0, [[HIBITS]], #:lo12:test_yet_another_var +} diff --git a/test/CodeGen/AArch64/got-abuse.ll b/test/CodeGen/AArch64/got-abuse.ll new file mode 100644 index 000000000000..c474e5845a64 --- /dev/null +++ b/test/CodeGen/AArch64/got-abuse.ll @@ -0,0 +1,23 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic -filetype=obj < %s + +; LLVM gives well-defined semantics to this horrible construct (though C says +; it's undefined). Regardless, we shouldn't crash. The important feature here is +; that in general the only way to access a GOT symbol is via a 64-bit +; load. Neither of these alternatives has the ELF relocations required to +; support it: +; + ldr wD, [xN, #:got_lo12:func] +; + add xD, xN, #:got_lo12:func + +declare void @consume(i32) +declare void @func() + +define void @foo() nounwind { +; CHECK: foo: +entry: + call void @consume(i32 ptrtoint (void ()* @func to i32)) +; CHECK: adrp x[[ADDRHI:[0-9]+]], :got:func +; CHECK: ldr {{x[0-9]+}}, [x[[ADDRHI]], #:got_lo12:func] + ret void +} + diff --git a/test/CodeGen/AArch64/i128-align.ll b/test/CodeGen/AArch64/i128-align.ll new file mode 100644 index 000000000000..f019ea0a6706 --- /dev/null +++ b/test/CodeGen/AArch64/i128-align.ll @@ -0,0 +1,29 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +%struct = type { i32, i128, i8 } + +@var = global %struct zeroinitializer + +define i64 @check_size() { +; CHECK: check_size: + %starti = ptrtoint %struct* @var to i64 + + %endp = getelementptr %struct* @var, i64 1 + %endi = ptrtoint %struct* %endp to i64 + + %diff = sub i64 %endi, %starti + ret i64 %diff +; CHECK: movz x0, #48 +} + +define i64 @check_field() { +; CHECK: check_field: + %starti = ptrtoint %struct* @var to i64 + + %endp = getelementptr %struct* @var, i64 0, i32 1 + %endi = ptrtoint i128* %endp to i64 + + %diff = sub i64 %endi, %starti + ret i64 %diff +; CHECK: movz x0, #16 +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/illegal-float-ops.ll b/test/CodeGen/AArch64/illegal-float-ops.ll new file mode 100644 index 000000000000..446151b8ffac --- /dev/null +++ b/test/CodeGen/AArch64/illegal-float-ops.ll @@ -0,0 +1,221 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +@varfloat = global float 0.0 +@vardouble = global double 0.0 +@varfp128 = global fp128 zeroinitializer + +declare float @llvm.cos.f32(float) +declare double @llvm.cos.f64(double) +declare fp128 @llvm.cos.f128(fp128) + +define void @test_cos(float %float, double %double, fp128 %fp128) { +; CHECK: test_cos: + + %cosfloat = call float @llvm.cos.f32(float %float) + store float %cosfloat, float* @varfloat +; CHECK: bl cosf + + %cosdouble = call double @llvm.cos.f64(double %double) + store double %cosdouble, double* @vardouble +; CHECK: bl cos + + %cosfp128 = call fp128 @llvm.cos.f128(fp128 %fp128) + store fp128 %cosfp128, fp128* @varfp128 +; CHECK: bl cosl + + ret void +} + +declare float @llvm.exp.f32(float) +declare double @llvm.exp.f64(double) +declare fp128 @llvm.exp.f128(fp128) + +define void @test_exp(float %float, double %double, fp128 %fp128) { +; CHECK: test_exp: + + %expfloat = call float @llvm.exp.f32(float %float) + store float %expfloat, float* @varfloat +; CHECK: bl expf + + %expdouble = call double @llvm.exp.f64(double %double) + store double %expdouble, double* @vardouble +; CHECK: bl exp + + %expfp128 = call fp128 @llvm.exp.f128(fp128 %fp128) + store fp128 %expfp128, fp128* @varfp128 +; CHECK: bl expl + + ret void +} + +declare float @llvm.exp2.f32(float) +declare double @llvm.exp2.f64(double) +declare fp128 @llvm.exp2.f128(fp128) + +define void @test_exp2(float %float, double %double, fp128 %fp128) { +; CHECK: test_exp2: + + %exp2float = call float @llvm.exp2.f32(float %float) + store float %exp2float, float* @varfloat +; CHECK: bl exp2f + + %exp2double = call double @llvm.exp2.f64(double %double) + store double %exp2double, double* @vardouble +; CHECK: bl exp2 + + %exp2fp128 = call fp128 @llvm.exp2.f128(fp128 %fp128) + store fp128 %exp2fp128, fp128* @varfp128 +; CHECK: bl exp2l + ret void + +} + +declare float @llvm.log.f32(float) +declare double @llvm.log.f64(double) +declare fp128 @llvm.log.f128(fp128) + +define void @test_log(float %float, double %double, fp128 %fp128) { +; CHECK: test_log: + + %logfloat = call float @llvm.log.f32(float %float) + store float %logfloat, float* @varfloat +; CHECK: bl logf + + %logdouble = call double @llvm.log.f64(double %double) + store double %logdouble, double* @vardouble +; CHECK: bl log + + %logfp128 = call fp128 @llvm.log.f128(fp128 %fp128) + store fp128 %logfp128, fp128* @varfp128 +; CHECK: bl logl + + ret void +} + +declare float @llvm.log2.f32(float) +declare double @llvm.log2.f64(double) +declare fp128 @llvm.log2.f128(fp128) + +define void @test_log2(float %float, double %double, fp128 %fp128) { +; CHECK: test_log2: + + %log2float = call float @llvm.log2.f32(float %float) + store float %log2float, float* @varfloat +; CHECK: bl log2f + + %log2double = call double @llvm.log2.f64(double %double) + store double %log2double, double* @vardouble +; CHECK: bl log2 + + %log2fp128 = call fp128 @llvm.log2.f128(fp128 %fp128) + store fp128 %log2fp128, fp128* @varfp128 +; CHECK: bl log2l + ret void + +} + +declare float @llvm.log10.f32(float) +declare double @llvm.log10.f64(double) +declare fp128 @llvm.log10.f128(fp128) + +define void @test_log10(float %float, double %double, fp128 %fp128) { +; CHECK: test_log10: + + %log10float = call float @llvm.log10.f32(float %float) + store float %log10float, float* @varfloat +; CHECK: bl log10f + + %log10double = call double @llvm.log10.f64(double %double) + store double %log10double, double* @vardouble +; CHECK: bl log10 + + %log10fp128 = call fp128 @llvm.log10.f128(fp128 %fp128) + store fp128 %log10fp128, fp128* @varfp128 +; CHECK: bl log10l + + ret void +} + +declare float @llvm.sin.f32(float) +declare double @llvm.sin.f64(double) +declare fp128 @llvm.sin.f128(fp128) + +define void @test_sin(float %float, double %double, fp128 %fp128) { +; CHECK: test_sin: + + %sinfloat = call float @llvm.sin.f32(float %float) + store float %sinfloat, float* @varfloat +; CHECK: bl sinf + + %sindouble = call double @llvm.sin.f64(double %double) + store double %sindouble, double* @vardouble +; CHECK: bl sin + + %sinfp128 = call fp128 @llvm.sin.f128(fp128 %fp128) + store fp128 %sinfp128, fp128* @varfp128 +; CHECK: bl sinl + ret void + +} + +declare float @llvm.pow.f32(float, float) +declare double @llvm.pow.f64(double, double) +declare fp128 @llvm.pow.f128(fp128, fp128) + +define void @test_pow(float %float, double %double, fp128 %fp128) { +; CHECK: test_pow: + + %powfloat = call float @llvm.pow.f32(float %float, float %float) + store float %powfloat, float* @varfloat +; CHECK: bl powf + + %powdouble = call double @llvm.pow.f64(double %double, double %double) + store double %powdouble, double* @vardouble +; CHECK: bl pow + + %powfp128 = call fp128 @llvm.pow.f128(fp128 %fp128, fp128 %fp128) + store fp128 %powfp128, fp128* @varfp128 +; CHECK: bl powl + + ret void +} + +declare float @llvm.powi.f32(float, i32) +declare double @llvm.powi.f64(double, i32) +declare fp128 @llvm.powi.f128(fp128, i32) + +define void @test_powi(float %float, double %double, i32 %exponent, fp128 %fp128) { +; CHECK: test_powi: + + %powifloat = call float @llvm.powi.f32(float %float, i32 %exponent) + store float %powifloat, float* @varfloat +; CHECK: bl __powisf2 + + %powidouble = call double @llvm.powi.f64(double %double, i32 %exponent) + store double %powidouble, double* @vardouble +; CHECK: bl __powidf2 + + %powifp128 = call fp128 @llvm.powi.f128(fp128 %fp128, i32 %exponent) + store fp128 %powifp128, fp128* @varfp128 +; CHECK: bl __powitf2 + ret void + +} + +define void @test_frem(float %float, double %double, fp128 %fp128) { +; CHECK: test_frem: + + %fremfloat = frem float %float, %float + store float %fremfloat, float* @varfloat +; CHECK: bl fmodf + + %fremdouble = frem double %double, %double + store double %fremdouble, double* @vardouble +; CHECK: bl fmod + + %fremfp128 = frem fp128 %fp128, %fp128 + store fp128 %fremfp128, fp128* @varfp128 +; CHECK: bl fmodl + + ret void +} diff --git a/test/CodeGen/AArch64/init-array.ll b/test/CodeGen/AArch64/init-array.ll new file mode 100644 index 000000000000..d80be8f3a639 --- /dev/null +++ b/test/CodeGen/AArch64/init-array.ll @@ -0,0 +1,9 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -use-init-array < %s | FileCheck %s + +define internal void @_GLOBAL__I_a() section ".text.startup" { + ret void +} + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] + +; CHECK: .section .init_array
\ No newline at end of file diff --git a/test/CodeGen/AArch64/inline-asm-constraints-badI.ll b/test/CodeGen/AArch64/inline-asm-constraints-badI.ll new file mode 100644 index 000000000000..c39c57f05822 --- /dev/null +++ b/test/CodeGen/AArch64/inline-asm-constraints-badI.ll @@ -0,0 +1,7 @@ +; RUN: not llc -mtriple=aarch64-none-linux-gnu < %s + +define void @foo() { + ; Out of range immediate for I. + call void asm sideeffect "add x0, x0, $0", "I"(i32 4096) + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/inline-asm-constraints-badK.ll b/test/CodeGen/AArch64/inline-asm-constraints-badK.ll new file mode 100644 index 000000000000..47c5f98bf009 --- /dev/null +++ b/test/CodeGen/AArch64/inline-asm-constraints-badK.ll @@ -0,0 +1,7 @@ +; RUN: not llc -mtriple=aarch64-none-linux-gnu < %s + +define void @foo() { + ; 32-bit bitpattern ending in 1101 can't be produced. + call void asm sideeffect "and w0, w0, $0", "K"(i32 13) + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/inline-asm-constraints-badK2.ll b/test/CodeGen/AArch64/inline-asm-constraints-badK2.ll new file mode 100644 index 000000000000..7a5b99e23b3d --- /dev/null +++ b/test/CodeGen/AArch64/inline-asm-constraints-badK2.ll @@ -0,0 +1,7 @@ +; RUN: not llc -mtriple=aarch64-none-linux-gnu < %s + +define void @foo() { + ; 32-bit bitpattern ending in 1101 can't be produced. + call void asm sideeffect "and w0, w0, $0", "K"(i64 4294967296) + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/inline-asm-constraints-badL.ll b/test/CodeGen/AArch64/inline-asm-constraints-badL.ll new file mode 100644 index 000000000000..4f0039865a35 --- /dev/null +++ b/test/CodeGen/AArch64/inline-asm-constraints-badL.ll @@ -0,0 +1,7 @@ +; RUN: not llc -mtriple=aarch64-none-linux-gnu < %s + +define void @foo() { + ; 32-bit bitpattern ending in 1101 can't be produced. + call void asm sideeffect "and x0, x0, $0", "L"(i32 13) + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/inline-asm-constraints.ll b/test/CodeGen/AArch64/inline-asm-constraints.ll new file mode 100644 index 000000000000..c232f3208cfa --- /dev/null +++ b/test/CodeGen/AArch64/inline-asm-constraints.ll @@ -0,0 +1,117 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s + +define i64 @test_inline_constraint_r(i64 %base, i32 %offset) { +; CHECK: test_inline_constraint_r: + %val = call i64 asm "add $0, $1, $2, sxtw", "=r,r,r"(i64 %base, i32 %offset) +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtw + ret i64 %val +} + +define i16 @test_small_reg(i16 %lhs, i16 %rhs) { +; CHECK: test_small_reg: + %val = call i16 asm sideeffect "add $0, $1, $2, sxth", "=r,r,r"(i16 %lhs, i16 %rhs) +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxth + ret i16 %val +} + +define i64 @test_inline_constraint_r_imm(i64 %base, i32 %offset) { +; CHECK: test_inline_constraint_r_imm: + %val = call i64 asm "add $0, $1, $2, sxtw", "=r,r,r"(i64 4, i32 12) +; CHECK: movz [[FOUR:x[0-9]+]], #4 +; CHECK: movz [[TWELVE:w[0-9]+]], #12 +; CHECK: add {{x[0-9]+}}, [[FOUR]], [[TWELVE]], sxtw + ret i64 %val +} + +; m is permitted to have a base/offset form. We don't do that +; currently though. +define i32 @test_inline_constraint_m(i32 *%ptr) { +; CHECK: test_inline_constraint_m: + %val = call i32 asm "ldr $0, $1", "=r,m"(i32 *%ptr) +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}] + ret i32 %val +} + +@arr = global [8 x i32] zeroinitializer + +; Q should *never* have base/offset form even if given the chance. +define i32 @test_inline_constraint_Q(i32 *%ptr) { +; CHECK: test_inline_constraint_Q: + %val = call i32 asm "ldr $0, $1", "=r,Q"(i32* getelementptr([8 x i32]* @arr, i32 0, i32 1)) +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}] + ret i32 %val +} + +@dump = global fp128 zeroinitializer + +define void @test_inline_constraint_I() { +; CHECK: test_inline_constraint_I: + call void asm sideeffect "add x0, x0, $0", "I"(i32 0) + call void asm sideeffect "add x0, x0, $0", "I"(i64 4095) +; CHECK: add x0, x0, #0 +; CHECK: add x0, x0, #4095 + + ret void +} + +; Skip J because it's useless + +define void @test_inline_constraint_K() { +; CHECK: test_inline_constraint_K: + call void asm sideeffect "and w0, w0, $0", "K"(i32 2863311530) ; = 0xaaaaaaaa + call void asm sideeffect "and w0, w0, $0", "K"(i32 65535) +; CHECK: and w0, w0, #-1431655766 +; CHECK: and w0, w0, #65535 + + ret void +} + +define void @test_inline_constraint_L() { +; CHECK: test_inline_constraint_L: + call void asm sideeffect "and x0, x0, $0", "L"(i64 4294967296) ; = 0xaaaaaaaa + call void asm sideeffect "and x0, x0, $0", "L"(i64 65535) +; CHECK: and x0, x0, #4294967296 +; CHECK: and x0, x0, #65535 + + ret void +} + +; Skip M and N because we don't support MOV pseudo-instructions yet. + +@var = global i32 0 + +define void @test_inline_constraint_S() { +; CHECK: test_inline_constraint_S: + call void asm sideeffect "adrp x0, $0", "S"(i32* @var) + call void asm sideeffect "adrp x0, ${0:A}", "S"(i32* @var) + call void asm sideeffect "add x0, x0, ${0:L}", "S"(i32* @var) +; CHECK: adrp x0, var +; CHECK: adrp x0, var +; CHECK: add x0, x0, #:lo12:var + ret void +} + +define i32 @test_inline_constraint_S_label(i1 %in) { +; CHECK: test_inline_constraint_S_label: + call void asm sideeffect "adr x0, $0", "S"(i8* blockaddress(@test_inline_constraint_S_label, %loc)) +; CHECK: adr x0, .Ltmp{{[0-9]+}} + br i1 %in, label %loc, label %loc2 +loc: + ret i32 0 +loc2: + ret i32 42 +} + +define void @test_inline_constraint_Y() { +; CHECK: test_inline_constraint_Y: + call void asm sideeffect "fcmp s0, $0", "Y"(float 0.0) +; CHECK: fcmp s0, #0.0 + ret void +} + +define void @test_inline_constraint_Z() { +; CHECK: test_inline_constraint_Z: + call void asm sideeffect "cmp w0, $0", "Z"(i32 0) +; CHECK: cmp w0, #0 + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/inline-asm-modifiers.ll b/test/CodeGen/AArch64/inline-asm-modifiers.ll new file mode 100644 index 000000000000..3b55945561eb --- /dev/null +++ b/test/CodeGen/AArch64/inline-asm-modifiers.ll @@ -0,0 +1,125 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-ELF %s + +@var_simple = hidden global i32 0 +@var_got = global i32 0 +@var_tlsgd = thread_local global i32 0 +@var_tlsld = thread_local(localdynamic) global i32 0 +@var_tlsie = thread_local(initialexec) global i32 0 +@var_tlsle = thread_local(localexec) global i32 0 + +define void @test_inline_modifier_L() nounwind { +; CHECK: test_inline_modifier_L: + call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_simple) + call void asm sideeffect "ldr x0, [x0, ${0:L}]", "S,~{x0}"(i32* @var_got) + call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsgd) + call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsld) + call void asm sideeffect "ldr x0, [x0, ${0:L}]", "S,~{x0}"(i32* @var_tlsie) + call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsle) +; CHECK: add x0, x0, #:lo12:var_simple +; CHECK: ldr x0, [x0, #:got_lo12:var_got] +; CHECK: add x0, x0, #:tlsdesc_lo12:var_tlsgd +; CHECK: add x0, x0, #:dtprel_lo12:var_tlsld +; CHECK: ldr x0, [x0, #:gottprel_lo12:var_tlsie] +; CHECK: add x0, x0, #:tprel_lo12:var_tlsle + +; CHECK-ELF: R_AARCH64_ADD_ABS_LO12_NC var_simple +; CHECK-ELF: R_AARCH64_LD64_GOT_LO12_NC var_got +; CHECK-ELF: R_AARCH64_TLSDESC_ADD_LO12_NC var_tlsgd +; CHECK-ELF: R_AARCH64_TLSLD_ADD_DTPREL_LO12 var_tlsld +; CHECK-ELF: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC var_tlsie +; CHECK-ELF: R_AARCH64_TLSLE_ADD_TPREL_LO12 var_tlsle + + ret void +} + +define void @test_inline_modifier_G() nounwind { +; CHECK: test_inline_modifier_G: + call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsld) + call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsle) +; CHECK: add x0, x0, #:dtprel_hi12:var_tlsld, lsl #12 +; CHECK: add x0, x0, #:tprel_hi12:var_tlsle, lsl #12 + +; CHECK-ELF: R_AARCH64_TLSLD_ADD_DTPREL_HI12 var_tlsld +; CHECK-ELF: R_AARCH64_TLSLE_ADD_TPREL_HI12 var_tlsle + + ret void +} + +define void @test_inline_modifier_A() nounwind { +; CHECK: test_inline_modifier_A: + call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_simple) + call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_got) + call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsgd) + call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsie) + ; N.b. All tprel and dtprel relocs are modified: lo12 or granules. +; CHECK: adrp x0, var_simple +; CHECK: adrp x0, :got:var_got +; CHECK: adrp x0, :tlsdesc:var_tlsgd +; CHECK: adrp x0, :gottprel:var_tlsie + +; CHECK-ELF: R_AARCH64_ADR_PREL_PG_HI21 var_simple +; CHECK-ELF: R_AARCH64_ADR_GOT_PAGE var_got +; CHECK-ELF: R_AARCH64_TLSDESC_ADR_PAGE var_tlsgd +; CHECK-ELF: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 var_tlsie + + ret void +} + +define void @test_inline_modifier_wx(i32 %small, i64 %big) nounwind { +; CHECK: test_inline_modifier_wx: + call i32 asm sideeffect "add $0, $0, $0", "=r,0"(i32 %small) + call i32 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i32 %small) + call i32 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i32 %small) +; CHECK: //APP +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + + call i64 asm sideeffect "add $0, $0, $0", "=r,0"(i64 %big) + call i64 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i64 %big) + call i64 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i64 %big) +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} +; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + + call i32 asm sideeffect "add ${0:w}, ${1:w}, ${1:w}", "=r,r"(i32 0) + call i32 asm sideeffect "add ${0:x}, ${1:x}, ${1:x}", "=r,r"(i32 0) +; CHECK: add {{w[0-9]+}}, wzr, wzr +; CHECK: add {{x[0-9]+}}, xzr, xzr + ret void +} + +define void @test_inline_modifier_bhsdq() nounwind { +; CHECK: test_inline_modifier_bhsdq: + call float asm sideeffect "ldr ${0:b}, [sp]", "=w"() + call float asm sideeffect "ldr ${0:h}, [sp]", "=w"() + call float asm sideeffect "ldr ${0:s}, [sp]", "=w"() + call float asm sideeffect "ldr ${0:d}, [sp]", "=w"() + call float asm sideeffect "ldr ${0:q}, [sp]", "=w"() +; CHECK: ldr b0, [sp] +; CHECK: ldr h0, [sp] +; CHECK: ldr s0, [sp] +; CHECK: ldr d0, [sp] +; CHECK: ldr q0, [sp] + + call double asm sideeffect "ldr ${0:b}, [sp]", "=w"() + call double asm sideeffect "ldr ${0:h}, [sp]", "=w"() + call double asm sideeffect "ldr ${0:s}, [sp]", "=w"() + call double asm sideeffect "ldr ${0:d}, [sp]", "=w"() + call double asm sideeffect "ldr ${0:q}, [sp]", "=w"() +; CHECK: ldr b0, [sp] +; CHECK: ldr h0, [sp] +; CHECK: ldr s0, [sp] +; CHECK: ldr d0, [sp] +; CHECK: ldr q0, [sp] + ret void +} + +define void @test_inline_modifier_c() nounwind { +; CHECK: test_inline_modifier_c: + call void asm sideeffect "adr x0, ${0:c}", "i"(i32 3) +; CHECK: adr x0, 3 + + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/jump-table.ll b/test/CodeGen/AArch64/jump-table.ll new file mode 100644 index 000000000000..dcf9f4ed455c --- /dev/null +++ b/test/CodeGen/AArch64/jump-table.ll @@ -0,0 +1,56 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -filetype=obj | elf-dump | FileCheck %s -check-prefix=CHECK-ELF + +define i32 @test_jumptable(i32 %in) { +; CHECK: test_jumptable + + switch i32 %in, label %def [ + i32 0, label %lbl1 + i32 1, label %lbl2 + i32 2, label %lbl3 + i32 4, label %lbl4 + ] +; CHECK: adrp [[JTPAGE:x[0-9]+]], .LJTI0_0 +; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], #:lo12:.LJTI0_0 +; CHECK: ldr [[DEST:x[0-9]+]], [x[[JT]], {{x[0-9]+}}, lsl #3] +; CHECK: br [[DEST]] + +def: + ret i32 0 + +lbl1: + ret i32 1 + +lbl2: + ret i32 2 + +lbl3: + ret i32 4 + +lbl4: + ret i32 8 + +} + +; CHECK: .rodata + +; CHECK: .LJTI0_0: +; CHECK-NEXT: .xword +; CHECK-NEXT: .xword +; CHECK-NEXT: .xword +; CHECK-NEXT: .xword +; CHECK-NEXT: .xword + +; ELF tests: + +; First make sure we get a page/lo12 pair in .text to pick up the jump-table +; CHECK-ELF: .rela.text +; CHECK-ELF: ('r_sym', 0x00000008) +; CHECK-ELF-NEXT: ('r_type', 0x00000113) +; CHECK-ELF: ('r_sym', 0x00000008) +; CHECK-ELF-NEXT: ('r_type', 0x00000115) + +; Also check the targets in .rodata are relocated +; CHECK-ELF: .rela.rodata +; CHECK-ELF: ('r_sym', 0x00000005) +; CHECK-ELF-NEXT: ('r_type', 0x00000101)
\ No newline at end of file diff --git a/test/CodeGen/AArch64/large-frame.ll b/test/CodeGen/AArch64/large-frame.ll new file mode 100644 index 000000000000..2b2e1295c4f6 --- /dev/null +++ b/test/CodeGen/AArch64/large-frame.ll @@ -0,0 +1,114 @@ +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s +declare void @use_addr(i8*) + +@addr = global i8* null + +define void @test_bigframe() { +; CHECK: test_bigframe: + + %var1 = alloca i8, i32 20000000 + %var2 = alloca i8, i32 16 + %var3 = alloca i8, i32 20000000 +; CHECK: sub sp, sp, #496 +; CHECK: str x30, [sp, #488] + ; Total adjust is 39999536 +; CHECK: movz [[SUBCONST:x[0-9]+]], #22576 +; CHECK: movk [[SUBCONST]], #610, lsl #16 +; CHECK: sub sp, sp, [[SUBCONST]] + + ; Total offset is 20000024 +; CHECK: movz [[VAR1OFFSET:x[0-9]+]], #11544 +; CHECK: movk [[VAR1OFFSET]], #305, lsl #16 +; CHECK: add {{x[0-9]+}}, sp, [[VAR1OFFSET]] + store volatile i8* %var1, i8** @addr + + %var1plus2 = getelementptr i8* %var1, i32 2 + store volatile i8* %var1plus2, i8** @addr + +; CHECK: movz [[VAR2OFFSET:x[0-9]+]], #11528 +; CHECK: movk [[VAR2OFFSET]], #305, lsl #16 +; CHECK: add {{x[0-9]+}}, sp, [[VAR2OFFSET]] + store volatile i8* %var2, i8** @addr + + %var2plus2 = getelementptr i8* %var2, i32 2 + store volatile i8* %var2plus2, i8** @addr + + store volatile i8* %var3, i8** @addr + + %var3plus2 = getelementptr i8* %var3, i32 2 + store volatile i8* %var3plus2, i8** @addr + +; CHECK: movz [[ADDCONST:x[0-9]+]], #22576 +; CHECK: movk [[ADDCONST]], #610, lsl #16 +; CHECK: add sp, sp, [[ADDCONST]] + ret void +} + +define void @test_mediumframe() { +; CHECK: test_mediumframe: + %var1 = alloca i8, i32 1000000 + %var2 = alloca i8, i32 16 + %var3 = alloca i8, i32 1000000 +; CHECK: sub sp, sp, #496 +; CHECK: str x30, [sp, #488] +; CHECK: sub sp, sp, #688 +; CHECK-NEXT: sub sp, sp, #488, lsl #12 + + store volatile i8* %var1, i8** @addr +; CHECK: add [[VAR1ADDR:x[0-9]+]], sp, #600 +; CHECK: add [[VAR1ADDR]], [[VAR1ADDR]], #244, lsl #12 + + %var1plus2 = getelementptr i8* %var1, i32 2 + store volatile i8* %var1plus2, i8** @addr +; CHECK: add [[VAR1PLUS2:x[0-9]+]], {{x[0-9]+}}, #2 + + store volatile i8* %var2, i8** @addr +; CHECK: add [[VAR2ADDR:x[0-9]+]], sp, #584 +; CHECK: add [[VAR2ADDR]], [[VAR2ADDR]], #244, lsl #12 + + %var2plus2 = getelementptr i8* %var2, i32 2 + store volatile i8* %var2plus2, i8** @addr +; CHECK: add [[VAR2PLUS2:x[0-9]+]], {{x[0-9]+}}, #2 + + store volatile i8* %var3, i8** @addr + + %var3plus2 = getelementptr i8* %var3, i32 2 + store volatile i8* %var3plus2, i8** @addr + +; CHECK: add sp, sp, #688 +; CHECK: add sp, sp, #488, lsl #12 +; CHECK: ldr x30, [sp, #488] +; CHECK: add sp, sp, #496 + ret void +} + + +@bigspace = global [8 x i64] zeroinitializer + +; If temporary registers are allocated for adjustment, they should *not* clobber +; argument registers. +define void @test_tempallocation([8 x i64] %val) nounwind { +; CHECK: test_tempallocation: + %var = alloca i8, i32 1000000 +; CHECK: sub sp, sp, + +; Make sure the prologue is reasonably efficient +; CHECK-NEXT: stp x29, x30, [sp, +; CHECK-NEXT: stp x25, x26, [sp, +; CHECK-NEXT: stp x23, x24, [sp, +; CHECK-NEXT: stp x21, x22, [sp, +; CHECK-NEXT: stp x19, x20, [sp, + +; Make sure we don't trash an argument register +; CHECK-NOT: movz {{x[0-7],}} +; CHECK: sub sp, sp, + +; CHECK-NOT: movz {{x[0-7],}} + +; CHECK: bl use_addr + call void @use_addr(i8* %var) + + store [8 x i64] %val, [8 x i64]* @bigspace + ret void +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/ldst-regoffset.ll b/test/CodeGen/AArch64/ldst-regoffset.ll new file mode 100644 index 000000000000..45935129fd7e --- /dev/null +++ b/test/CodeGen/AArch64/ldst-regoffset.ll @@ -0,0 +1,333 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var_8bit = global i8 0 +@var_16bit = global i16 0 +@var_32bit = global i32 0 +@var_64bit = global i64 0 + +@var_float = global float 0.0 +@var_double = global double 0.0 + +define void @ldst_8bit(i8* %base, i32 %off32, i64 %off64) { +; CHECK: ldst_8bit: + + %addr8_sxtw = getelementptr i8* %base, i32 %off32 + %val8_sxtw = load volatile i8* %addr8_sxtw + %val32_signed = sext i8 %val8_sxtw to i32 + store volatile i32 %val32_signed, i32* @var_32bit +; CHECK: ldrsb {{w[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw] + + %addr_lsl = getelementptr i8* %base, i64 %off64 + %val8_lsl = load volatile i8* %addr_lsl + %val32_unsigned = zext i8 %val8_lsl to i32 + store volatile i32 %val32_unsigned, i32* @var_32bit +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] + + %addrint_uxtw = ptrtoint i8* %base to i64 + %offset_uxtw = zext i32 %off32 to i64 + %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw + %addr_uxtw = inttoptr i64 %addrint1_uxtw to i8* + %val8_uxtw = load volatile i8* %addr_uxtw + %newval8 = add i8 %val8_uxtw, 1 + store volatile i8 %newval8, i8* @var_8bit +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw] + + ret void +} + + +define void @ldst_16bit(i16* %base, i32 %off32, i64 %off64) { +; CHECK: ldst_16bit: + + %addr8_sxtwN = getelementptr i16* %base, i32 %off32 + %val8_sxtwN = load volatile i16* %addr8_sxtwN + %val32_signed = sext i16 %val8_sxtwN to i32 + store volatile i32 %val32_signed, i32* @var_32bit +; CHECK: ldrsh {{w[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw #1] + + %addr_lslN = getelementptr i16* %base, i64 %off64 + %val8_lslN = load volatile i16* %addr_lslN + %val32_unsigned = zext i16 %val8_lslN to i32 + store volatile i32 %val32_unsigned, i32* @var_32bit +; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #1] + + %addrint_uxtw = ptrtoint i16* %base to i64 + %offset_uxtw = zext i32 %off32 to i64 + %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw + %addr_uxtw = inttoptr i64 %addrint1_uxtw to i16* + %val8_uxtw = load volatile i16* %addr_uxtw + %newval8 = add i16 %val8_uxtw, 1 + store volatile i16 %newval8, i16* @var_16bit +; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw] + + %base_sxtw = ptrtoint i16* %base to i64 + %offset_sxtw = sext i32 %off32 to i64 + %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw + %addr_sxtw = inttoptr i64 %addrint_sxtw to i16* + %val16_sxtw = load volatile i16* %addr_sxtw + %val64_signed = sext i16 %val16_sxtw to i64 + store volatile i64 %val64_signed, i64* @var_64bit +; CHECK: ldrsh {{x[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw] + + + %base_lsl = ptrtoint i16* %base to i64 + %addrint_lsl = add i64 %base_lsl, %off64 + %addr_lsl = inttoptr i64 %addrint_lsl to i16* + %val16_lsl = load volatile i16* %addr_lsl + %val64_unsigned = zext i16 %val16_lsl to i64 + store volatile i64 %val64_unsigned, i64* @var_64bit +; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] + + %base_uxtwN = ptrtoint i16* %base to i64 + %offset_uxtwN = zext i32 %off32 to i64 + %offset2_uxtwN = shl i64 %offset_uxtwN, 1 + %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN + %addr_uxtwN = inttoptr i64 %addrint_uxtwN to i16* + %val32 = load volatile i32* @var_32bit + %val16_trunc32 = trunc i32 %val32 to i16 + store volatile i16 %val16_trunc32, i16* %addr_uxtwN +; CHECK: strh {{w[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw #1] + ret void +} + +define void @ldst_32bit(i32* %base, i32 %off32, i64 %off64) { +; CHECK: ldst_32bit: + + %addr_sxtwN = getelementptr i32* %base, i32 %off32 + %val_sxtwN = load volatile i32* %addr_sxtwN + store volatile i32 %val_sxtwN, i32* @var_32bit +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw #2] + + %addr_lslN = getelementptr i32* %base, i64 %off64 + %val_lslN = load volatile i32* %addr_lslN + store volatile i32 %val_lslN, i32* @var_32bit +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #2] + + %addrint_uxtw = ptrtoint i32* %base to i64 + %offset_uxtw = zext i32 %off32 to i64 + %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw + %addr_uxtw = inttoptr i64 %addrint1_uxtw to i32* + %val_uxtw = load volatile i32* %addr_uxtw + %newval8 = add i32 %val_uxtw, 1 + store volatile i32 %newval8, i32* @var_32bit +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw] + + + %base_sxtw = ptrtoint i32* %base to i64 + %offset_sxtw = sext i32 %off32 to i64 + %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw + %addr_sxtw = inttoptr i64 %addrint_sxtw to i32* + %val16_sxtw = load volatile i32* %addr_sxtw + %val64_signed = sext i32 %val16_sxtw to i64 + store volatile i64 %val64_signed, i64* @var_64bit +; CHECK: ldrsw {{x[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw] + + + %base_lsl = ptrtoint i32* %base to i64 + %addrint_lsl = add i64 %base_lsl, %off64 + %addr_lsl = inttoptr i64 %addrint_lsl to i32* + %val16_lsl = load volatile i32* %addr_lsl + %val64_unsigned = zext i32 %val16_lsl to i64 + store volatile i64 %val64_unsigned, i64* @var_64bit +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] + + %base_uxtwN = ptrtoint i32* %base to i64 + %offset_uxtwN = zext i32 %off32 to i64 + %offset2_uxtwN = shl i64 %offset_uxtwN, 2 + %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN + %addr_uxtwN = inttoptr i64 %addrint_uxtwN to i32* + %val32 = load volatile i32* @var_32bit + store volatile i32 %val32, i32* %addr_uxtwN +; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw #2] + ret void +} + +define void @ldst_64bit(i64* %base, i32 %off32, i64 %off64) { +; CHECK: ldst_64bit: + + %addr_sxtwN = getelementptr i64* %base, i32 %off32 + %val_sxtwN = load volatile i64* %addr_sxtwN + store volatile i64 %val_sxtwN, i64* @var_64bit +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw #3] + + %addr_lslN = getelementptr i64* %base, i64 %off64 + %val_lslN = load volatile i64* %addr_lslN + store volatile i64 %val_lslN, i64* @var_64bit +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #3] + + %addrint_uxtw = ptrtoint i64* %base to i64 + %offset_uxtw = zext i32 %off32 to i64 + %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw + %addr_uxtw = inttoptr i64 %addrint1_uxtw to i64* + %val8_uxtw = load volatile i64* %addr_uxtw + %newval8 = add i64 %val8_uxtw, 1 + store volatile i64 %newval8, i64* @var_64bit +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw] + + %base_sxtw = ptrtoint i64* %base to i64 + %offset_sxtw = sext i32 %off32 to i64 + %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw + %addr_sxtw = inttoptr i64 %addrint_sxtw to i64* + %val64_sxtw = load volatile i64* %addr_sxtw + store volatile i64 %val64_sxtw, i64* @var_64bit +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw] + + %base_lsl = ptrtoint i64* %base to i64 + %addrint_lsl = add i64 %base_lsl, %off64 + %addr_lsl = inttoptr i64 %addrint_lsl to i64* + %val64_lsl = load volatile i64* %addr_lsl + store volatile i64 %val64_lsl, i64* @var_64bit +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] + + %base_uxtwN = ptrtoint i64* %base to i64 + %offset_uxtwN = zext i32 %off32 to i64 + %offset2_uxtwN = shl i64 %offset_uxtwN, 3 + %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN + %addr_uxtwN = inttoptr i64 %addrint_uxtwN to i64* + %val64 = load volatile i64* @var_64bit + store volatile i64 %val64, i64* %addr_uxtwN +; CHECK: str {{x[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw #3] + ret void +} + +define void @ldst_float(float* %base, i32 %off32, i64 %off64) { +; CHECK: ldst_float: + + %addr_sxtwN = getelementptr float* %base, i32 %off32 + %val_sxtwN = load volatile float* %addr_sxtwN + store volatile float %val_sxtwN, float* @var_float +; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw #2] + + %addr_lslN = getelementptr float* %base, i64 %off64 + %val_lslN = load volatile float* %addr_lslN + store volatile float %val_lslN, float* @var_float +; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #2] + + %addrint_uxtw = ptrtoint float* %base to i64 + %offset_uxtw = zext i32 %off32 to i64 + %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw + %addr_uxtw = inttoptr i64 %addrint1_uxtw to float* + %val_uxtw = load volatile float* %addr_uxtw + store volatile float %val_uxtw, float* @var_float +; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw] + + %base_sxtw = ptrtoint float* %base to i64 + %offset_sxtw = sext i32 %off32 to i64 + %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw + %addr_sxtw = inttoptr i64 %addrint_sxtw to float* + %val64_sxtw = load volatile float* %addr_sxtw + store volatile float %val64_sxtw, float* @var_float +; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw] + + %base_lsl = ptrtoint float* %base to i64 + %addrint_lsl = add i64 %base_lsl, %off64 + %addr_lsl = inttoptr i64 %addrint_lsl to float* + %val64_lsl = load volatile float* %addr_lsl + store volatile float %val64_lsl, float* @var_float +; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] + + %base_uxtwN = ptrtoint float* %base to i64 + %offset_uxtwN = zext i32 %off32 to i64 + %offset2_uxtwN = shl i64 %offset_uxtwN, 2 + %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN + %addr_uxtwN = inttoptr i64 %addrint_uxtwN to float* + %val64 = load volatile float* @var_float + store volatile float %val64, float* %addr_uxtwN +; CHECK: str {{s[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw #2] + ret void +} + +define void @ldst_double(double* %base, i32 %off32, i64 %off64) { +; CHECK: ldst_double: + + %addr_sxtwN = getelementptr double* %base, i32 %off32 + %val_sxtwN = load volatile double* %addr_sxtwN + store volatile double %val_sxtwN, double* @var_double +; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw #3] + + %addr_lslN = getelementptr double* %base, i64 %off64 + %val_lslN = load volatile double* %addr_lslN + store volatile double %val_lslN, double* @var_double +; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #3] + + %addrint_uxtw = ptrtoint double* %base to i64 + %offset_uxtw = zext i32 %off32 to i64 + %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw + %addr_uxtw = inttoptr i64 %addrint1_uxtw to double* + %val_uxtw = load volatile double* %addr_uxtw + store volatile double %val_uxtw, double* @var_double +; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw] + + %base_sxtw = ptrtoint double* %base to i64 + %offset_sxtw = sext i32 %off32 to i64 + %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw + %addr_sxtw = inttoptr i64 %addrint_sxtw to double* + %val64_sxtw = load volatile double* %addr_sxtw + store volatile double %val64_sxtw, double* @var_double +; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw] + + %base_lsl = ptrtoint double* %base to i64 + %addrint_lsl = add i64 %base_lsl, %off64 + %addr_lsl = inttoptr i64 %addrint_lsl to double* + %val64_lsl = load volatile double* %addr_lsl + store volatile double %val64_lsl, double* @var_double +; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] + + %base_uxtwN = ptrtoint double* %base to i64 + %offset_uxtwN = zext i32 %off32 to i64 + %offset2_uxtwN = shl i64 %offset_uxtwN, 3 + %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN + %addr_uxtwN = inttoptr i64 %addrint_uxtwN to double* + %val64 = load volatile double* @var_double + store volatile double %val64, double* %addr_uxtwN +; CHECK: str {{d[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw #3] + ret void +} + + +define void @ldst_128bit(fp128* %base, i32 %off32, i64 %off64) { +; CHECK: ldst_128bit: + + %addr_sxtwN = getelementptr fp128* %base, i32 %off32 + %val_sxtwN = load volatile fp128* %addr_sxtwN + store volatile fp128 %val_sxtwN, fp128* %base +; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw #4] + + %addr_lslN = getelementptr fp128* %base, i64 %off64 + %val_lslN = load volatile fp128* %addr_lslN + store volatile fp128 %val_lslN, fp128* %base +; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #4] + + %addrint_uxtw = ptrtoint fp128* %base to i64 + %offset_uxtw = zext i32 %off32 to i64 + %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw + %addr_uxtw = inttoptr i64 %addrint1_uxtw to fp128* + %val_uxtw = load volatile fp128* %addr_uxtw + store volatile fp128 %val_uxtw, fp128* %base +; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw] + + %base_sxtw = ptrtoint fp128* %base to i64 + %offset_sxtw = sext i32 %off32 to i64 + %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw + %addr_sxtw = inttoptr i64 %addrint_sxtw to fp128* + %val64_sxtw = load volatile fp128* %addr_sxtw + store volatile fp128 %val64_sxtw, fp128* %base +; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, sxtw] + + %base_lsl = ptrtoint fp128* %base to i64 + %addrint_lsl = add i64 %base_lsl, %off64 + %addr_lsl = inttoptr i64 %addrint_lsl to fp128* + %val64_lsl = load volatile fp128* %addr_lsl + store volatile fp128 %val64_lsl, fp128* %base +; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] + + %base_uxtwN = ptrtoint fp128* %base to i64 + %offset_uxtwN = zext i32 %off32 to i64 + %offset2_uxtwN = shl i64 %offset_uxtwN, 4 + %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN + %addr_uxtwN = inttoptr i64 %addrint_uxtwN to fp128* + %val64 = load volatile fp128* %base + store volatile fp128 %val64, fp128* %addr_uxtwN +; CHECK: str {{q[0-9]+}}, [{{x[0-9]+}}, {{w[0-9]+}}, uxtw #4] + ret void +} diff --git a/test/CodeGen/AArch64/ldst-unscaledimm.ll b/test/CodeGen/AArch64/ldst-unscaledimm.ll new file mode 100644 index 000000000000..78a3c83c3dd8 --- /dev/null +++ b/test/CodeGen/AArch64/ldst-unscaledimm.ll @@ -0,0 +1,218 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var_8bit = global i8 0 +@var_16bit = global i16 0 +@var_32bit = global i32 0 +@var_64bit = global i64 0 + +@var_float = global float 0.0 +@var_double = global double 0.0 + +@varptr = global i8* null + +define void @ldst_8bit() { +; CHECK: ldst_8bit: + +; No architectural support for loads to 16-bit or 8-bit since we +; promote i8 during lowering. + %addr_8bit = load i8** @varptr + +; match a sign-extending load 8-bit -> 32-bit + %addr_sext32 = getelementptr i8* %addr_8bit, i64 -256 + %val8_sext32 = load volatile i8* %addr_sext32 + %val32_signed = sext i8 %val8_sext32 to i32 + store volatile i32 %val32_signed, i32* @var_32bit +; CHECK: ldursb {{w[0-9]+}}, [{{x[0-9]+}}, #-256] + +; match a zero-extending load volatile 8-bit -> 32-bit + %addr_zext32 = getelementptr i8* %addr_8bit, i64 -12 + %val8_zext32 = load volatile i8* %addr_zext32 + %val32_unsigned = zext i8 %val8_zext32 to i32 + store volatile i32 %val32_unsigned, i32* @var_32bit +; CHECK: ldurb {{w[0-9]+}}, [{{x[0-9]+}}, #-12] + +; match an any-extending load volatile 8-bit -> 32-bit + %addr_anyext = getelementptr i8* %addr_8bit, i64 -1 + %val8_anyext = load volatile i8* %addr_anyext + %newval8 = add i8 %val8_anyext, 1 + store volatile i8 %newval8, i8* @var_8bit +; CHECK: ldurb {{w[0-9]+}}, [{{x[0-9]+}}, #-1] + +; match a sign-extending load volatile 8-bit -> 64-bit + %addr_sext64 = getelementptr i8* %addr_8bit, i64 -5 + %val8_sext64 = load volatile i8* %addr_sext64 + %val64_signed = sext i8 %val8_sext64 to i64 + store volatile i64 %val64_signed, i64* @var_64bit +; CHECK: ldursb {{x[0-9]+}}, [{{x[0-9]+}}, #-5] + +; match a zero-extending load volatile 8-bit -> 64-bit. +; This uses the fact that ldrb w0, [x0] will zero out the high 32-bits +; of x0 so it's identical to load volatileing to 32-bits. + %addr_zext64 = getelementptr i8* %addr_8bit, i64 -9 + %val8_zext64 = load volatile i8* %addr_zext64 + %val64_unsigned = zext i8 %val8_zext64 to i64 + store volatile i64 %val64_unsigned, i64* @var_64bit +; CHECK: ldurb {{w[0-9]+}}, [{{x[0-9]+}}, #-9] + +; truncating store volatile 32-bits to 8-bits + %addr_trunc32 = getelementptr i8* %addr_8bit, i64 -256 + %val32 = load volatile i32* @var_32bit + %val8_trunc32 = trunc i32 %val32 to i8 + store volatile i8 %val8_trunc32, i8* %addr_trunc32 +; CHECK: sturb {{w[0-9]+}}, [{{x[0-9]+}}, #-256] + +; truncating store volatile 64-bits to 8-bits + %addr_trunc64 = getelementptr i8* %addr_8bit, i64 -1 + %val64 = load volatile i64* @var_64bit + %val8_trunc64 = trunc i64 %val64 to i8 + store volatile i8 %val8_trunc64, i8* %addr_trunc64 +; CHECK: sturb {{w[0-9]+}}, [{{x[0-9]+}}, #-1] + + ret void +} + +define void @ldst_16bit() { +; CHECK: ldst_16bit: + +; No architectural support for loads to 16-bit or 16-bit since we +; promote i16 during lowering. + %addr_8bit = load i8** @varptr + +; match a sign-extending load 16-bit -> 32-bit + %addr8_sext32 = getelementptr i8* %addr_8bit, i64 -256 + %addr_sext32 = bitcast i8* %addr8_sext32 to i16* + %val16_sext32 = load volatile i16* %addr_sext32 + %val32_signed = sext i16 %val16_sext32 to i32 + store volatile i32 %val32_signed, i32* @var_32bit +; CHECK: ldursh {{w[0-9]+}}, [{{x[0-9]+}}, #-256] + +; match a zero-extending load volatile 16-bit -> 32-bit. With offset that would be unaligned. + %addr8_zext32 = getelementptr i8* %addr_8bit, i64 15 + %addr_zext32 = bitcast i8* %addr8_zext32 to i16* + %val16_zext32 = load volatile i16* %addr_zext32 + %val32_unsigned = zext i16 %val16_zext32 to i32 + store volatile i32 %val32_unsigned, i32* @var_32bit +; CHECK: ldurh {{w[0-9]+}}, [{{x[0-9]+}}, #15] + +; match an any-extending load volatile 16-bit -> 32-bit + %addr8_anyext = getelementptr i8* %addr_8bit, i64 -1 + %addr_anyext = bitcast i8* %addr8_anyext to i16* + %val16_anyext = load volatile i16* %addr_anyext + %newval16 = add i16 %val16_anyext, 1 + store volatile i16 %newval16, i16* @var_16bit +; CHECK: ldurh {{w[0-9]+}}, [{{x[0-9]+}}, #-1] + +; match a sign-extending load volatile 16-bit -> 64-bit + %addr8_sext64 = getelementptr i8* %addr_8bit, i64 -5 + %addr_sext64 = bitcast i8* %addr8_sext64 to i16* + %val16_sext64 = load volatile i16* %addr_sext64 + %val64_signed = sext i16 %val16_sext64 to i64 + store volatile i64 %val64_signed, i64* @var_64bit +; CHECK: ldursh {{x[0-9]+}}, [{{x[0-9]+}}, #-5] + +; match a zero-extending load volatile 16-bit -> 64-bit. +; This uses the fact that ldrb w0, [x0] will zero out the high 32-bits +; of x0 so it's identical to load volatileing to 32-bits. + %addr8_zext64 = getelementptr i8* %addr_8bit, i64 9 + %addr_zext64 = bitcast i8* %addr8_zext64 to i16* + %val16_zext64 = load volatile i16* %addr_zext64 + %val64_unsigned = zext i16 %val16_zext64 to i64 + store volatile i64 %val64_unsigned, i64* @var_64bit +; CHECK: ldurh {{w[0-9]+}}, [{{x[0-9]+}}, #9] + +; truncating store volatile 32-bits to 16-bits + %addr8_trunc32 = getelementptr i8* %addr_8bit, i64 -256 + %addr_trunc32 = bitcast i8* %addr8_trunc32 to i16* + %val32 = load volatile i32* @var_32bit + %val16_trunc32 = trunc i32 %val32 to i16 + store volatile i16 %val16_trunc32, i16* %addr_trunc32 +; CHECK: sturh {{w[0-9]+}}, [{{x[0-9]+}}, #-256] + +; truncating store volatile 64-bits to 16-bits + %addr8_trunc64 = getelementptr i8* %addr_8bit, i64 -1 + %addr_trunc64 = bitcast i8* %addr8_trunc64 to i16* + %val64 = load volatile i64* @var_64bit + %val16_trunc64 = trunc i64 %val64 to i16 + store volatile i16 %val16_trunc64, i16* %addr_trunc64 +; CHECK: sturh {{w[0-9]+}}, [{{x[0-9]+}}, #-1] + + ret void +} + +define void @ldst_32bit() { +; CHECK: ldst_32bit: + + %addr_8bit = load i8** @varptr + +; Straight 32-bit load/store + %addr32_8_noext = getelementptr i8* %addr_8bit, i64 1 + %addr32_noext = bitcast i8* %addr32_8_noext to i32* + %val32_noext = load volatile i32* %addr32_noext + store volatile i32 %val32_noext, i32* %addr32_noext +; CHECK: ldur {{w[0-9]+}}, [{{x[0-9]+}}, #1] +; CHECK: stur {{w[0-9]+}}, [{{x[0-9]+}}, #1] + +; Zero-extension to 64-bits + %addr32_8_zext = getelementptr i8* %addr_8bit, i64 -256 + %addr32_zext = bitcast i8* %addr32_8_zext to i32* + %val32_zext = load volatile i32* %addr32_zext + %val64_unsigned = zext i32 %val32_zext to i64 + store volatile i64 %val64_unsigned, i64* @var_64bit +; CHECK: ldur {{w[0-9]+}}, [{{x[0-9]+}}, #-256] +; CHECK: str {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_64bit] + +; Sign-extension to 64-bits + %addr32_8_sext = getelementptr i8* %addr_8bit, i64 -12 + %addr32_sext = bitcast i8* %addr32_8_sext to i32* + %val32_sext = load volatile i32* %addr32_sext + %val64_signed = sext i32 %val32_sext to i64 + store volatile i64 %val64_signed, i64* @var_64bit +; CHECK: ldursw {{x[0-9]+}}, [{{x[0-9]+}}, #-12] +; CHECK: str {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_64bit] + +; Truncation from 64-bits + %addr64_8_trunc = getelementptr i8* %addr_8bit, i64 255 + %addr64_trunc = bitcast i8* %addr64_8_trunc to i64* + %addr32_8_trunc = getelementptr i8* %addr_8bit, i64 -20 + %addr32_trunc = bitcast i8* %addr32_8_trunc to i32* + + %val64_trunc = load volatile i64* %addr64_trunc + %val32_trunc = trunc i64 %val64_trunc to i32 + store volatile i32 %val32_trunc, i32* %addr32_trunc +; CHECK: ldur {{x[0-9]+}}, [{{x[0-9]+}}, #255] +; CHECK: stur {{w[0-9]+}}, [{{x[0-9]+}}, #-20] + + ret void +} + +define void @ldst_float() { +; CHECK: ldst_float: + + %addr_8bit = load i8** @varptr + %addrfp_8 = getelementptr i8* %addr_8bit, i64 -5 + %addrfp = bitcast i8* %addrfp_8 to float* + + %valfp = load volatile float* %addrfp +; CHECK: ldur {{s[0-9]+}}, [{{x[0-9]+}}, #-5] + + store volatile float %valfp, float* %addrfp +; CHECK: stur {{s[0-9]+}}, [{{x[0-9]+}}, #-5] + + ret void +} + +define void @ldst_double() { +; CHECK: ldst_double: + + %addr_8bit = load i8** @varptr + %addrfp_8 = getelementptr i8* %addr_8bit, i64 4 + %addrfp = bitcast i8* %addrfp_8 to double* + + %valfp = load volatile double* %addrfp +; CHECK: ldur {{d[0-9]+}}, [{{x[0-9]+}}, #4] + + store volatile double %valfp, double* %addrfp +; CHECK: stur {{d[0-9]+}}, [{{x[0-9]+}}, #4] + + ret void +} diff --git a/test/CodeGen/AArch64/ldst-unsignedimm.ll b/test/CodeGen/AArch64/ldst-unsignedimm.ll new file mode 100644 index 000000000000..1e7540d9be0a --- /dev/null +++ b/test/CodeGen/AArch64/ldst-unsignedimm.ll @@ -0,0 +1,251 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var_8bit = global i8 0 +@var_16bit = global i16 0 +@var_32bit = global i32 0 +@var_64bit = global i64 0 + +@var_float = global float 0.0 +@var_double = global double 0.0 + +define void @ldst_8bit() { +; CHECK: ldst_8bit: + +; No architectural support for loads to 16-bit or 8-bit since we +; promote i8 during lowering. + +; match a sign-extending load 8-bit -> 32-bit + %val8_sext32 = load volatile i8* @var_8bit + %val32_signed = sext i8 %val8_sext32 to i32 + store volatile i32 %val32_signed, i32* @var_32bit +; CHECK: adrp {{x[0-9]+}}, var_8bit +; CHECK: ldrsb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_8bit] + +; match a zero-extending load volatile 8-bit -> 32-bit + %val8_zext32 = load volatile i8* @var_8bit + %val32_unsigned = zext i8 %val8_zext32 to i32 + store volatile i32 %val32_unsigned, i32* @var_32bit +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_8bit] + +; match an any-extending load volatile 8-bit -> 32-bit + %val8_anyext = load volatile i8* @var_8bit + %newval8 = add i8 %val8_anyext, 1 + store volatile i8 %newval8, i8* @var_8bit +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_8bit] + +; match a sign-extending load volatile 8-bit -> 64-bit + %val8_sext64 = load volatile i8* @var_8bit + %val64_signed = sext i8 %val8_sext64 to i64 + store volatile i64 %val64_signed, i64* @var_64bit +; CHECK: ldrsb {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_8bit] + +; match a zero-extending load volatile 8-bit -> 64-bit. +; This uses the fact that ldrb w0, [x0] will zero out the high 32-bits +; of x0 so it's identical to load volatileing to 32-bits. + %val8_zext64 = load volatile i8* @var_8bit + %val64_unsigned = zext i8 %val8_zext64 to i64 + store volatile i64 %val64_unsigned, i64* @var_64bit +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_8bit] + +; truncating store volatile 32-bits to 8-bits + %val32 = load volatile i32* @var_32bit + %val8_trunc32 = trunc i32 %val32 to i8 + store volatile i8 %val8_trunc32, i8* @var_8bit +; CHECK: strb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_8bit] + +; truncating store volatile 64-bits to 8-bits + %val64 = load volatile i64* @var_64bit + %val8_trunc64 = trunc i64 %val64 to i8 + store volatile i8 %val8_trunc64, i8* @var_8bit +; CHECK: strb {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_8bit] + + ret void +} + +define void @ldst_16bit() { +; CHECK: ldst_16bit: + +; No architectural support for load volatiles to 16-bit promote i16 during +; lowering. + +; match a sign-extending load volatile 16-bit -> 32-bit + %val16_sext32 = load volatile i16* @var_16bit + %val32_signed = sext i16 %val16_sext32 to i32 + store volatile i32 %val32_signed, i32* @var_32bit +; CHECK: adrp {{x[0-9]+}}, var_16bit +; CHECK: ldrsh {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_16bit] + +; match a zero-extending load volatile 16-bit -> 32-bit + %val16_zext32 = load volatile i16* @var_16bit + %val32_unsigned = zext i16 %val16_zext32 to i32 + store volatile i32 %val32_unsigned, i32* @var_32bit +; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_16bit] + +; match an any-extending load volatile 16-bit -> 32-bit + %val16_anyext = load volatile i16* @var_16bit + %newval16 = add i16 %val16_anyext, 1 + store volatile i16 %newval16, i16* @var_16bit +; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_16bit] + +; match a sign-extending load volatile 16-bit -> 64-bit + %val16_sext64 = load volatile i16* @var_16bit + %val64_signed = sext i16 %val16_sext64 to i64 + store volatile i64 %val64_signed, i64* @var_64bit +; CHECK: ldrsh {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_16bit] + +; match a zero-extending load volatile 16-bit -> 64-bit. +; This uses the fact that ldrb w0, [x0] will zero out the high 32-bits +; of x0 so it's identical to load volatileing to 32-bits. + %val16_zext64 = load volatile i16* @var_16bit + %val64_unsigned = zext i16 %val16_zext64 to i64 + store volatile i64 %val64_unsigned, i64* @var_64bit +; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_16bit] + +; truncating store volatile 32-bits to 16-bits + %val32 = load volatile i32* @var_32bit + %val16_trunc32 = trunc i32 %val32 to i16 + store volatile i16 %val16_trunc32, i16* @var_16bit +; CHECK: strh {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_16bit] + +; truncating store volatile 64-bits to 16-bits + %val64 = load volatile i64* @var_64bit + %val16_trunc64 = trunc i64 %val64 to i16 + store volatile i16 %val16_trunc64, i16* @var_16bit +; CHECK: strh {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_16bit] + + ret void +} + +define void @ldst_32bit() { +; CHECK: ldst_32bit: + +; Straight 32-bit load/store + %val32_noext = load volatile i32* @var_32bit + store volatile i32 %val32_noext, i32* @var_32bit +; CHECK: adrp {{x[0-9]+}}, var_32bit +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_32bit] +; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_32bit] + +; Zero-extension to 64-bits + %val32_zext = load volatile i32* @var_32bit + %val64_unsigned = zext i32 %val32_zext to i64 + store volatile i64 %val64_unsigned, i64* @var_64bit +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_32bit] +; CHECK: str {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_64bit] + +; Sign-extension to 64-bits + %val32_sext = load volatile i32* @var_32bit + %val64_signed = sext i32 %val32_sext to i64 + store volatile i64 %val64_signed, i64* @var_64bit +; CHECK: ldrsw {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_32bit] +; CHECK: str {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_64bit] + +; Truncation from 64-bits + %val64_trunc = load volatile i64* @var_64bit + %val32_trunc = trunc i64 %val64_trunc to i32 + store volatile i32 %val32_trunc, i32* @var_32bit +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_64bit] +; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_32bit] + + ret void +} + +@arr8 = global i8* null +@arr16 = global i16* null +@arr32 = global i32* null +@arr64 = global i64* null + +; Now check that our selection copes with accesses more complex than a +; single symbol. Permitted offsets should be folded into the loads and +; stores. Since all forms use the same Operand it's only necessary to +; check the various access-sizes involved. + +define void @ldst_complex_offsets() { +; CHECK: ldst_complex_offsets + %arr8_addr = load volatile i8** @arr8 +; CHECK: adrp {{x[0-9]+}}, arr8 +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:arr8] + + %arr8_sub1_addr = getelementptr i8* %arr8_addr, i64 1 + %arr8_sub1 = load volatile i8* %arr8_sub1_addr + store volatile i8 %arr8_sub1, i8* @var_8bit +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #1] + + %arr8_sub4095_addr = getelementptr i8* %arr8_addr, i64 4095 + %arr8_sub4095 = load volatile i8* %arr8_sub4095_addr + store volatile i8 %arr8_sub4095, i8* @var_8bit +; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, #4095] + + + %arr16_addr = load volatile i16** @arr16 +; CHECK: adrp {{x[0-9]+}}, arr16 +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:arr16] + + %arr16_sub1_addr = getelementptr i16* %arr16_addr, i64 1 + %arr16_sub1 = load volatile i16* %arr16_sub1_addr + store volatile i16 %arr16_sub1, i16* @var_16bit +; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, #2] + + %arr16_sub4095_addr = getelementptr i16* %arr16_addr, i64 4095 + %arr16_sub4095 = load volatile i16* %arr16_sub4095_addr + store volatile i16 %arr16_sub4095, i16* @var_16bit +; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, #8190] + + + %arr32_addr = load volatile i32** @arr32 +; CHECK: adrp {{x[0-9]+}}, arr32 +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:arr32] + + %arr32_sub1_addr = getelementptr i32* %arr32_addr, i64 1 + %arr32_sub1 = load volatile i32* %arr32_sub1_addr + store volatile i32 %arr32_sub1, i32* @var_32bit +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, #4] + + %arr32_sub4095_addr = getelementptr i32* %arr32_addr, i64 4095 + %arr32_sub4095 = load volatile i32* %arr32_sub4095_addr + store volatile i32 %arr32_sub4095, i32* @var_32bit +; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, #16380] + + + %arr64_addr = load volatile i64** @arr64 +; CHECK: adrp {{x[0-9]+}}, arr64 +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, #:lo12:arr64] + + %arr64_sub1_addr = getelementptr i64* %arr64_addr, i64 1 + %arr64_sub1 = load volatile i64* %arr64_sub1_addr + store volatile i64 %arr64_sub1, i64* @var_64bit +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, #8] + + %arr64_sub4095_addr = getelementptr i64* %arr64_addr, i64 4095 + %arr64_sub4095 = load volatile i64* %arr64_sub4095_addr + store volatile i64 %arr64_sub4095, i64* @var_64bit +; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, #32760] + + ret void +} + +define void @ldst_float() { +; CHECK: ldst_float: + + %valfp = load volatile float* @var_float +; CHECK: adrp {{x[0-9]+}}, var_float +; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_float] + + store volatile float %valfp, float* @var_float +; CHECK: str {{s[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_float] + + ret void +} + +define void @ldst_double() { +; CHECK: ldst_double: + + %valfp = load volatile double* @var_double +; CHECK: adrp {{x[0-9]+}}, var_double +; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_double] + + store volatile double %valfp, double* @var_double +; CHECK: str {{d[0-9]+}}, [{{x[0-9]+}}, #:lo12:var_double] + + ret void +} diff --git a/test/CodeGen/AArch64/lit.local.cfg b/test/CodeGen/AArch64/lit.local.cfg new file mode 100644 index 000000000000..c5ce2411ed48 --- /dev/null +++ b/test/CodeGen/AArch64/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.ll', '.c', '.cpp'] + +targets = set(config.root.targets_to_build.split()) +if not 'AArch64' in targets: + config.unsupported = True + diff --git a/test/CodeGen/AArch64/literal_pools.ll b/test/CodeGen/AArch64/literal_pools.ll new file mode 100644 index 000000000000..e09084148fdf --- /dev/null +++ b/test/CodeGen/AArch64/literal_pools.ll @@ -0,0 +1,55 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @foo() { +; CHECK: foo: + %val32 = load i32* @var32 + %val64 = load i64* @var64 + + %val32_lit32 = and i32 %val32, 123456785 + store volatile i32 %val32_lit32, i32* @var32 +; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI0_[0-9]+]] +; CHECK: ldr {{w[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] + + %val64_lit32 = and i64 %val64, 305402420 + store volatile i64 %val64_lit32, i64* @var64 +; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI0_[0-9]+]] +; CHECK: ldr {{w[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] + + %val64_lit32signed = and i64 %val64, -12345678 + store volatile i64 %val64_lit32signed, i64* @var64 +; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI0_[0-9]+]] +; CHECK: ldrsw {{x[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] + + %val64_lit64 = and i64 %val64, 1234567898765432 + store volatile i64 %val64_lit64, i64* @var64 +; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI0_[0-9]+]] +; CHECK: ldr {{x[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] + + ret void +} + +@varfloat = global float 0.0 +@vardouble = global double 0.0 + +define void @floating_lits() { +; CHECK: floating_lits: + + %floatval = load float* @varfloat + %newfloat = fadd float %floatval, 128.0 +; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI1_[0-9]+]] +; CHECK: ldr {{s[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] +; CHECK: fadd + store float %newfloat, float* @varfloat + + %doubleval = load double* @vardouble + %newdouble = fadd double %doubleval, 129.0 +; CHECK: adrp x[[LITBASE:[0-9]+]], [[CURLIT:.LCPI1_[0-9]+]] +; CHECK: ldr {{d[0-9]+}}, [x[[LITBASE]], #:lo12:[[CURLIT]]] +; CHECK: fadd + store double %newdouble, double* @vardouble + + ret void +} diff --git a/test/CodeGen/AArch64/local_vars.ll b/test/CodeGen/AArch64/local_vars.ll new file mode 100644 index 000000000000..5cbf5a37ec54 --- /dev/null +++ b/test/CodeGen/AArch64/local_vars.ll @@ -0,0 +1,57 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -O0 | FileCheck %s +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -O0 -disable-fp-elim | FileCheck -check-prefix CHECK-WITHFP %s + +; Make sure a reasonably sane prologue and epilogue are +; generated. This test is not robust in the face of an frame-handling +; evolving, but still has value for unrelated changes, I +; believe. +; +; In particular, it will fail when ldp/stp are used for frame setup, +; when FP-elim is implemented, and when addressing from FP is +; implemented. + +@var = global i64 0 +@local_addr = global i64* null + +declare void @foo() + +define void @trivial_func() nounwind { +; CHECK: trivial_func: // @trivial_func +; CHECK-NEXT: // BB#0 +; CHECK-NEXT: ret + + ret void +} + +define void @trivial_fp_func() { +; CHECK-WITHFP: trivial_fp_func: + +; CHECK-WITHFP: sub sp, sp, #16 +; CHECK-WITHFP: stp x29, x30, [sp] +; CHECK-WITHFP-NEXT: mov x29, sp + +; Dont't really care, but it would be a Bad Thing if this came after the epilogue. +; CHECK: bl foo + call void @foo() + ret void + +; CHECK-WITHFP: ldp x29, x30, [sp] +; CHECK-WITHFP: add sp, sp, #16 + +; CHECK-WITHFP: ret +} + +define void @stack_local() { + %local_var = alloca i64 +; CHECK: stack_local: +; CHECK: sub sp, sp, #16 + + %val = load i64* @var + store i64 %val, i64* %local_var +; CHECK: str {{x[0-9]+}}, [sp, #{{[0-9]+}}] + + store i64* %local_var, i64** @local_addr +; CHECK: add {{x[0-9]+}}, sp, #{{[0-9]+}} + + ret void +} diff --git a/test/CodeGen/AArch64/logical-imm.ll b/test/CodeGen/AArch64/logical-imm.ll new file mode 100644 index 000000000000..5f3f4da0cdad --- /dev/null +++ b/test/CodeGen/AArch64/logical-imm.ll @@ -0,0 +1,84 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @test_and(i32 %in32, i64 %in64) { +; CHECK: test_and: + + %val0 = and i32 %in32, 2863311530 + store volatile i32 %val0, i32* @var32 +; CHECK: and {{w[0-9]+}}, {{w[0-9]+}}, #0xaaaaaaaa + + %val1 = and i32 %in32, 4293984240 + store volatile i32 %val1, i32* @var32 +; CHECK: and {{w[0-9]+}}, {{w[0-9]+}}, #0xfff0fff0 + + %val2 = and i64 %in64, 9331882296111890817 + store volatile i64 %val2, i64* @var64 +; CHECK: and {{x[0-9]+}}, {{x[0-9]+}}, #0x8181818181818181 + + %val3 = and i64 %in64, 18429855317404942275 + store volatile i64 %val3, i64* @var64 +; CHECK: and {{x[0-9]+}}, {{x[0-9]+}}, #0xffc3ffc3ffc3ffc3 + + ret void +} + +define void @test_orr(i32 %in32, i64 %in64) { +; CHECK: test_orr: + + %val0 = or i32 %in32, 2863311530 + store volatile i32 %val0, i32* @var32 +; CHECK: orr {{w[0-9]+}}, {{w[0-9]+}}, #0xaaaaaaaa + + %val1 = or i32 %in32, 4293984240 + store volatile i32 %val1, i32* @var32 +; CHECK: orr {{w[0-9]+}}, {{w[0-9]+}}, #0xfff0fff0 + + %val2 = or i64 %in64, 9331882296111890817 + store volatile i64 %val2, i64* @var64 +; CHECK: orr {{x[0-9]+}}, {{x[0-9]+}}, #0x8181818181818181 + + %val3 = or i64 %in64, 18429855317404942275 + store volatile i64 %val3, i64* @var64 +; CHECK: orr {{x[0-9]+}}, {{x[0-9]+}}, #0xffc3ffc3ffc3ffc3 + + ret void +} + +define void @test_eor(i32 %in32, i64 %in64) { +; CHECK: test_eor: + + %val0 = xor i32 %in32, 2863311530 + store volatile i32 %val0, i32* @var32 +; CHECK: eor {{w[0-9]+}}, {{w[0-9]+}}, #0xaaaaaaaa + + %val1 = xor i32 %in32, 4293984240 + store volatile i32 %val1, i32* @var32 +; CHECK: eor {{w[0-9]+}}, {{w[0-9]+}}, #0xfff0fff0 + + %val2 = xor i64 %in64, 9331882296111890817 + store volatile i64 %val2, i64* @var64 +; CHECK: eor {{x[0-9]+}}, {{x[0-9]+}}, #0x8181818181818181 + + %val3 = xor i64 %in64, 18429855317404942275 + store volatile i64 %val3, i64* @var64 +; CHECK: eor {{x[0-9]+}}, {{x[0-9]+}}, #0xffc3ffc3ffc3ffc3 + + ret void +} + +define void @test_mov(i32 %in32, i64 %in64) { +; CHECK: test_mov: + %val0 = add i32 %in32, 2863311530 + store i32 %val0, i32* @var32 +; CHECK: orr {{w[0-9]+}}, wzr, #0xaaaaaaaa + + %val1 = add i64 %in64, 11068046444225730969 + store i64 %val1, i64* @var64 +; CHECK: orr {{x[0-9]+}}, xzr, #0x9999999999999999 + + ret void +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/logical_shifted_reg.ll b/test/CodeGen/AArch64/logical_shifted_reg.ll new file mode 100644 index 000000000000..bbbfcc1b9118 --- /dev/null +++ b/test/CodeGen/AArch64/logical_shifted_reg.ll @@ -0,0 +1,224 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -O0 | FileCheck %s + +@var1_32 = global i32 0 +@var2_32 = global i32 0 + +@var1_64 = global i64 0 +@var2_64 = global i64 0 + +define void @logical_32bit() { +; CHECK: logical_32bit: + %val1 = load i32* @var1_32 + %val2 = load i32* @var2_32 + + ; First check basic and/bic/or/orn/eor/eon patterns with no shift + %neg_val2 = xor i32 -1, %val2 + + %and_noshift = and i32 %val1, %val2 +; CHECK: and {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %and_noshift, i32* @var1_32 + %bic_noshift = and i32 %neg_val2, %val1 +; CHECK: bic {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %bic_noshift, i32* @var1_32 + + %or_noshift = or i32 %val1, %val2 +; CHECK: orr {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %or_noshift, i32* @var1_32 + %orn_noshift = or i32 %neg_val2, %val1 +; CHECK: orn {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %orn_noshift, i32* @var1_32 + + %xor_noshift = xor i32 %val1, %val2 +; CHECK: eor {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %xor_noshift, i32* @var1_32 + %xorn_noshift = xor i32 %neg_val2, %val1 +; CHECK: eon {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} + store volatile i32 %xorn_noshift, i32* @var1_32 + + ; Check the maximum shift on each + %operand_lsl31 = shl i32 %val2, 31 + %neg_operand_lsl31 = xor i32 -1, %operand_lsl31 + + %and_lsl31 = and i32 %val1, %operand_lsl31 +; CHECK: and {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #31 + store volatile i32 %and_lsl31, i32* @var1_32 + %bic_lsl31 = and i32 %val1, %neg_operand_lsl31 +; CHECK: bic {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #31 + store volatile i32 %bic_lsl31, i32* @var1_32 + + %or_lsl31 = or i32 %val1, %operand_lsl31 +; CHECK: orr {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #31 + store volatile i32 %or_lsl31, i32* @var1_32 + %orn_lsl31 = or i32 %val1, %neg_operand_lsl31 +; CHECK: orn {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #31 + store volatile i32 %orn_lsl31, i32* @var1_32 + + %xor_lsl31 = xor i32 %val1, %operand_lsl31 +; CHECK: eor {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #31 + store volatile i32 %xor_lsl31, i32* @var1_32 + %xorn_lsl31 = xor i32 %val1, %neg_operand_lsl31 +; CHECK: eon {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #31 + store volatile i32 %xorn_lsl31, i32* @var1_32 + + ; Check other shifts on a subset + %operand_asr10 = ashr i32 %val2, 10 + %neg_operand_asr10 = xor i32 -1, %operand_asr10 + + %bic_asr10 = and i32 %val1, %neg_operand_asr10 +; CHECK: bic {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #10 + store volatile i32 %bic_asr10, i32* @var1_32 + %xor_asr10 = xor i32 %val1, %operand_asr10 +; CHECK: eor {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #10 + store volatile i32 %xor_asr10, i32* @var1_32 + + %operand_lsr1 = lshr i32 %val2, 1 + %neg_operand_lsr1 = xor i32 -1, %operand_lsr1 + + %orn_lsr1 = or i32 %val1, %neg_operand_lsr1 +; CHECK: orn {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #1 + store volatile i32 %orn_lsr1, i32* @var1_32 + %xor_lsr1 = xor i32 %val1, %operand_lsr1 +; CHECK: eor {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #1 + store volatile i32 %xor_lsr1, i32* @var1_32 + + %operand_ror20_big = shl i32 %val2, 12 + %operand_ror20_small = lshr i32 %val2, 20 + %operand_ror20 = or i32 %operand_ror20_big, %operand_ror20_small + %neg_operand_ror20 = xor i32 -1, %operand_ror20 + + %xorn_ror20 = xor i32 %val1, %neg_operand_ror20 +; CHECK: eon {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, ror #20 + store volatile i32 %xorn_ror20, i32* @var1_32 + %and_ror20 = and i32 %val1, %operand_ror20 +; CHECK: and {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, ror #20 + store volatile i32 %and_ror20, i32* @var1_32 + + ret void +} + +define void @logical_64bit() { +; CHECK: logical_64bit: + %val1 = load i64* @var1_64 + %val2 = load i64* @var2_64 + + ; First check basic and/bic/or/orn/eor/eon patterns with no shift + %neg_val2 = xor i64 -1, %val2 + + %and_noshift = and i64 %val1, %val2 +; CHECK: and {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %and_noshift, i64* @var1_64 + %bic_noshift = and i64 %neg_val2, %val1 +; CHECK: bic {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %bic_noshift, i64* @var1_64 + + %or_noshift = or i64 %val1, %val2 +; CHECK: orr {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %or_noshift, i64* @var1_64 + %orn_noshift = or i64 %neg_val2, %val1 +; CHECK: orn {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %orn_noshift, i64* @var1_64 + + %xor_noshift = xor i64 %val1, %val2 +; CHECK: eor {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %xor_noshift, i64* @var1_64 + %xorn_noshift = xor i64 %neg_val2, %val1 +; CHECK: eon {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} + store volatile i64 %xorn_noshift, i64* @var1_64 + + ; Check the maximum shift on each + %operand_lsl63 = shl i64 %val2, 63 + %neg_operand_lsl63 = xor i64 -1, %operand_lsl63 + + %and_lsl63 = and i64 %val1, %operand_lsl63 +; CHECK: and {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #63 + store volatile i64 %and_lsl63, i64* @var1_64 + %bic_lsl63 = and i64 %val1, %neg_operand_lsl63 +; CHECK: bic {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #63 + store volatile i64 %bic_lsl63, i64* @var1_64 + + %or_lsl63 = or i64 %val1, %operand_lsl63 +; CHECK: orr {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #63 + store volatile i64 %or_lsl63, i64* @var1_64 + %orn_lsl63 = or i64 %val1, %neg_operand_lsl63 +; CHECK: orn {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #63 + store volatile i64 %orn_lsl63, i64* @var1_64 + + %xor_lsl63 = xor i64 %val1, %operand_lsl63 +; CHECK: eor {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #63 + store volatile i64 %xor_lsl63, i64* @var1_64 + %xorn_lsl63 = xor i64 %val1, %neg_operand_lsl63 +; CHECK: eon {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #63 + store volatile i64 %xorn_lsl63, i64* @var1_64 + + ; Check other shifts on a subset + %operand_asr10 = ashr i64 %val2, 10 + %neg_operand_asr10 = xor i64 -1, %operand_asr10 + + %bic_asr10 = and i64 %val1, %neg_operand_asr10 +; CHECK: bic {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #10 + store volatile i64 %bic_asr10, i64* @var1_64 + %xor_asr10 = xor i64 %val1, %operand_asr10 +; CHECK: eor {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #10 + store volatile i64 %xor_asr10, i64* @var1_64 + + %operand_lsr1 = lshr i64 %val2, 1 + %neg_operand_lsr1 = xor i64 -1, %operand_lsr1 + + %orn_lsr1 = or i64 %val1, %neg_operand_lsr1 +; CHECK: orn {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #1 + store volatile i64 %orn_lsr1, i64* @var1_64 + %xor_lsr1 = xor i64 %val1, %operand_lsr1 +; CHECK: eor {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #1 + store volatile i64 %xor_lsr1, i64* @var1_64 + + ; Construct a rotate-right from a bunch of other logical + ; operations. DAGCombiner should ensure we the ROTR during + ; selection + %operand_ror20_big = shl i64 %val2, 44 + %operand_ror20_small = lshr i64 %val2, 20 + %operand_ror20 = or i64 %operand_ror20_big, %operand_ror20_small + %neg_operand_ror20 = xor i64 -1, %operand_ror20 + + %xorn_ror20 = xor i64 %val1, %neg_operand_ror20 +; CHECK: eon {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, ror #20 + store volatile i64 %xorn_ror20, i64* @var1_64 + %and_ror20 = and i64 %val1, %operand_ror20 +; CHECK: and {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, ror #20 + store volatile i64 %and_ror20, i64* @var1_64 + + ret void +} + +define void @flag_setting() { +; CHECK: flag_setting: + %val1 = load i64* @var1_64 + %val2 = load i64* @var2_64 + +; CHECK: tst {{x[0-9]+}}, {{x[0-9]+}} +; CHECK: b.gt .L + %simple_and = and i64 %val1, %val2 + %tst1 = icmp sgt i64 %simple_and, 0 + br i1 %tst1, label %ret, label %test2 + +test2: +; CHECK: tst {{x[0-9]+}}, {{x[0-9]+}}, lsl #63 +; CHECK: b.lt .L + %shifted_op = shl i64 %val2, 63 + %shifted_and = and i64 %val1, %shifted_op + %tst2 = icmp slt i64 %shifted_and, 0 + br i1 %tst2, label %ret, label %test3 + +test3: +; CHECK: tst {{x[0-9]+}}, {{x[0-9]+}}, asr #12 +; CHECK: b.gt .L + %asr_op = ashr i64 %val2, 12 + %asr_and = and i64 %asr_op, %val1 + %tst3 = icmp sgt i64 %asr_and, 0 + br i1 %tst3, label %ret, label %other_exit + +other_exit: + store volatile i64 %val1, i64* @var1_64 + ret void +ret: + ret void +} diff --git a/test/CodeGen/AArch64/logical_shifted_reg.s b/test/CodeGen/AArch64/logical_shifted_reg.s new file mode 100644 index 000000000000..89aea580119b --- /dev/null +++ b/test/CodeGen/AArch64/logical_shifted_reg.s @@ -0,0 +1,208 @@ + .file "/home/timnor01/a64-trunk/llvm/test/CodeGen/AArch64/logical_shifted_reg.ll" + .text + .globl logical_32bit + .type logical_32bit,@function +logical_32bit: // @logical_32bit + .cfi_startproc +// BB#0: + adrp x0, var1_32 + ldr w1, [x0, #:lo12:var1_32] + adrp x0, var2_32 + ldr w2, [x0, #:lo12:var2_32] + and w3, w1, w2 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + bic w3, w1, w2 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + orr w3, w1, w2 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + orn w3, w1, w2 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + eor w3, w1, w2 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + eon w3, w2, w1 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + and w3, w1, w2, lsl #31 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + bic w3, w1, w2, lsl #31 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + orr w3, w1, w2, lsl #31 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + orn w3, w1, w2, lsl #31 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + eor w3, w1, w2, lsl #31 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + eon w3, w1, w2, lsl #31 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + bic w3, w1, w2, asr #10 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + eor w3, w1, w2, asr #10 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + orn w3, w1, w2, lsr #1 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + eor w3, w1, w2, lsr #1 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + eon w3, w1, w2, ror #20 + adrp x0, var1_32 + str w3, [x0, #:lo12:var1_32] + and w1, w1, w2, ror #20 + adrp x0, var1_32 + str w1, [x0, #:lo12:var1_32] + ret +.Ltmp0: + .size logical_32bit, .Ltmp0-logical_32bit + .cfi_endproc + + .globl logical_64bit + .type logical_64bit,@function +logical_64bit: // @logical_64bit + .cfi_startproc +// BB#0: + adrp x0, var1_64 + ldr x0, [x0, #:lo12:var1_64] + adrp x1, var2_64 + ldr x1, [x1, #:lo12:var2_64] + and x2, x0, x1 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + bic x2, x0, x1 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + orr x2, x0, x1 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + orn x2, x0, x1 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + eor x2, x0, x1 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + eon x2, x1, x0 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + and x2, x0, x1, lsl #63 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + bic x2, x0, x1, lsl #63 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + orr x2, x0, x1, lsl #63 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + orn x2, x0, x1, lsl #63 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + eor x2, x0, x1, lsl #63 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + eon x2, x0, x1, lsl #63 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + bic x2, x0, x1, asr #10 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + eor x2, x0, x1, asr #10 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + orn x2, x0, x1, lsr #1 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + eor x2, x0, x1, lsr #1 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + eon x2, x0, x1, ror #20 + adrp x3, var1_64 + str x2, [x3, #:lo12:var1_64] + and x0, x0, x1, ror #20 + adrp x1, var1_64 + str x0, [x1, #:lo12:var1_64] + ret +.Ltmp1: + .size logical_64bit, .Ltmp1-logical_64bit + .cfi_endproc + + .globl flag_setting + .type flag_setting,@function +flag_setting: // @flag_setting + .cfi_startproc +// BB#0: + sub sp, sp, #16 + adrp x0, var1_64 + ldr x0, [x0, #:lo12:var1_64] + adrp x1, var2_64 + ldr x1, [x1, #:lo12:var2_64] + tst x0, x1 + str x0, [sp, #8] // 8-byte Folded Spill + str x1, [sp] // 8-byte Folded Spill + b.gt .LBB2_4 + b .LBB2_1 +.LBB2_1: // %test2 + ldr x0, [sp, #8] // 8-byte Folded Reload + ldr x1, [sp] // 8-byte Folded Reload + tst x0, x1, lsl #63 + b.lt .LBB2_4 + b .LBB2_2 +.LBB2_2: // %test3 + ldr x0, [sp, #8] // 8-byte Folded Reload + ldr x1, [sp] // 8-byte Folded Reload + tst x0, x1, asr #12 + b.gt .LBB2_4 + b .LBB2_3 +.LBB2_3: // %other_exit + adrp x0, var1_64 + ldr x1, [sp, #8] // 8-byte Folded Reload + str x1, [x0, #:lo12:var1_64] + add sp, sp, #16 + ret +.LBB2_4: // %ret + add sp, sp, #16 + ret +.Ltmp2: + .size flag_setting, .Ltmp2-flag_setting + .cfi_endproc + + .type var1_32,@object // @var1_32 + .bss + .globl var1_32 + .align 2 +var1_32: + .word 0 // 0x0 + .size var1_32, 4 + + .type var2_32,@object // @var2_32 + .globl var2_32 + .align 2 +var2_32: + .word 0 // 0x0 + .size var2_32, 4 + + .type var1_64,@object // @var1_64 + .globl var1_64 + .align 3 +var1_64: + .xword 0 // 0x0 + .size var1_64, 8 + + .type var2_64,@object // @var2_64 + .globl var2_64 + .align 3 +var2_64: + .xword 0 // 0x0 + .size var2_64, 8 + + diff --git a/test/CodeGen/AArch64/movw-consts.ll b/test/CodeGen/AArch64/movw-consts.ll new file mode 100644 index 000000000000..b8a5fb932202 --- /dev/null +++ b/test/CodeGen/AArch64/movw-consts.ll @@ -0,0 +1,124 @@ +; RUN: llc -verify-machineinstrs -O0 < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +define i64 @test0() { +; CHECK: test0: +; Not produced by move wide instructions, but good to make sure we can return 0 anyway: +; CHECK: mov x0, xzr + ret i64 0 +} + +define i64 @test1() { +; CHECK: test1: +; CHECK: movz x0, #1 + ret i64 1 +} + +define i64 @test2() { +; CHECK: test2: +; CHECK: movz x0, #65535 + ret i64 65535 +} + +define i64 @test3() { +; CHECK: test3: +; CHECK: movz x0, #1, lsl #16 + ret i64 65536 +} + +define i64 @test4() { +; CHECK: test4: +; CHECK: movz x0, #65535, lsl #16 + ret i64 4294901760 +} + +define i64 @test5() { +; CHECK: test5: +; CHECK: movz x0, #1, lsl #32 + ret i64 4294967296 +} + +define i64 @test6() { +; CHECK: test6: +; CHECK: movz x0, #65535, lsl #32 + ret i64 281470681743360 +} + +define i64 @test7() { +; CHECK: test7: +; CHECK: movz x0, #1, lsl #48 + ret i64 281474976710656 +} + +; A 32-bit MOVN can generate some 64-bit patterns that a 64-bit one +; couldn't. Useful even for i64 +define i64 @test8() { +; CHECK: test8: +; CHECK: movn w0, #60875 + ret i64 4294906420 +} + +define i64 @test9() { +; CHECK: test9: +; CHECK: movn x0, #0 + ret i64 -1 +} + +define i64 @test10() { +; CHECK: test10: +; CHECK: movn x0, #60875, lsl #16 + ret i64 18446744069720047615 +} + +; For reasonably legitimate reasons returning an i32 results in the +; selection of an i64 constant, so we need a different idiom to test that selection +@var32 = global i32 0 + +define void @test11() { +; CHECK: test11: +; CHECK: mov {{w[0-9]+}}, wzr + store i32 0, i32* @var32 + ret void +} + +define void @test12() { +; CHECK: test12: +; CHECK: movz {{w[0-9]+}}, #1 + store i32 1, i32* @var32 + ret void +} + +define void @test13() { +; CHECK: test13: +; CHECK: movz {{w[0-9]+}}, #65535 + store i32 65535, i32* @var32 + ret void +} + +define void @test14() { +; CHECK: test14: +; CHECK: movz {{w[0-9]+}}, #1, lsl #16 + store i32 65536, i32* @var32 + ret void +} + +define void @test15() { +; CHECK: test15: +; CHECK: movz {{w[0-9]+}}, #65535, lsl #16 + store i32 4294901760, i32* @var32 + ret void +} + +define void @test16() { +; CHECK: test16: +; CHECK: movn {{w[0-9]+}}, #0 + store i32 -1, i32* @var32 + ret void +} + +define i64 @test17() { +; CHECK: test17: + + ; Mustn't MOVN w0 here. +; CHECK: movn x0, #2 + ret i64 -3 +} diff --git a/test/CodeGen/AArch64/pic-eh-stubs.ll b/test/CodeGen/AArch64/pic-eh-stubs.ll new file mode 100644 index 000000000000..77bf691cbcbd --- /dev/null +++ b/test/CodeGen/AArch64/pic-eh-stubs.ll @@ -0,0 +1,60 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic -o - %s | FileCheck %s + +; Make sure exception-handling PIC code can be linked correctly. An alternative +; to the sequence described below would have .gcc_except_table itself writable +; and not use the indirection, but this isn't what LLVM does right now. + + ; There should be a read-only .gcc_except_table section... +; CHECK: .section .gcc_except_table,"a" + + ; ... referring indirectly to stubs for its typeinfo ... +; CHECK: // @TType Encoding = indirect pcrel sdata8 + ; ... one of which is "int"'s typeinfo +; CHECK: .Ltmp9: +; CHECK-NEXT: .xword .L_ZTIi.DW.stub-.Ltmp9 + + ; .. and which is properly defined (in a writable section for the dynamic loader) later. +; CHECK: .section .data.rel,"aw" +; CHECK: .L_ZTIi.DW.stub: +; CHECK-NEXT: .xword _ZTIi + +@_ZTIi = external constant i8* + +define i32 @_Z3barv() { +entry: + invoke void @_Z3foov() + to label %return unwind label %lpad + +lpad: ; preds = %entry + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast (i8** @_ZTIi to i8*) + %1 = extractvalue { i8*, i32 } %0, 1 + %2 = tail call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) nounwind + %matches = icmp eq i32 %1, %2 + br i1 %matches, label %catch, label %eh.resume + +catch: ; preds = %lpad + %3 = extractvalue { i8*, i32 } %0, 0 + %4 = tail call i8* @__cxa_begin_catch(i8* %3) nounwind + %5 = bitcast i8* %4 to i32* + %exn.scalar = load i32* %5, align 4 + tail call void @__cxa_end_catch() nounwind + br label %return + +return: ; preds = %entry, %catch + %retval.0 = phi i32 [ %exn.scalar, %catch ], [ 42, %entry ] + ret i32 %retval.0 + +eh.resume: ; preds = %lpad + resume { i8*, i32 } %0 +} + +declare void @_Z3foov() + +declare i32 @__gxx_personality_v0(...) + +declare i32 @llvm.eh.typeid.for(i8*) nounwind readnone + +declare i8* @__cxa_begin_catch(i8*) + +declare void @__cxa_end_catch()
\ No newline at end of file diff --git a/test/CodeGen/AArch64/regress-bitcast-formals.ll b/test/CodeGen/AArch64/regress-bitcast-formals.ll new file mode 100644 index 000000000000..28dc9a7e2515 --- /dev/null +++ b/test/CodeGen/AArch64/regress-bitcast-formals.ll @@ -0,0 +1,11 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +; CallingConv.td requires a bitcast for vector arguments. Make sure we're +; actually capable of that (the test was omitted from LowerFormalArguments). + +define void @test_bitcast_lower(<2 x i32> %a) { +; CHECK: test_bitcast_lower: + + ret void +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/regress-f128csel-flags.ll b/test/CodeGen/AArch64/regress-f128csel-flags.ll new file mode 100644 index 000000000000..b35185ccd6f3 --- /dev/null +++ b/test/CodeGen/AArch64/regress-f128csel-flags.ll @@ -0,0 +1,27 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +; We used to not mark NZCV as being used in the continuation basic-block +; when lowering a 128-bit "select" to branches. This meant a subsequent use +; of the same flags gave an internal fault here. + +declare void @foo(fp128) + +define double @test_f128csel_flags(i32 %lhs, fp128 %a, fp128 %b) nounwind { +; CHECK: test_f128csel_flags + + %tst = icmp ne i32 %lhs, 42 + %val = select i1 %tst, fp128 %a, fp128 %b +; CHECK: cmp w0, #42 +; CHECK: b.eq .LBB0 + + call void @foo(fp128 %val) + %retval = select i1 %tst, double 4.0, double 5.0 + + ; It's also reasonably important that the actual fcsel comes before the + ; function call since bl may corrupt NZCV. We were doing the right thing anyway, + ; but just as well test it while we're here. +; CHECK: fcsel {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, ne +; CHECK: bl foo + + ret double %retval +} diff --git a/test/CodeGen/AArch64/regress-tail-livereg.ll b/test/CodeGen/AArch64/regress-tail-livereg.ll new file mode 100644 index 000000000000..8d5485cae4c8 --- /dev/null +++ b/test/CodeGen/AArch64/regress-tail-livereg.ll @@ -0,0 +1,19 @@ +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s +@var = global void()* zeroinitializer + +declare void @bar() + +define void @foo() { +; CHECK: foo: + %func = load void()** @var + + ; Calling a function encourages @foo to use a callee-saved register, + ; which makes it a natural choice for the tail call itself. But we don't + ; want that: the final "br xN" has to use a temporary or argument + ; register. + call void @bar() + + tail call void %func() +; CHECK: br {{x([0-79]|1[0-8])}} + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/regress-tblgen-chains.ll b/test/CodeGen/AArch64/regress-tblgen-chains.ll new file mode 100644 index 000000000000..e54552fd8edf --- /dev/null +++ b/test/CodeGen/AArch64/regress-tblgen-chains.ll @@ -0,0 +1,36 @@ +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s + +; When generating DAG selection tables, TableGen used to only flag an +; instruction as needing a chain on its own account if it had a built-in pattern +; which used the chain. This meant that the AArch64 load/stores weren't +; recognised and so both loads from %locvar below were coalesced into a single +; LS8_LDR instruction (same operands other than the non-existent chain) and the +; increment was lost at return. + +; This was obviously a Bad Thing. + +declare void @bar(i8*) + +define i64 @test_chains() { +; CHECK: test_chains: + + %locvar = alloca i8 + + call void @bar(i8* %locvar) +; CHECK: bl bar + + %inc.1 = load i8* %locvar + %inc.2 = zext i8 %inc.1 to i64 + %inc.3 = add i64 %inc.2, 1 + %inc.4 = trunc i64 %inc.3 to i8 + store i8 %inc.4, i8* %locvar +; CHECK: ldrb {{w[0-9]+}}, [sp, [[LOCADDR:#[0-9]+]]] +; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, #1 +; CHECK: strb {{w[0-9]+}}, [sp, [[LOCADDR]]] +; CHECK: ldrb {{w[0-9]+}}, [sp, [[LOCADDR]]] + + %ret.1 = load i8* %locvar + %ret.2 = zext i8 %ret.1 to i64 + ret i64 %ret.2 +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/regress-w29-reserved-with-fp.ll b/test/CodeGen/AArch64/regress-w29-reserved-with-fp.ll new file mode 100644 index 000000000000..980e2ffef901 --- /dev/null +++ b/test/CodeGen/AArch64/regress-w29-reserved-with-fp.ll @@ -0,0 +1,37 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -disable-fp-elim < %s | FileCheck %s +@var = global i32 0 + +declare void @bar() + +define void @test_w29_reserved() { +; CHECK: test_w29_reserved: +; CHECK: add x29, sp, #{{[0-9]+}} + + %val1 = load volatile i32* @var + %val2 = load volatile i32* @var + %val3 = load volatile i32* @var + %val4 = load volatile i32* @var + %val5 = load volatile i32* @var + %val6 = load volatile i32* @var + %val7 = load volatile i32* @var + %val8 = load volatile i32* @var + %val9 = load volatile i32* @var + +; CHECK-NOT: ldr w29, + + ; Call to prevent fp-elim that occurs regardless in leaf functions. + call void @bar() + + store volatile i32 %val1, i32* @var + store volatile i32 %val2, i32* @var + store volatile i32 %val3, i32* @var + store volatile i32 %val4, i32* @var + store volatile i32 %val5, i32* @var + store volatile i32 %val6, i32* @var + store volatile i32 %val7, i32* @var + store volatile i32 %val8, i32* @var + store volatile i32 %val9, i32* @var + + ret void +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/regress-wzr-allocatable.ll b/test/CodeGen/AArch64/regress-wzr-allocatable.ll new file mode 100644 index 000000000000..764d2bc44f0d --- /dev/null +++ b/test/CodeGen/AArch64/regress-wzr-allocatable.ll @@ -0,0 +1,41 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -O0 + +; When WZR wasn't marked as reserved, this function tried to allocate +; it at O0 and then generated an internal fault (mostly incidentally) +; when it discovered that it was already in use for a multiplication. + +; I'm not really convinced this is a good test since it could easily +; stop testing what it does now with no-one any the wiser. However, I +; can't think of a better way to force the allocator to use WZR +; specifically. + +define void @test() nounwind { +entry: + br label %for.cond + +for.cond: ; preds = %for.body, %entry + br i1 undef, label %for.body, label %for.end + +for.body: ; preds = %for.cond + br label %for.cond + +for.end: ; preds = %for.cond + br label %for.cond6 + +for.cond6: ; preds = %for.body9, %for.end + br i1 undef, label %for.body9, label %while.cond30 + +for.body9: ; preds = %for.cond6 + store i16 0, i16* undef, align 2 + %0 = load i32* undef, align 4 + %1 = load i32* undef, align 4 + %mul15 = mul i32 %0, %1 + %add16 = add i32 %mul15, 32768 + %div = udiv i32 %add16, 65535 + %add17 = add i32 %div, 1 + store i32 %add17, i32* undef, align 4 + br label %for.cond6 + +while.cond30: ; preds = %for.cond6 + ret void +} diff --git a/test/CodeGen/AArch64/setcc-takes-i32.ll b/test/CodeGen/AArch64/setcc-takes-i32.ll new file mode 100644 index 000000000000..d2eb77ab1b54 --- /dev/null +++ b/test/CodeGen/AArch64/setcc-takes-i32.ll @@ -0,0 +1,22 @@ +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s + +; Most important point here is that the promotion of the i1 works +; correctly. Previously LLVM thought that i64 was the appropriate SetCC output, +; which meant it proceded in two steps and produced an i64 -> i64 any_ext which +; couldn't be selected and faulted. + +; It was expecting the smallest legal promotion of i1 to be the preferred SetCC +; type, so we'll satisfy it (this actually arguably gives better code anyway, +; with flag-manipulation operations allowed to use W-registers). + +declare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) + +define i64 @test_select(i64 %lhs, i64 %rhs) { +; CHECK: test_select: + + %res = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %lhs, i64 %rhs) + %flag = extractvalue {i64, i1} %res, 1 + %retval = select i1 %flag, i64 %lhs, i64 %rhs + ret i64 %retval +; CHECK: ret +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/sibling-call.ll b/test/CodeGen/AArch64/sibling-call.ll new file mode 100644 index 000000000000..a1ec618b03ba --- /dev/null +++ b/test/CodeGen/AArch64/sibling-call.ll @@ -0,0 +1,97 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +declare void @callee_stack0() +declare void @callee_stack8([8 x i32], i64) +declare void @callee_stack16([8 x i32], i64, i64) + +define void @caller_to0_from0() nounwind { +; CHECK: caller_to0_from0: +; CHECK-NEXT: // BB + tail call void @callee_stack0() + ret void +; CHECK-NEXT: b callee_stack0 +} + +define void @caller_to0_from8([8 x i32], i64) nounwind{ +; CHECK: caller_to0_from8: +; CHECK-NEXT: // BB + + tail call void @callee_stack0() + ret void +; CHECK-NEXT: b callee_stack0 +} + +define void @caller_to8_from0() { +; CHECK: caller_to8_from0: + +; Caller isn't going to clean up any extra stack we allocate, so it +; can't be a tail call. + tail call void @callee_stack8([8 x i32] undef, i64 42) + ret void +; CHECK: bl callee_stack8 +} + +define void @caller_to8_from8([8 x i32], i64 %a) { +; CHECK: caller_to8_from8: +; CHECK-NOT: sub sp, sp, + +; This should reuse our stack area for the 42 + tail call void @callee_stack8([8 x i32] undef, i64 42) + ret void +; CHECK: str {{x[0-9]+}}, [sp] +; CHECK-NEXT: b callee_stack8 +} + +define void @caller_to16_from8([8 x i32], i64 %a) { +; CHECK: caller_to16_from8: + +; Shouldn't be a tail call: we can't use SP+8 because our caller might +; have something there. This may sound obvious but implementation does +; some funky aligning. + tail call void @callee_stack16([8 x i32] undef, i64 undef, i64 undef) +; CHECK: bl callee_stack16 + ret void +} + +define void @caller_to8_from24([8 x i32], i64 %a, i64 %b, i64 %c) { +; CHECK: caller_to8_from24: +; CHECK-NOT: sub sp, sp + +; Reuse our area, putting "42" at incoming sp + tail call void @callee_stack8([8 x i32] undef, i64 42) + ret void +; CHECK: str {{x[0-9]+}}, [sp] +; CHECK-NEXT: b callee_stack8 +} + +define void @caller_to16_from16([8 x i32], i64 %a, i64 %b) { +; CHECK: caller_to16_from16: +; CHECK-NOT: sub sp, sp, + +; Here we want to make sure that both loads happen before the stores: +; otherwise either %a or %b will be wrongly clobbered. + tail call void @callee_stack16([8 x i32] undef, i64 %b, i64 %a) + ret void + +; CHECK: ldr x0, +; CHECK: ldr x1, +; CHECK: str x1, +; CHECK: str x0, + +; CHECK-NOT: add sp, sp, +; CHECK: b callee_stack16 +} + +@func = global void(i32)* null + +define void @indirect_tail() { +; CHECK: indirect_tail: +; CHECK-NOT: sub sp, sp + + %fptr = load void(i32)** @func + tail call void %fptr(i32 42) + ret void +; CHECK: movz w0, #42 +; CHECK: ldr [[FPTR:x[1-9]+]], [{{x[0-9]+}}, #:lo12:func] +; CHECK: br [[FPTR]] +}
\ No newline at end of file diff --git a/test/CodeGen/AArch64/sincos-expansion.ll b/test/CodeGen/AArch64/sincos-expansion.ll new file mode 100644 index 000000000000..c7a392b78c24 --- /dev/null +++ b/test/CodeGen/AArch64/sincos-expansion.ll @@ -0,0 +1,35 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s + +define float @test_sincos_f32(float %f) { + %sin = call float @sinf(float %f) readnone + %cos = call float @cosf(float %f) readnone +; CHECK: bl cosf +; CHECK: bl sinf + %val = fadd float %sin, %cos + ret float %val +} + +define double @test_sincos_f64(double %f) { + %sin = call double @sin(double %f) readnone + %cos = call double @cos(double %f) readnone + %val = fadd double %sin, %cos +; CHECK: bl cos +; CHECK: bl sin + ret double %val +} + +define fp128 @test_sincos_f128(fp128 %f) { + %sin = call fp128 @sinl(fp128 %f) readnone + %cos = call fp128 @cosl(fp128 %f) readnone + %val = fadd fp128 %sin, %cos +; CHECK: bl cosl +; CHECK: bl sinl + ret fp128 %val +} + +declare float @sinf(float) readonly +declare double @sin(double) readonly +declare fp128 @sinl(fp128) readonly +declare float @cosf(float) readonly +declare double @cos(double) readonly +declare fp128 @cosl(fp128) readonly
\ No newline at end of file diff --git a/test/CodeGen/AArch64/tail-call.ll b/test/CodeGen/AArch64/tail-call.ll new file mode 100644 index 000000000000..f323b151ad1e --- /dev/null +++ b/test/CodeGen/AArch64/tail-call.ll @@ -0,0 +1,94 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -tailcallopt | FileCheck %s + +declare fastcc void @callee_stack0() +declare fastcc void @callee_stack8([8 x i32], i64) +declare fastcc void @callee_stack16([8 x i32], i64, i64) + +define fastcc void @caller_to0_from0() nounwind { +; CHECK: caller_to0_from0: +; CHECK-NEXT: // BB + tail call fastcc void @callee_stack0() + ret void +; CHECK-NEXT: b callee_stack0 +} + +define fastcc void @caller_to0_from8([8 x i32], i64) { +; CHECK: caller_to0_from8: + + tail call fastcc void @callee_stack0() + ret void +; CHECK: add sp, sp, #16 +; CHECK-NEXT: b callee_stack0 +} + +define fastcc void @caller_to8_from0() { +; CHECK: caller_to8_from0: +; CHECK: sub sp, sp, #32 + +; Key point is that the "42" should go #16 below incoming stack +; pointer (we didn't have arg space to reuse). + tail call fastcc void @callee_stack8([8 x i32] undef, i64 42) + ret void +; CHECK: str {{x[0-9]+}}, [sp, #16] +; CHECK-NEXT: add sp, sp, #16 +; CHECK-NEXT: b callee_stack8 +} + +define fastcc void @caller_to8_from8([8 x i32], i64 %a) { +; CHECK: caller_to8_from8: +; CHECK: sub sp, sp, #16 + +; Key point is that the "%a" should go where at SP on entry. + tail call fastcc void @callee_stack8([8 x i32] undef, i64 42) + ret void +; CHECK: str {{x[0-9]+}}, [sp, #16] +; CHECK-NEXT: add sp, sp, #16 +; CHECK-NEXT: b callee_stack8 +} + +define fastcc void @caller_to16_from8([8 x i32], i64 %a) { +; CHECK: caller_to16_from8: +; CHECK: sub sp, sp, #16 + +; Important point is that the call reuses the "dead" argument space +; above %a on the stack. If it tries to go below incoming-SP then the +; callee will not deallocate the space, even in fastcc. + tail call fastcc void @callee_stack16([8 x i32] undef, i64 42, i64 2) +; CHECK: str {{x[0-9]+}}, [sp, #24] +; CHECK: str {{x[0-9]+}}, [sp, #16] +; CHECK: add sp, sp, #16 +; CHECK: b callee_stack16 + ret void +} + + +define fastcc void @caller_to8_from24([8 x i32], i64 %a, i64 %b, i64 %c) { +; CHECK: caller_to8_from24: +; CHECK: sub sp, sp, #16 + +; Key point is that the "%a" should go where at #16 above SP on entry. + tail call fastcc void @callee_stack8([8 x i32] undef, i64 42) + ret void +; CHECK: str {{x[0-9]+}}, [sp, #32] +; CHECK-NEXT: add sp, sp, #32 +; CHECK-NEXT: b callee_stack8 +} + + +define fastcc void @caller_to16_from16([8 x i32], i64 %a, i64 %b) { +; CHECK: caller_to16_from16: +; CHECK: sub sp, sp, #16 + +; Here we want to make sure that both loads happen before the stores: +; otherwise either %a or %b will be wrongly clobbered. + tail call fastcc void @callee_stack16([8 x i32] undef, i64 %b, i64 %a) + ret void + +; CHECK: ldr x0, +; CHECK: ldr x1, +; CHECK: str x1, +; CHECK: str x0, + +; CHECK: add sp, sp, #16 +; CHECK: b callee_stack16 +} diff --git a/test/CodeGen/AArch64/tls-dynamic-together.ll b/test/CodeGen/AArch64/tls-dynamic-together.ll new file mode 100644 index 000000000000..bad2298c8a65 --- /dev/null +++ b/test/CodeGen/AArch64/tls-dynamic-together.ll @@ -0,0 +1,18 @@ +; RUN: llc -O0 -mtriple=aarch64-none-linux-gnu -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s + +; If the .tlsdesccall and blr parts are emitted completely separately (even with +; glue) then LLVM will separate them quite happily (with a spill at O0, hence +; the option). This is definitely wrong, so we make sure they are emitted +; together. + +@general_dynamic_var = external thread_local global i32 + +define i32 @test_generaldynamic() { +; CHECK: test_generaldynamic: + + %val = load i32* @general_dynamic_var + ret i32 %val + +; CHECK: .tlsdesccall general_dynamic_var +; CHECK-NEXT: blr {{x[0-9]+}} +} diff --git a/test/CodeGen/AArch64/tls-dynamics.ll b/test/CodeGen/AArch64/tls-dynamics.ll new file mode 100644 index 000000000000..cdfd11783c23 --- /dev/null +++ b/test/CodeGen/AArch64/tls-dynamics.ll @@ -0,0 +1,121 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s + +@general_dynamic_var = external thread_local global i32 + +define i32 @test_generaldynamic() { +; CHECK: test_generaldynamic: + + %val = load i32* @general_dynamic_var + ret i32 %val + +; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:general_dynamic_var +; CHECK: add x0, x[[TLSDESC_HI]], #:tlsdesc_lo12:general_dynamic_var +; CHECK: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], #:tlsdesc_lo12:general_dynamic_var] +; CHECK: .tlsdesccall general_dynamic_var +; CHECK-NEXT: blr [[CALLEE]] + +; CHECK: mrs x[[TP:[0-9]+]], tpidr_el0 +; CHECK: ldr w0, [x[[TP]], x0] + +; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE +; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC +; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC +; CHECK-RELOC: R_AARCH64_TLSDESC_CALL + +} + +define i32* @test_generaldynamic_addr() { +; CHECK: test_generaldynamic_addr: + + ret i32* @general_dynamic_var + +; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:general_dynamic_var +; CHECK: add x0, x[[TLSDESC_HI]], #:tlsdesc_lo12:general_dynamic_var +; CHECK: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], #:tlsdesc_lo12:general_dynamic_var] +; CHECK: .tlsdesccall general_dynamic_var +; CHECK-NEXT: blr [[CALLEE]] + +; CHECK: mrs [[TP:x[0-9]+]], tpidr_el0 +; CHECK: add x0, [[TP]], x0 + +; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE +; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC +; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC +; CHECK-RELOC: R_AARCH64_TLSDESC_CALL + +} + +@local_dynamic_var = external thread_local(localdynamic) global i32 + +define i32 @test_localdynamic() { +; CHECK: test_localdynamic: + + %val = load i32* @local_dynamic_var + ret i32 %val + +; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:_TLS_MODULE_BASE_ +; CHECK: add x0, x[[TLSDESC_HI]], #:tlsdesc_lo12:_TLS_MODULE_BASE_ +; CHECK: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], #:tlsdesc_lo12:_TLS_MODULE_BASE_] +; CHECK: .tlsdesccall _TLS_MODULE_BASE_ +; CHECK-NEXT: blr [[CALLEE]] + +; CHECK: movz [[DTP_OFFSET:x[0-9]+]], #:dtprel_g1:local_dynamic_var +; CHECK: movk [[DTP_OFFSET]], #:dtprel_g0_nc:local_dynamic_var + +; CHECK: ldr w0, [x0, [[DTP_OFFSET]]] + +; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE +; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC +; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC +; CHECK-RELOC: R_AARCH64_TLSDESC_CALL + +} + +define i32* @test_localdynamic_addr() { +; CHECK: test_localdynamic_addr: + + ret i32* @local_dynamic_var + +; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:_TLS_MODULE_BASE_ +; CHECK: add x0, x[[TLSDESC_HI]], #:tlsdesc_lo12:_TLS_MODULE_BASE_ +; CHECK: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], #:tlsdesc_lo12:_TLS_MODULE_BASE_] +; CHECK: .tlsdesccall _TLS_MODULE_BASE_ +; CHECK-NEXT: blr [[CALLEE]] + +; CHECK: movz [[DTP_OFFSET:x[0-9]+]], #:dtprel_g1:local_dynamic_var +; CHECK: movk [[DTP_OFFSET]], #:dtprel_g0_nc:local_dynamic_var + +; CHECK: add x0, x0, [[DTP_OFFSET]] + +; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE +; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC +; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC +; CHECK-RELOC: R_AARCH64_TLSDESC_CALL + +} + +; The entire point of the local-dynamic access model is to have a single call to +; the expensive resolver. Make sure we achieve that goal. + +@local_dynamic_var2 = external thread_local(localdynamic) global i32 + +define i32 @test_localdynamic_deduplicate() { +; CHECK: test_localdynamic_deduplicate: + + %val = load i32* @local_dynamic_var + %val2 = load i32* @local_dynamic_var2 + + %sum = add i32 %val, %val2 + ret i32 %sum + +; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:_TLS_MODULE_BASE_ +; CHECK: add x0, x[[TLSDESC_HI]], #:tlsdesc_lo12:_TLS_MODULE_BASE_ +; CHECK: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], #:tlsdesc_lo12:_TLS_MODULE_BASE_] +; CHECK: .tlsdesccall _TLS_MODULE_BASE_ +; CHECK-NEXT: blr [[CALLEE]] + +; CHECK-NOT: _TLS_MODULE_BASE_ + +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/tls-execs.ll b/test/CodeGen/AArch64/tls-execs.ll new file mode 100644 index 000000000000..a66588422793 --- /dev/null +++ b/test/CodeGen/AArch64/tls-execs.ll @@ -0,0 +1,63 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-none-linux-gnu -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s + +@initial_exec_var = external thread_local(initialexec) global i32 + +define i32 @test_initial_exec() { +; CHECK: test_initial_exec: + %val = load i32* @initial_exec_var + +; CHECK: adrp x[[GOTADDR:[0-9]+]], :gottprel:initial_exec_var +; CHECK: ldr x[[TP_OFFSET:[0-9]+]], [x[[GOTADDR]], #:gottprel_lo12:initial_exec_var] +; CHECK: mrs x[[TP:[0-9]+]], tpidr_el0 +; CHECK: ldr w0, [x[[TP]], x[[TP_OFFSET]]] + +; CHECK-RELOC: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 +; CHECK-RELOC: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC + + ret i32 %val +} + +define i32* @test_initial_exec_addr() { +; CHECK: test_initial_exec_addr: + ret i32* @initial_exec_var + +; CHECK: adrp x[[GOTADDR:[0-9]+]], :gottprel:initial_exec_var +; CHECK: ldr [[TP_OFFSET:x[0-9]+]], [x[[GOTADDR]], #:gottprel_lo12:initial_exec_var] +; CHECK: mrs [[TP:x[0-9]+]], tpidr_el0 +; CHECK: add x0, [[TP]], [[TP_OFFSET]] + +; CHECK-RELOC: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 +; CHECK-RELOC: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC + +} + +@local_exec_var = thread_local(initialexec) global i32 0 + +define i32 @test_local_exec() { +; CHECK: test_local_exec: + %val = load i32* @local_exec_var + +; CHECK: movz [[TP_OFFSET:x[0-9]+]], #:tprel_g1:local_exec_var +; CHECK: movk [[TP_OFFSET]], #:tprel_g0_nc:local_exec_var +; CHECK: mrs x[[TP:[0-9]+]], tpidr_el0 +; CHECK: ldr w0, [x[[TP]], [[TP_OFFSET]]] + +; CHECK-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G1 +; CHECK-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC + + ret i32 %val +} + +define i32* @test_local_exec_addr() { +; CHECK: test_local_exec_addr: + ret i32* @local_exec_var + +; CHECK: movz [[TP_OFFSET:x[0-9]+]], #:tprel_g1:local_exec_var +; CHECK: movk [[TP_OFFSET]], #:tprel_g0_nc:local_exec_var +; CHECK: mrs [[TP:x[0-9]+]], tpidr_el0 +; CHECK: add x0, [[TP]], [[TP_OFFSET]] + +; CHECK-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G1 +; CHECK-RELOC: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC +} diff --git a/test/CodeGen/AArch64/tst-br.ll b/test/CodeGen/AArch64/tst-br.ll new file mode 100644 index 000000000000..65c1fda49e2d --- /dev/null +++ b/test/CodeGen/AArch64/tst-br.ll @@ -0,0 +1,48 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +; We've got the usual issues with LLVM reordering blocks here. The +; tests are correct for the current order, but who knows when that +; will change. Beware! +@var32 = global i32 0 +@var64 = global i64 0 + +define i32 @test_tbz() { +; CHECK: test_tbz: + + %val = load i32* @var32 + %val64 = load i64* @var64 + + %tbit0 = and i32 %val, 32768 + %tst0 = icmp ne i32 %tbit0, 0 + br i1 %tst0, label %test1, label %end1 +; CHECK: tbz {{w[0-9]+}}, #15, [[LBL_end1:.LBB0_[0-9]+]] + +test1: + %tbit1 = and i32 %val, 4096 + %tst1 = icmp ne i32 %tbit1, 0 + br i1 %tst1, label %test2, label %end1 +; CHECK: tbz {{w[0-9]+}}, #12, [[LBL_end1]] + +test2: + %tbit2 = and i64 %val64, 32768 + %tst2 = icmp ne i64 %tbit2, 0 + br i1 %tst2, label %test3, label %end1 +; CHECK: tbz {{x[0-9]+}}, #15, [[LBL_end1]] + +test3: + %tbit3 = and i64 %val64, 4096 + %tst3 = icmp ne i64 %tbit3, 0 + br i1 %tst3, label %end2, label %end1 +; CHECK: tbz {{x[0-9]+}}, #12, [[LBL_end1]] + +end2: +; CHECK: movz x0, #1 +; CHECK-NEXT: ret + ret i32 1 + +end1: +; CHECK: [[LBL_end1]]: +; CHECK-NEXT: mov x0, xzr +; CHECK-NEXT: ret + ret i32 0 +} diff --git a/test/CodeGen/AArch64/variadic.ll b/test/CodeGen/AArch64/variadic.ll new file mode 100644 index 000000000000..c5d319eb112b --- /dev/null +++ b/test/CodeGen/AArch64/variadic.ll @@ -0,0 +1,144 @@ +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s + +%va_list = type {i8*, i8*, i8*, i32, i32} + +@var = global %va_list zeroinitializer + +declare void @llvm.va_start(i8*) + +define void @test_simple(i32 %n, ...) { +; CHECK: test_simple: +; CHECK: sub sp, sp, #[[STACKSIZE:[0-9]+]] +; CHECK: mov x[[FPRBASE:[0-9]+]], sp +; CHECK: str q7, [x[[FPRBASE]], #112] +; CHECK: add x[[GPRBASE:[0-9]+]], sp, #[[GPRFROMSP:[0-9]+]] +; CHECK: str x7, [x[[GPRBASE]], #48] + +; Omit the middle ones + +; CHECK: str q0, [sp] +; CHECK: str x1, [sp, #[[GPRFROMSP]]] + + %addr = bitcast %va_list* @var to i8* + call void @llvm.va_start(i8* %addr) +; CHECK: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var +; CHECK: movn [[VR_OFFS:w[0-9]+]], #127 +; CHECK: str [[VR_OFFS]], [x[[VA_LIST]], #28] +; CHECK: movn [[GR_OFFS:w[0-9]+]], #55 +; CHECK: str [[GR_OFFS]], [x[[VA_LIST]], #24] +; CHECK: add [[VR_TOP:x[0-9]+]], x[[FPRBASE]], #128 +; CHECK: str [[VR_TOP]], [x[[VA_LIST]], #16] +; CHECK: add [[GR_TOP:x[0-9]+]], x[[GPRBASE]], #56 +; CHECK: str [[GR_TOP]], [x[[VA_LIST]], #8] +; CHECK: add [[STACK:x[0-9]+]], sp, #[[STACKSIZE]] +; CHECK: str [[STACK]], [{{x[0-9]+}}, #:lo12:var] + + ret void +} + +define void @test_fewargs(i32 %n, i32 %n1, i32 %n2, float %m, ...) { +; CHECK: test_fewargs: +; CHECK: sub sp, sp, #[[STACKSIZE:[0-9]+]] +; CHECK: mov x[[FPRBASE:[0-9]+]], sp +; CHECK: str q7, [x[[FPRBASE]], #96] +; CHECK: add x[[GPRBASE:[0-9]+]], sp, #[[GPRFROMSP:[0-9]+]] +; CHECK: str x7, [x[[GPRBASE]], #32] + +; Omit the middle ones + +; CHECK: str q1, [sp] +; CHECK: str x3, [sp, #[[GPRFROMSP]]] + + %addr = bitcast %va_list* @var to i8* + call void @llvm.va_start(i8* %addr) +; CHECK: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var +; CHECK: movn [[VR_OFFS:w[0-9]+]], #111 +; CHECK: str [[VR_OFFS]], [x[[VA_LIST]], #28] +; CHECK: movn [[GR_OFFS:w[0-9]+]], #39 +; CHECK: str [[GR_OFFS]], [x[[VA_LIST]], #24] +; CHECK: add [[VR_TOP:x[0-9]+]], x[[FPRBASE]], #112 +; CHECK: str [[VR_TOP]], [x[[VA_LIST]], #16] +; CHECK: add [[GR_TOP:x[0-9]+]], x[[GPRBASE]], #40 +; CHECK: str [[GR_TOP]], [x[[VA_LIST]], #8] +; CHECK: add [[STACK:x[0-9]+]], sp, #[[STACKSIZE]] +; CHECK: str [[STACK]], [{{x[0-9]+}}, #:lo12:var] + + ret void +} + +define void @test_nospare([8 x i64], [8 x float], ...) { +; CHECK: test_nospare: + + %addr = bitcast %va_list* @var to i8* + call void @llvm.va_start(i8* %addr) +; CHECK-NOT: sub sp, sp +; CHECK: mov [[STACK:x[0-9]+]], sp +; CHECK: str [[STACK]], [{{x[0-9]+}}, #:lo12:var] + + ret void +} + +; If there are non-variadic arguments on the stack (here two i64s) then the +; __stack field should point just past them. +define void @test_offsetstack([10 x i64], [3 x float], ...) { +; CHECK: test_offsetstack: +; CHECK: sub sp, sp, #80 +; CHECK: mov x[[FPRBASE:[0-9]+]], sp +; CHECK: str q7, [x[[FPRBASE]], #64] + +; CHECK-NOT: str x{{[0-9]+}}, +; Omit the middle ones + +; CHECK: str q3, [sp] + + %addr = bitcast %va_list* @var to i8* + call void @llvm.va_start(i8* %addr) +; CHECK: add x[[VA_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var +; CHECK: movn [[VR_OFFS:w[0-9]+]], #79 +; CHECK: str [[VR_OFFS]], [x[[VA_LIST]], #28] +; CHECK: str wzr, [x[[VA_LIST]], #24] +; CHECK: add [[VR_TOP:x[0-9]+]], x[[FPRBASE]], #80 +; CHECK: str [[VR_TOP]], [x[[VA_LIST]], #16] +; CHECK: add [[STACK:x[0-9]+]], sp, #96 +; CHECK: str [[STACK]], [{{x[0-9]+}}, #:lo12:var] + + ret void +} + +declare void @llvm.va_end(i8*) + +define void @test_va_end() nounwind { +; CHECK: test_va_end: +; CHECK-NEXT: BB#0 + + %addr = bitcast %va_list* @var to i8* + call void @llvm.va_end(i8* %addr) + + ret void +; CHECK-NEXT: ret +} + +declare void @llvm.va_copy(i8* %dest, i8* %src) + +@second_list = global %va_list zeroinitializer + +define void @test_va_copy() { +; CHECK: test_va_copy: + %srcaddr = bitcast %va_list* @var to i8* + %dstaddr = bitcast %va_list* @second_list to i8* + call void @llvm.va_copy(i8* %dstaddr, i8* %srcaddr) + +; Check beginning and end again: + +; CHECK: ldr [[BLOCK:x[0-9]+]], [{{x[0-9]+}}, #:lo12:var] +; CHECK: str [[BLOCK]], [{{x[0-9]+}}, #:lo12:second_list] + +; CHECK: add x[[DEST_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:second_list +; CHECK: add x[[SRC_LIST:[0-9]+]], {{x[0-9]+}}, #:lo12:var + +; CHECK: ldr [[BLOCK:x[0-9]+]], [x[[SRC_LIST]], #24] +; CHECK: str [[BLOCK]], [x[[DEST_LIST]], #24] + + ret void +; CHECK: ret +} diff --git a/test/CodeGen/AArch64/zero-reg.ll b/test/CodeGen/AArch64/zero-reg.ll new file mode 100644 index 000000000000..fef0437ae7f3 --- /dev/null +++ b/test/CodeGen/AArch64/zero-reg.ll @@ -0,0 +1,31 @@ +; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s + +@var32 = global i32 0 +@var64 = global i64 0 + +define void @test_zr() { +; CHECK: test_zr: + + store i32 0, i32* @var32 +; CHECK: str wzr, [{{x[0-9]+}}, #:lo12:var32] + store i64 0, i64* @var64 +; CHECK: str xzr, [{{x[0-9]+}}, #:lo12:var64] + + ret void +; CHECK: ret +} + +define void @test_sp(i32 %val) { +; CHECK: test_sp: + +; Important correctness point here is that LLVM doesn't try to use xzr +; as an addressing register: "str w0, [xzr]" is not a valid A64 +; instruction (0b11111 in the Rn field would mean "sp"). + %addr = getelementptr i32* null, i64 0 + store i32 %val, i32* %addr +; CHECK: mov x[[NULL:[0-9]+]], xzr +; CHECK: str {{w[0-9]+}}, [x[[NULL]]] + + ret void +; CHECK: ret +}
\ No newline at end of file diff --git a/test/CodeGen/ARM/2007-03-13-InstrSched.ll b/test/CodeGen/ARM/2007-03-13-InstrSched.ll index a63cdd46e2d8..4783f3707690 100644 --- a/test/CodeGen/ARM/2007-03-13-InstrSched.ll +++ b/test/CodeGen/ARM/2007-03-13-InstrSched.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=arm-apple-darwin -relocation-model=pic \ ; RUN: -mattr=+v6 | grep r9 ; RUN: llc < %s -mtriple=arm-apple-darwin -relocation-model=pic \ diff --git a/test/CodeGen/ARM/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/ARM/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index 642268992062..000000000000 --- a/test/CodeGen/ARM/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=arm -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/ARM/2010-08-04-StackVariable.ll b/test/CodeGen/ARM/2010-08-04-StackVariable.ll index 6aeaa26cebd1..91a9903f3852 100644 --- a/test/CodeGen/ARM/2010-08-04-StackVariable.ll +++ b/test/CodeGen/ARM/2010-08-04-StackVariable.ll @@ -74,51 +74,54 @@ return: ; preds = %entry declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0, !9, !16, !17, !20} +!llvm.dbg.cu = !{!3} -!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"SVal", metadata !"SVal", metadata !"", metadata !2, i32 11, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 524307, metadata !2, metadata !"SVal", metadata !2, i32 1, i64 128, i64 64, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_structure_type ] -!2 = metadata !{i32 524329, metadata !"small.cc", metadata !"/Users/manav/R8248330", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 4, metadata !"small.cc", metadata !"/Users/manav/R8248330", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] +!0 = metadata !{i32 786478, metadata !1, metadata !"SVal", metadata !"SVal", metadata !"", metadata !2, i32 11, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786451, metadata !2, metadata !"SVal", metadata !2, i32 1, i64 128, i64 64, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_structure_type ] +!2 = metadata !{i32 786473, metadata !48} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 4, metadata !2, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, metadata !47, metadata !47, metadata !46, metadata !47, metadata !""} ; [ DW_TAG_compile_unit ] !4 = metadata !{metadata !5, metadata !7, metadata !0, metadata !9} -!5 = metadata !{i32 524301, metadata !1, metadata !"Data", metadata !2, i32 7, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] -!6 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] -!7 = metadata !{i32 524301, metadata !1, metadata !"Kind", metadata !2, i32 8, i64 32, i64 32, i64 64, i32 0, metadata !8} ; [ DW_TAG_member ] -!8 = metadata !{i32 524324, metadata !2, metadata !"unsigned int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!9 = metadata !{i32 524334, i32 0, metadata !1, metadata !"~SVal", metadata !"~SVal", metadata !"", metadata !2, i32 12, metadata !10, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null} ; [ DW_TAG_subprogram ] -!10 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{i32 786445, metadata !1, metadata !"Data", metadata !2, i32 7, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] +!6 = metadata !{i32 786447, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!7 = metadata !{i32 786445, metadata !1, metadata !"Kind", metadata !2, i32 8, i64 32, i64 32, i64 64, i32 0, metadata !8} ; [ DW_TAG_member ] +!8 = metadata !{i32 786468, metadata !2, metadata !"unsigned int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786478, metadata !1, metadata !"~SVal", metadata !"~SVal", metadata !"", metadata !2, i32 12, metadata !10, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null} ; [ DW_TAG_subprogram ] +!10 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ] !11 = metadata !{null, metadata !12, metadata !13} -!12 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !1} ; [ DW_TAG_pointer_type ] -!13 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!14 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null} ; [ DW_TAG_subroutine_type ] +!12 = metadata !{i32 786447, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !1} ; [ DW_TAG_pointer_type ] +!13 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null} ; [ DW_TAG_subroutine_type ] !15 = metadata !{null, metadata !12} -!16 = metadata !{i32 524334, i32 0, metadata !1, metadata !"SVal", metadata !"SVal", metadata !"_ZN4SValC1Ev", metadata !2, i32 11, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, void (%struct.SVal*)* @_ZN4SValC1Ev} ; [ DW_TAG_subprogram ] -!17 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"_Z3fooi4SVal", metadata !2, i32 16, metadata !18, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32, %struct.SVal*)* @_Z3fooi4SVal} ; [ DW_TAG_subprogram ] -!18 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !19, i32 0, null} ; [ DW_TAG_subroutine_type ] +!16 = metadata !{i32 786478, metadata !1, metadata !"SVal", metadata !"SVal", metadata !"_ZN4SValC1Ev", metadata !2, i32 11, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, void (%struct.SVal*)* @_ZN4SValC1Ev} ; [ DW_TAG_subprogram ] +!17 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"_Z3fooi4SVal", metadata !2, i32 16, metadata !18, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32, %struct.SVal*)* @_Z3fooi4SVal} ; [ DW_TAG_subprogram ] +!18 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !19, i32 0, null} ; [ DW_TAG_subroutine_type ] !19 = metadata !{metadata !13, metadata !13, metadata !1} -!20 = metadata !{i32 524334, i32 0, metadata !2, metadata !"main", metadata !"main", metadata !"main", metadata !2, i32 23, metadata !21, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!21 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !22, i32 0, null} ; [ DW_TAG_subroutine_type ] +!20 = metadata !{i32 786478, metadata !2, metadata !"main", metadata !"main", metadata !"main", metadata !2, i32 23, metadata !21, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] +!21 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !22, i32 0, null} ; [ DW_TAG_subroutine_type ] !22 = metadata !{metadata !13} -!23 = metadata !{i32 524545, metadata !17, metadata !"i", metadata !2, i32 16, metadata !13} ; [ DW_TAG_arg_variable ] +!23 = metadata !{i32 786689, metadata !17, metadata !"i", metadata !2, i32 16, metadata !13, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !24 = metadata !{i32 16, i32 0, metadata !17, null} -!25 = metadata !{i32 524545, metadata !17, metadata !"location", metadata !2, i32 16, metadata !26} ; [ DW_TAG_arg_variable ] -!26 = metadata !{i32 524304, metadata !2, metadata !"SVal", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !1} ; [ DW_TAG_reference_type ] +!25 = metadata !{i32 786689, metadata !17, metadata !"location", metadata !2, i32 16, metadata !26, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!26 = metadata !{i32 786448, metadata !2, metadata !"SVal", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !1} ; [ DW_TAG_reference_type ] !27 = metadata !{i32 17, i32 0, metadata !28, null} -!28 = metadata !{i32 524299, metadata !17, i32 16, i32 0, metadata !2, i32 2} ; [ DW_TAG_lexical_block ] +!28 = metadata !{i32 786443, metadata !2, metadata !17, i32 16, i32 0, i32 2} ; [ DW_TAG_lexical_block ] !29 = metadata !{i32 18, i32 0, metadata !28, null} !30 = metadata !{i32 20, i32 0, metadata !28, null} -!31 = metadata !{i32 524545, metadata !16, metadata !"this", metadata !2, i32 11, metadata !32} ; [ DW_TAG_arg_variable ] -!32 = metadata !{i32 524326, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !33} ; [ DW_TAG_const_type ] -!33 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !1} ; [ DW_TAG_pointer_type ] +!31 = metadata !{i32 786689, metadata !16, metadata !"this", metadata !2, i32 11, metadata !32, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!32 = metadata !{i32 786470, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !33} ; [ DW_TAG_const_type ] +!33 = metadata !{i32 786447, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !1} ; [ DW_TAG_pointer_type ] !34 = metadata !{i32 11, i32 0, metadata !16, null} !35 = metadata !{i32 11, i32 0, metadata !36, null} -!36 = metadata !{i32 524299, metadata !37, i32 11, i32 0, metadata !2, i32 1} ; [ DW_TAG_lexical_block ] -!37 = metadata !{i32 524299, metadata !16, i32 11, i32 0, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] -!38 = metadata !{i32 524544, metadata !39, metadata !"v", metadata !2, i32 24, metadata !1} ; [ DW_TAG_auto_variable ] -!39 = metadata !{i32 524299, metadata !40, i32 23, i32 0, metadata !2, i32 4} ; [ DW_TAG_lexical_block ] -!40 = metadata !{i32 524299, metadata !20, i32 23, i32 0, metadata !2, i32 3} ; [ DW_TAG_lexical_block ] +!36 = metadata !{i32 786443, metadata !2, metadata !37, i32 11, i32 0, i32 1} ; [ DW_TAG_lexical_block ] +!37 = metadata !{i32 786443, metadata !2, metadata !16, i32 11, i32 0, i32 0} ; [ DW_TAG_lexical_block ] +!38 = metadata !{i32 786688, metadata !39, metadata !"v", metadata !2, i32 24, metadata !1, i32 0, i32 0} ; [ DW_TAG_auto_variable ] +!39 = metadata !{i32 786443, metadata !2, metadata !40, i32 23, i32 0, i32 4} ; [ DW_TAG_lexical_block ] +!40 = metadata !{i32 786443, metadata !2, metadata !20, i32 23, i32 0, i32 3} ; [ DW_TAG_lexical_block ] !41 = metadata !{i32 24, i32 0, metadata !39, null} !42 = metadata !{i32 25, i32 0, metadata !39, null} !43 = metadata !{i32 26, i32 0, metadata !39, null} -!44 = metadata !{i32 524544, metadata !39, metadata !"k", metadata !2, i32 26, metadata !13} ; [ DW_TAG_auto_variable ] +!44 = metadata !{i32 786688, metadata !39, metadata !"k", metadata !2, i32 26, metadata !13, i32 0, i32 0} ; [ DW_TAG_auto_variable ] !45 = metadata !{i32 27, i32 0, metadata !39, null} +!46 = metadata !{metadata !0, metadata !9, metadata !16, metadata !17, metadata !20} +!47 = metadata !{i32 0} +!48 = metadata !{metadata !"small.cc", metadata !"/Users/manav/R8248330"} diff --git a/test/CodeGen/ARM/2010-11-30-reloc-movt.ll b/test/CodeGen/ARM/2010-11-30-reloc-movt.ll index 8b164c5d91f8..94a05412f5d4 100644 --- a/test/CodeGen/ARM/2010-11-30-reloc-movt.ll +++ b/test/CodeGen/ARM/2010-11-30-reloc-movt.ll @@ -23,7 +23,7 @@ entry: ; OBJ: Relocation 0 ; OBJ-NEXT: 'r_offset', 0x00000004 -; OBJ-NEXT: 'r_sym', 0x000007 +; OBJ-NEXT: 'r_sym', 0x000009 ; OBJ-NEXT: 'r_type', 0x2b ; OBJ: Relocation 1 @@ -33,7 +33,7 @@ entry: ; OBJ: # Relocation 2 ; OBJ-NEXT: 'r_offset', 0x0000000c -; OBJ-NEXT: 'r_sym', 0x000008 +; OBJ-NEXT: 'r_sym', 0x00000a ; OBJ-NEXT: 'r_type', 0x1c } diff --git a/test/CodeGen/ARM/2010-12-15-elf-lcomm.ll b/test/CodeGen/ARM/2010-12-15-elf-lcomm.ll index 5cfbb4f944f7..1272a257931d 100644 --- a/test/CodeGen/ARM/2010-12-15-elf-lcomm.ll +++ b/test/CodeGen/ARM/2010-12-15-elf-lcomm.ll @@ -10,7 +10,8 @@ @STRIDE = internal global i32 8 ; ASM: .type array00,%object @ @array00 -; ASM-NEXT: .lcomm array00,80 +; ASM-NEXT: .local array00 +; ASM-NEXT: .comm array00,80,1 ; ASM-NEXT: .type _MergedGlobals,%object @ @_MergedGlobals diff --git a/test/CodeGen/ARM/2011-01-19-MergedGlobalDbg.ll b/test/CodeGen/ARM/2011-01-19-MergedGlobalDbg.ll index ca88eedcea60..1d1b89a34f9a 100644 --- a/test/CodeGen/ARM/2011-01-19-MergedGlobalDbg.ll +++ b/test/CodeGen/ARM/2011-01-19-MergedGlobalDbg.ll @@ -75,44 +75,38 @@ entry: ret i8 %0, !dbg !39 } -!llvm.dbg.sp = !{!0, !6, !7, !8, !9} -!llvm.dbg.lv.get1 = !{!10, !11} -!llvm.dbg.gv = !{!13, !14, !15, !16, !17} -!llvm.dbg.lv.get2 = !{!18, !19} -!llvm.dbg.lv.get3 = !{!21, !22} -!llvm.dbg.lv.get4 = !{!24, !25} -!llvm.dbg.lv.get5 = !{!27, !28} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"get1", metadata !"get1", metadata !"get1", metadata !1, i32 4, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get1} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"foo.c", metadata !"/tmp/", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 1, metadata !"foo.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2369.8)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"get1", metadata !"get1", metadata !"get1", metadata !1, i32 4, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get1, null, null, metadata !42, i32 4} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !47} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !47, i32 1, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2369.8)", i1 true, metadata !"", i32 0, null, null, metadata !40, metadata !41, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !1, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] !4 = metadata !{metadata !5, metadata !5} -!5 = metadata !{i32 589860, metadata !1, metadata !"_Bool", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589870, i32 0, metadata !1, metadata !"get2", metadata !"get2", metadata !"get2", metadata !1, i32 7, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get2} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 589870, i32 0, metadata !1, metadata !"get3", metadata !"get3", metadata !"get3", metadata !1, i32 10, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get3} ; [ DW_TAG_subprogram ] -!8 = metadata !{i32 589870, i32 0, metadata !1, metadata !"get4", metadata !"get4", metadata !"get4", metadata !1, i32 13, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get4} ; [ DW_TAG_subprogram ] -!9 = metadata !{i32 589870, i32 0, metadata !1, metadata !"get5", metadata !"get5", metadata !"get5", metadata !1, i32 16, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get5} ; [ DW_TAG_subprogram ] -!10 = metadata !{i32 590081, metadata !0, metadata !"a", metadata !1, i32 4, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!11 = metadata !{i32 590080, metadata !12, metadata !"b", metadata !1, i32 4, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!12 = metadata !{i32 589835, metadata !0, i32 4, i32 0, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!13 = metadata !{i32 589876, i32 0, metadata !1, metadata !"x1", metadata !"x1", metadata !"", metadata !1, i32 3, metadata !5, i1 true, i1 true, i8* @x1} ; [ DW_TAG_variable ] -!14 = metadata !{i32 589876, i32 0, metadata !1, metadata !"x2", metadata !"x2", metadata !"", metadata !1, i32 6, metadata !5, i1 true, i1 true, i8* @x2} ; [ DW_TAG_variable ] -!15 = metadata !{i32 589876, i32 0, metadata !1, metadata !"x3", metadata !"x3", metadata !"", metadata !1, i32 9, metadata !5, i1 true, i1 true, i8* @x3} ; [ DW_TAG_variable ] -!16 = metadata !{i32 589876, i32 0, metadata !1, metadata !"x4", metadata !"x4", metadata !"", metadata !1, i32 12, metadata !5, i1 true, i1 true, i8* @x4} ; [ DW_TAG_variable ] -!17 = metadata !{i32 589876, i32 0, metadata !1, metadata !"x5", metadata !"x5", metadata !"", metadata !1, i32 15, metadata !5, i1 false, i1 true, i8* @x5} ; [ DW_TAG_variable ] -!18 = metadata !{i32 590081, metadata !6, metadata !"a", metadata !1, i32 7, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 590080, metadata !20, metadata !"b", metadata !1, i32 7, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!20 = metadata !{i32 589835, metadata !6, i32 7, i32 0, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] -!21 = metadata !{i32 590081, metadata !7, metadata !"a", metadata !1, i32 10, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!22 = metadata !{i32 590080, metadata !23, metadata !"b", metadata !1, i32 10, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!23 = metadata !{i32 589835, metadata !7, i32 10, i32 0, metadata !1, i32 2} ; [ DW_TAG_lexical_block ] -!24 = metadata !{i32 590081, metadata !8, metadata !"a", metadata !1, i32 13, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!25 = metadata !{i32 590080, metadata !26, metadata !"b", metadata !1, i32 13, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!26 = metadata !{i32 589835, metadata !8, i32 13, i32 0, metadata !1, i32 3} ; [ DW_TAG_lexical_block ] -!27 = metadata !{i32 590081, metadata !9, metadata !"a", metadata !1, i32 16, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!28 = metadata !{i32 590080, metadata !29, metadata !"b", metadata !1, i32 16, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!29 = metadata !{i32 589835, metadata !9, i32 16, i32 0, metadata !1, i32 4} ; [ DW_TAG_lexical_block ] +!5 = metadata !{i32 786468, metadata !1, metadata !1, metadata !"_Bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !1, metadata !"get2", metadata !"get2", metadata !"get2", metadata !1, i32 7, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get2, null, null, metadata !43, i32 7} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786478, metadata !1, metadata !"get3", metadata !"get3", metadata !"get3", metadata !1, i32 10, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get3, null, null, metadata !44, i32 10} ; [ DW_TAG_subprogram ] +!8 = metadata !{i32 786478, metadata !1, metadata !"get4", metadata !"get4", metadata !"get4", metadata !1, i32 13, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get4, null, null, metadata !45, i32 13} ; [ DW_TAG_subprogram ] +!9 = metadata !{i32 786478, metadata !1, metadata !"get5", metadata !"get5", metadata !"get5", metadata !1, i32 16, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i8 (i8)* @get5, null, null, metadata !46, i32 16} ; [ DW_TAG_subprogram ] +!10 = metadata !{i32 786689, metadata !0, metadata !"a", metadata !1, i32 4, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!11 = metadata !{i32 786688, metadata !12, metadata !"b", metadata !1, i32 4, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!12 = metadata !{i32 786443, metadata !0, i32 4, i32 0, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!13 = metadata !{i32 786484, i32 0, metadata !1, metadata !"x1", metadata !"x1", metadata !"", metadata !1, i32 3, metadata !5, i1 true, i1 true, i8* @x1, null} ; [ DW_TAG_variable ] +!14 = metadata !{i32 786484, i32 0, metadata !1, metadata !"x2", metadata !"x2", metadata !"", metadata !1, i32 6, metadata !5, i1 true, i1 true, i8* @x2, null} ; [ DW_TAG_variable ] +!15 = metadata !{i32 786484, i32 0, metadata !1, metadata !"x3", metadata !"x3", metadata !"", metadata !1, i32 9, metadata !5, i1 true, i1 true, i8* @x3, null} ; [ DW_TAG_variable ] +!16 = metadata !{i32 786484, i32 0, metadata !1, metadata !"x4", metadata !"x4", metadata !"", metadata !1, i32 12, metadata !5, i1 true, i1 true, i8* @x4, null} ; [ DW_TAG_variable ] +!17 = metadata !{i32 786484, i32 0, metadata !1, metadata !"x5", metadata !"x5", metadata !"", metadata !1, i32 15, metadata !5, i1 false, i1 true, i8* @x5, null} ; [ DW_TAG_variable ] +!18 = metadata !{i32 786689, metadata !6, metadata !"a", metadata !1, i32 7, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786688, metadata !20, metadata !"b", metadata !1, i32 7, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!20 = metadata !{i32 786443, metadata !6, i32 7, i32 0, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] +!21 = metadata !{i32 786689, metadata !7, metadata !"a", metadata !1, i32 10, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!22 = metadata !{i32 786688, metadata !23, metadata !"b", metadata !1, i32 10, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!23 = metadata !{i32 786443, metadata !7, i32 10, i32 0, metadata !1, i32 2} ; [ DW_TAG_lexical_block ] +!24 = metadata !{i32 786689, metadata !8, metadata !"a", metadata !1, i32 13, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!25 = metadata !{i32 786688, metadata !26, metadata !"b", metadata !1, i32 13, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!26 = metadata !{i32 786443, metadata !8, i32 13, i32 0, metadata !1, i32 3} ; [ DW_TAG_lexical_block ] +!27 = metadata !{i32 786689, metadata !9, metadata !"a", metadata !1, i32 16, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!28 = metadata !{i32 786688, metadata !29, metadata !"b", metadata !1, i32 16, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!29 = metadata !{i32 786443, metadata !9, i32 16, i32 0, metadata !1, i32 4} ; [ DW_TAG_lexical_block ] !30 = metadata !{i32 4, i32 0, metadata !0, null} !31 = metadata !{i32 4, i32 0, metadata !12, null} !32 = metadata !{i32 7, i32 0, metadata !6, null} @@ -123,3 +117,11 @@ entry: !37 = metadata !{i32 13, i32 0, metadata !26, null} !38 = metadata !{i32 16, i32 0, metadata !9, null} !39 = metadata !{i32 16, i32 0, metadata !29, null} +!40 = metadata !{metadata !0, metadata !6, metadata !7, metadata !8, metadata !9} +!41 = metadata !{metadata !13, metadata !14, metadata !15, metadata !16, metadata !17} +!42 = metadata !{metadata !10, metadata !11} +!43 = metadata !{metadata !18, metadata !19} +!44 = metadata !{metadata !21, metadata !22} +!45 = metadata !{metadata !24, metadata !25} +!46 = metadata !{metadata !27, metadata !28} +!47 = metadata !{metadata !"foo.c", metadata !"/tmp/"} diff --git a/test/CodeGen/ARM/2011-08-02-MergedGlobalDbg.ll b/test/CodeGen/ARM/2011-08-02-MergedGlobalDbg.ll index f2b0c5d7d090..266609b8ce69 100644 --- a/test/CodeGen/ARM/2011-08-02-MergedGlobalDbg.ll +++ b/test/CodeGen/ARM/2011-08-02-MergedGlobalDbg.ll @@ -8,7 +8,7 @@ ; DW_OP_constu ; offset -;CHECK: .long Lset33 +;CHECK: .long Lset8 ;CHECK-NEXT: @ DW_AT_type ;CHECK-NEXT: @ DW_AT_decl_file ;CHECK-NEXT: @ DW_AT_decl_line @@ -73,44 +73,37 @@ define i32 @get5(i32 %a) nounwind optsize ssp { declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!llvm.dbg.sp = !{!1, !6, !7, !8, !9} -!llvm.dbg.lv.get1 = !{!10, !11} -!llvm.dbg.lv.get2 = !{!13, !14} -!llvm.dbg.lv.get3 = !{!16, !17} -!llvm.dbg.lv.get4 = !{!19, !20} -!llvm.dbg.gv = !{!22, !23, !24, !25, !26} -!llvm.dbg.lv.get5 = !{!27, !28} -!0 = metadata !{i32 589841, i32 0, i32 12, metadata !"ss3.c", metadata !"/private/tmp", metadata !"clang", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"get1", metadata !"get1", metadata !"", metadata !2, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get1, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"ss3.c", metadata !"/private/tmp", metadata !0} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589845, 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 ] +!0 = metadata !{i32 786449, metadata !47, i32 12, metadata !"clang", i1 true, metadata !"", i32 0, null, null, metadata !40, metadata !41, null} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786478, metadata !2, metadata !"get1", metadata !"get1", metadata !"", metadata !2, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get1, null, null, metadata !42, i32 5} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !47} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786453, metadata !2, metadata !2, metadata !"", 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 589860, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589870, i32 0, metadata !2, metadata !"get2", metadata !"get2", metadata !"", metadata !2, i32 8, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get2, null, null} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 589870, i32 0, metadata !2, metadata !"get3", metadata !"get3", metadata !"", metadata !2, i32 11, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get3, null, null} ; [ DW_TAG_subprogram ] -!8 = metadata !{i32 589870, i32 0, metadata !2, metadata !"get4", metadata !"get4", metadata !"", metadata !2, i32 14, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get4, null, null} ; [ DW_TAG_subprogram ] -!9 = metadata !{i32 589870, i32 0, metadata !2, metadata !"get5", metadata !"get5", metadata !"", metadata !2, i32 17, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get5, null, null} ; [ DW_TAG_subprogram ] -!10 = metadata !{i32 590081, metadata !1, metadata !"a", metadata !2, i32 16777221, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!11 = metadata !{i32 590080, metadata !12, metadata !"b", metadata !2, i32 5, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!12 = metadata !{i32 589835, metadata !1, i32 5, i32 19, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] -!13 = metadata !{i32 590081, metadata !6, metadata !"a", metadata !2, i32 16777224, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!14 = metadata !{i32 590080, metadata !15, metadata !"b", metadata !2, i32 8, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!15 = metadata !{i32 589835, metadata !6, i32 8, i32 17, metadata !2, i32 1} ; [ DW_TAG_lexical_block ] -!16 = metadata !{i32 590081, metadata !7, metadata !"a", metadata !2, i32 16777227, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!17 = metadata !{i32 590080, metadata !18, metadata !"b", metadata !2, i32 11, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!18 = metadata !{i32 589835, metadata !7, i32 11, i32 19, metadata !2, i32 2} ; [ DW_TAG_lexical_block ] -!19 = metadata !{i32 590081, metadata !8, metadata !"a", metadata !2, i32 16777230, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!20 = metadata !{i32 590080, metadata !21, metadata !"b", metadata !2, i32 14, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!21 = metadata !{i32 589835, metadata !8, i32 14, i32 19, metadata !2, i32 3} ; [ DW_TAG_lexical_block ] -!22 = metadata !{i32 589876, i32 0, metadata !0, metadata !"x5", metadata !"x5", metadata !"", metadata !2, i32 16, metadata !5, i32 0, i32 1, i32* @x5} ; [ DW_TAG_variable ] -!23 = metadata !{i32 589876, i32 0, metadata !0, metadata !"x4", metadata !"x4", metadata !"", metadata !2, i32 13, metadata !5, i32 1, i32 1, i32* @x4} ; [ DW_TAG_variable ] -!24 = metadata !{i32 589876, i32 0, metadata !0, metadata !"x3", metadata !"x3", metadata !"", metadata !2, i32 10, metadata !5, i32 1, i32 1, i32* @x3} ; [ DW_TAG_variable ] -!25 = metadata !{i32 589876, i32 0, metadata !0, metadata !"x2", metadata !"x2", metadata !"", metadata !2, i32 7, metadata !5, i32 1, i32 1, i32* @x2} ; [ DW_TAG_variable ] -!26 = metadata !{i32 589876, i32 0, metadata !0, metadata !"x1", metadata !"x1", metadata !"", metadata !2, i32 4, metadata !5, i32 1, i32 1, i32* @x1} ; [ DW_TAG_variable ] -!27 = metadata !{i32 590081, metadata !9, metadata !"a", metadata !2, i32 16777233, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!28 = metadata !{i32 590080, metadata !29, metadata !"b", metadata !2, i32 17, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!29 = metadata !{i32 589835, metadata !9, i32 17, i32 19, metadata !2, i32 4} ; [ DW_TAG_lexical_block ] +!5 = metadata !{i32 786468, null, metadata !0, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !2, metadata !"get2", metadata !"get2", metadata !"", metadata !2, i32 8, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get2, null, null, metadata !43, i32 8} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786478, metadata !2, metadata !"get3", metadata !"get3", metadata !"", metadata !2, i32 11, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get3, null, null, metadata !44, i32 11} ; [ DW_TAG_subprogram ] +!8 = metadata !{i32 786478, metadata !2, metadata !"get4", metadata !"get4", metadata !"", metadata !2, i32 14, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get4, null, null, metadata !45, i32 14} ; [ DW_TAG_subprogram ] +!9 = metadata !{i32 786478, metadata !2, metadata !"get5", metadata !"get5", metadata !"", metadata !2, i32 17, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @get5, null, null, metadata !46, i32 17} ; [ DW_TAG_subprogram ] +!10 = metadata !{i32 786689, metadata !1, metadata !"a", metadata !2, i32 16777221, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!11 = metadata !{i32 786688, metadata !12, metadata !"b", metadata !2, i32 5, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!12 = metadata !{i32 786443, metadata !1, i32 5, i32 19, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] +!13 = metadata !{i32 786689, metadata !6, metadata !"a", metadata !2, i32 16777224, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!14 = metadata !{i32 786688, metadata !15, metadata !"b", metadata !2, i32 8, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!15 = metadata !{i32 786443, metadata !6, i32 8, i32 17, metadata !2, i32 1} ; [ DW_TAG_lexical_block ] +!16 = metadata !{i32 786689, metadata !7, metadata !"a", metadata !2, i32 16777227, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!17 = metadata !{i32 786688, metadata !18, metadata !"b", metadata !2, i32 11, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!18 = metadata !{i32 786443, metadata !7, i32 11, i32 19, metadata !2, i32 2} ; [ DW_TAG_lexical_block ] +!19 = metadata !{i32 786689, metadata !8, metadata !"a", metadata !2, i32 16777230, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!20 = metadata !{i32 786688, metadata !21, metadata !"b", metadata !2, i32 14, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!21 = metadata !{i32 786443, metadata !8, i32 14, i32 19, metadata !2, i32 3} ; [ DW_TAG_lexical_block ] +!22 = metadata !{i32 786484, i32 0, metadata !0, metadata !"x5", metadata !"x5", metadata !"", metadata !2, i32 16, metadata !5, i32 0, i32 1, i32* @x5, null} ; [ DW_TAG_variable ] +!23 = metadata !{i32 786484, i32 0, metadata !0, metadata !"x4", metadata !"x4", metadata !"", metadata !2, i32 13, metadata !5, i32 1, i32 1, i32* @x4, null} ; [ DW_TAG_variable ] +!24 = metadata !{i32 786484, i32 0, metadata !0, metadata !"x3", metadata !"x3", metadata !"", metadata !2, i32 10, metadata !5, i32 1, i32 1, i32* @x3, null} ; [ DW_TAG_variable ] +!25 = metadata !{i32 786484, i32 0, metadata !0, metadata !"x2", metadata !"x2", metadata !"", metadata !2, i32 7, metadata !5, i32 1, i32 1, i32* @x2, null} ; [ DW_TAG_variable ] +!26 = metadata !{i32 786484, i32 0, metadata !0, metadata !"x1", metadata !"x1", metadata !"", metadata !2, i32 4, metadata !5, i32 1, i32 1, i32* @x1, null} ; [ DW_TAG_variable ] +!27 = metadata !{i32 786689, metadata !9, metadata !"a", metadata !2, i32 16777233, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!28 = metadata !{i32 786688, metadata !29, metadata !"b", metadata !2, i32 17, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!29 = metadata !{i32 786443, metadata !9, i32 17, i32 19, metadata !2, i32 4} ; [ DW_TAG_lexical_block ] !30 = metadata !{i32 5, i32 16, metadata !1, null} !31 = metadata !{i32 5, i32 32, metadata !12, null} !32 = metadata !{i32 8, i32 14, metadata !6, null} @@ -121,3 +114,11 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !37 = metadata !{i32 14, i32 32, metadata !21, null} !38 = metadata !{i32 17, i32 16, metadata !9, null} !39 = metadata !{i32 17, i32 32, metadata !29, null} +!40 = metadata !{metadata !1, metadata !6, metadata !7, metadata !8, metadata !9} +!41 = metadata !{metadata !22, metadata !23, metadata !24, metadata !25, metadata !26} +!42 = metadata !{metadata !10, metadata !11} +!43 = metadata !{metadata !13, metadata !14} +!44 = metadata !{metadata !16, metadata !17} +!45 = metadata !{metadata !19, metadata !20} +!46 = metadata !{metadata !27, metadata !28} +!47 = metadata !{metadata !"ss3.c", metadata !"/private/tmp"} diff --git a/test/CodeGen/ARM/2011-10-26-memset-with-neon.ll b/test/CodeGen/ARM/2011-10-26-memset-with-neon.ll index 6e0ef9619657..f563eeef0180 100644 --- a/test/CodeGen/ARM/2011-10-26-memset-with-neon.ll +++ b/test/CodeGen/ARM/2011-10-26-memset-with-neon.ll @@ -1,13 +1,5 @@ ; RUN: llc -march=arm -mcpu=cortex-a8 < %s | FileCheck %s -; Should trigger a NEON store. -; CHECK: vstr -define void @f_0_12(i8* nocapture %c) nounwind optsize { -entry: - call void @llvm.memset.p0i8.i64(i8* %c, i8 0, i64 12, i32 8, i1 false) - ret void -} - ; Trigger multiple NEON stores. ; CHECK: vst1.64 ; CHECK-NEXT: vst1.64 diff --git a/test/CodeGen/ARM/2011-11-29-128bitArithmetics.ll b/test/CodeGen/ARM/2011-11-29-128bitArithmetics.ll index f9ede7401a3c..0d0d03b23e86 100644 --- a/test/CodeGen/ARM/2011-11-29-128bitArithmetics.ll +++ b/test/CodeGen/ARM/2011-11-29-128bitArithmetics.ll @@ -8,7 +8,7 @@ define void @test_sqrt(<4 x float>* %X) nounwind { ; CHECK: movw r1, :lower16:{{.*}} ; CHECK: movt r1, :upper16:{{.*}} -; CHECK: vld1.64 {{.*}}, [r1, :128] +; CHECK: vld1.64 {{.*}}, [r1:128] ; CHECK: vsqrt.f32 {{s[0-9]+}}, {{s[0-9]+}} ; CHECK: vsqrt.f32 {{s[0-9]+}}, {{s[0-9]+}} ; CHECK: vsqrt.f32 {{s[0-9]+}}, {{s[0-9]+}} @@ -252,7 +252,7 @@ define void @test_powi(<4 x float>* %X) nounwind { ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}} ; CHECK: movt [[reg0]], :upper16:{{.*}} -; CHECK: vld1.64 {{.*}}, :128 +; CHECK: vld1.64 {{.*}}:128 ; CHECK: vmul.f32 {{.*}} ; CHECK: vst1.64 diff --git a/test/CodeGen/ARM/2011-12-14-machine-sink.ll b/test/CodeGen/ARM/2011-12-14-machine-sink.ll index b21bb006e327..1b21f7571d8e 100644 --- a/test/CodeGen/ARM/2011-12-14-machine-sink.ll +++ b/test/CodeGen/ARM/2011-12-14-machine-sink.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -o /dev/null -stats 2>&1 | FileCheck %s -check-prefix=STATS ; Radar 10266272 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" diff --git a/test/CodeGen/ARM/2012-06-12-SchedMemLatency.ll b/test/CodeGen/ARM/2012-06-12-SchedMemLatency.ll index b05ec6367ee4..ca0964a05933 100644 --- a/test/CodeGen/ARM/2012-06-12-SchedMemLatency.ll +++ b/test/CodeGen/ARM/2012-06-12-SchedMemLatency.ll @@ -13,6 +13,7 @@ ; CHECK-NOT: ch SU ; CHECK: ch SU(2): Latency=1 ; CHECK-NOT: ch SU +; CHECK: Successors: ; CHECK: ** List Scheduling ; CHECK: SU(2){{.*}}STR{{.*}} ; CHECK-NOT: ch SU @@ -22,6 +23,7 @@ ; CHECK-NOT: ch SU ; CHECK: ch SU(2): Latency=1 ; CHECK-NOT: ch SU +; CHECK: Successors: define i32 @f1(i32* nocapture %p1, i32* nocapture %p2) nounwind { entry: store volatile i32 65540, i32* %p1, align 4, !tbaa !0 diff --git a/test/CodeGen/ARM/2012-08-09-neon-extload.ll b/test/CodeGen/ARM/2012-08-09-neon-extload.ll index b55f1cae7fe6..764c58f2e159 100644 --- a/test/CodeGen/ARM/2012-08-09-neon-extload.ll +++ b/test/CodeGen/ARM/2012-08-09-neon-extload.ll @@ -18,7 +18,7 @@ define void @test_v2i8tov2i32() { %i32val = sext <2 x i8> %i8val to <2 x i32> store <2 x i32> %i32val, <2 x i32>* @var_v2i32 -; CHECK: vld1.16 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}, :16] +; CHECK: vld1.16 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}:16] ; CHECK: vmovl.s8 {{q[0-9]+}}, d[[LOAD]] ; CHECK: vmovl.s16 {{q[0-9]+}}, {{d[0-9]+}} @@ -32,7 +32,7 @@ define void @test_v2i8tov2i64() { %i64val = sext <2 x i8> %i8val to <2 x i64> store <2 x i64> %i64val, <2 x i64>* @var_v2i64 -; CHECK: vld1.16 {d{{[0-9]+}}[0]}, [{{r[0-9]+}}, :16] +; CHECK: vld1.16 {d{{[0-9]+}}[0]}, [{{r[0-9]+}}:16] ; CHECK: vmovl.s8 {{q[0-9]+}}, d[[LOAD]] ; CHECK: vmovl.s16 {{q[0-9]+}}, {{d[0-9]+}} ; CHECK: vmovl.s32 {{q[0-9]+}}, {{d[0-9]+}} @@ -50,7 +50,7 @@ define void @test_v4i8tov4i16() { %i16val = sext <4 x i8> %i8val to <4 x i16> store <4 x i16> %i16val, <4 x i16>* @var_v4i16 -; CHECK: vld1.32 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}, :32] +; CHECK: vld1.32 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}:32] ; CHECK: vmovl.s8 {{q[0-9]+}}, d[[LOAD]] ; CHECK-NOT: vmovl.s16 @@ -65,7 +65,7 @@ define void @test_v4i8tov4i32() { %i16val = sext <4 x i8> %i8val to <4 x i32> store <4 x i32> %i16val, <4 x i32>* @var_v4i32 -; CHECK: vld1.32 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}, :32] +; CHECK: vld1.32 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}:32] ; CHECK: vmovl.s8 {{q[0-9]+}}, d[[LOAD]] ; CHECK: vmovl.s16 {{q[0-9]+}}, {{d[0-9]+}} @@ -79,7 +79,7 @@ define void @test_v2i16tov2i32() { %i32val = sext <2 x i16> %i16val to <2 x i32> store <2 x i32> %i32val, <2 x i32>* @var_v2i32 -; CHECK: vld1.32 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}, :32] +; CHECK: vld1.32 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}:32] ; CHECK: vmovl.s16 {{q[0-9]+}}, d[[LOAD]] ; CHECK-NOT: vmovl @@ -94,7 +94,7 @@ define void @test_v2i16tov2i64() { %i64val = sext <2 x i16> %i16val to <2 x i64> store <2 x i64> %i64val, <2 x i64>* @var_v2i64 -; CHECK: vld1.32 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}, :32] +; CHECK: vld1.32 {d[[LOAD:[0-9]+]][0]}, [{{r[0-9]+}}:32] ; CHECK: vmovl.s16 {{q[0-9]+}}, d[[LOAD]] ; CHECK: vmovl.s32 {{q[0-9]+}}, d[[LOAD]] diff --git a/test/CodeGen/ARM/2012-08-23-legalize-vmull.ll b/test/CodeGen/ARM/2012-08-23-legalize-vmull.ll new file mode 100644 index 000000000000..2f55204aa407 --- /dev/null +++ b/test/CodeGen/ARM/2012-08-23-legalize-vmull.ll @@ -0,0 +1,150 @@ +; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s + +; PR12281 +; Test generataion of code for vmull instruction when multiplying 128-bit +; vectors that were created by sign-extending smaller vector sizes. +; +; The vmull operation requires 64-bit vectors, so we must extend the original +; vector size to 64 bits for vmull operation. +; Previously failed with an assertion because the <4 x i8> vector was too small +; for vmull. + +; Vector x Constant +; v4i8 +; +define void @sextload_v4i8_c(<4 x i8>* %v) nounwind { +;CHECK: sextload_v4i8_c: +entry: + %0 = load <4 x i8>* %v, align 8 + %v0 = sext <4 x i8> %0 to <4 x i32> +;CHECK: vmull + %v1 = mul <4 x i32> %v0, <i32 3, i32 3, i32 3, i32 3> + store <4 x i32> %v1, <4 x i32>* undef, align 8 + ret void; +} + +; v2i8 +; +define void @sextload_v2i8_c(<2 x i8>* %v) nounwind { +;CHECK: sextload_v2i8_c: +entry: + %0 = load <2 x i8>* %v, align 8 + %v0 = sext <2 x i8> %0 to <2 x i64> +;CHECK: vmull + %v1 = mul <2 x i64> %v0, <i64 3, i64 3> + store <2 x i64> %v1, <2 x i64>* undef, align 8 + ret void; +} + +; v2i16 +; +define void @sextload_v2i16_c(<2 x i16>* %v) nounwind { +;CHECK: sextload_v2i16_c: +entry: + %0 = load <2 x i16>* %v, align 8 + %v0 = sext <2 x i16> %0 to <2 x i64> +;CHECK: vmull + %v1 = mul <2 x i64> %v0, <i64 3, i64 3> + store <2 x i64> %v1, <2 x i64>* undef, align 8 + ret void; +} + + +; Vector x Vector +; v4i8 +; +define void @sextload_v4i8_v(<4 x i8>* %v, <4 x i8>* %p) nounwind { +;CHECK: sextload_v4i8_v: +entry: + %0 = load <4 x i8>* %v, align 8 + %v0 = sext <4 x i8> %0 to <4 x i32> + + %1 = load <4 x i8>* %p, align 8 + %v2 = sext <4 x i8> %1 to <4 x i32> +;CHECK: vmull + %v1 = mul <4 x i32> %v0, %v2 + store <4 x i32> %v1, <4 x i32>* undef, align 8 + ret void; +} + +; v2i8 +; +define void @sextload_v2i8_v(<2 x i8>* %v, <2 x i8>* %p) nounwind { +;CHECK: sextload_v2i8_v: +entry: + %0 = load <2 x i8>* %v, align 8 + %v0 = sext <2 x i8> %0 to <2 x i64> + + %1 = load <2 x i8>* %p, align 8 + %v2 = sext <2 x i8> %1 to <2 x i64> +;CHECK: vmull + %v1 = mul <2 x i64> %v0, %v2 + store <2 x i64> %v1, <2 x i64>* undef, align 8 + ret void; +} + +; v2i16 +; +define void @sextload_v2i16_v(<2 x i16>* %v, <2 x i16>* %p) nounwind { +;CHECK: sextload_v2i16_v: +entry: + %0 = load <2 x i16>* %v, align 8 + %v0 = sext <2 x i16> %0 to <2 x i64> + + %1 = load <2 x i16>* %p, align 8 + %v2 = sext <2 x i16> %1 to <2 x i64> +;CHECK: vmull + %v1 = mul <2 x i64> %v0, %v2 + store <2 x i64> %v1, <2 x i64>* undef, align 8 + ret void; +} + + +; Vector(small) x Vector(big) +; v4i8 x v4i16 +; +define void @sextload_v4i8_vs(<4 x i8>* %v, <4 x i16>* %p) nounwind { +;CHECK: sextload_v4i8_vs: +entry: + %0 = load <4 x i8>* %v, align 8 + %v0 = sext <4 x i8> %0 to <4 x i32> + + %1 = load <4 x i16>* %p, align 8 + %v2 = sext <4 x i16> %1 to <4 x i32> +;CHECK: vmull + %v1 = mul <4 x i32> %v0, %v2 + store <4 x i32> %v1, <4 x i32>* undef, align 8 + ret void; +} + +; v2i8 +; v2i8 x v2i16 +define void @sextload_v2i8_vs(<2 x i8>* %v, <2 x i16>* %p) nounwind { +;CHECK: sextload_v2i8_vs: +entry: + %0 = load <2 x i8>* %v, align 8 + %v0 = sext <2 x i8> %0 to <2 x i64> + + %1 = load <2 x i16>* %p, align 8 + %v2 = sext <2 x i16> %1 to <2 x i64> +;CHECK: vmull + %v1 = mul <2 x i64> %v0, %v2 + store <2 x i64> %v1, <2 x i64>* undef, align 8 + ret void; +} + +; v2i16 +; v2i16 x v2i32 +define void @sextload_v2i16_vs(<2 x i16>* %v, <2 x i32>* %p) nounwind { +;CHECK: sextload_v2i16_vs: +entry: + %0 = load <2 x i16>* %v, align 8 + %v0 = sext <2 x i16> %0 to <2 x i64> + + %1 = load <2 x i32>* %p, align 8 + %v2 = sext <2 x i32> %1 to <2 x i64> +;CHECK: vmull + %v1 = mul <2 x i64> %v0, %v2 + store <2 x i64> %v1, <2 x i64>* undef, align 8 + ret void; +} diff --git a/test/CodeGen/ARM/2012-10-04-AAPCS-byval-align8.ll b/test/CodeGen/ARM/2012-10-04-AAPCS-byval-align8.ll index b5f6d311cb9c..b0644d17431d 100644 --- a/test/CodeGen/ARM/2012-10-04-AAPCS-byval-align8.ll +++ b/test/CodeGen/ARM/2012-10-04-AAPCS-byval-align8.ll @@ -19,7 +19,7 @@ entry: ; CHECK: bfc [[REG]], #0, #3 %0 = va_arg i8** %g, double call void @llvm.va_end(i8* %g1) - + ret void } diff --git a/test/CodeGen/ARM/2012-11-14-subs_carry.ll b/test/CodeGen/ARM/2012-11-14-subs_carry.ll new file mode 100644 index 000000000000..38700f3a8d10 --- /dev/null +++ b/test/CodeGen/ARM/2012-11-14-subs_carry.ll @@ -0,0 +1,31 @@ +; RUN: llc < %s -mtriple=thumbv7-apple-ios | FileCheck %s + +;CHECK: foo +;CHECK: adds +;CHECK-NEXT: adc +;CHECK-NEXT: bx + +;rdar://12028498 + +define i32 @foo() nounwind ssp { +entry: + %tmp2 = zext i32 3 to i64 + br label %bug_block + +bug_block: + %tmp410 = and i64 1031, 1647010 + %tmp411 = and i64 %tmp2, -211 + %tmp412 = shl i64 %tmp410, %tmp2 + %tmp413 = shl i64 %tmp411, %tmp2 + %tmp415 = and i64 %tmp413, 1 + %tmp420 = xor i64 0, %tmp415 + %tmp421 = and i64 %tmp412, %tmp415 + %tmp422 = shl i64 %tmp421, 1 + br label %finish + +finish: + %tmp423 = lshr i64 %tmp422, 32 + %tmp424 = trunc i64 %tmp423 to i32 + ret i32 %tmp424 +} + diff --git a/test/CodeGen/ARM/2013-01-21-PR14992.ll b/test/CodeGen/ARM/2013-01-21-PR14992.ll new file mode 100644 index 000000000000..38b9e0e8f086 --- /dev/null +++ b/test/CodeGen/ARM/2013-01-21-PR14992.ll @@ -0,0 +1,28 @@ +;PR14492 - Tablegen incorrectly converts ARM tLDMIA_UPD pseudo to tLDMIA +;RUN: llc -mtriple=thumbv7 < %s | FileCheck -check-prefix=EXPECTED %s +;RUN: llc -mtriple=thumbv7 < %s | FileCheck %s + +;EXPECTED: foo: +;CHECK: foo: +define i32 @foo(i32* %a) nounwind optsize { +entry: + %0 = load i32* %a, align 4, !tbaa !0 + %arrayidx1 = getelementptr inbounds i32* %a, i32 1 + %1 = load i32* %arrayidx1, align 4, !tbaa !0 + %arrayidx2 = getelementptr inbounds i32* %a, i32 2 + %2 = load i32* %arrayidx2, align 4, !tbaa !0 + %add.ptr = getelementptr inbounds i32* %a, i32 3 +;Make sure we do not have a duplicated register in the front of the reg list +;EXPECTED: ldm [[BASE:r[0-9]+]]!, {[[REG:r[0-9]+]], {{r[0-9]+}}, +;CHECK-NOT: ldm [[BASE:r[0-9]+]]!, {[[REG:r[0-9]+]], [[REG]], + tail call void @bar(i32* %add.ptr) nounwind optsize + %add = add nsw i32 %1, %0 + %add3 = add nsw i32 %add, %2 + ret i32 %add3 +} + +declare void @bar(i32*) optsize + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/ARM/2013-02-27-expand-vfma.ll b/test/CodeGen/ARM/2013-02-27-expand-vfma.ll new file mode 100644 index 000000000000..0e3bf2371061 --- /dev/null +++ b/test/CodeGen/ARM/2013-02-27-expand-vfma.ll @@ -0,0 +1,31 @@ +; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s +; RUN: llc < %s -mtriple=armv7s-apple-darwin | FileCheck %s -check-prefix=VFP4 + +define <4 x float> @muladd(<4 x float> %a, <4 x float> %b, <4 x float> %c) nounwind { +; CHECK: muladd: +; CHECK: fmaf +; CHECK: fmaf +; CHECK: fmaf +; CHECK: fmaf +; CHECK-NOT: fmaf + +; CHECK-VFP4: vfma.f32 + %tmp = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %b, <4 x float> %c, <4 x float> %a) #2 + ret <4 x float> %tmp +} + +declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>) #1 + +define <2 x float> @muladd2(<2 x float> %a, <2 x float> %b, <2 x float> %c) nounwind { +; CHECK: muladd2: +; CHECK: fmaf +; CHECK: fmaf +; CHECK-NOT: fmaf + +; CHECK-VFP4: vfma.f32 + %tmp = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %b, <2 x float> %c, <2 x float> %a) #2 + ret <2 x float> %tmp +} + +declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>) #1 + diff --git a/test/CodeGen/ARM/2013-04-05-overridden-loads-PR14824.ll b/test/CodeGen/ARM/2013-04-05-overridden-loads-PR14824.ll new file mode 100644 index 000000000000..2561686c1f83 --- /dev/null +++ b/test/CodeGen/ARM/2013-04-05-overridden-loads-PR14824.ll @@ -0,0 +1,110 @@ +; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabi -mcpu=cortex-a9 -mattr=+neon,+neonfp | FileCheck %s +; The test is presented by Jiangning Liu. +;CHECK-NOT: vldmia + +define void @sample_test(<8 x i64> * %secondSource, <8 x i64> * %source, <8 x i64> * %dest) nounwind { +entry: + %s0 = load <8 x i64> * %source, align 64 + %s1 = load <8 x i64> * %secondSource, align 64 + %s2 = bitcast <8 x i64> %s0 to i512 + %data.i.i.48.extract.shift = lshr i512 %s2, 384 + %data.i.i.48.extract.trunc = trunc i512 %data.i.i.48.extract.shift to i64 + %arrayidx64 = getelementptr inbounds <8 x i64> * %source, i32 6 + %s120 = load <8 x i64> * %arrayidx64, align 64 + %arrayidx67 = getelementptr inbounds <8 x i64> * %secondSource, i32 6 + %s121 = load <8 x i64> * %arrayidx67, align 64 + %s122 = bitcast <8 x i64> %s120 to i512 + %data.i.i677.48.extract.shift = lshr i512 %s122, 384 + %data.i.i677.48.extract.trunc = trunc i512 %data.i.i677.48.extract.shift to i64 + %s123 = insertelement <8 x i64> undef, i64 %data.i.i677.48.extract.trunc, i32 0 + %data.i.i677.32.extract.shift = lshr i512 %s122, 256 + %data.i.i677.32.extract.trunc = trunc i512 %data.i.i677.32.extract.shift to i64 + %s124 = insertelement <8 x i64> %s123, i64 %data.i.i677.32.extract.trunc, i32 1 + %data.i.i677.16.extract.shift = lshr i512 %s122, 128 + %data.i.i677.16.extract.trunc = trunc i512 %data.i.i677.16.extract.shift to i64 + %s125 = insertelement <8 x i64> %s124, i64 %data.i.i677.16.extract.trunc, i32 2 + %data.i.i677.56.extract.shift = lshr i512 %s122, 448 + %data.i.i677.56.extract.trunc = trunc i512 %data.i.i677.56.extract.shift to i64 + %s126 = insertelement <8 x i64> %s125, i64 %data.i.i677.56.extract.trunc, i32 3 + %data.i.i677.24.extract.shift = lshr i512 %s122, 192 + %data.i.i677.24.extract.trunc = trunc i512 %data.i.i677.24.extract.shift to i64 + %s127 = insertelement <8 x i64> %s126, i64 %data.i.i677.24.extract.trunc, i32 4 + %s128 = insertelement <8 x i64> %s127, i64 %data.i.i677.32.extract.trunc, i32 5 + %s129 = insertelement <8 x i64> %s128, i64 %data.i.i677.16.extract.trunc, i32 6 + %s130 = insertelement <8 x i64> %s129, i64 %data.i.i677.56.extract.trunc, i32 7 + %s131 = bitcast <8 x i64> %s121 to i512 + %data.i1.i676.48.extract.shift = lshr i512 %s131, 384 + %data.i1.i676.48.extract.trunc = trunc i512 %data.i1.i676.48.extract.shift to i64 + %s132 = insertelement <8 x i64> undef, i64 %data.i1.i676.48.extract.trunc, i32 0 + %data.i1.i676.32.extract.shift = lshr i512 %s131, 256 + %data.i1.i676.32.extract.trunc = trunc i512 %data.i1.i676.32.extract.shift to i64 + %s133 = insertelement <8 x i64> %s132, i64 %data.i1.i676.32.extract.trunc, i32 1 + %data.i1.i676.16.extract.shift = lshr i512 %s131, 128 + %data.i1.i676.16.extract.trunc = trunc i512 %data.i1.i676.16.extract.shift to i64 + %s134 = insertelement <8 x i64> %s133, i64 %data.i1.i676.16.extract.trunc, i32 2 + %data.i1.i676.56.extract.shift = lshr i512 %s131, 448 + %data.i1.i676.56.extract.trunc = trunc i512 %data.i1.i676.56.extract.shift to i64 + %s135 = insertelement <8 x i64> %s134, i64 %data.i1.i676.56.extract.trunc, i32 3 + %data.i1.i676.24.extract.shift = lshr i512 %s131, 192 + %data.i1.i676.24.extract.trunc = trunc i512 %data.i1.i676.24.extract.shift to i64 + %s136 = insertelement <8 x i64> %s135, i64 %data.i1.i676.24.extract.trunc, i32 4 + %s137 = insertelement <8 x i64> %s136, i64 %data.i1.i676.32.extract.trunc, i32 5 + %s138 = insertelement <8 x i64> %s137, i64 %data.i1.i676.16.extract.trunc, i32 6 + %s139 = insertelement <8 x i64> %s138, i64 %data.i1.i676.56.extract.trunc, i32 7 + %vecinit28.i.i699 = shufflevector <8 x i64> %s139, <8 x i64> %s130, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 undef, i32 undef, i32 undef> + %vecinit35.i.i700 = shufflevector <8 x i64> %vecinit28.i.i699, <8 x i64> %s139, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 13, i32 undef, i32 undef> + %vecinit42.i.i701 = shufflevector <8 x i64> %vecinit35.i.i700, <8 x i64> %s139, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 14, i32 undef> + %vecinit49.i.i702 = shufflevector <8 x i64> %vecinit42.i.i701, <8 x i64> %s130, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 15> + %arrayidx72 = getelementptr inbounds <8 x i64> * %dest, i32 6 + store <8 x i64> %vecinit49.i.i702, <8 x i64> * %arrayidx72, align 64 + %arrayidx75 = getelementptr inbounds <8 x i64> * %source, i32 7 + %s140 = load <8 x i64> * %arrayidx75, align 64 + %arrayidx78 = getelementptr inbounds <8 x i64> * %secondSource, i32 7 + %s141 = load <8 x i64> * %arrayidx78, align 64 + %s142 = bitcast <8 x i64> %s140 to i512 + %data.i.i650.32.extract.shift = lshr i512 %s142, 256 + %data.i.i650.32.extract.trunc = trunc i512 %data.i.i650.32.extract.shift to i64 + %s143 = insertelement <8 x i64> undef, i64 %data.i.i650.32.extract.trunc, i32 0 + %s144 = insertelement <8 x i64> %s143, i64 %data.i.i650.32.extract.trunc, i32 1 + %data.i.i650.16.extract.shift = lshr i512 %s142, 128 + %data.i.i650.16.extract.trunc = trunc i512 %data.i.i650.16.extract.shift to i64 + %s145 = insertelement <8 x i64> %s144, i64 %data.i.i650.16.extract.trunc, i32 2 + %data.i.i650.8.extract.shift = lshr i512 %s142, 64 + %data.i.i650.8.extract.trunc = trunc i512 %data.i.i650.8.extract.shift to i64 + %s146 = insertelement <8 x i64> %s145, i64 %data.i.i650.8.extract.trunc, i32 3 + %s147 = insertelement <8 x i64> %s146, i64 %data.i.i650.8.extract.trunc, i32 4 + %data.i.i650.48.extract.shift = lshr i512 %s142, 384 + %data.i.i650.48.extract.trunc = trunc i512 %data.i.i650.48.extract.shift to i64 + %s148 = insertelement <8 x i64> %s147, i64 %data.i.i650.48.extract.trunc, i32 5 + %s149 = insertelement <8 x i64> %s148, i64 %data.i.i650.16.extract.trunc, i32 6 + %data.i.i650.0.extract.trunc = trunc i512 %s142 to i64 + %s150 = insertelement <8 x i64> %s149, i64 %data.i.i650.0.extract.trunc, i32 7 + %s151 = bitcast <8 x i64> %s141 to i512 + %data.i1.i649.32.extract.shift = lshr i512 %s151, 256 + %data.i1.i649.32.extract.trunc = trunc i512 %data.i1.i649.32.extract.shift to i64 + %s152 = insertelement <8 x i64> undef, i64 %data.i1.i649.32.extract.trunc, i32 0 + %s153 = insertelement <8 x i64> %s152, i64 %data.i1.i649.32.extract.trunc, i32 1 + %data.i1.i649.16.extract.shift = lshr i512 %s151, 128 + %data.i1.i649.16.extract.trunc = trunc i512 %data.i1.i649.16.extract.shift to i64 + %s154 = insertelement <8 x i64> %s153, i64 %data.i1.i649.16.extract.trunc, i32 2 + %data.i1.i649.8.extract.shift = lshr i512 %s151, 64 + %data.i1.i649.8.extract.trunc = trunc i512 %data.i1.i649.8.extract.shift to i64 + %s155 = insertelement <8 x i64> %s154, i64 %data.i1.i649.8.extract.trunc, i32 3 + %s156 = insertelement <8 x i64> %s155, i64 %data.i1.i649.8.extract.trunc, i32 4 + %data.i1.i649.48.extract.shift = lshr i512 %s151, 384 + %data.i1.i649.48.extract.trunc = trunc i512 %data.i1.i649.48.extract.shift to i64 + %s157 = insertelement <8 x i64> %s156, i64 %data.i1.i649.48.extract.trunc, i32 5 + %s158 = insertelement <8 x i64> %s157, i64 %data.i1.i649.16.extract.trunc, i32 6 + %data.i1.i649.0.extract.trunc = trunc i512 %s151 to i64 + %s159 = insertelement <8 x i64> %s158, i64 %data.i1.i649.0.extract.trunc, i32 7 + %vecinit7.i.i669 = shufflevector <8 x i64> %s159, <8 x i64> %s150, <8 x i32> <i32 0, i32 9, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> + %vecinit14.i.i670 = shufflevector <8 x i64> %vecinit7.i.i669, <8 x i64> %s150, <8 x i32> <i32 0, i32 1, i32 10, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> + %vecinit21.i.i671 = shufflevector <8 x i64> %vecinit14.i.i670, <8 x i64> %s150, <8 x i32> <i32 0, i32 1, i32 2, i32 11, i32 undef, i32 undef, i32 undef, i32 undef> + %vecinit28.i.i672 = shufflevector <8 x i64> %vecinit21.i.i671, <8 x i64> %s150, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 undef, i32 undef, i32 undef> + %vecinit35.i.i673 = shufflevector <8 x i64> %vecinit28.i.i672, <8 x i64> %s159, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 13, i32 undef, i32 undef> + %vecinit42.i.i674 = shufflevector <8 x i64> %vecinit35.i.i673, <8 x i64> %s159, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 14, i32 undef> + %vecinit49.i.i675 = shufflevector <8 x i64> %vecinit42.i.i674, <8 x i64> %s159, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 15> + %arrayidx83 = getelementptr inbounds <8 x i64> * %dest, i32 7 + store <8 x i64> %vecinit49.i.i675, <8 x i64> * %arrayidx83, align 64 + ret void +} diff --git a/test/CodeGen/ARM/DbgValueOtherTargets.test b/test/CodeGen/ARM/DbgValueOtherTargets.test new file mode 100644 index 000000000000..bf90891de0a7 --- /dev/null +++ b/test/CodeGen/ARM/DbgValueOtherTargets.test @@ -0,0 +1 @@ +RUN: llc -O0 -march=arm -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/ARM/MergeConsecutiveStores.ll b/test/CodeGen/ARM/MergeConsecutiveStores.ll new file mode 100644 index 000000000000..06c87e986a83 --- /dev/null +++ b/test/CodeGen/ARM/MergeConsecutiveStores.ll @@ -0,0 +1,98 @@ +; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s + +; Make sure that we merge the consecutive load/store sequence below and use a +; word (16 bit) instead of a byte copy. +; CHECK: MergeLoadStoreBaseIndexOffset +; CHECK: ldrh [[REG:r[0-9]+]], [{{.*}}] +; CHECK: strh [[REG]], [r1], #2 +define void @MergeLoadStoreBaseIndexOffset(i32* %a, i8* %b, i8* %c, i32 %n) { + br label %1 + +; <label>:1 + %.09 = phi i32 [ %n, %0 ], [ %11, %1 ] + %.08 = phi i8* [ %b, %0 ], [ %10, %1 ] + %.0 = phi i32* [ %a, %0 ], [ %2, %1 ] + %2 = getelementptr inbounds i32* %.0, i32 1 + %3 = load i32* %.0, align 1 + %4 = getelementptr inbounds i8* %c, i32 %3 + %5 = load i8* %4, align 1 + %6 = add i32 %3, 1 + %7 = getelementptr inbounds i8* %c, i32 %6 + %8 = load i8* %7, align 1 + store i8 %5, i8* %.08, align 1 + %9 = getelementptr inbounds i8* %.08, i32 1 + store i8 %8, i8* %9, align 1 + %10 = getelementptr inbounds i8* %.08, i32 2 + %11 = add nsw i32 %.09, -1 + %12 = icmp eq i32 %11, 0 + br i1 %12, label %13, label %1 + +; <label>:13 + ret void +} + +; Make sure that we merge the consecutive load/store sequence below and use a +; word (16 bit) instead of a byte copy even if there are intermediate sign +; extensions. +; CHECK: MergeLoadStoreBaseIndexOffsetSext +; CHECK: ldrh [[REG:r[0-9]+]], [{{.*}}] +; CHECK: strh [[REG]], [r1], #2 +define void @MergeLoadStoreBaseIndexOffsetSext(i8* %a, i8* %b, i8* %c, i32 %n) { + br label %1 + +; <label>:1 + %.09 = phi i32 [ %n, %0 ], [ %12, %1 ] + %.08 = phi i8* [ %b, %0 ], [ %11, %1 ] + %.0 = phi i8* [ %a, %0 ], [ %2, %1 ] + %2 = getelementptr inbounds i8* %.0, i32 1 + %3 = load i8* %.0, align 1 + %4 = sext i8 %3 to i32 + %5 = getelementptr inbounds i8* %c, i32 %4 + %6 = load i8* %5, align 1 + %7 = add i32 %4, 1 + %8 = getelementptr inbounds i8* %c, i32 %7 + %9 = load i8* %8, align 1 + store i8 %6, i8* %.08, align 1 + %10 = getelementptr inbounds i8* %.08, i32 1 + store i8 %9, i8* %10, align 1 + %11 = getelementptr inbounds i8* %.08, i32 2 + %12 = add nsw i32 %.09, -1 + %13 = icmp eq i32 %12, 0 + br i1 %13, label %14, label %1 + +; <label>:14 + ret void +} + +; However, we can only merge ignore sign extensions when they are on all memory +; computations; +; CHECK: loadStoreBaseIndexOffsetSextNoSex +; CHECK-NOT: ldrh [[REG:r[0-9]+]], [{{.*}}] +; CHECK-NOT: strh [[REG]], [r1], #2 +define void @loadStoreBaseIndexOffsetSextNoSex(i8* %a, i8* %b, i8* %c, i32 %n) { + br label %1 + +; <label>:1 + %.09 = phi i32 [ %n, %0 ], [ %12, %1 ] + %.08 = phi i8* [ %b, %0 ], [ %11, %1 ] + %.0 = phi i8* [ %a, %0 ], [ %2, %1 ] + %2 = getelementptr inbounds i8* %.0, i32 1 + %3 = load i8* %.0, align 1 + %4 = sext i8 %3 to i32 + %5 = getelementptr inbounds i8* %c, i32 %4 + %6 = load i8* %5, align 1 + %7 = add i8 %3, 1 + %wrap.4 = sext i8 %7 to i32 + %8 = getelementptr inbounds i8* %c, i32 %wrap.4 + %9 = load i8* %8, align 1 + store i8 %6, i8* %.08, align 1 + %10 = getelementptr inbounds i8* %.08, i32 1 + store i8 %9, i8* %10, align 1 + %11 = getelementptr inbounds i8* %.08, i32 2 + %12 = add nsw i32 %.09, -1 + %13 = icmp eq i32 %12, 0 + br i1 %13, label %14, label %1 + +; <label>:14 + ret void +} diff --git a/test/CodeGen/ARM/PR15053.ll b/test/CodeGen/ARM/PR15053.ll new file mode 100644 index 000000000000..706a90efe3a8 --- /dev/null +++ b/test/CodeGen/ARM/PR15053.ll @@ -0,0 +1,13 @@ +; RUN: llc -mtriple=armv7 < %s +; PR15053 + +declare i32 @llvm.arm.strexd(i32, i32, i8*) nounwind +declare { i32, i32 } @llvm.arm.ldrexd(i8*) nounwind readonly + +define void @foo() { +entry: + %0 = tail call { i32, i32 } @llvm.arm.ldrexd(i8* undef) nounwind + %1 = extractvalue { i32, i32 } %0, 0 + %2 = tail call i32 @llvm.arm.strexd(i32 %1, i32 undef, i8* undef) nounwind + ret void +} diff --git a/test/CodeGen/ARM/a15-SD-dep.ll b/test/CodeGen/ARM/a15-SD-dep.ll new file mode 100644 index 000000000000..a52468e5be9e --- /dev/null +++ b/test/CodeGen/ARM/a15-SD-dep.ll @@ -0,0 +1,58 @@ +; RUN: llc -O1 -mcpu=cortex-a15 -mtriple=armv7-linux-gnueabi -disable-a15-sd-optimization -verify-machineinstrs < %s | FileCheck -check-prefix=DISABLED %s +; RUN: llc -O1 -mcpu=cortex-a15 -mtriple=armv7-linux-gnueabi -verify-machineinstrs < %s | FileCheck -check-prefix=ENABLED %s + +; CHECK-ENABLED: t1: +; CHECK-DISABLED: t1: +define <2 x float> @t1(float %f) { + ; CHECK-ENABLED: vdup.32 d{{[0-9]*}}, d0[0] + ; CHECK-DISABLED-NOT: vdup.32 d{{[0-9]*}}, d0[0] + %i1 = insertelement <2 x float> undef, float %f, i32 1 + %i2 = fadd <2 x float> %i1, %i1 + ret <2 x float> %i2 +} + +; CHECK-ENABLED: t2: +; CHECK-DISABLED: t2: +define <4 x float> @t2(float %g, float %f) { + ; CHECK-ENABLED: vdup.32 q{{[0-9]*}}, d0[0] + ; CHECK-DISABLED-NOT: vdup.32 d{{[0-9]*}}, d0[0] + %i1 = insertelement <4 x float> undef, float %f, i32 1 + %i2 = fadd <4 x float> %i1, %i1 + ret <4 x float> %i2 +} + +; CHECK-ENABLED: t3: +; CHECK-DISABLED: t3: +define arm_aapcs_vfpcc <2 x float> @t3(float %f) { + ; CHECK-ENABLED: vdup.32 d{{[0-9]*}}, d0[0] + ; CHECK-DISABLED-NOT: vdup.32 d{{[0-9]*}}, d0[0] + %i1 = insertelement <2 x float> undef, float %f, i32 1 + %i2 = fadd <2 x float> %i1, %i1 + ret <2 x float> %i2 +} + +; CHECK-ENABLED: t4: +; CHECK-DISABLED: t4: +define <2 x float> @t4(float %f) { + ; CHECK-ENABLED: vdup.32 d{{[0-9]*}}, d0[0] + ; CHECK-DISABLED-NOT: vdup + %i1 = insertelement <2 x float> undef, float %f, i32 1 + br label %b + + ; Block %b has an S-reg as live-in. +b: + %i2 = fadd <2 x float> %i1, %i1 + ret <2 x float> %i2 +} + +; CHECK-ENABLED: t5: +; CHECK-DISABLED: t5: +define arm_aapcs_vfpcc <4 x float> @t5(<4 x float> %q, float %f) { + ; CHECK-ENABLED: vdup.32 d{{[0-9]*}}, d{{[0-9]*}}[0] + ; CHECK-ENABLED: vadd.f32 + ; CHECK-ENABLED-NEXT: bx lr + ; CHECK-DISABLED-NOT: vdup + %i1 = insertelement <4 x float> %q, float %f, i32 1 + %i2 = fadd <4 x float> %i1, %i1 + ret <4 x float> %i2 +} diff --git a/test/CodeGen/ARM/a15-partial-update.ll b/test/CodeGen/ARM/a15-partial-update.ll new file mode 100644 index 000000000000..6306790d15f0 --- /dev/null +++ b/test/CodeGen/ARM/a15-partial-update.ll @@ -0,0 +1,38 @@ +; RUN: llc -O1 -mcpu=cortex-a15 -mtriple=armv7-linux-gnueabi -verify-machineinstrs < %s | FileCheck %s + +; CHECK: t1: +define <2 x float> @t1(float* %A, <2 x float> %B) { +; The generated code for this test uses a vld1.32 instruction +; to write the lane 1 of a D register containing the value of +; <2 x float> %B. Since the D register is defined, it would +; be incorrect to fully write it (with a vmov.f64) before the +; vld1.32 instruction. The test checks that a vmov.f64 was not +; generated. + +; CHECK-NOT: vmov.{{.*}} d{{[0-9]+}}, + %tmp2 = load float* %A, align 4 + %tmp3 = insertelement <2 x float> %B, float %tmp2, i32 1 + ret <2 x float> %tmp3 +} + +; CHECK: t2: +define void @t2(<4 x i8> *%in, <4 x i8> *%out, i32 %n) { +entry: + br label %loop +loop: +; The code generated by this test uses a vld1.32 instruction. +; We check that a dependency breaking vmov* instruction was +; generated. + +; CHECK: vmov.{{.*}} d{{[0-9]+}}, + %oldcount = phi i32 [0, %entry], [%newcount, %loop] + %newcount = add i32 %oldcount, 1 + %p1 = getelementptr <4 x i8> *%in, i32 %newcount + %p2 = getelementptr <4 x i8> *%out, i32 %newcount + %tmp1 = load <4 x i8> *%p1, align 4 + store <4 x i8> %tmp1, <4 x i8> *%p2 + %cmp = icmp eq i32 %newcount, %n + br i1 %cmp, label %loop, label %ret +ret: + ret void +} diff --git a/test/CodeGen/ARM/addrmode.ll b/test/CodeGen/ARM/addrmode.ll index 6da90897b94b..748d25804447 100644 --- a/test/CodeGen/ARM/addrmode.ll +++ b/test/CodeGen/ARM/addrmode.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=arm -stats 2>&1 | grep asm-printer | grep 4 define i32 @t1(i32 %a) { diff --git a/test/CodeGen/ARM/alloc-no-stack-realign.ll b/test/CodeGen/ARM/alloc-no-stack-realign.ll new file mode 100644 index 000000000000..273041dee34e --- /dev/null +++ b/test/CodeGen/ARM/alloc-no-stack-realign.ll @@ -0,0 +1,48 @@ +; RUN: llc < %s -mtriple=armv7-apple-ios -O0 -realign-stack=0 | FileCheck %s -check-prefix=NO-REALIGN +; RUN: llc < %s -mtriple=armv7-apple-ios -O0 | FileCheck %s + +; rdar://12713765 +; When realign-stack is set to false, make sure we are not creating stack +; objects that are assumed to be 64-byte aligned. +@T3_retval = common global <16 x float> zeroinitializer, align 16 + +define void @test(<16 x float>* noalias sret %agg.result) nounwind ssp { +entry: +; CHECK: test +; CHECK: bic sp, sp, #63 +; CHECK: orr [[R2:r[0-9]+]], [[R1:r[0-9]+]], #48 +; CHECK: vst1.64 +; CHECK: orr [[R2:r[0-9]+]], [[R1:r[0-9]+]], #32 +; CHECK: vst1.64 +; CHECK: orr [[R2:r[0-9]+]], [[R1:r[0-9]+]], #16 +; CHECK: vst1.64 +; CHECK: vst1.64 +; CHECK: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #48 +; CHECK: vst1.64 +; CHECK: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #32 +; CHECK: vst1.64 +; CHECK: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #16 +; CHECK: vst1.64 +; CHECK: vst1.64 +; NO-REALIGN: test +; NO-REALIGN: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #48 +; NO-REALIGN: vst1.64 +; NO-REALIGN: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #32 +; NO-REALIGN: vst1.64 +; NO-REALIGN: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #16 +; NO-REALIGN: vst1.64 +; NO-REALIGN: vst1.64 +; NO-REALIGN: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #48 +; NO-REALIGN: vst1.64 +; NO-REALIGN: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #32 +; NO-REALIGN: vst1.64 +; NO-REALIGN: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #16 +; NO-REALIGN: vst1.64 +; NO-REALIGN: vst1.64 + %retval = alloca <16 x float>, align 16 + %0 = load <16 x float>* @T3_retval, align 16 + store <16 x float> %0, <16 x float>* %retval + %1 = load <16 x float>* %retval + store <16 x float> %1, <16 x float>* %agg.result, align 16 + ret void +} diff --git a/test/CodeGen/ARM/arm-modifier.ll b/test/CodeGen/ARM/arm-modifier.ll index 5e12d8e03555..c74701663459 100644 --- a/test/CodeGen/ARM/arm-modifier.ll +++ b/test/CodeGen/ARM/arm-modifier.ll @@ -61,8 +61,7 @@ ret void define i64 @f4(i64* %val) nounwind { entry: ;CHECK: f4 - ;CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], {{r[0-9]?[13579]}}, [r0] - ;CHECK: mov r0, [[REG1]] + ;CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], {{r[0-9]?[13579]}}, [r{{[0-9]+}}] %0 = tail call i64 asm sideeffect "ldrexd $0, ${0:H}, [$1]", "=&r,r,*Qo"(i64* %val, i64* %val) nounwind ret i64 %0 } diff --git a/test/CodeGen/ARM/arm-ttype-target2.ll b/test/CodeGen/ARM/arm-ttype-target2.ll new file mode 100644 index 000000000000..8b5087f89c04 --- /dev/null +++ b/test/CodeGen/ARM/arm-ttype-target2.ll @@ -0,0 +1,44 @@ +; RUN: llc -mtriple=armv7-none-linux-gnueabi -arm-enable-ehabi -arm-enable-ehabi-descriptors < %s | FileCheck %s + +@_ZTVN10__cxxabiv117__class_type_infoE = external global i8* +@_ZTS3Foo = linkonce_odr constant [5 x i8] c"3Foo\00" +@_ZTI3Foo = linkonce_odr unnamed_addr constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8** @_ZTVN10__cxxabiv117__class_type_infoE, i32 2) to i8*), i8* getelementptr inbounds ([5 x i8]* @_ZTS3Foo, i32 0, i32 0) } + +define i32 @main() { +entry: + invoke void @_Z3foov() + to label %return unwind label %lpad + +lpad: ; preds = %entry + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast ({ i8*, i8* }* @_ZTI3Foo to i8*) + %1 = extractvalue { i8*, i32 } %0, 1 + %2 = tail call i32 @llvm.eh.typeid.for(i8* bitcast ({ i8*, i8* }* @_ZTI3Foo to i8*)) nounwind +; CHECK: _ZTI3Foo(target2) + + %matches = icmp eq i32 %1, %2 + br i1 %matches, label %catch, label %eh.resume + +catch: ; preds = %lpad + %3 = extractvalue { i8*, i32 } %0, 0 + %4 = tail call i8* @__cxa_begin_catch(i8* %3) nounwind + tail call void @__cxa_end_catch() + br label %return + +return: ; preds = %entry, %catch + %retval.0 = phi i32 [ 1, %catch ], [ 0, %entry ] + ret i32 %retval.0 + +eh.resume: ; preds = %lpad + resume { i8*, i32 } %0 +} + +declare void @_Z3foov() + +declare i32 @__gxx_personality_v0(...) + +declare i32 @llvm.eh.typeid.for(i8*) nounwind readnone + +declare i8* @__cxa_begin_catch(i8*) + +declare void @__cxa_end_catch() diff --git a/test/CodeGen/ARM/atomic-64bit.ll b/test/CodeGen/ARM/atomic-64bit.ll index e9609ac0f9ef..f2c7305ff33a 100644 --- a/test/CodeGen/ARM/atomic-64bit.ll +++ b/test/CodeGen/ARM/atomic-64bit.ll @@ -1,98 +1,176 @@ ; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s +; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB define i64 @test1(i64* %ptr, i64 %val) { -; CHECK: test1 +; CHECK: test1: ; CHECK: dmb ish -; CHECK: ldrexd r2, r3 -; CHECK: adds r0, r2 -; CHECK: adc r1, r3 -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: adds [[REG3:(r[0-9]?[02468])]], [[REG1]] +; CHECK: adc [[REG4:(r[0-9]?[13579])]], [[REG2]] +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test1: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: adds.w [[REG3:[a-z0-9]+]], [[REG1]] +; CHECK-THUMB: adc.w [[REG4:[a-z0-9]+]], [[REG2]] +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = atomicrmw add i64* %ptr, i64 %val seq_cst ret i64 %r } define i64 @test2(i64* %ptr, i64 %val) { -; CHECK: test2 +; CHECK: test2: ; CHECK: dmb ish -; CHECK: ldrexd r2, r3 -; CHECK: subs r0, r2 -; CHECK: sbc r1, r3 -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: subs [[REG3:(r[0-9]?[02468])]], [[REG1]] +; CHECK: sbc [[REG4:(r[0-9]?[13579])]], [[REG2]] +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test2: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: subs.w [[REG3:[a-z0-9]+]], [[REG1]] +; CHECK-THUMB: sbc.w [[REG4:[a-z0-9]+]], [[REG2]] +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = atomicrmw sub i64* %ptr, i64 %val seq_cst ret i64 %r } define i64 @test3(i64* %ptr, i64 %val) { -; CHECK: test3 +; CHECK: test3: ; CHECK: dmb ish -; CHECK: ldrexd r2, r3 -; CHECK: and r0, r2 -; CHECK: and r1, r3 -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: and [[REG3:(r[0-9]?[02468])]], [[REG1]] +; CHECK: and [[REG4:(r[0-9]?[13579])]], [[REG2]] +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test3: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: and.w [[REG3:[a-z0-9]+]], [[REG1]] +; CHECK-THUMB: and.w [[REG4:[a-z0-9]+]], [[REG2]] +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = atomicrmw and i64* %ptr, i64 %val seq_cst ret i64 %r } define i64 @test4(i64* %ptr, i64 %val) { -; CHECK: test4 +; CHECK: test4: ; CHECK: dmb ish -; CHECK: ldrexd r2, r3 -; CHECK: orr r0, r2 -; CHECK: orr r1, r3 -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: orr [[REG3:(r[0-9]?[02468])]], [[REG1]] +; CHECK: orr [[REG4:(r[0-9]?[13579])]], [[REG2]] +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test4: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: orr.w [[REG3:[a-z0-9]+]], [[REG1]] +; CHECK-THUMB: orr.w [[REG4:[a-z0-9]+]], [[REG2]] +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = atomicrmw or i64* %ptr, i64 %val seq_cst ret i64 %r } define i64 @test5(i64* %ptr, i64 %val) { -; CHECK: test5 +; CHECK: test5: ; CHECK: dmb ish -; CHECK: ldrexd r2, r3 -; CHECK: eor r0, r2 -; CHECK: eor r1, r3 -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: eor [[REG3:(r[0-9]?[02468])]], [[REG1]] +; CHECK: eor [[REG4:(r[0-9]?[13579])]], [[REG2]] +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test5: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: eor.w [[REG3:[a-z0-9]+]], [[REG1]] +; CHECK-THUMB: eor.w [[REG4:[a-z0-9]+]], [[REG2]] +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = atomicrmw xor i64* %ptr, i64 %val seq_cst ret i64 %r } define i64 @test6(i64* %ptr, i64 %val) { -; CHECK: test6 +; CHECK: test6: ; CHECK: dmb ish -; CHECK: ldrexd r2, r3 -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test6: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}} +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = atomicrmw xchg i64* %ptr, i64 %val seq_cst ret i64 %r } define i64 @test7(i64* %ptr, i64 %val1, i64 %val2) { -; CHECK: test7 +; CHECK: test7: ; CHECK: dmb ish -; CHECK: ldrexd r2, r3 -; CHECK: cmp r2 -; CHECK: cmpeq r3 +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: cmp [[REG1]] +; CHECK: cmpeq [[REG2]] ; CHECK: bne -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test7: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: cmp [[REG1]] +; CHECK-THUMB: it eq +; CHECK-THUMB: cmpeq [[REG2]] +; CHECK-THUMB: bne +; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}} +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = cmpxchg i64* %ptr, i64 %val1, i64 %val2 seq_cst ret i64 %r } @@ -100,15 +178,27 @@ define i64 @test7(i64* %ptr, i64 %val1, i64 %val2) { ; Compiles down to cmpxchg ; FIXME: Should compile to a single ldrexd define i64 @test8(i64* %ptr) { -; CHECK: test8 -; CHECK: ldrexd r2, r3 -; CHECK: cmp r2 -; CHECK: cmpeq r3 +; CHECK: test8: +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: cmp [[REG1]] +; CHECK: cmpeq [[REG2]] ; CHECK: bne -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test8: +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: cmp [[REG1]] +; CHECK-THUMB: it eq +; CHECK-THUMB: cmpeq [[REG2]] +; CHECK-THUMB: bne +; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}} +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = load atomic i64* %ptr seq_cst, align 8 ret i64 %r } @@ -116,13 +206,131 @@ define i64 @test8(i64* %ptr) { ; Compiles down to atomicrmw xchg; there really isn't any more efficient ; way to write it. define void @test9(i64* %ptr, i64 %val) { -; CHECK: test9 +; CHECK: test9: ; CHECK: dmb ish -; CHECK: ldrexd r2, r3 -; CHECK: strexd {{[a-z0-9]+}}, r0, r1 +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} ; CHECK: cmp ; CHECK: bne ; CHECK: dmb ish + +; CHECK-THUMB: test9: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}} +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + store atomic i64 %val, i64* %ptr seq_cst, align 8 ret void } + +define i64 @test10(i64* %ptr, i64 %val) { +; CHECK: test10: +; CHECK: dmb ish +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]] +; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]] +; CHECK: blt +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK: cmp +; CHECK: bne +; CHECK: dmb ish + +; CHECK-THUMB: test10: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]] +; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]] +; CHECK-THUMB: blt +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + + %r = atomicrmw min i64* %ptr, i64 %val seq_cst + ret i64 %r +} + +define i64 @test11(i64* %ptr, i64 %val) { +; CHECK: test11: +; CHECK: dmb ish +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]] +; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]] +; CHECK: blo +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK: cmp +; CHECK: bne +; CHECK: dmb ish + + +; CHECK-THUMB: test11: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]] +; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]] +; CHECK-THUMB: blo +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + + %r = atomicrmw umin i64* %ptr, i64 %val seq_cst + ret i64 %r +} + +define i64 @test12(i64* %ptr, i64 %val) { +; CHECK: test12: +; CHECK: dmb ish +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]] +; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]] +; CHECK: bge +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK: cmp +; CHECK: bne +; CHECK: dmb ish + +; CHECK-THUMB: test12: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]] +; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]] +; CHECK-THUMB: bge +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + + %r = atomicrmw max i64* %ptr, i64 %val seq_cst + ret i64 %r +} + +define i64 @test13(i64* %ptr, i64 %val) { +; CHECK: test13: +; CHECK: dmb ish +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]] +; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]] +; CHECK: bhs +; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK: cmp +; CHECK: bne +; CHECK: dmb ish + +; CHECK-THUMB: test13: +; CHECK-THUMB: dmb ish +; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]] +; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]] +; CHECK-THUMB: bhs +; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]] +; CHECK-THUMB: cmp +; CHECK-THUMB: bne +; CHECK-THUMB: dmb ish + %r = atomicrmw umax i64* %ptr, i64 %val seq_cst + ret i64 %r +} + diff --git a/test/CodeGen/ARM/avoid-cpsr-rmw.ll b/test/CodeGen/ARM/avoid-cpsr-rmw.ll index 96e83dd88e92..c5d00a0f8a4c 100644 --- a/test/CodeGen/ARM/avoid-cpsr-rmw.ll +++ b/test/CodeGen/ARM/avoid-cpsr-rmw.ll @@ -49,3 +49,68 @@ while.body: while.end: ret void } + +; Allow partial CPSR dependency when code size is the priority. +; rdar://12878928 +define void @t3(i32* nocapture %ptr1, i32* %ptr2, i32 %c) nounwind minsize { +entry: +; CHECK: t3: + %tobool7 = icmp eq i32* %ptr2, null + br i1 %tobool7, label %while.end, label %while.body + +while.body: +; CHECK: while.body +; CHECK: mul r{{[0-9]+}} +; CHECK: muls + %ptr1.addr.09 = phi i32* [ %add.ptr, %while.body ], [ %ptr1, %entry ] + %ptr2.addr.08 = phi i32* [ %incdec.ptr, %while.body ], [ %ptr2, %entry ] + %0 = load i32* %ptr1.addr.09, align 4 + %arrayidx1 = getelementptr inbounds i32* %ptr1.addr.09, i32 1 + %1 = load i32* %arrayidx1, align 4 + %arrayidx3 = getelementptr inbounds i32* %ptr1.addr.09, i32 2 + %2 = load i32* %arrayidx3, align 4 + %arrayidx4 = getelementptr inbounds i32* %ptr1.addr.09, i32 3 + %3 = load i32* %arrayidx4, align 4 + %add.ptr = getelementptr inbounds i32* %ptr1.addr.09, i32 4 + %mul = mul i32 %1, %0 + %mul5 = mul i32 %mul, %2 + %mul6 = mul i32 %mul5, %3 + store i32 %mul6, i32* %ptr2.addr.08, align 4 + %incdec.ptr = getelementptr inbounds i32* %ptr2.addr.08, i32 -1 + %tobool = icmp eq i32* %incdec.ptr, null + br i1 %tobool, label %while.end, label %while.body + +while.end: + ret void +} + +; Avoid producing tMOVi8 after a high-latency flag-setting operation. +; <rdar://problem/13468102> +define void @t4(i32* nocapture %p, double* nocapture %q) { +entry: +; CHECK: t4 +; CHECK: vmrs APSR_nzcv, fpscr +; CHECK: if.then +; CHECK-NOT movs + %0 = load double* %q, align 4 + %cmp = fcmp olt double %0, 1.000000e+01 + %incdec.ptr1 = getelementptr inbounds i32* %p, i32 1 + br i1 %cmp, label %if.then, label %if.else + +if.then: + store i32 7, i32* %p, align 4 + %incdec.ptr2 = getelementptr inbounds i32* %p, i32 2 + store i32 8, i32* %incdec.ptr1, align 4 + store i32 9, i32* %incdec.ptr2, align 4 + br label %if.end + +if.else: + store i32 3, i32* %p, align 4 + %incdec.ptr5 = getelementptr inbounds i32* %p, i32 2 + store i32 5, i32* %incdec.ptr1, align 4 + store i32 6, i32* %incdec.ptr5, align 4 + br label %if.end + +if.end: + ret void +} diff --git a/test/CodeGen/ARM/bfx.ll b/test/CodeGen/ARM/bfx.ll index 519c1353a387..394da9e157ff 100644 --- a/test/CodeGen/ARM/bfx.ll +++ b/test/CodeGen/ARM/bfx.ll @@ -26,3 +26,28 @@ define i32 @ubfx2(i32 %a) { ret i32 %t2 } +; rdar://12870177 +define i32 @ubfx_opt(i32* nocapture %ctx, i32 %x) nounwind readonly ssp { +entry: +; CHECK: ubfx_opt +; CHECK: lsr [[REG1:(lr|r[0-9]+)]], r1, #24 +; CHECK: ldr {{lr|r[0-9]+}}, [r0, [[REG1]], lsl #2] +; CHECK: ubfx [[REG2:(lr|r[0-9]+)]], r1, #16, #8 +; CHECK: ldr {{lr|r[0-9]+}}, [r0, [[REG2]], lsl #2] +; CHECK: ubfx [[REG3:(lr|r[0-9]+)]], r1, #8, #8 +; CHECK: ldr {{lr|r[0-9]+}}, [r0, [[REG3]], lsl #2] + %and = lshr i32 %x, 8 + %shr = and i32 %and, 255 + %and1 = lshr i32 %x, 16 + %shr2 = and i32 %and1, 255 + %shr4 = lshr i32 %x, 24 + %arrayidx = getelementptr inbounds i32* %ctx, i32 %shr4 + %0 = load i32* %arrayidx, align 4 + %arrayidx5 = getelementptr inbounds i32* %ctx, i32 %shr2 + %1 = load i32* %arrayidx5, align 4 + %add = add i32 %1, %0 + %arrayidx6 = getelementptr inbounds i32* %ctx, i32 %shr + %2 = load i32* %arrayidx6, align 4 + %add7 = add i32 %add, %2 + ret i32 %add7 +} diff --git a/test/CodeGen/ARM/call-tc.ll b/test/CodeGen/ARM/call-tc.ll index 94edff5c0be5..58fbbda0f6bd 100644 --- a/test/CodeGen/ARM/call-tc.ll +++ b/test/CodeGen/ARM/call-tc.ll @@ -103,7 +103,6 @@ define i32 @t8(i32 %x) nounwind ssp { entry: ; CHECKT2D: t8: ; CHECKT2D-NOT: push -; CHECKT2D-NOT %and = and i32 %x, 1 %tobool = icmp eq i32 %and, 0 br i1 %tobool, label %if.end, label %if.then diff --git a/test/CodeGen/ARM/call_nolink.ll b/test/CodeGen/ARM/call_nolink.ll index 00b16888f389..5ec7f74a605f 100644 --- a/test/CodeGen/ARM/call_nolink.ll +++ b/test/CodeGen/ARM/call_nolink.ll @@ -1,5 +1,4 @@ -; RUN: llc < %s -march=arm -mtriple=arm-linux-gnueabi | \ -; RUN: not grep "bx lr" +; RUN: llc < %s -march=arm -mtriple=arm-linux-gnueabi | FileCheck %s %struct.anon = type { i32 (i32, i32, i32)*, i32, i32, [3 x i32], i8*, i8*, i8* } @r = external global [14 x i32] ; <[14 x i32]*> [#uses=4] @@ -8,6 +7,8 @@ @numi = external global i32 ; <i32*> [#uses=1] @counter = external global [2 x i32] ; <[2 x i32]*> [#uses=1] +; CHECK: main_bb_2E_i_bb205_2E_i_2E_i_bb115_2E_i_2E_i: +; CHECK-NOT: bx lr define void @main_bb_2E_i_bb205_2E_i_2E_i_bb115_2E_i_2E_i() { newFuncRoot: @@ -50,3 +51,12 @@ bb115.i.i: ; preds = %bb115.i.i.bb115.i.i_crit_edge, %newFuncRoot icmp slt i32 %tmp166.i.i, %tmp168.i.i ; <i1>:0 [#uses=1] br i1 %0, label %bb115.i.i.bb115.i.i_crit_edge, label %bb115.i.i.bb170.i.i_crit_edge.exitStub } + +define void @PR15520(void ()* %fn) { + call void %fn() + ret void + +; CHECK: PR15520: +; CHECK: mov lr, pc +; CHECK: mov pc, r0 +} diff --git a/test/CodeGen/ARM/coalesce-subregs.ll b/test/CodeGen/ARM/coalesce-subregs.ll index 3ba947579a3a..e7bd5f41bb4b 100644 --- a/test/CodeGen/ARM/coalesce-subregs.ll +++ b/test/CodeGen/ARM/coalesce-subregs.ll @@ -147,7 +147,7 @@ if.end: ; preds = %entry, %if.then ; CHECK: vmov.f32 {{.*}}, #1.0 ; CHECK-NOT: vmov ; CHECK-NOT: vorr -; CHECK: %if.end +; CHECK: bx ; We may leave the last insertelement in the if.end block. ; It is inserting the %add value into a dead lane, but %add causes interference ; in the entry block, and we don't do dead lane checks across basic blocks. diff --git a/test/CodeGen/ARM/commute-movcc.ll b/test/CodeGen/ARM/commute-movcc.ll index 7316452cd617..769ba55eb9eb 100644 --- a/test/CodeGen/ARM/commute-movcc.ll +++ b/test/CodeGen/ARM/commute-movcc.ll @@ -1,5 +1,5 @@ -; RUN: llc -mtriple=thumbv7-apple-ios -disable-code-place < %s | FileCheck %s -; RUN: llc -mtriple=armv7-apple-ios -disable-code-place < %s | FileCheck %s +; RUN: llc -mtriple=thumbv7-apple-ios -disable-block-placement < %s | FileCheck %s +; RUN: llc -mtriple=armv7-apple-ios -disable-block-placement < %s | FileCheck %s ; LLVM IR optimizers canonicalize icmp+select this way. ; Make sure that TwoAddressInstructionPass can commute the corresponding diff --git a/test/CodeGen/ARM/crash.ll b/test/CodeGen/ARM/crash.ll index 0f6f33e0448e..4e3e2010b07a 100644 --- a/test/CodeGen/ARM/crash.ll +++ b/test/CodeGen/ARM/crash.ll @@ -69,3 +69,26 @@ bb: store <4 x float> %tmp154, <4 x float>* undef, align 16 ret void } + +; <rdar://problem/12721258> +%A = type { %B } +%B = type { i32 } + +define void @_Z3Foov() ssp { +entry: + br i1 true, label %exit, label %false + +false: + invoke void undef(%A* undef) + to label %exit unwind label %lpad + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* null + unreachable + +exit: + ret void +} + +declare i32 @__gxx_personality_sj0(...) diff --git a/test/CodeGen/ARM/debug-info-arg.ll b/test/CodeGen/ARM/debug-info-arg.ll index a7b44e6fe709..33c8e9daae69 100644 --- a/test/CodeGen/ARM/debug-info-arg.ll +++ b/test/CodeGen/ARM/debug-info-arg.ll @@ -30,29 +30,27 @@ declare void @foobar(i64, i64) declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!llvm.dbg.sp = !{!1} -!llvm.dbg.lv.foo = !{!5, !13, !14, !17, !18, !19} -!0 = metadata !{i32 589841, i32 0, i32 12, metadata !"one.c", metadata !"/Volumes/Athwagate/R10048772", metadata !"Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"", metadata !2, i32 11, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void (%struct.tag_s*, %struct.tag_s*, i64, i64, %struct.tag_s*, %struct.tag_s*)* @foo, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"one.c", metadata !"/Volumes/Athwagate/R10048772", metadata !0} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589845, 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 ] +!0 = metadata !{i32 786449, metadata !32, i32 12, metadata !"Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)", i1 true, metadata !"", i32 0, null, null, metadata !30, null, null} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786478, metadata !2, metadata !2, metadata !"foo", metadata !"foo", metadata !"", i32 11, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void (%struct.tag_s*, %struct.tag_s*, i64, i64, %struct.tag_s*, %struct.tag_s*)* @foo, null, null, metadata !31, i32 11} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !32} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786453, metadata !32, metadata !2, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !4 = metadata !{null} -!5 = metadata !{i32 590081, metadata !1, metadata !"this", metadata !2, i32 16777227, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] -!6 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !7} ; [ DW_TAG_pointer_type ] -!7 = metadata !{i32 589843, metadata !0, metadata !"tag_s", metadata !2, i32 5, i64 96, i64 32, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!5 = metadata !{i32 786689, metadata !1, metadata !"this", metadata !2, i32 16777227, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!6 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !7} ; [ DW_TAG_pointer_type ] +!7 = metadata !{i32 786451, metadata !32, metadata !0, metadata !"tag_s", i32 5, i64 96, i64 32, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_structure_type ] !8 = metadata !{metadata !9, metadata !11, metadata !12} -!9 = metadata !{i32 589837, metadata !7, metadata !"x", metadata !2, i32 6, i64 32, i64 32, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] -!10 = metadata !{i32 589860, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!11 = metadata !{i32 589837, metadata !7, metadata !"y", metadata !2, i32 7, i64 32, i64 32, i64 32, i32 0, metadata !10} ; [ DW_TAG_member ] -!12 = metadata !{i32 589837, metadata !7, metadata !"z", metadata !2, i32 8, i64 32, i64 32, i64 64, i32 0, metadata !10} ; [ DW_TAG_member ] -!13 = metadata !{i32 590081, metadata !1, metadata !"c", metadata !2, i32 33554443, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] -!14 = metadata !{i32 590081, metadata !1, metadata !"x", metadata !2, i32 50331659, metadata !15, i32 0} ; [ DW_TAG_arg_variable ] -!15 = metadata !{i32 589846, metadata !0, metadata !"UInt64", metadata !2, i32 1, i64 0, i64 0, i64 0, i32 0, metadata !16} ; [ DW_TAG_typedef ] -!16 = metadata !{i32 589860, metadata !0, metadata !"long long unsigned int", null, i32 0, i64 64, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!17 = metadata !{i32 590081, metadata !1, metadata !"y", metadata !2, i32 67108875, metadata !15, i32 0} ; [ DW_TAG_arg_variable ] -!18 = metadata !{i32 590081, metadata !1, metadata !"ptr1", metadata !2, i32 83886091, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 590081, metadata !1, metadata !"ptr2", metadata !2, i32 100663307, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] +!9 = metadata !{i32 786445, metadata !32, metadata !7, metadata !"x", i32 6, i64 32, i64 32, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] +!10 = metadata !{i32 786468, null, metadata !0, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!11 = metadata !{i32 786445, metadata !32, metadata !7, metadata !"y", i32 7, i64 32, i64 32, i64 32, i32 0, metadata !10} ; [ DW_TAG_member ] +!12 = metadata !{i32 786445, metadata !32, metadata !7, metadata !"z", i32 8, i64 32, i64 32, i64 64, i32 0, metadata !10} ; [ DW_TAG_member ] +!13 = metadata !{i32 786689, metadata !1, metadata !"c", metadata !2, i32 33554443, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!14 = metadata !{i32 786689, metadata !1, metadata !"x", metadata !2, i32 50331659, metadata !15, i32 0, null} ; [ DW_TAG_arg_variable ] +!15 = metadata !{i32 786454, metadata !32, metadata !0, metadata !"UInt64", i32 1, i64 0, i64 0, i64 0, i32 0, metadata !16} ; [ DW_TAG_typedef ] +!16 = metadata !{i32 786468, null, metadata !0, metadata !"long long unsigned int", i32 0, i64 64, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!17 = metadata !{i32 786689, metadata !1, metadata !"y", metadata !2, i32 67108875, metadata !15, i32 0, null} ; [ DW_TAG_arg_variable ] +!18 = metadata !{i32 786689, metadata !1, metadata !"ptr1", metadata !2, i32 83886091, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786689, metadata !1, metadata !"ptr2", metadata !2, i32 100663307, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] !20 = metadata !{i32 11, i32 24, metadata !1, null} !21 = metadata !{i32 11, i32 44, metadata !1, null} !22 = metadata !{i32 11, i32 54, metadata !1, null} @@ -60,6 +58,9 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !24 = metadata !{i32 11, i32 81, metadata !1, null} !25 = metadata !{i32 11, i32 101, metadata !1, null} !26 = metadata !{i32 12, i32 3, metadata !27, null} -!27 = metadata !{i32 589835, metadata !1, i32 11, i32 107, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] +!27 = metadata !{i32 786443, metadata !1, i32 11, i32 107, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] !28 = metadata !{i32 13, i32 5, metadata !27, null} !29 = metadata !{i32 14, i32 1, metadata !27, null} +!30 = metadata !{metadata !1} +!31 = metadata !{metadata !5, metadata !13, metadata !14, metadata !17, metadata !18, metadata!19} +!32 = metadata !{metadata !"one.c", metadata !"/Volumes/Athwagate/R10048772"} diff --git a/test/CodeGen/ARM/debug-info-blocks.ll b/test/CodeGen/ARM/debug-info-blocks.ll index 0ad0a15ca3d9..d0bfecc5af41 100644 --- a/test/CodeGen/ARM/debug-info-blocks.ll +++ b/test/CodeGen/ARM/debug-info-blocks.ll @@ -93,153 +93,166 @@ define hidden void @foobar_func_block_invoke_0(i8* %.block_descriptor, %0* %load } !llvm.dbg.cu = !{!0} -!llvm.dbg.enum = !{!1, !1, !5, !5, !9, !14, !19, !19, !14, !14, !14, !19, !19, !19} -!llvm.dbg.sp = !{!23} -!0 = metadata !{i32 589841, i32 0, i32 16, metadata !"MyLibrary.i", metadata !"/Volumes/Sandbox/llvm", metadata !"Apple clang version 2.1", i1 true, i1 false, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 589828, metadata !0, metadata !"", metadata !2, i32 248, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !3, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] -!2 = metadata !{i32 589865, metadata !"header.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, i32 16, metadata !40, metadata !"Apple clang version 2.1", i1 false, metadata !"", i32 2, metadata !147, null, metadata !148, null, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786433, metadata !160, metadata !0, metadata !"", i32 248, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !3, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!2 = metadata !{i32 786473, metadata !160} ; [ DW_TAG_file_type ] !3 = metadata !{metadata !4} -!4 = metadata !{i32 589864, metadata !"Ver1", i64 0} ; [ DW_TAG_enumerator ] -!5 = metadata !{i32 589828, metadata !0, metadata !"Mode", metadata !6, i32 79, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !7, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] -!6 = metadata !{i32 589865, metadata !"header2.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!4 = metadata !{i32 786472, metadata !"Ver1", i64 0} ; [ DW_TAG_enumerator ] +!5 = metadata !{i32 786433, metadata !160, metadata !0, metadata !"Mode", i32 79, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !7, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!6 = metadata !{i32 786473, metadata !161} ; [ DW_TAG_file_type ] !7 = metadata !{metadata !8} -!8 = metadata !{i32 589864, metadata !"One", i64 0} ; [ DW_TAG_enumerator ] -!9 = metadata !{i32 589828, metadata !0, metadata !"", metadata !10, i32 15, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !11, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] -!10 = metadata !{i32 589865, metadata !"header3.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!8 = metadata !{i32 786472, metadata !"One", i64 0} ; [ DW_TAG_enumerator ] +!9 = metadata !{i32 786433, metadata !149, metadata !0, metadata !"", i32 15, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !11, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!10 = metadata !{i32 786473, metadata !149} ; [ DW_TAG_file_type ] !11 = metadata !{metadata !12, metadata !13} -!12 = metadata !{i32 589864, metadata !"Unknown", i64 0} ; [ DW_TAG_enumerator ] -!13 = metadata !{i32 589864, metadata !"Known", i64 1} ; [ DW_TAG_enumerator ] -!14 = metadata !{i32 589828, metadata !0, metadata !"", metadata !15, i32 20, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !16, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] -!15 = metadata !{i32 589865, metadata !"Private.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!12 = metadata !{i32 786472, metadata !"Unknown", i64 0} ; [ DW_TAG_enumerator ] +!13 = metadata !{i32 786472, metadata !"Known", i64 1} ; [ DW_TAG_enumerator ] +!14 = metadata !{i32 786433, metadata !150, metadata !0, metadata !"", i32 20, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !16, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!15 = metadata !{i32 786473, metadata !150} ; [ DW_TAG_file_type ] !16 = metadata !{metadata !17, metadata !18} -!17 = metadata !{i32 589864, metadata !"Single", i64 0} ; [ DW_TAG_enumerator ] -!18 = metadata !{i32 589864, metadata !"Double", i64 1} ; [ DW_TAG_enumerator ] -!19 = metadata !{i32 589828, metadata !0, metadata !"", metadata !20, i32 14, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !21, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] -!20 = metadata !{i32 589865, metadata !"header4.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!17 = metadata !{i32 786472, metadata !"Single", i64 0} ; [ DW_TAG_enumerator ] +!18 = metadata !{i32 786472, metadata !"Double", i64 1} ; [ DW_TAG_enumerator ] +!19 = metadata !{i32 786433, metadata !151, metadata !0, metadata !"", i32 14, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !21, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!20 = metadata !{i32 786473, metadata !151} ; [ DW_TAG_file_type ] !21 = metadata !{metadata !22} -!22 = metadata !{i32 589864, metadata !"Eleven", i64 0} ; [ DW_TAG_enumerator ] -!23 = metadata !{i32 589870, i32 0, metadata !24, metadata !"foobar_func_block_invoke_0", metadata !"foobar_func_block_invoke_0", metadata !"", metadata !24, i32 609, metadata !25, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (i8*, %0*, [4 x i32], [4 x i32])* @foobar_func_block_invoke_0, null, null} ; [ DW_TAG_subprogram ] -!24 = metadata !{i32 589865, metadata !"MyLibrary.m", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] -!25 = metadata !{i32 589845, metadata !24, metadata !"", metadata !24, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !26, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!22 = metadata !{i32 786472, metadata !"Eleven", i64 0} ; [ DW_TAG_enumerator ] +!23 = metadata !{i32 786478, metadata !24, metadata !"foobar_func_block_invoke_0", metadata !"foobar_func_block_invoke_0", metadata !"", metadata !24, i32 609, metadata !25, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (i8*, %0*, [4 x i32], [4 x i32])* @foobar_func_block_invoke_0, null, null, null, i32 609} ; [ DW_TAG_subprogram ] +!24 = metadata !{i32 786473, metadata !152} ; [ DW_TAG_file_type ] +!25 = metadata !{i32 786453, metadata !152, metadata !24, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !26, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !26 = metadata !{null} -!27 = metadata !{i32 590081, metadata !23, metadata !".block_descriptor", metadata !24, i32 16777825, metadata !28, i32 64} ; [ DW_TAG_arg_variable ] -!28 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 0, i64 0, i32 0, metadata !29} ; [ DW_TAG_pointer_type ] -!29 = metadata !{i32 589843, metadata !24, metadata !"__block_literal_14", metadata !24, i32 609, i64 256, i64 32, i32 0, i32 0, i32 0, metadata !30, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!27 = metadata !{i32 786689, metadata !23, metadata !".block_descriptor", metadata !24, i32 16777825, metadata !28, i32 64, null} ; [ DW_TAG_arg_variable ] +!28 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 0, i64 0, i32 0, metadata !29} ; [ DW_TAG_pointer_type ] +!29 = metadata !{i32 786451, metadata !152, metadata !24, metadata !"__block_literal_14", i32 609, i64 256, i64 32, i32 0, i32 0, i32 0, metadata !30, i32 0, i32 0} ; [ DW_TAG_structure_type ] !30 = metadata !{metadata !31, metadata !33, metadata !35, metadata !36, metadata !37, metadata !48, metadata !89, metadata !124} -!31 = metadata !{i32 589837, metadata !24, metadata !"__isa", metadata !24, i32 609, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_member ] -!32 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] -!33 = metadata !{i32 589837, metadata !24, metadata !"__flags", metadata !24, i32 609, i64 32, i64 32, i64 32, i32 0, metadata !34} ; [ DW_TAG_member ] -!34 = metadata !{i32 589860, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!35 = metadata !{i32 589837, metadata !24, metadata !"__reserved", metadata !24, i32 609, i64 32, i64 32, i64 64, i32 0, metadata !34} ; [ DW_TAG_member ] -!36 = metadata !{i32 589837, metadata !24, metadata !"__FuncPtr", metadata !24, i32 609, i64 32, i64 32, i64 96, i32 0, metadata !32} ; [ DW_TAG_member ] -!37 = metadata !{i32 589837, metadata !24, metadata !"__descriptor", metadata !24, i32 609, i64 32, i64 32, i64 128, i32 0, metadata !38} ; [ DW_TAG_member ] -!38 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !39} ; [ DW_TAG_pointer_type ] -!39 = metadata !{i32 589843, metadata !0, metadata !"__block_descriptor_withcopydispose", metadata !40, i32 307, i64 128, i64 32, i32 0, i32 0, i32 0, metadata !41, i32 0, i32 0} ; [ DW_TAG_structure_type ] -!40 = metadata !{i32 589865, metadata !"MyLibrary.i", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!31 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__isa", i32 609, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_member ] +!32 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!33 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__flags", i32 609, i64 32, i64 32, i64 32, i32 0, metadata !34} ; [ DW_TAG_member ] +!34 = metadata !{i32 786468, null, metadata !0, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!35 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__reserved", i32 609, i64 32, i64 32, i64 64, i32 0, metadata !34} ; [ DW_TAG_member ] +!36 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__FuncPtr", i32 609, i64 32, i64 32, i64 96, i32 0, metadata !32} ; [ DW_TAG_member ] +!37 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__descriptor", i32 609, i64 32, i64 32, i64 128, i32 0, metadata !38} ; [ DW_TAG_member ] +!38 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !39} ; [ DW_TAG_pointer_type ] +!39 = metadata !{i32 786451, metadata !153, metadata !0, metadata !"__block_descriptor_withcopydispose", i32 307, i64 128, i64 32, i32 0, i32 0, i32 0, metadata !41, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!40 = metadata !{i32 786473, metadata !153} ; [ DW_TAG_file_type ] !41 = metadata !{metadata !42, metadata !44, metadata !45, metadata !47} -!42 = metadata !{i32 589837, metadata !40, metadata !"reserved", metadata !40, i32 307, i64 32, i64 32, i64 0, i32 0, metadata !43} ; [ DW_TAG_member ] -!43 = metadata !{i32 589860, metadata !0, metadata !"long unsigned int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!44 = metadata !{i32 589837, metadata !40, metadata !"Size", metadata !40, i32 307, i64 32, i64 32, i64 32, i32 0, metadata !43} ; [ DW_TAG_member ] -!45 = metadata !{i32 589837, metadata !40, metadata !"CopyFuncPtr", metadata !40, i32 307, i64 32, i64 32, i64 64, i32 0, metadata !46} ; [ DW_TAG_member ] -!46 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_pointer_type ] -!47 = metadata !{i32 589837, metadata !40, metadata !"DestroyFuncPtr", metadata !40, i32 307, i64 32, i64 32, i64 96, i32 0, metadata !46} ; [ DW_TAG_member ] -!48 = metadata !{i32 589837, metadata !24, metadata !"mydata", metadata !24, i32 609, i64 32, i64 32, i64 160, i32 0, metadata !49} ; [ DW_TAG_member ] -!49 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 0, i64 0, i32 0, metadata !50} ; [ DW_TAG_pointer_type ] -!50 = metadata !{i32 589843, metadata !24, metadata !"", metadata !24, i32 0, i64 224, i64 0, i32 0, i32 16, i32 0, metadata !51, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!42 = metadata !{i32 786445, metadata !153, metadata !40, metadata !"reserved", i32 307, i64 32, i64 32, i64 0, i32 0, metadata !43} ; [ DW_TAG_member ] +!43 = metadata !{i32 786468, null, metadata !0, metadata !"long unsigned int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!44 = metadata !{i32 786445, metadata !153, metadata !40, metadata !"Size", i32 307, i64 32, i64 32, i64 32, i32 0, metadata !43} ; [ DW_TAG_member ] +!45 = metadata !{i32 786445, metadata !153, metadata !40, metadata !"CopyFuncPtr", i32 307, i64 32, i64 32, i64 64, i32 0, metadata !46} ; [ DW_TAG_member ] +!46 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_pointer_type ] +!47 = metadata !{i32 786445, metadata !153, metadata !40, metadata !"DestroyFuncPtr", i32 307, i64 32, i64 32, i64 96, i32 0, metadata !46} ; [ DW_TAG_member ] +!48 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"mydata", i32 609, i64 32, i64 32, i64 160, i32 0, metadata !49} ; [ DW_TAG_member ] +!49 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 0, i64 0, i32 0, metadata !50} ; [ DW_TAG_pointer_type ] +!50 = metadata !{i32 786451, metadata !152, metadata !24, metadata !"", i32 0, i64 224, i64 0, i32 0, i32 16, i32 0, metadata !51, i32 0, i32 0} ; [ DW_TAG_structure_type ] !51 = metadata !{metadata !52, metadata !53, metadata !54, metadata !55, metadata !56, metadata !57, metadata !58} -!52 = metadata !{i32 589837, metadata !24, metadata !"__isa", metadata !24, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_member ] -!53 = metadata !{i32 589837, metadata !24, metadata !"__forwarding", metadata !24, i32 0, i64 32, i64 32, i64 32, i32 0, metadata !32} ; [ DW_TAG_member ] -!54 = metadata !{i32 589837, metadata !24, metadata !"__flags", metadata !24, i32 0, i64 32, i64 32, i64 64, i32 0, metadata !34} ; [ DW_TAG_member ] -!55 = metadata !{i32 589837, metadata !24, metadata !"__size", metadata !24, i32 0, i64 32, i64 32, i64 96, i32 0, metadata !34} ; [ DW_TAG_member ] -!56 = metadata !{i32 589837, metadata !24, metadata !"__copy_helper", metadata !24, i32 0, i64 32, i64 32, i64 128, i32 0, metadata !32} ; [ DW_TAG_member ] -!57 = metadata !{i32 589837, metadata !24, metadata !"__destroy_helper", metadata !24, i32 0, i64 32, i64 32, i64 160, i32 0, metadata !32} ; [ DW_TAG_member ] -!58 = metadata !{i32 589837, metadata !24, metadata !"mydata", metadata !24, i32 0, i64 32, i64 32, i64 192, i32 0, metadata !59} ; [ DW_TAG_member ] -!59 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !60} ; [ DW_TAG_pointer_type ] -!60 = metadata !{i32 589843, metadata !24, metadata !"UIMydata", metadata !61, i32 26, i64 128, i64 32, i32 0, i32 0, i32 0, metadata !62, i32 16, i32 0} ; [ DW_TAG_structure_type ] -!61 = metadata !{i32 589865, metadata !"header11.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!52 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__isa", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_member ] +!53 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__forwarding", i32 0, i64 32, i64 32, i64 32, i32 0, metadata !32} ; [ DW_TAG_member ] +!54 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__flags", i32 0, i64 32, i64 32, i64 64, i32 0, metadata !34} ; [ DW_TAG_member ] +!55 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__size", i32 0, i64 32, i64 32, i64 96, i32 0, metadata !34} ; [ DW_TAG_member ] +!56 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__copy_helper", i32 0, i64 32, i64 32, i64 128, i32 0, metadata !32} ; [ DW_TAG_member ] +!57 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"__destroy_helper", i32 0, i64 32, i64 32, i64 160, i32 0, metadata !32} ; [ DW_TAG_member ] +!58 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"mydata", i32 0, i64 32, i64 32, i64 192, i32 0, metadata !59} ; [ DW_TAG_member ] +!59 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !60} ; [ DW_TAG_pointer_type ] +!60 = metadata !{i32 786451, metadata !154, metadata !24, metadata !"UIMydata", i32 26, i64 128, i64 32, i32 0, i32 0, i32 0, metadata !62, i32 16, i32 0} ; [ DW_TAG_structure_type ] +!61 = metadata !{i32 786473, metadata !154} ; [ DW_TAG_file_type ] !62 = metadata !{metadata !63, metadata !71, metadata !75, metadata !79} -!63 = metadata !{i32 589852, metadata !60, null, metadata !61, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !64} ; [ DW_TAG_inheritance ] -!64 = metadata !{i32 589843, metadata !40, metadata !"NSO", metadata !65, i32 66, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !66, i32 16, i32 0} ; [ DW_TAG_structure_type ] -!65 = metadata !{i32 589865, metadata !"NSO.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!63 = metadata !{i32 786460, metadata !60, null, metadata !61, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !64} ; [ DW_TAG_inheritance ] +!64 = metadata !{i32 786451, metadata !155, metadata !40, metadata !"NSO", i32 66, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !66, i32 16, i32 0} ; [ DW_TAG_structure_type ] +!65 = metadata !{i32 786473, metadata !155} ; [ DW_TAG_file_type ] !66 = metadata !{metadata !67} -!67 = metadata !{i32 589837, metadata !65, metadata !"isa", metadata !65, i32 67, i64 32, i64 32, i64 0, i32 2, metadata !68, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] -!68 = metadata !{i32 589846, metadata !0, metadata !"Class", metadata !40, i32 197, i64 0, i64 0, i64 0, i32 0, metadata !69} ; [ DW_TAG_typedef ] -!69 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !70} ; [ DW_TAG_pointer_type ] -!70 = metadata !{i32 589843, metadata !0, metadata !"objc_class", metadata !40, i32 0, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] -!71 = metadata !{i32 589837, metadata !61, metadata !"_mydataRef", metadata !61, i32 28, i64 32, i64 32, i64 32, i32 0, metadata !72, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] -!72 = metadata !{i32 589846, metadata !0, metadata !"CFTypeRef", metadata !24, i32 313, i64 0, i64 0, i64 0, i32 0, metadata !73} ; [ DW_TAG_typedef ] -!73 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !74} ; [ DW_TAG_pointer_type ] -!74 = metadata !{i32 589862, metadata !0, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, null} ; [ DW_TAG_const_type ] -!75 = metadata !{i32 589837, metadata !61, metadata !"_scale", metadata !61, i32 29, i64 32, i64 32, i64 64, i32 0, metadata !76, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] -!76 = metadata !{i32 589846, metadata !0, metadata !"Float", metadata !77, i32 89, i64 0, i64 0, i64 0, i32 0, metadata !78} ; [ DW_TAG_typedef ] -!77 = metadata !{i32 589865, metadata !"header12.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] -!78 = metadata !{i32 589860, metadata !0, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!79 = metadata !{i32 589837, metadata !61, metadata !"_mydataFlags", metadata !61, i32 37, i64 8, i64 8, i64 96, i32 0, metadata !80, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] -!80 = metadata !{i32 589843, metadata !0, metadata !"", metadata !61, i32 30, i64 8, i64 8, i32 0, i32 0, i32 0, metadata !81, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!67 = metadata !{i32 786445, metadata !155, metadata !65, metadata !"isa", i32 67, i64 32, i64 32, i64 0, i32 2, metadata !68, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] +!68 = metadata !{i32 786454, metadata !0, metadata !"Class", metadata !40, i32 197, i64 0, i64 0, i64 0, i32 0, metadata !69} ; [ DW_TAG_typedef ] +!69 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !70} ; [ DW_TAG_pointer_type ] +!70 = metadata !{i32 786451, metadata !40, metadata !0, metadata !"objc_class", i32 0, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!71 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"_mydataRef", i32 28, i64 32, i64 32, i64 32, i32 0, metadata !72, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] +!72 = metadata !{i32 786454, metadata !0, metadata !"CFTypeRef", metadata !24, i32 313, i64 0, i64 0, i64 0, i32 0, metadata !73} ; [ DW_TAG_typedef ] +!73 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !74} ; [ DW_TAG_pointer_type ] +!74 = metadata !{i32 786470, null, metadata !0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null} ; [ DW_TAG_const_type ] +!75 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"_scale", i32 29, i64 32, i64 32, i64 64, i32 0, metadata !76, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] +!76 = metadata !{i32 786454, metadata !0, metadata !"Float", metadata !77, i32 89, i64 0, i64 0, i64 0, i32 0, metadata !78} ; [ DW_TAG_typedef ] +!77 = metadata !{i32 786473, metadata !156} ; [ DW_TAG_file_type ] +!78 = metadata !{i32 786468, null, metadata !0, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!79 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"_mydataFlags", i32 37, i64 8, i64 8, i64 96, i32 0, metadata !80, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] +!80 = metadata !{i32 786451, metadata !154, metadata !0, metadata !"", i32 30, i64 8, i64 8, i32 0, i32 0, i32 0, metadata !81, i32 0, i32 0} ; [ DW_TAG_structure_type ] !81 = metadata !{metadata !82, metadata !84, metadata !85, metadata !86, metadata !87, metadata !88} -!82 = metadata !{i32 589837, metadata !61, metadata !"named", metadata !61, i32 31, i64 1, i64 32, i64 0, i32 0, metadata !83} ; [ DW_TAG_member ] -!83 = metadata !{i32 589860, metadata !0, metadata !"unsigned int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!84 = metadata !{i32 589837, metadata !61, metadata !"mydataO", metadata !61, i32 32, i64 3, i64 32, i64 1, i32 0, metadata !83} ; [ DW_TAG_member ] -!85 = metadata !{i32 589837, metadata !61, metadata !"cached", metadata !61, i32 33, i64 1, i64 32, i64 4, i32 0, metadata !83} ; [ DW_TAG_member ] -!86 = metadata !{i32 589837, metadata !61, metadata !"hasBeenCached", metadata !61, i32 34, i64 1, i64 32, i64 5, i32 0, metadata !83} ; [ DW_TAG_member ] -!87 = metadata !{i32 589837, metadata !61, metadata !"hasPattern", metadata !61, i32 35, i64 1, i64 32, i64 6, i32 0, metadata !83} ; [ DW_TAG_member ] -!88 = metadata !{i32 589837, metadata !61, metadata !"isCIMydata", metadata !61, i32 36, i64 1, i64 32, i64 7, i32 0, metadata !83} ; [ DW_TAG_member ] -!89 = metadata !{i32 589837, metadata !24, metadata !"self", metadata !24, i32 609, i64 32, i64 32, i64 192, i32 0, metadata !90} ; [ DW_TAG_member ] -!90 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !91} ; [ DW_TAG_pointer_type ] -!91 = metadata !{i32 589843, metadata !40, metadata !"MyWork", metadata !24, i32 36, i64 384, i64 32, i32 0, i32 0, i32 0, metadata !92, i32 16, i32 0} ; [ DW_TAG_structure_type ] +!82 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"named", i32 31, i64 1, i64 32, i64 0, i32 0, metadata !83} ; [ DW_TAG_member ] +!83 = metadata !{i32 786468, null, metadata !0, metadata !"unsigned int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!84 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"mydataO", i32 32, i64 3, i64 32, i64 1, i32 0, metadata !83} ; [ DW_TAG_member ] +!85 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"cached", i32 33, i64 1, i64 32, i64 4, i32 0, metadata !83} ; [ DW_TAG_member ] +!86 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"hasBeenCached", i32 34, i64 1, i64 32, i64 5, i32 0, metadata !83} ; [ DW_TAG_member ] +!87 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"hasPattern", i32 35, i64 1, i64 32, i64 6, i32 0, metadata !83} ; [ DW_TAG_member ] +!88 = metadata !{i32 786445, metadata !154, metadata !61, metadata !"isCIMydata", i32 36, i64 1, i64 32, i64 7, i32 0, metadata !83} ; [ DW_TAG_member ] +!89 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"self", i32 609, i64 32, i64 32, i64 192, i32 0, metadata !90} ; [ DW_TAG_member ] +!90 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !91} ; [ DW_TAG_pointer_type ] +!91 = metadata !{i32 786451, metadata !152, metadata !40, metadata !"MyWork", i32 36, i64 384, i64 32, i32 0, i32 0, i32 0, metadata !92, i32 16, i32 0} ; [ DW_TAG_structure_type ] !92 = metadata !{metadata !93, metadata !98, metadata !101, metadata !107, metadata !123} -!93 = metadata !{i32 589852, metadata !91, null, metadata !24, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !94} ; [ DW_TAG_inheritance ] -!94 = metadata !{i32 589843, metadata !40, metadata !"twork", metadata !95, i32 43, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !96, i32 16, i32 0} ; [ DW_TAG_structure_type ] -!95 = metadata !{i32 589865, metadata !"header13.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!93 = metadata !{i32 786460, metadata !91, null, metadata !24, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !94} ; [ DW_TAG_inheritance ] +!94 = metadata !{i32 786451, metadata !157, metadata !40, metadata !"twork", i32 43, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !96, i32 16, i32 0} ; [ DW_TAG_structure_type ] +!95 = metadata !{i32 786473, metadata !157} ; [ DW_TAG_file_type ] !96 = metadata !{metadata !97} -!97 = metadata !{i32 589852, metadata !94, null, metadata !95, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !64} ; [ DW_TAG_inheritance ] -!98 = metadata !{i32 589837, metadata !24, metadata !"_itemID", metadata !24, i32 38, i64 64, i64 32, i64 32, i32 1, metadata !99, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] -!99 = metadata !{i32 589846, metadata !0, metadata !"uint64_t", metadata !40, i32 55, i64 0, i64 0, i64 0, i32 0, metadata !100} ; [ DW_TAG_typedef ] -!100 = metadata !{i32 589860, metadata !0, metadata !"long long unsigned int", null, i32 0, i64 64, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!101 = metadata !{i32 589837, metadata !24, metadata !"_library", metadata !24, i32 39, i64 32, i64 32, i64 96, i32 1, metadata !102, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] -!102 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !103} ; [ DW_TAG_pointer_type ] -!103 = metadata !{i32 589843, metadata !40, metadata !"MyLibrary2", metadata !104, i32 22, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !105, i32 16, i32 0} ; [ DW_TAG_structure_type ] -!104 = metadata !{i32 589865, metadata !"header14.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!97 = metadata !{i32 786460, metadata !94, null, metadata !95, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !64} ; [ DW_TAG_inheritance ] +!98 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"_itemID", i32 38, i64 64, i64 32, i64 32, i32 1, metadata !99, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] +!99 = metadata !{i32 786454, metadata !0, metadata !"uint64_t", metadata !40, i32 55, i64 0, i64 0, i64 0, i32 0, metadata !100} ; [ DW_TAG_typedef ] +!100 = metadata !{i32 786468, null, metadata !0, metadata !"long long unsigned int", i32 0, i64 64, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!101 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"_library", i32 39, i64 32, i64 32, i64 96, i32 1, metadata !102, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] +!102 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !103} ; [ DW_TAG_pointer_type ] +!103 = metadata !{i32 786451, metadata !158, metadata !40, metadata !"MyLibrary2", i32 22, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !105, i32 16, i32 0} ; [ DW_TAG_structure_type ] +!104 = metadata !{i32 786473, metadata !158} ; [ DW_TAG_file_type ] !105 = metadata !{metadata !106} -!106 = metadata !{i32 589852, metadata !103, null, metadata !104, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !64} ; [ DW_TAG_inheritance ] -!107 = metadata !{i32 589837, metadata !24, metadata !"_bounds", metadata !24, i32 40, i64 128, i64 32, i64 128, i32 1, metadata !108, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] -!108 = metadata !{i32 589846, metadata !0, metadata !"CR", metadata !40, i32 33, i64 0, i64 0, i64 0, i32 0, metadata !109} ; [ DW_TAG_typedef ] -!109 = metadata !{i32 589843, metadata !0, metadata !"CR", metadata !77, i32 29, i64 128, i64 32, i32 0, i32 0, i32 0, metadata !110, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!106 = metadata !{i32 786460, metadata !103, null, metadata !104, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !64} ; [ DW_TAG_inheritance ] +!107 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"_bounds", i32 40, i64 128, i64 32, i64 128, i32 1, metadata !108, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] +!108 = metadata !{i32 786454, metadata !0, metadata !"CR", metadata !40, i32 33, i64 0, i64 0, i64 0, i32 0, metadata !109} ; [ DW_TAG_typedef ] +!109 = metadata !{i32 786451, metadata !156, metadata !0, metadata !"CR", i32 29, i64 128, i64 32, i32 0, i32 0, i32 0, metadata !110, i32 0, i32 0} ; [ DW_TAG_structure_type ] !110 = metadata !{metadata !111, metadata !117} -!111 = metadata !{i32 589837, metadata !77, metadata !"origin", metadata !77, i32 30, i64 64, i64 32, i64 0, i32 0, metadata !112} ; [ DW_TAG_member ] -!112 = metadata !{i32 589846, metadata !0, metadata !"CP", metadata !77, i32 17, i64 0, i64 0, i64 0, i32 0, metadata !113} ; [ DW_TAG_typedef ] -!113 = metadata !{i32 589843, metadata !0, metadata !"CP", metadata !77, i32 13, i64 64, i64 32, i32 0, i32 0, i32 0, metadata !114, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!111 = metadata !{i32 786445, metadata !156, metadata !77, metadata !"origin", i32 30, i64 64, i64 32, i64 0, i32 0, metadata !112} ; [ DW_TAG_member ] +!112 = metadata !{i32 786454, metadata !0, metadata !"CP", metadata !77, i32 17, i64 0, i64 0, i64 0, i32 0, metadata !113} ; [ DW_TAG_typedef ] +!113 = metadata !{i32 786451, metadata !156, metadata !0, metadata !"CP", i32 13, i64 64, i64 32, i32 0, i32 0, i32 0, metadata !114, i32 0, i32 0} ; [ DW_TAG_structure_type ] !114 = metadata !{metadata !115, metadata !116} -!115 = metadata !{i32 589837, metadata !77, metadata !"x", metadata !77, i32 14, i64 32, i64 32, i64 0, i32 0, metadata !76} ; [ DW_TAG_member ] -!116 = metadata !{i32 589837, metadata !77, metadata !"y", metadata !77, i32 15, i64 32, i64 32, i64 32, i32 0, metadata !76} ; [ DW_TAG_member ] -!117 = metadata !{i32 589837, metadata !77, metadata !"size", metadata !77, i32 31, i64 64, i64 32, i64 64, i32 0, metadata !118} ; [ DW_TAG_member ] -!118 = metadata !{i32 589846, metadata !0, metadata !"Size", metadata !77, i32 25, i64 0, i64 0, i64 0, i32 0, metadata !119} ; [ DW_TAG_typedef ] -!119 = metadata !{i32 589843, metadata !0, metadata !"Size", metadata !77, i32 21, i64 64, i64 32, i32 0, i32 0, i32 0, metadata !120, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!115 = metadata !{i32 786445, metadata !156, metadata !77, metadata !"x", i32 14, i64 32, i64 32, i64 0, i32 0, metadata !76} ; [ DW_TAG_member ] +!116 = metadata !{i32 786445, metadata !156, metadata !77, metadata !"y", i32 15, i64 32, i64 32, i64 32, i32 0, metadata !76} ; [ DW_TAG_member ] +!117 = metadata !{i32 786445, metadata !156, metadata !77, metadata !"size", i32 31, i64 64, i64 32, i64 64, i32 0, metadata !118} ; [ DW_TAG_member ] +!118 = metadata !{i32 786454, metadata !0, metadata !"Size", metadata !77, i32 25, i64 0, i64 0, i64 0, i32 0, metadata !119} ; [ DW_TAG_typedef ] +!119 = metadata !{i32 786451, metadata !156, metadata !0, metadata !"Size", i32 21, i64 64, i64 32, i32 0, i32 0, i32 0, metadata !120, i32 0, i32 0} ; [ DW_TAG_structure_type ] !120 = metadata !{metadata !121, metadata !122} -!121 = metadata !{i32 589837, metadata !77, metadata !"width", metadata !77, i32 22, i64 32, i64 32, i64 0, i32 0, metadata !76} ; [ DW_TAG_member ] -!122 = metadata !{i32 589837, metadata !77, metadata !"height", metadata !77, i32 23, i64 32, i64 32, i64 32, i32 0, metadata !76} ; [ DW_TAG_member ] -!123 = metadata !{i32 589837, metadata !24, metadata !"_data", metadata !24, i32 40, i64 128, i64 32, i64 256, i32 1, metadata !108, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] -!124 = metadata !{i32 589837, metadata !24, metadata !"semi", metadata !24, i32 609, i64 32, i64 32, i64 224, i32 0, metadata !125} ; [ DW_TAG_member ] -!125 = metadata !{i32 589846, metadata !0, metadata !"d_t", metadata !24, i32 35, i64 0, i64 0, i64 0, i32 0, metadata !126} ; [ DW_TAG_typedef ] -!126 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !127} ; [ DW_TAG_pointer_type ] -!127 = metadata !{i32 589843, metadata !0, metadata !"my_struct", metadata !128, i32 49, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] -!128 = metadata !{i32 589865, metadata !"header15.h", metadata !"/Volumes/Sandbox/llvm", metadata !0} ; [ DW_TAG_file_type ] +!121 = metadata !{i32 786445, metadata !156, metadata !77, metadata !"width", i32 22, i64 32, i64 32, i64 0, i32 0, metadata !76} ; [ DW_TAG_member ] +!122 = metadata !{i32 786445, metadata !156, metadata !77, metadata !"height", i32 23, i64 32, i64 32, i64 32, i32 0, metadata !76} ; [ DW_TAG_member ] +!123 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"_data", i32 40, i64 128, i64 32, i64 256, i32 1, metadata !108, metadata !"", metadata !"", metadata !"", i32 0} ; [ DW_TAG_member ] +!124 = metadata !{i32 786445, metadata !152, metadata !24, metadata !"semi", i32 609, i64 32, i64 32, i64 224, i32 0, metadata !125} ; [ DW_TAG_member ] +!125 = metadata !{i32 786454, metadata !0, metadata !"d_t", metadata !24, i32 35, i64 0, i64 0, i64 0, i32 0, metadata !126} ; [ DW_TAG_typedef ] +!126 = metadata !{i32 786447, null, metadata !0, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !127} ; [ DW_TAG_pointer_type ] +!127 = metadata !{i32 786451, metadata !159, metadata !0, metadata !"my_struct", i32 49, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!128 = metadata !{i32 786473, metadata !159} ; [ DW_TAG_file_type ] !129 = metadata !{i32 609, i32 144, metadata !23, null} -!130 = metadata !{i32 590081, metadata !23, metadata !"loadedMydata", metadata !24, i32 33555041, metadata !59, i32 0} ; [ DW_TAG_arg_variable ] +!130 = metadata !{i32 786689, metadata !23, metadata !"loadedMydata", metadata !24, i32 33555041, metadata !59, i32 0, null} ; [ DW_TAG_arg_variable ] !131 = metadata !{i32 609, i32 155, metadata !23, null} -!132 = metadata !{i32 590081, metadata !23, metadata !"bounds", metadata !24, i32 50332257, metadata !108, i32 0} ; [ DW_TAG_arg_variable ] +!132 = metadata !{i32 786689, metadata !23, metadata !"bounds", metadata !24, i32 50332257, metadata !108, i32 0, null} ; [ DW_TAG_arg_variable ] !133 = metadata !{i32 609, i32 175, metadata !23, null} -!134 = metadata !{i32 590081, metadata !23, metadata !"data", metadata !24, i32 67109473, metadata !108, i32 0} ; [ DW_TAG_arg_variable ] +!134 = metadata !{i32 786689, metadata !23, metadata !"data", metadata !24, i32 67109473, metadata !108, i32 0, null} ; [ DW_TAG_arg_variable ] !135 = metadata !{i32 609, i32 190, metadata !23, null} -!136 = metadata !{i32 590080, metadata !23, metadata !"mydata", metadata !24, i32 604, metadata !50, i32 0, i64 1, i64 20, i64 2, i64 1, i64 4, i64 2, i64 1, i64 24} ; [ DW_TAG_auto_variable ] +!136 = metadata !{i32 786688, metadata !23, metadata !"mydata", metadata !24, i32 604, metadata !50, i32 0, null, i64 1, i64 20, i64 2, i64 1, i64 4, i64 2, i64 1, i64 24} ; [ DW_TAG_auto_variable ] !137 = metadata !{i32 604, i32 49, metadata !23, null} -!138 = metadata !{i32 590080, metadata !23, metadata !"self", metadata !40, i32 604, metadata !90, i32 0, i64 1, i64 24} ; [ DW_TAG_auto_variable ] -!139 = metadata !{i32 590080, metadata !23, metadata !"semi", metadata !24, i32 607, metadata !125, i32 0, i64 1, i64 28} ; [ DW_TAG_auto_variable ] +!138 = metadata !{i32 786688, metadata !23, metadata !"self", metadata !40, i32 604, metadata !90, i32 0, null, i64 1, i64 24} ; [ DW_TAG_auto_variable ] +!139 = metadata !{i32 786688, metadata !23, metadata !"semi", metadata !24, i32 607, metadata !125, i32 0, null, i64 1, i64 28} ; [ DW_TAG_auto_variable ] !140 = metadata !{i32 607, i32 30, metadata !23, null} !141 = metadata !{i32 610, i32 17, metadata !142, null} -!142 = metadata !{i32 589835, metadata !23, i32 609, i32 200, metadata !24, i32 94} ; [ DW_TAG_lexical_block ] +!142 = metadata !{i32 786443, metadata !23, i32 609, i32 200, metadata !24, i32 94} ; [ DW_TAG_lexical_block ] !143 = metadata !{i32 611, i32 17, metadata !142, null} !144 = metadata !{i32 612, i32 17, metadata !142, null} !145 = metadata !{i32 613, i32 17, metadata !142, null} !146 = metadata !{i32 615, i32 13, metadata !142, null} +!147 = metadata !{metadata !1, metadata !1, metadata !5, metadata !5, metadata !9, metadata !14, metadata !19, metadata !19, metadata !14, metadata !14, metadata !14, metadata !19, metadata !19, metadata !19} +!148 = metadata !{metadata !23} +!149 = metadata !{metadata !"header3.h", metadata !"/Volumes/Sandbox/llvm"} +!150 = metadata !{metadata !"Private.h", metadata !"/Volumes/Sandbox/llvm"} +!151 = metadata !{metadata !"header4.h", metadata !"/Volumes/Sandbox/llvm"} +!152 = metadata !{metadata !"MyLibrary.m", metadata !"/Volumes/Sandbox/llvm"} +!153 = metadata !{metadata !"MyLibrary.i", metadata !"/Volumes/Sandbox/llvm"} +!154 = metadata !{metadata !"header11.h", metadata !"/Volumes/Sandbox/llvm"} +!155 = metadata !{metadata !"NSO.h", metadata !"/Volumes/Sandbox/llvm"} +!156 = metadata !{metadata !"header12.h", metadata !"/Volumes/Sandbox/llvm"} +!157 = metadata !{metadata !"header13.h", metadata !"/Volumes/Sandbox/llvm"} +!158 = metadata !{metadata !"header14.h", metadata !"/Volumes/Sandbox/llvm"} +!159 = metadata !{metadata !"header15.h", metadata !"/Volumes/Sandbox/llvm"} +!160 = metadata !{metadata !"header.h", metadata !"/Volumes/Sandbox/llvm"} +!161 = metadata !{metadata !"header2.h", metadata !"/Volumes/Sandbox/llvm"} diff --git a/test/CodeGen/ARM/debug-info-branch-folding.ll b/test/CodeGen/ARM/debug-info-branch-folding.ll index 4f4ff8e81707..95e6cf2554a0 100644 --- a/test/CodeGen/ARM/debug-info-branch-folding.ll +++ b/test/CodeGen/ARM/debug-info-branch-folding.ll @@ -3,7 +3,7 @@ target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32- target triple = "thumbv7-apple-macosx10.6.7" ;CHECK: vadd.f32 q4, q8, q8 -;CHECK-NEXT: Ltmp1 +;CHECK-NEXT: LBB0_1 ;CHECK:@DEBUG_VALUE: x <- Q4+0 ;CHECK-NEXT:@DEBUG_VALUE: y <- Q4+0 @@ -38,58 +38,59 @@ declare i32 @printf(i8* nocapture, ...) nounwind declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0, !10, !14} -!llvm.dbg.lv.test0001 = !{!18} -!llvm.dbg.lv.main = !{!19, !20, !24, !26, !27, !28, !29} -!llvm.dbg.lv.printFV = !{!30} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"test0001", metadata !"test0001", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, <4 x float> (float)* @test0001, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"build2.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"build2.c", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 129915)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, i32 0, metadata !1, metadata !"test0001", metadata !"test0001", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, <4 x float> (float)* @test0001, null, null, metadata !51, i32 0} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !54} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !54, i32 12, metadata !"clang version 3.0 (trunk 129915)", i1 true, metadata !"", i32 0, null, null, metadata !50, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !54, metadata !1, metadata !"", 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 589846, metadata !2, metadata !"v4f32", metadata !1, i32 14, i64 0, i64 0, i64 0, i32 0, metadata !6} ; [ DW_TAG_typedef ] -!6 = metadata !{i32 590083, metadata !2, metadata !"", metadata !2, i32 0, i64 128, i64 128, i32 0, i32 0, metadata !7, metadata !8, i32 0, i32 0} ; [ DW_TAG_vector_type ] -!7 = metadata !{i32 589860, metadata !2, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!5 = metadata !{i32 786454, metadata !54, metadata !2, metadata !"v4f32", i32 14, i64 0, i64 0, i64 0, i32 0, metadata !6} ; [ DW_TAG_typedef ] +!6 = metadata !{i32 786691, metadata !2, metadata !"", metadata !2, i32 0, i64 128, i64 128, i32 0, i32 0, metadata !7, metadata !8, i32 0, i32 0} ; [ DW_TAG_vector_type ] +!7 = metadata !{i32 786468, null, metadata !2, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] !8 = metadata !{metadata !9} -!9 = metadata !{i32 589857, i64 0, i64 3} ; [ DW_TAG_subrange_type ] -!10 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 59, metadata !11, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i8**, i1)* @main, null} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!9 = metadata !{i32 786465, i64 0, i64 4} ; [ DW_TAG_subrange_type ] +!10 = metadata !{i32 786478, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 59, metadata !11, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i8**, i1)* @main, null, null, metadata !52, i32 0} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 786453, metadata !54, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !12 = metadata !{metadata !13} -!13 = metadata !{i32 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!14 = metadata !{i32 589870, i32 0, metadata !15, metadata !"printFV", metadata !"printFV", metadata !"", metadata !15, i32 41, metadata !16, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, null, null} ; [ DW_TAG_subprogram ] -!15 = metadata !{i32 589865, metadata !"/Volumes/Lalgate/work/llvm/projects/llvm-test/SingleSource/UnitTests/Vector/helpers.h", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!16 = metadata !{i32 589845, metadata !15, metadata !"", metadata !15, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !17, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!13 = metadata !{i32 786468, null, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786478, i32 0, metadata !15, metadata !"printFV", metadata !"printFV", metadata !"", metadata !15, i32 41, metadata !16, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, null, null, null, metadata !53, i32 0} ; [ DW_TAG_subprogram ] +!15 = metadata !{i32 786473, metadata !55} ; [ DW_TAG_file_type ] +!16 = metadata !{i32 786453, metadata !55, metadata !15, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !17, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !17 = metadata !{null} -!18 = metadata !{i32 590081, metadata !0, metadata !"a", metadata !1, i32 16777219, metadata !7, i32 0} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 590081, metadata !10, metadata !"argc", metadata !1, i32 16777275, metadata !13, i32 0} ; [ DW_TAG_arg_variable ] -!20 = metadata !{i32 590081, metadata !10, metadata !"argv", metadata !1, i32 33554491, metadata !21, i32 0} ; [ DW_TAG_arg_variable ] -!21 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !22} ; [ DW_TAG_pointer_type ] -!22 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !23} ; [ DW_TAG_pointer_type ] -!23 = metadata !{i32 589860, metadata !2, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!24 = metadata !{i32 590080, metadata !25, metadata !"i", metadata !1, i32 60, metadata !13, i32 0} ; [ DW_TAG_auto_variable ] -!25 = metadata !{i32 589835, metadata !10, i32 59, i32 33, metadata !1, i32 14} ; [ DW_TAG_lexical_block ] -!26 = metadata !{i32 590080, metadata !25, metadata !"j", metadata !1, i32 60, metadata !13, i32 0} ; [ DW_TAG_auto_variable ] -!27 = metadata !{i32 590080, metadata !25, metadata !"x", metadata !1, i32 61, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!28 = metadata !{i32 590080, metadata !25, metadata !"y", metadata !1, i32 62, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!29 = metadata !{i32 590080, metadata !25, metadata !"z", metadata !1, i32 63, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!30 = metadata !{i32 590081, metadata !14, metadata !"F", metadata !15, i32 16777257, metadata !31, i32 0} ; [ DW_TAG_arg_variable ] -!31 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_pointer_type ] -!32 = metadata !{i32 589846, metadata !2, metadata !"FV", metadata !15, i32 25, i64 0, i64 0, i64 0, i32 0, metadata !33} ; [ DW_TAG_typedef ] -!33 = metadata !{i32 589847, metadata !2, metadata !"", metadata !15, i32 22, i64 128, i64 128, i64 0, i32 0, i32 0, metadata !34, i32 0, i32 0} ; [ DW_TAG_union_type ] +!18 = metadata !{i32 786689, metadata !0, metadata !"a", metadata !1, i32 16777219, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786689, metadata !10, metadata !"argc", metadata !1, i32 16777275, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] +!20 = metadata !{i32 786689, metadata !10, metadata !"argv", metadata !1, i32 33554491, metadata !21, i32 0, null} ; [ DW_TAG_arg_variable ] +!21 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !22} ; [ DW_TAG_pointer_type ] +!22 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !23} ; [ DW_TAG_pointer_type ] +!23 = metadata !{i32 786468, null, metadata !2, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!24 = metadata !{i32 786688, metadata !25, metadata !"i", metadata !1, i32 60, metadata !13, i32 0, null} ; [ DW_TAG_auto_variable ] +!25 = metadata !{i32 786443, metadata !1, metadata !10, i32 59, i32 33, i32 14} ; [ DW_TAG_lexical_block ] +!26 = metadata !{i32 786688, metadata !25, metadata !"j", metadata !1, i32 60, metadata !13, i32 0, null} ; [ DW_TAG_auto_variable ] +!27 = metadata !{i32 786688, metadata !25, metadata !"x", metadata !1, i32 61, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!28 = metadata !{i32 786688, metadata !25, metadata !"y", metadata !1, i32 62, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!29 = metadata !{i32 786688, metadata !25, metadata !"z", metadata !1, i32 63, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!30 = metadata !{i32 786689, metadata !14, metadata !"F", metadata !15, i32 16777257, metadata !31, i32 0, null} ; [ DW_TAG_arg_variable ] +!31 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_pointer_type ] +!32 = metadata !{i32 786454, metadata !55, metadata !2, metadata !"FV", i32 25, i64 0, i64 0, i64 0, i32 0, metadata !33} ; [ DW_TAG_typedef ] +!33 = metadata !{i32 786455, metadata !55, metadata !2, metadata !"", i32 22, i64 128, i64 128, i64 0, i32 0, i32 0, metadata !34, i32 0, i32 0} ; [ DW_TAG_union_type ] !34 = metadata !{metadata !35, metadata !37} -!35 = metadata !{i32 589837, metadata !15, metadata !"V", metadata !15, i32 23, i64 128, i64 128, i64 0, i32 0, metadata !36} ; [ DW_TAG_member ] -!36 = metadata !{i32 589846, metadata !2, metadata !"v4sf", metadata !15, i32 3, i64 0, i64 0, i64 0, i32 0, metadata !6} ; [ DW_TAG_typedef ] -!37 = metadata !{i32 589837, metadata !15, metadata !"A", metadata !15, i32 24, i64 128, i64 32, i64 0, i32 0, metadata !38} ; [ DW_TAG_member ] -!38 = metadata !{i32 589825, metadata !2, metadata !"", metadata !2, i32 0, i64 128, i64 32, i32 0, i32 0, metadata !7, metadata !8, i32 0, i32 0} ; [ DW_TAG_array_type ] +!35 = metadata !{i32 786445, metadata !55, metadata !15, metadata !"V", i32 23, i64 128, i64 128, i64 0, i32 0, metadata !36} ; [ DW_TAG_member ] +!36 = metadata !{i32 786454, metadata !55, metadata !2, metadata !"v4sf", i32 3, i64 0, i64 0, i64 0, i32 0, metadata !6} ; [ DW_TAG_typedef ] +!37 = metadata !{i32 786445, metadata !55, metadata !15, metadata !"A", i32 24, i64 128, i64 32, i64 0, i32 0, metadata !38} ; [ DW_TAG_member ] +!38 = metadata !{i32 786433, null, metadata !2, metadata !"", i32 0, i64 128, i64 32, i32 0, i32 0, metadata !7, metadata !8, i32 0, i32 0} ; [ DW_TAG_array_type ] !39 = metadata !{i32 79, i32 7, metadata !40, null} -!40 = metadata !{i32 589835, metadata !41, i32 75, i32 35, metadata !1, i32 18} ; [ DW_TAG_lexical_block ] -!41 = metadata !{i32 589835, metadata !42, i32 75, i32 5, metadata !1, i32 17} ; [ DW_TAG_lexical_block ] -!42 = metadata !{i32 589835, metadata !43, i32 71, i32 32, metadata !1, i32 16} ; [ DW_TAG_lexical_block ] -!43 = metadata !{i32 589835, metadata !25, i32 71, i32 3, metadata !1, i32 15} ; [ DW_TAG_lexical_block ] +!40 = metadata !{i32 786443, metadata !1, metadata !41, i32 75, i32 35, i32 18} ; [ DW_TAG_lexical_block ] +!41 = metadata !{i32 786443, metadata !1, metadata !42, i32 75, i32 5, i32 17} ; [ DW_TAG_lexical_block ] +!42 = metadata !{i32 786443, metadata !1, metadata !43, i32 71, i32 32, i32 16} ; [ DW_TAG_lexical_block ] +!43 = metadata !{i32 786443, metadata !1, metadata !25, i32 71, i32 3, i32 15} ; [ DW_TAG_lexical_block ] !44 = metadata !{i32 75, i32 5, metadata !42, null} !45 = metadata !{i32 42, i32 2, metadata !46, metadata !48} -!46 = metadata !{i32 589835, metadata !47, i32 42, i32 2, metadata !15, i32 20} ; [ DW_TAG_lexical_block ] -!47 = metadata !{i32 589835, metadata !14, i32 41, i32 28, metadata !15, i32 19} ; [ DW_TAG_lexical_block ] +!46 = metadata !{i32 786443, metadata !15, metadata !47, i32 42, i32 2, i32 20} ; [ DW_TAG_lexical_block ] +!47 = metadata !{i32 786443, metadata !15, metadata !14, i32 41, i32 28, i32 19} ; [ DW_TAG_lexical_block ] !48 = metadata !{i32 95, i32 3, metadata !25, null} !49 = metadata !{i32 99, i32 3, metadata !25, null} +!50 = metadata !{metadata !0, metadata !10, metadata !14} +!51 = metadata !{metadata !18} +!52 = metadata !{metadata !19, metadata !20, metadata !24, metadata !26, metadata !27, metadata !28, metadata !29} +!53 = metadata !{metadata !30} +!54 = metadata !{metadata !"build2.c", metadata !"/private/tmp"} +!55 = metadata !{metadata !"/Volumes/Lalgate/work/llvm/projects/llvm-test/SingleSource/UnitTests/Vector/helpers.h", metadata !"/private/tmp"} diff --git a/test/CodeGen/ARM/debug-info-d16-reg.ll b/test/CodeGen/ARM/debug-info-d16-reg.ll index 325eea00c8d6..e3e4d068932e 100644 --- a/test/CodeGen/ARM/debug-info-d16-reg.ll +++ b/test/CodeGen/ARM/debug-info-d16-reg.ll @@ -56,44 +56,41 @@ entry: declare i32 @puts(i8* nocapture) nounwind -!llvm.dbg.sp = !{!0, !9, !10} -!llvm.dbg.lv.printer = !{!16, !17, !18} -!llvm.dbg.lv.inlineprinter = !{!19, !20, !21} -!llvm.dbg.lv.main = !{!22, !23, !24} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"printer", metadata !"printer", metadata !"printer", metadata !1, i32 12, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i8*, double, i8)* @printer} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"a.c", metadata !"/tmp/", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 1, metadata !"/tmp/a.c", metadata !"/tmp", metadata !"(LLVM build 00)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"printer", metadata !"printer", metadata !"printer", metadata !1, i32 12, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i8*, double, i8)* @printer, null, null, metadata !43, i32 12} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !46} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 1, metadata !1, metadata !"(LLVM build 00)", i1 true, metadata !"", i32 0, null, null, metadata !42, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] !4 = metadata !{metadata !5, metadata !6, metadata !7, metadata !8} -!5 = metadata !{i32 589860, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589839, metadata !1, metadata !"", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] -!7 = metadata !{i32 589860, metadata !1, metadata !"double", metadata !1, i32 0, i64 64, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!8 = metadata !{i32 589860, metadata !1, metadata !"unsigned char", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, i32 8} ; [ DW_TAG_base_type ] -!9 = metadata !{i32 589870, i32 0, metadata !1, metadata !"inlineprinter", metadata !"inlineprinter", metadata !"inlineprinter", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i8*, double, i8)* @inlineprinter} ; [ DW_TAG_subprogram ] -!10 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 18, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i8**)* @main} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{i32 786468, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786447, metadata !1, metadata !"", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!7 = metadata !{i32 786468, metadata !1, metadata !"double", metadata !1, i32 0, i64 64, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 786468, metadata !1, metadata !"unsigned char", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, i32 8} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786478, metadata !1, metadata !"inlineprinter", metadata !"inlineprinter", metadata !"inlineprinter", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i8*, double, i8)* @inlineprinter, null, null, metadata !44, i32 5} ; [ DW_TAG_subprogram ] +!10 = metadata !{i32 786478, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 18, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i8**)* @main, null, null, metadata !45, i32 18} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null} ; [ DW_TAG_subroutine_type ] !12 = metadata !{metadata !5, metadata !5, metadata !13} -!13 = metadata !{i32 589839, metadata !1, metadata !"", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !14} ; [ DW_TAG_pointer_type ] -!14 = metadata !{i32 589839, metadata !1, metadata !"", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !15} ; [ DW_TAG_pointer_type ] -!15 = metadata !{i32 589860, metadata !1, metadata !"char", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!16 = metadata !{i32 590081, metadata !0, metadata !"ptr", metadata !1, i32 11, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] -!17 = metadata !{i32 590081, metadata !0, metadata !"val", metadata !1, i32 11, metadata !7, i32 0} ; [ DW_TAG_arg_variable ] -!18 = metadata !{i32 590081, metadata !0, metadata !"c", metadata !1, i32 11, metadata !8, i32 0} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 590081, metadata !9, metadata !"ptr", metadata !1, i32 4, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] -!20 = metadata !{i32 590081, metadata !9, metadata !"val", metadata !1, i32 4, metadata !7, i32 0} ; [ DW_TAG_arg_variable ] -!21 = metadata !{i32 590081, metadata !9, metadata !"c", metadata !1, i32 4, metadata !8, i32 0} ; [ DW_TAG_arg_variable ] -!22 = metadata !{i32 590081, metadata !10, metadata !"argc", metadata !1, i32 17, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!23 = metadata !{i32 590081, metadata !10, metadata !"argv", metadata !1, i32 17, metadata !13, i32 0} ; [ DW_TAG_arg_variable ] -!24 = metadata !{i32 590080, metadata !25, metadata !"dval", metadata !1, i32 19, metadata !7, i32 0} ; [ DW_TAG_auto_variable ] -!25 = metadata !{i32 589835, metadata !10, i32 18, i32 0, metadata !1, i32 2} ; [ DW_TAG_lexical_block ] +!13 = metadata !{i32 786447, metadata !1, metadata !"", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !14} ; [ DW_TAG_pointer_type ] +!14 = metadata !{i32 786447, metadata !1, metadata !"", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !15} ; [ DW_TAG_pointer_type ] +!15 = metadata !{i32 786468, metadata !1, metadata !"char", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!16 = metadata !{i32 786689, metadata !0, metadata !"ptr", metadata !1, i32 11, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!17 = metadata !{i32 786689, metadata !0, metadata !"val", metadata !1, i32 11, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!18 = metadata !{i32 786689, metadata !0, metadata !"c", metadata !1, i32 11, metadata !8, i32 0, null} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786689, metadata !9, metadata !"ptr", metadata !1, i32 4, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!20 = metadata !{i32 786689, metadata !9, metadata !"val", metadata !1, i32 4, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!21 = metadata !{i32 786689, metadata !9, metadata !"c", metadata !1, i32 4, metadata !8, i32 0, null} ; [ DW_TAG_arg_variable ] +!22 = metadata !{i32 786689, metadata !10, metadata !"argc", metadata !1, i32 17, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!23 = metadata !{i32 786689, metadata !10, metadata !"argv", metadata !1, i32 17, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] +!24 = metadata !{i32 786688, metadata !25, metadata !"dval", metadata !1, i32 19, metadata !7, i32 0, null} ; [ DW_TAG_auto_variable ] +!25 = metadata !{i32 786443, metadata !1, metadata !10, i32 18, i32 0, i32 2} ; [ DW_TAG_lexical_block ] !26 = metadata !{i32 4, i32 0, metadata !9, null} !27 = metadata !{i32 6, i32 0, metadata !28, null} -!28 = metadata !{i32 589835, metadata !9, i32 5, i32 0, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] +!28 = metadata !{i32 786443, metadata !1, metadata !9, i32 5, i32 0, i32 1} ; [ DW_TAG_lexical_block ] !29 = metadata !{i32 7, i32 0, metadata !28, null} !30 = metadata !{i32 11, i32 0, metadata !0, null} !31 = metadata !{i32 13, i32 0, metadata !32, null} -!32 = metadata !{i32 589835, metadata !0, i32 12, i32 0, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!32 = metadata !{i32 786443, metadata !1, metadata !0, i32 12, i32 0, i32 0} ; [ DW_TAG_lexical_block ] !33 = metadata !{i32 14, i32 0, metadata !32, null} !34 = metadata !{i32 17, i32 0, metadata !10, null} !35 = metadata !{i32 19, i32 0, metadata !25, null} @@ -103,3 +100,8 @@ declare i32 @puts(i8* nocapture) nounwind !39 = metadata !{i32 6, i32 0, metadata !28, metadata !37} !40 = metadata !{i32 22, i32 0, metadata !25, null} !41 = metadata !{i32 23, i32 0, metadata !25, null} +!42 = metadata !{metadata !0, metadata !9, metadata !10} +!43 = metadata !{metadata !16, metadata !17, metadata !18} +!44 = metadata !{metadata !19, metadata !20, metadata !21} +!45 = metadata !{metadata !22, metadata !23, metadata !24} +!46 = metadata !{metadata !"a.c", metadata !"/tmp/"} diff --git a/test/CodeGen/ARM/debug-info-qreg.ll b/test/CodeGen/ARM/debug-info-qreg.ll index 97c9c66c58aa..038c2296cdbe 100644 --- a/test/CodeGen/ARM/debug-info-qreg.ll +++ b/test/CodeGen/ARM/debug-info-qreg.ll @@ -35,58 +35,61 @@ declare i32 @printf(i8* nocapture, ...) nounwind declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0, !10, !14} -!llvm.dbg.lv.test0001 = !{!18} -!llvm.dbg.lv.main = !{!19, !20, !24, !26, !27, !28, !29} -!llvm.dbg.lv.printFV = !{!30} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"test0001", metadata !"test0001", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, <4 x float> (float)* @test0001, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"build2.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"build2.c", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 129915)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"test0001", metadata !"test0001", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, <4 x float> (float)* @test0001, null, null, metadata !51, i32 3} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !54} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !54, i32 12, metadata !"clang version 3.0 (trunk 129915)", i1 true, metadata !"", i32 0, null, null, metadata !50, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !54, metadata !1, metadata !"", 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 589846, metadata !2, metadata !"v4f32", metadata !1, i32 14, i64 0, i64 0, i64 0, i32 0, metadata !6} ; [ DW_TAG_typedef ] -!6 = metadata !{i32 590083, metadata !2, metadata !"", metadata !2, i32 0, i64 128, i64 128, i32 0, i32 0, metadata !7, metadata !8, i32 0, i32 0} ; [ DW_TAG_vector_type ] -!7 = metadata !{i32 589860, metadata !2, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!5 = metadata !{i32 786454, metadata !54, metadata !2, metadata !"v4f32", i32 14, i64 0, i64 0, i64 0, i32 0, metadata !6} ; [ DW_TAG_typedef ] +!6 = metadata !{i32 786691, metadata !2, metadata !"", metadata !2, i32 0, i64 128, i64 128, i32 0, i32 0, metadata !7, metadata !8, i32 0, i32 0} ; [ DW_TAG_vector_type ] +!7 = metadata !{i32 786468, null, metadata !2, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] !8 = metadata !{metadata !9} -!9 = metadata !{i32 589857, i64 0, i64 3} ; [ DW_TAG_subrange_type ] -!10 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 59, metadata !11, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i8**)* @main, null} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!9 = metadata !{i32 786465, i64 0, i64 4} ; [ DW_TAG_subrange_type ] +!10 = metadata !{i32 786478, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 59, metadata !11, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i8**)* @main, null, null, metadata !52, i32 59} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 786453, metadata !54, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !12 = metadata !{metadata !13} -!13 = metadata !{i32 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!14 = metadata !{i32 589870, i32 0, metadata !15, metadata !"printFV", metadata !"printFV", metadata !"", metadata !15, i32 41, metadata !16, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, null, null} ; [ DW_TAG_subprogram ] -!15 = metadata !{i32 589865, metadata !"/Volumes/Lalgate/work/llvm/projects/llvm-test/SingleSource/UnitTests/Vector/helpers.h", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!16 = metadata !{i32 589845, metadata !15, metadata !"", metadata !15, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !17, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!13 = metadata !{i32 786468, null, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786478, metadata !15, metadata !"printFV", metadata !"printFV", metadata !"", metadata !15, i32 41, metadata !16, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, null, null, null, metadata !53, i32 41} ; [ DW_TAG_subprogram ] +!15 = metadata !{i32 786473, metadata !55} ; [ DW_TAG_file_type ] +!16 = metadata !{i32 786453, metadata !55, metadata !15, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !17, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !17 = metadata !{null} -!18 = metadata !{i32 590081, metadata !0, metadata !"a", metadata !1, i32 16777219, metadata !7, i32 0} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 590081, metadata !10, metadata !"argc", metadata !1, i32 16777275, metadata !13, i32 0} ; [ DW_TAG_arg_variable ] -!20 = metadata !{i32 590081, metadata !10, metadata !"argv", metadata !1, i32 33554491, metadata !21, i32 0} ; [ DW_TAG_arg_variable ] -!21 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !22} ; [ DW_TAG_pointer_type ] -!22 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !23} ; [ DW_TAG_pointer_type ] -!23 = metadata !{i32 589860, metadata !2, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!24 = metadata !{i32 590080, metadata !25, metadata !"i", metadata !1, i32 60, metadata !13, i32 0} ; [ DW_TAG_auto_variable ] -!25 = metadata !{i32 589835, metadata !10, i32 59, i32 33, metadata !1, i32 14} ; [ DW_TAG_lexical_block ] -!26 = metadata !{i32 590080, metadata !25, metadata !"j", metadata !1, i32 60, metadata !13, i32 0} ; [ DW_TAG_auto_variable ] -!27 = metadata !{i32 590080, metadata !25, metadata !"x", metadata !1, i32 61, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!28 = metadata !{i32 590080, metadata !25, metadata !"y", metadata !1, i32 62, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!29 = metadata !{i32 590080, metadata !25, metadata !"z", metadata !1, i32 63, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!30 = metadata !{i32 590081, metadata !14, metadata !"F", metadata !15, i32 16777257, metadata !31, i32 0} ; [ DW_TAG_arg_variable ] -!31 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_pointer_type ] -!32 = metadata !{i32 589846, metadata !2, metadata !"FV", metadata !15, i32 25, i64 0, i64 0, i64 0, i32 0, metadata !33} ; [ DW_TAG_typedef ] -!33 = metadata !{i32 589847, metadata !2, metadata !"", metadata !15, i32 22, i64 128, i64 128, i64 0, i32 0, i32 0, metadata !34, i32 0, i32 0} ; [ DW_TAG_union_type ] +!18 = metadata !{i32 786689, metadata !0, metadata !"a", metadata !1, i32 16777219, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786689, metadata !10, metadata !"argc", metadata !1, i32 16777275, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] +!20 = metadata !{i32 786689, metadata !10, metadata !"argv", metadata !1, i32 33554491, metadata !21, i32 0, null} ; [ DW_TAG_arg_variable ] +!21 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !22} ; [ DW_TAG_pointer_type ] +!22 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !23} ; [ DW_TAG_pointer_type ] +!23 = metadata !{i32 786468, null, metadata !2, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!24 = metadata !{i32 786688, metadata !25, metadata !"i", metadata !1, i32 60, metadata !13, i32 0, null} ; [ DW_TAG_auto_variable ] +!25 = metadata !{i32 786443, metadata !1, metadata !10, i32 59, i32 33, i32 14} ; [ DW_TAG_lexical_block ] +!26 = metadata !{i32 786688, metadata !25, metadata !"j", metadata !1, i32 60, metadata !13, i32 0, null} ; [ DW_TAG_auto_variable ] +!27 = metadata !{i32 786688, metadata !25, metadata !"x", metadata !1, i32 61, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!28 = metadata !{i32 786688, metadata !25, metadata !"y", metadata !1, i32 62, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!29 = metadata !{i32 786688, metadata !25, metadata !"z", metadata !1, i32 63, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!30 = metadata !{i32 786689, metadata !14, metadata !"F", metadata !15, i32 16777257, metadata !31, i32 0, null} ; [ DW_TAG_arg_variable ] +!31 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !32} ; [ DW_TAG_pointer_type ] +!32 = metadata !{i32 786454, metadata !55, metadata !2, metadata !"FV", i32 25, i64 0, i64 0, i64 0, i32 0, metadata !33} ; [ DW_TAG_typedef ] +!33 = metadata !{i32 786455, metadata !55, metadata !2, metadata !"", i32 22, i64 128, i64 128, i64 0, i32 0, i32 0, metadata !34, i32 0, i32 0} ; [ DW_TAG_union_type ] !34 = metadata !{metadata !35, metadata !37} -!35 = metadata !{i32 589837, metadata !15, metadata !"V", metadata !15, i32 23, i64 128, i64 128, i64 0, i32 0, metadata !36} ; [ DW_TAG_member ] -!36 = metadata !{i32 589846, metadata !2, metadata !"v4sf", metadata !15, i32 3, i64 0, i64 0, i64 0, i32 0, metadata !6} ; [ DW_TAG_typedef ] -!37 = metadata !{i32 589837, metadata !15, metadata !"A", metadata !15, i32 24, i64 128, i64 32, i64 0, i32 0, metadata !38} ; [ DW_TAG_member ] -!38 = metadata !{i32 589825, metadata !2, metadata !"", metadata !2, i32 0, i64 128, i64 32, i32 0, i32 0, metadata !7, metadata !8, i32 0, i32 0} ; [ DW_TAG_array_type ] +!35 = metadata !{i32 786445, metadata !55, metadata !15, metadata !"V", i32 23, i64 128, i64 128, i64 0, i32 0, metadata !36} ; [ DW_TAG_member ] +!36 = metadata !{i32 786454, metadata !55, metadata !2, metadata !"v4sf", i32 3, i64 0, i64 0, i64 0, i32 0, metadata !6} ; [ DW_TAG_typedef ] +!37 = metadata !{i32 786445, metadata !55, metadata !15, metadata !"A", i32 24, i64 128, i64 32, i64 0, i32 0, metadata !38} ; [ DW_TAG_member ] +!38 = metadata !{i32 786433, null, metadata !2, metadata !"", i32 0, i64 128, i64 32, i32 0, i32 0, metadata !7, metadata !8, i32 0, i32 0} ; [ DW_TAG_array_type ] !39 = metadata !{i32 79, i32 7, metadata !40, null} -!40 = metadata !{i32 589835, metadata !41, i32 75, i32 35, metadata !1, i32 18} ; [ DW_TAG_lexical_block ] -!41 = metadata !{i32 589835, metadata !42, i32 75, i32 5, metadata !1, i32 17} ; [ DW_TAG_lexical_block ] -!42 = metadata !{i32 589835, metadata !43, i32 71, i32 32, metadata !1, i32 16} ; [ DW_TAG_lexical_block ] -!43 = metadata !{i32 589835, metadata !25, i32 71, i32 3, metadata !1, i32 15} ; [ DW_TAG_lexical_block ] +!40 = metadata !{i32 786443, metadata !1, metadata !41, i32 75, i32 35, i32 18} ; [ DW_TAG_lexical_block ] +!41 = metadata !{i32 786443, metadata !1, metadata !42, i32 75, i32 5, i32 17} ; [ DW_TAG_lexical_block ] +!42 = metadata !{i32 786443, metadata !1, metadata !43, i32 71, i32 32, i32 16} ; [ DW_TAG_lexical_block ] +!43 = metadata !{i32 786443, metadata !1, metadata !25, i32 71, i32 3, i32 15} ; [ DW_TAG_lexical_block ] !44 = metadata !{i32 75, i32 5, metadata !42, null} !45 = metadata !{i32 42, i32 2, metadata !46, metadata !48} -!46 = metadata !{i32 589835, metadata !47, i32 42, i32 2, metadata !15, i32 20} ; [ DW_TAG_lexical_block ] -!47 = metadata !{i32 589835, metadata !14, i32 41, i32 28, metadata !15, i32 19} ; [ DW_TAG_lexical_block ] +!46 = metadata !{i32 786443, metadata !15, metadata !47, i32 42, i32 2, i32 20} ; [ DW_TAG_lexical_block ] +!47 = metadata !{i32 786443, metadata !15, metadata !14, i32 41, i32 28, i32 19} ; [ DW_TAG_lexical_block ] !48 = metadata !{i32 95, i32 3, metadata !25, null} !49 = metadata !{i32 99, i32 3, metadata !25, null} +!50 = metadata !{metadata !0, metadata !10, metadata !14} +!51 = metadata !{metadata !18} +!52 = metadata !{metadata !19, metadata !20, metadata !24, metadata !26, metadata !27, metadata !28, metadata !29} +!53 = metadata !{metadata !30} +!54 = metadata !{metadata !"build2.c", metadata !"/private/tmp"} +!55 = metadata !{metadata !"/Volumes/Lalgate/work/llvm/projects/llvm-test/SingleSource/UnitTests/Vector/helpers.h", metadata !"/private/tmp"} diff --git a/test/CodeGen/ARM/debug-info-s16-reg.ll b/test/CodeGen/ARM/debug-info-s16-reg.ll index db41143fb3b1..f3af0b93c69c 100644 --- a/test/CodeGen/ARM/debug-info-s16-reg.ll +++ b/test/CodeGen/ARM/debug-info-s16-reg.ll @@ -61,46 +61,43 @@ declare i32 @puts(i8* nocapture) nounwind optsize declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0, !6, !7} -!llvm.dbg.lv.inlineprinter = !{!8, !10, !12} -!llvm.dbg.lv.printer = !{!14, !15, !16} -!llvm.dbg.lv.main = !{!17, !18, !22} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"inlineprinter", metadata !"inlineprinter", metadata !"", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i8*, float, i8)* @inlineprinter, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"a.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"a.c", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 129915)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"inlineprinter", metadata !"inlineprinter", metadata !"", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i8*, float, i8)* @inlineprinter, null, null, metadata !48, i32 5} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !51} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 12, metadata !1, metadata !"clang version 3.0 (trunk 129915)", i1 true, metadata !"", i32 0, null, null, metadata !47, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, 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 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589870, i32 0, metadata !1, metadata !"printer", metadata !"printer", metadata !"", metadata !1, i32 12, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i8*, float, i8)* @printer, null} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 18, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i8**)* @main, null} ; [ DW_TAG_subprogram ] -!8 = metadata !{i32 590081, metadata !0, metadata !"ptr", metadata !1, i32 16777220, metadata !9, i32 0} ; [ DW_TAG_arg_variable ] -!9 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] -!10 = metadata !{i32 590081, metadata !0, metadata !"val", metadata !1, i32 33554436, metadata !11, i32 0} ; [ DW_TAG_arg_variable ] -!11 = metadata !{i32 589860, metadata !2, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!12 = metadata !{i32 590081, metadata !0, metadata !"c", metadata !1, i32 50331652, metadata !13, i32 0} ; [ DW_TAG_arg_variable ] -!13 = metadata !{i32 589860, metadata !2, metadata !"unsigned char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 8} ; [ DW_TAG_base_type ] -!14 = metadata !{i32 590081, metadata !6, metadata !"ptr", metadata !1, i32 16777227, metadata !9, i32 0} ; [ DW_TAG_arg_variable ] -!15 = metadata !{i32 590081, metadata !6, metadata !"val", metadata !1, i32 33554443, metadata !11, i32 0} ; [ DW_TAG_arg_variable ] -!16 = metadata !{i32 590081, metadata !6, metadata !"c", metadata !1, i32 50331659, metadata !13, i32 0} ; [ DW_TAG_arg_variable ] -!17 = metadata !{i32 590081, metadata !7, metadata !"argc", metadata !1, i32 16777233, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!18 = metadata !{i32 590081, metadata !7, metadata !"argv", metadata !1, i32 33554449, metadata !19, i32 0} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !20} ; [ DW_TAG_pointer_type ] -!20 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !21} ; [ DW_TAG_pointer_type ] -!21 = metadata !{i32 589860, metadata !2, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!22 = metadata !{i32 590080, metadata !23, metadata !"dval", metadata !1, i32 19, metadata !11, i32 0} ; [ DW_TAG_auto_variable ] -!23 = metadata !{i32 589835, metadata !7, i32 18, i32 1, metadata !1, i32 2} ; [ DW_TAG_lexical_block ] +!5 = metadata !{i32 786468, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !1, metadata !"printer", metadata !"printer", metadata !"", metadata !1, i32 12, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i8*, float, i8)* @printer, null, null, metadata !49, i32 12} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786478, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 18, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i8**)* @main, null, null, metadata !50, i32 18} ; [ DW_TAG_subprogram ] +!8 = metadata !{i32 786689, metadata !0, metadata !"ptr", metadata !1, i32 16777220, metadata !9, i32 0, null} ; [ DW_TAG_arg_variable ] +!9 = metadata !{i32 786447, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!10 = metadata !{i32 786689, metadata !0, metadata !"val", metadata !1, i32 33554436, metadata !11, i32 0, null} ; [ DW_TAG_arg_variable ] +!11 = metadata !{i32 786468, metadata !2, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!12 = metadata !{i32 786689, metadata !0, metadata !"c", metadata !1, i32 50331652, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] +!13 = metadata !{i32 786468, metadata !2, metadata !"unsigned char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 8} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786689, metadata !6, metadata !"ptr", metadata !1, i32 16777227, metadata !9, i32 0, null} ; [ DW_TAG_arg_variable ] +!15 = metadata !{i32 786689, metadata !6, metadata !"val", metadata !1, i32 33554443, metadata !11, i32 0, null} ; [ DW_TAG_arg_variable ] +!16 = metadata !{i32 786689, metadata !6, metadata !"c", metadata !1, i32 50331659, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] +!17 = metadata !{i32 786689, metadata !7, metadata !"argc", metadata !1, i32 16777233, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!18 = metadata !{i32 786689, metadata !7, metadata !"argv", metadata !1, i32 33554449, metadata !19, i32 0, null} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786447, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !20} ; [ DW_TAG_pointer_type ] +!20 = metadata !{i32 786447, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !21} ; [ DW_TAG_pointer_type ] +!21 = metadata !{i32 786468, metadata !2, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!22 = metadata !{i32 786688, metadata !23, metadata !"dval", metadata !1, i32 19, metadata !11, i32 0, null} ; [ DW_TAG_auto_variable ] +!23 = metadata !{i32 786443, metadata !1, metadata !7, i32 18, i32 1, i32 2} ; [ DW_TAG_lexical_block ] !24 = metadata !{i32 4, i32 22, metadata !0, null} !25 = metadata !{i32 4, i32 33, metadata !0, null} !26 = metadata !{i32 4, i32 52, metadata !0, null} !27 = metadata !{i32 6, i32 3, metadata !28, null} -!28 = metadata !{i32 589835, metadata !0, i32 5, i32 1, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!28 = metadata !{i32 786443, metadata !1, metadata !0, i32 5, i32 1, i32 0} ; [ DW_TAG_lexical_block ] !29 = metadata !{i32 7, i32 3, metadata !28, null} !30 = metadata !{i32 11, i32 42, metadata !6, null} !31 = metadata !{i32 11, i32 53, metadata !6, null} !32 = metadata !{i32 11, i32 72, metadata !6, null} !33 = metadata !{i32 13, i32 3, metadata !34, null} -!34 = metadata !{i32 589835, metadata !6, i32 12, i32 1, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] +!34 = metadata !{i32 786443, metadata !1, metadata !6, i32 12, i32 1, i32 1} ; [ DW_TAG_lexical_block ] !35 = metadata !{i32 14, i32 3, metadata !34, null} !36 = metadata !{i32 17, i32 15, metadata !7, null} !37 = metadata !{i32 17, i32 28, metadata !7, null} @@ -113,3 +110,8 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !44 = metadata !{i32 6, i32 3, metadata !28, metadata !40} !45 = metadata !{i32 22, i32 3, metadata !23, null} !46 = metadata !{i32 23, i32 1, metadata !23, null} +!47 = metadata !{metadata !0, metadata !6, metadata !7} +!48 = metadata !{metadata !8, metadata !10, metadata !12} +!49 = metadata !{metadata !14, metadata !15, metadata !16} +!50 = metadata !{metadata !17, metadata !18, metadata !22} +!51 = metadata !{metadata !"a.c", metadata !"/private/tmp"} diff --git a/test/CodeGen/ARM/debug-info-sreg2.ll b/test/CodeGen/ARM/debug-info-sreg2.ll index ae7af0afad50..ae02a245b432 100644 --- a/test/CodeGen/ARM/debug-info-sreg2.ll +++ b/test/CodeGen/ARM/debug-info-sreg2.ll @@ -40,22 +40,23 @@ declare float @_Z2f3f(float) optsize declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!llvm.dbg.sp = !{!1} -!llvm.dbg.lv._Z3foov = !{!5, !8} -!0 = metadata !{i32 589841, i32 0, i32 4, metadata !"k.cc", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 130845)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"_Z3foov", metadata !2, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void ()* @_Z3foov, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"k.cc", metadata !"/private/tmp", metadata !0} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589845, 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 ] +!0 = metadata !{i32 786449, i32 4, metadata !2, metadata !"clang version 3.0 (trunk 130845)", i1 true, metadata !"", i32 0, null, null, metadata !16, null, null} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"_Z3foov", metadata !2, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void ()* @_Z3foov, null, null, metadata !17, i32 5} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !18} ; [ 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 !{null} -!5 = metadata !{i32 590080, metadata !6, metadata !"k", metadata !2, i32 6, metadata !7, i32 0} ; [ DW_TAG_auto_variable ] -!6 = metadata !{i32 589835, metadata !1, i32 5, i32 12, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] -!7 = metadata !{i32 589860, metadata !0, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!8 = metadata !{i32 590080, metadata !9, metadata !"y", metadata !2, i32 8, metadata !7, i32 0} ; [ DW_TAG_auto_variable ] -!9 = metadata !{i32 589835, metadata !10, i32 7, i32 25, metadata !2, i32 2} ; [ DW_TAG_lexical_block ] -!10 = metadata !{i32 589835, metadata !6, i32 7, i32 3, metadata !2, i32 1} ; [ DW_TAG_lexical_block ] +!5 = metadata !{i32 786688, metadata !6, metadata !"k", metadata !2, i32 6, metadata !7, i32 0, null} ; [ DW_TAG_auto_variable ] +!6 = metadata !{i32 786443, metadata !2, metadata !1, i32 5, i32 12, i32 0} ; [ DW_TAG_lexical_block ] +!7 = metadata !{i32 786468, metadata !0, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 786688, metadata !9, metadata !"y", metadata !2, i32 8, metadata !7, i32 0, null} ; [ DW_TAG_auto_variable ] +!9 = metadata !{i32 786443, metadata !2, metadata !10, i32 7, i32 25, i32 2} ; [ DW_TAG_lexical_block ] +!10 = metadata !{i32 786443, metadata !2, metadata !6, i32 7, i32 3, i32 1} ; [ DW_TAG_lexical_block ] !11 = metadata !{i32 6, i32 18, metadata !6, null} !12 = metadata !{i32 7, i32 3, metadata !6, null} !13 = metadata !{i32 8, i32 20, metadata !9, null} !14 = metadata !{i32 7, i32 20, metadata !10, null} !15 = metadata !{i32 10, i32 1, metadata !6, null} +!16 = metadata !{metadata !1} +!17 = metadata !{metadata !5, metadata !8} +!18 = metadata !{metadata !"k.cc", metadata !"/private/tmp"} diff --git a/test/CodeGen/ARM/domain-conv-vmovs.ll b/test/CodeGen/ARM/domain-conv-vmovs.ll index a5c41144584c..b5586cc99fc1 100644 --- a/test/CodeGen/ARM/domain-conv-vmovs.ll +++ b/test/CodeGen/ARM/domain-conv-vmovs.ll @@ -78,7 +78,7 @@ define float @test_ineligible(float, float %in) { ; use-def chains would be messed up. Primarily a compile-test (we used to ; internal fault). call void @bar() -; CHECL: bl bar +; CHECK: bl bar ; CHECK: vext.32 ; CHECK: vext.32 ret float %val @@ -98,3 +98,23 @@ define i32 @test_vmovs_no_sreg(i32 %in) { ret i32 %resi } + + +; The point of this test is: +; + Make sure s1 is live before the BL +; + Make sure s1 is clobbered by the BL +; + Convince LLVM to emit a VMOV to S0 +; + Convince LLVM to domain-convert this. + +; When all of those are satisfied, LLVM should *not* mark s1 as an implicit-use +; because it's dead. + +declare float @clobbers_s1(float, float) + +define <2 x float> @test_clobbers_recognised(<2 x float> %invec, float %val) { + %elt = call float @clobbers_s1(float %val, float %val) + + %vec = insertelement <2 x float> %invec, float %elt, i32 0 + %res = fadd <2 x float> %vec, %vec + ret <2 x float> %res +} diff --git a/test/CodeGen/ARM/eh-dispcont.ll b/test/CodeGen/ARM/eh-dispcont.ll new file mode 100644 index 000000000000..935965bbdf8b --- /dev/null +++ b/test/CodeGen/ARM/eh-dispcont.ll @@ -0,0 +1,89 @@ +; RUN: llc -mtriple armv7-apple-ios -relocation-model=pic -o - %s | FileCheck %s -check-prefix=ARM-PIC +; RUN: llc -mtriple armv7-apple-ios -relocation-model=static -o - %s | FileCheck %s -check-prefix=ARM-NOPIC +; RUN: llc -mtriple armv7-apple-ios -relocation-model=dynamic-no-pic -o - %s | FileCheck %s -check-prefix=ARM-NOPIC +; RUN: llc -mtriple thumbv6-apple-ios -relocation-model=pic -o - %s | FileCheck %s -check-prefix=THUMB1-PIC +; RUN: llc -mtriple thumbv6-apple-ios -relocation-model=static -o - %s | FileCheck %s -check-prefix=THUMB1-NOPIC +; RUN: llc -mtriple thumbv6-apple-ios -relocation-model=dynamic-no-pic -o - %s | FileCheck %s -check-prefix=THUMB1-NOPIC + +@_ZTIi = external constant i8* + +define i32 @main() #0 { +entry: + %exception = tail call i8* @__cxa_allocate_exception(i32 4) #1 + %0 = bitcast i8* %exception to i32* + store i32 1, i32* %0, align 4 + invoke void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null) #2 + to label %unreachable unwind label %lpad + +lpad: ; preds = %entry + %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* null + %2 = extractvalue { i8*, i32 } %1, 0 + %3 = tail call i8* @__cxa_begin_catch(i8* %2) #1 + tail call void @__cxa_end_catch() + ret i32 0 + +unreachable: ; preds = %entry + unreachable +} + +declare i8* @__cxa_allocate_exception(i32) + +declare void @__cxa_throw(i8*, i8*, i8*) + +declare i8* @__cxa_begin_catch(i8*) + +declare void @__cxa_end_catch() + +declare i32 @__gxx_personality_sj0(...) + +attributes #0 = { ssp } +attributes #1 = { nounwind } +attributes #2 = { noreturn } + +; ARM-PIC: cxa_throw +; ARM-PIC: trap +; ARM-PIC: adr [[REG1:r[0-9]+]], [[LJTI:.*]] +; ARM-PIC: ldr [[REG0:r[0-9]+]], [r{{[0-9]+}}, [[REG1]]] +; ARM-PIC: add pc, [[REG0]], [[REG1]] +; ARM-PIC: [[LJTI]] +; ARM-PIC: .data_region jt32 +; ARM-PIC: .long [[LABEL:LBB0_[0-9]]]-[[LJTI]] +; ARM-PIC: .end_data_region +; ARM-PIC: [[LABEL]] + +; ARM-NOPIC: cxa_throw +; ARM-NOPIC: trap +; ARM-NOPIC: adr [[REG1:r[0-9]+]], [[LJTI:.*]] +; ARM-NOPIC: ldr [[REG0:r[0-9]+]], [r{{[0-9]+}}, [[REG1]]] +; ARM-NOPIC: mov pc, [[REG0]] +; ARM-NOPIC: [[LJTI]] +; ARM-NOPIC: .data_region jt32 +; ARM-NOPIC: .long [[LABEL:LBB0_[0-9]]] +; ARM-NOPIC: .end_data_region +; ARM-NOPIC: [[LABEL]] + +; THUMB1-PIC: cxa_throw +; THUMB1-PIC: trap +; THUMB1-PIC: adr [[REG0:r[0-9]+]], [[LJTI:.*]] +; THUMB1-PIC: adds [[REG1:r[0-9]+]], [[REG1]], [[REG0]] +; THUMB1-PIC: ldr [[REG1]] +; THUMB1-PIC: adds [[REG0]], [[REG1]], [[REG0]] +; THUMB1-PIC: mov pc, [[REG0]] +; THUMB1-PIC: [[LJTI]] +; THUMB1-PIC: .data_region jt32 +; THUMB1-PIC: .long [[LABEL:LBB0_[0-9]]]-[[LJTI]] +; THUMB1-PIC: .end_data_region +; THUMB1-PIC: [[LABEL]] + +; THUMB1-NOPIC: cxa_throw +; THUMB1-NOPIC: trap +; THUMB1-NOPIC: adr [[REG1:r[0-9]+]], [[LJTI:.*]] +; THUMB1-NOPIC: adds [[REG0:r[0-9]+]], [[REG0]], [[REG1]] +; THUMB1-NOPIC: ldr [[REG0]] +; THUMB1-NOPIC: mov pc, [[REG0]] +; THUMB1-NOPIC: [[LJTI]] +; THUMB1-NOPIC: .data_region jt32 +; THUMB1-NOPIC: .long [[LABEL:LBB0_[0-9]]]+1 +; THUMB1-NOPIC: .end_data_region +; THUMB1-NOPIC: [[LABEL]] diff --git a/test/CodeGen/ARM/ehabi-filters.ll b/test/CodeGen/ARM/ehabi-filters.ll new file mode 100644 index 000000000000..c42839d9fe3d --- /dev/null +++ b/test/CodeGen/ARM/ehabi-filters.ll @@ -0,0 +1,77 @@ +; RUN: llc -arm-enable-ehabi -arm-enable-ehabi-descriptors < %s | FileCheck %s +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64" +target triple = "armv7-none-linux-gnueabi" + +@_ZTIi = external constant i8* + +declare void @_Z3foov() noreturn; + +declare i8* @__cxa_allocate_exception(i32) + +declare i32 @__gxx_personality_v0(...) + +declare void @__cxa_throw(i8*, i8*, i8*) + +declare void @__cxa_call_unexpected(i8*) + +define i32 @main() { +; CHECK: main: +entry: + %exception.i = tail call i8* @__cxa_allocate_exception(i32 4) nounwind + %0 = bitcast i8* %exception.i to i32* + store i32 42, i32* %0, align 4, !tbaa !0 + invoke void @__cxa_throw(i8* %exception.i, i8* bitcast (i8** @_ZTIi to i8*), i8* null) noreturn + to label %unreachable.i unwind label %lpad.i + +lpad.i: ; preds = %entry + %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + filter [1 x i8*] [i8* bitcast (i8** @_ZTIi to i8*)] + catch i8* bitcast (i8** @_ZTIi to i8*) +; CHECK: .long _ZTIi(target2) @ TypeInfo 1 +; CHECK: .long _ZTIi(target2) @ FilterInfo -1 + %2 = extractvalue { i8*, i32 } %1, 1 + %ehspec.fails.i = icmp slt i32 %2, 0 + br i1 %ehspec.fails.i, label %ehspec.unexpected.i, label %lpad.body + +ehspec.unexpected.i: ; preds = %lpad.i + %3 = extractvalue { i8*, i32 } %1, 0 + invoke void @__cxa_call_unexpected(i8* %3) noreturn + to label %.noexc unwind label %lpad + +.noexc: ; preds = %ehspec.unexpected.i + unreachable + +unreachable.i: ; preds = %entry + unreachable + +lpad: ; preds = %ehspec.unexpected.i + %4 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast (i8** @_ZTIi to i8*) + br label %lpad.body + +lpad.body: ; preds = %lpad.i, %lpad + %eh.lpad-body = phi { i8*, i32 } [ %4, %lpad ], [ %1, %lpad.i ] + %5 = extractvalue { i8*, i32 } %eh.lpad-body, 1 + %6 = tail call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) nounwind + %matches = icmp eq i32 %5, %6 + br i1 %matches, label %try.cont, label %eh.resume + +try.cont: ; preds = %lpad.body + %7 = extractvalue { i8*, i32 } %eh.lpad-body, 0 + %8 = tail call i8* @__cxa_begin_catch(i8* %7) nounwind + tail call void @__cxa_end_catch() nounwind + ret i32 0 + +eh.resume: ; preds = %lpad.body + resume { i8*, i32 } %eh.lpad-body +} + +declare i32 @llvm.eh.typeid.for(i8*) nounwind readnone + +declare i8* @__cxa_begin_catch(i8*) + +declare void @__cxa_end_catch() + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/ARM/ehabi-mc-cantunwind.ll b/test/CodeGen/ARM/ehabi-mc-cantunwind.ll new file mode 100644 index 000000000000..698d76e56580 --- /dev/null +++ b/test/CodeGen/ARM/ehabi-mc-cantunwind.ll @@ -0,0 +1,14 @@ +; RUN: llc -mtriple arm-unknown-linux-gnueabi \ +; RUN: -arm-enable-ehabi -arm-enable-ehabi-descriptors \ +; RUN: -filetype=obj -o - %s \ +; RUN: | llvm-objdump -s - \ +; RUN: | FileCheck %s + +define void @test() nounwind { +entry: + ret void +} + +; CHECK: section .text +; CHECK: section .ARM.exidx +; CHECK-NEXT: 0000 00000000 01000000 diff --git a/test/CodeGen/ARM/ehabi-mc-section-group.ll b/test/CodeGen/ARM/ehabi-mc-section-group.ll new file mode 100644 index 000000000000..5e4b5096c494 --- /dev/null +++ b/test/CodeGen/ARM/ehabi-mc-section-group.ll @@ -0,0 +1,79 @@ +; Test section group of the function with linkonce_odr + +; The instantiation of C++ function template will come with linkonce_odr, +; which indicates that the linker can remove the duplicated instantiation. +; However, to make this feature work, we have to group the section properly. +; .text, .ARM.extab, and .ARM.exidx should be grouped together. + +; RUN: llc -mtriple arm-unknown-linux-gnueabi \ +; RUN: -arm-enable-ehabi -arm-enable-ehabi-descriptors \ +; RUN: -filetype=obj -o - %s \ +; RUN: | elf-dump --dump-section-data \ +; RUN: | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64" +target triple = "armv4t--linux-gnueabi" + +define void @_Z11instantiatev() { +entry: + tail call void @_Z4testIidEvT_S0_S0_S0_S0_T0_S1_S1_S1_S1_(i32 1, i32 2, i32 3, i32 4, i32 5, double 1.000000e-01, double 2.000000e-01, double 3.000000e-01, double 4.000000e-01, double 5.000000e-01) + ret void +} + +define linkonce_odr void @_Z4testIidEvT_S0_S0_S0_S0_T0_S1_S1_S1_S1_(i32 %u1, i32 %u2, i32 %u3, i32 %u4, i32 %u5, double %v1, double %v2, double %v3, double %v4, double %v5) { +entry: + invoke void @_Z5printiiiii(i32 %u1, i32 %u2, i32 %u3, i32 %u4, i32 %u5) + to label %try.cont unwind label %lpad + +lpad: ; preds = %entry + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + %1 = extractvalue { i8*, i32 } %0, 0 + %2 = tail call i8* @__cxa_begin_catch(i8* %1) nounwind + invoke void @_Z5printddddd(double %v1, double %v2, double %v3, double %v4, double %v5) + to label %invoke.cont2 unwind label %lpad1 + +invoke.cont2: ; preds = %lpad + tail call void @__cxa_end_catch() + br label %try.cont + +try.cont: ; preds = %entry, %invoke.cont2 + ret void + +lpad1: ; preds = %lpad + %3 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup + invoke void @__cxa_end_catch() + to label %eh.resume unwind label %terminate.lpad + +eh.resume: ; preds = %lpad1 + resume { i8*, i32 } %3 + +terminate.lpad: ; preds = %lpad1 + %4 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + tail call void @_ZSt9terminatev() noreturn nounwind + unreachable +} + +declare void @_Z5printiiiii(i32, i32, i32, i32, i32) + +declare i32 @__gxx_personality_v0(...) + +declare i8* @__cxa_begin_catch(i8*) + +declare void @_Z5printddddd(double, double, double, double, double) + +declare void @__cxa_end_catch() + +declare void @_ZSt9terminatev() + +; CHECK: # Section 1 +; CHECK-NEXT: (('sh_name', 0x0000002f) # '.group' +; CHECK: ('_section_data', '01000000 0a000000 0c000000 0e000000') +; CHECK: # Section 10 +; CHECK-NEXT: (('sh_name', 0x000000e1) # '.text._Z4testIidEvT_S0_S0_S0_S0_T0_S1_S1_S1_S1_' +; CHECK: # Section 12 +; CHECK-NEXT: (('sh_name', 0x000000d7) # '.ARM.extab.text._Z4testIidEvT_S0_S0_S0_S0_T0_S1_S1_S1_S1_' +; CHECK: # Section 14 +; CHECK-NEXT: (('sh_name', 0x00000065) # '.ARM.exidx.text._Z4testIidEvT_S0_S0_S0_S0_T0_S1_S1_S1_S1_' diff --git a/test/CodeGen/ARM/ehabi-mc-section.ll b/test/CodeGen/ARM/ehabi-mc-section.ll new file mode 100644 index 000000000000..fc51b240ff3d --- /dev/null +++ b/test/CodeGen/ARM/ehabi-mc-section.ll @@ -0,0 +1,59 @@ +; RUN: llc -mtriple arm-unknown-linux-gnueabi \ +; RUN: -arm-enable-ehabi -arm-enable-ehabi-descriptors \ +; RUN: -filetype=obj -o - %s \ +; RUN: | llvm-objdump -s - \ +; RUN: | FileCheck %s + +define void @_Z4testiiiiiddddd(i32 %u1, i32 %u2, i32 %u3, i32 %u4, i32 %u5, double %v1, double %v2, double %v3, double %v4, double %v5) section ".test_section" { +entry: + invoke void @_Z5printiiiii(i32 %u1, i32 %u2, i32 %u3, i32 %u4, i32 %u5) + to label %try.cont unwind label %lpad + +lpad: ; preds = %entry + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + %1 = extractvalue { i8*, i32 } %0, 0 + %2 = tail call i8* @__cxa_begin_catch(i8* %1) nounwind + invoke void @_Z5printddddd(double %v1, double %v2, double %v3, double %v4, double %v5) + to label %invoke.cont2 unwind label %lpad1 + +invoke.cont2: ; preds = %lpad + tail call void @__cxa_end_catch() + br label %try.cont + +try.cont: ; preds = %entry, %invoke.cont2 + ret void + +lpad1: ; preds = %lpad + %3 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup + invoke void @__cxa_end_catch() + to label %eh.resume unwind label %terminate.lpad + +eh.resume: ; preds = %lpad1 + resume { i8*, i32 } %3 + +terminate.lpad: ; preds = %lpad1 + %4 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + tail call void @_ZSt9terminatev() noreturn nounwind + unreachable +} + +declare void @_Z5printiiiii(i32, i32, i32, i32, i32) + +declare i32 @__gxx_personality_v0(...) + +declare i8* @__cxa_begin_catch(i8*) + +declare void @_Z5printddddd(double, double, double, double, double) + +declare void @__cxa_end_catch() + +declare void @_ZSt9terminatev() + +; CHECK: section .test_section +; CHECK: section .ARM.extab.test_section +; CHECK-NEXT: 0000 00000000 b0b0b000 +; CHECK: section .ARM.exidx.test_section +; CHECK-NEXT: 0000 00000000 00000000 diff --git a/test/CodeGen/ARM/ehabi-mc-sh_link.ll b/test/CodeGen/ARM/ehabi-mc-sh_link.ll new file mode 100644 index 000000000000..f90e5f384c1e --- /dev/null +++ b/test/CodeGen/ARM/ehabi-mc-sh_link.ll @@ -0,0 +1,47 @@ +; Test the sh_link in Elf32_Shdr. + +; The .ARM.exidx section should be linked with corresponding text section. +; The sh_link in Elf32_Shdr should be filled with the section index of +; the text section. + +; RUN: llc -mtriple arm-unknown-linux-gnueabi \ +; RUN: -arm-enable-ehabi -arm-enable-ehabi-descriptors \ +; RUN: -filetype=obj -o - %s \ +; RUN: | elf-dump --dump-section-data \ +; RUN: | FileCheck %s + +define void @test1() nounwind { +entry: + ret void +} + +define void @test2() nounwind section ".test_section" { +entry: + ret void +} + +; CHECK: # Section 1 +; CHECK-NEXT: (('sh_name', 0x00000010) # '.text' + +; CHECK: (('sh_name', 0x00000005) # '.ARM.exidx' +; CHECK-NEXT: ('sh_type', 0x70000001) +; CHECK-NEXT: ('sh_flags', 0x00000082) +; CHECK-NEXT: ('sh_addr', 0x00000000) +; CHECK-NEXT: ('sh_offset', 0x0000005c) +; CHECK-NEXT: ('sh_size', 0x00000008) +; CHECK-NEXT: ('sh_link', 0x00000001) +; CHECK-NEXT: ('sh_info', 0x00000000) +; CHECK-NEXT: ('sh_addralign', 0x00000004) + +; CHECK: # Section 7 +; CHECK-NEXT: (('sh_name', 0x00000039) # '.test_section' + +; CHECK: (('sh_name', 0x0000002f) # '.ARM.exidx.test_section' +; CHECK-NEXT: ('sh_type', 0x70000001) +; CHECK-NEXT: ('sh_flags', 0x00000082) +; CHECK-NEXT: ('sh_addr', 0x00000000) +; CHECK-NEXT: ('sh_offset', 0x00000068) +; CHECK-NEXT: ('sh_size', 0x00000008) +; CHECK-NEXT: ('sh_link', 0x00000007) +; CHECK-NEXT: ('sh_info', 0x00000000) +; CHECK-NEXT: ('sh_addralign', 0x00000004) diff --git a/test/CodeGen/ARM/ehabi-mc.ll b/test/CodeGen/ARM/ehabi-mc.ll new file mode 100644 index 000000000000..0dc2ef7838f0 --- /dev/null +++ b/test/CodeGen/ARM/ehabi-mc.ll @@ -0,0 +1,59 @@ +; RUN: llc -mtriple arm-unknown-linux-gnueabi \ +; RUN: -arm-enable-ehabi -arm-enable-ehabi-descriptors \ +; RUN: -filetype=obj -o - %s \ +; RUN: | llvm-objdump -s - \ +; RUN: | FileCheck %s + +define void @_Z4testiiiiiddddd(i32 %u1, i32 %u2, i32 %u3, i32 %u4, i32 %u5, double %v1, double %v2, double %v3, double %v4, double %v5) { +entry: + invoke void @_Z5printiiiii(i32 %u1, i32 %u2, i32 %u3, i32 %u4, i32 %u5) + to label %try.cont unwind label %lpad + +lpad: ; preds = %entry + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + %1 = extractvalue { i8*, i32 } %0, 0 + %2 = tail call i8* @__cxa_begin_catch(i8* %1) nounwind + invoke void @_Z5printddddd(double %v1, double %v2, double %v3, double %v4, double %v5) + to label %invoke.cont2 unwind label %lpad1 + +invoke.cont2: ; preds = %lpad + tail call void @__cxa_end_catch() + br label %try.cont + +try.cont: ; preds = %entry, %invoke.cont2 + ret void + +lpad1: ; preds = %lpad + %3 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup + invoke void @__cxa_end_catch() + to label %eh.resume unwind label %terminate.lpad + +eh.resume: ; preds = %lpad1 + resume { i8*, i32 } %3 + +terminate.lpad: ; preds = %lpad1 + %4 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + tail call void @_ZSt9terminatev() noreturn nounwind + unreachable +} + +declare void @_Z5printiiiii(i32, i32, i32, i32, i32) + +declare i32 @__gxx_personality_v0(...) + +declare i8* @__cxa_begin_catch(i8*) + +declare void @_Z5printddddd(double, double, double, double, double) + +declare void @__cxa_end_catch() + +declare void @_ZSt9terminatev() + +; CHECK: section .text +; CHECK: section .ARM.extab +; CHECK-NEXT: 0000 00000000 b0b0b000 +; CHECK: section .ARM.exidx +; CHECK-NEXT: 0000 00000000 00000000 diff --git a/test/CodeGen/ARM/ehabi-no-landingpad.ll b/test/CodeGen/ARM/ehabi-no-landingpad.ll new file mode 100644 index 000000000000..ac0dff421a6f --- /dev/null +++ b/test/CodeGen/ARM/ehabi-no-landingpad.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -mtriple=armv7-unknown-linux-gnueabi \ +; RUN: -arm-enable-ehabi -arm-enable-ehabi-descriptors | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64" +target triple = "armv7-unknown-linux-gnueabi" + +define void @_Z4testv() { +; CHECK: _Z4testv +; CHECK: .fnstart +; CHECK: .size +; CHECK-NOT: .handlerdata +; CHECK: .fnend +entry: + call void @_Z15throw_exceptionv() + ret void +} + +declare void @_Z15throw_exceptionv() diff --git a/test/CodeGen/ARM/elf-lcomm-align.ll b/test/CodeGen/ARM/elf-lcomm-align.ll index 46792990e593..a98b3c06f5e2 100644 --- a/test/CodeGen/ARM/elf-lcomm-align.ll +++ b/test/CodeGen/ARM/elf-lcomm-align.ll @@ -4,8 +4,9 @@ @c = internal global i8 0, align 1 @x = internal global i32 0, align 4 -; CHECK: .lcomm c,1 -; .lcomm doesn't support alignment. +; .lcomm doesn't support alignment, so we always use .local/.comm. +; CHECK: .local c +; CHECK-NEXT: .comm c,1,1 ; CHECK: .local x ; CHECK-NEXT: .comm x,4,4 diff --git a/test/CodeGen/ARM/extload-knownzero.ll b/test/CodeGen/ARM/extload-knownzero.ll new file mode 100644 index 000000000000..8fd6b6bd777a --- /dev/null +++ b/test/CodeGen/ARM/extload-knownzero.ll @@ -0,0 +1,26 @@ +; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s +; rdar://12771555 + +define void @foo(i16* %ptr, i32 %a) nounwind { +entry: +; CHECK: foo: + %tmp1 = icmp ult i32 %a, 100 + br i1 %tmp1, label %bb1, label %bb2 +bb1: +; CHECK: ldrh + %tmp2 = load i16* %ptr, align 2 + br label %bb2 +bb2: +; CHECK-NOT: uxth +; CHECK: cmp + %tmp3 = phi i16 [ 0, %entry ], [ %tmp2, %bb1 ] + %cmp = icmp ult i16 %tmp3, 24 + br i1 %cmp, label %bb3, label %exit +bb3: + call void @bar() nounwind + br label %exit +exit: + ret void +} + +declare void @bar () diff --git a/test/CodeGen/ARM/fabs-neon.ll b/test/CodeGen/ARM/fabs-neon.ll new file mode 100644 index 000000000000..614117ff7bca --- /dev/null +++ b/test/CodeGen/ARM/fabs-neon.ll @@ -0,0 +1,17 @@ +; RUN: llc < %s -mtriple=armv7-eabi -float-abi=hard -mcpu=cortex-a8 | FileCheck %s + +; CHECK: test: +; CHECK: vabs.f32 q0, q0 +define <4 x float> @test(<4 x float> %a) { + %foo = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a) + ret <4 x float> %foo +} +declare <4 x float> @llvm.fabs.v4f32(<4 x float> %a) + +; CHECK: test2: +; CHECK: vabs.f32 d0, d0 +define <2 x float> @test2(<2 x float> %a) { + %foo = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a) + ret <2 x float> %foo +} +declare <2 x float> @llvm.fabs.v2f32(<2 x float> %a) diff --git a/test/CodeGen/ARM/fabss.ll b/test/CodeGen/ARM/fabss.ll index 46c2f1c65fe5..c3e00ce47019 100644 --- a/test/CodeGen/ARM/fabss.ll +++ b/test/CodeGen/ARM/fabss.ll @@ -14,12 +14,12 @@ entry: declare float @fabsf(float) ; VFP2: test: -; VFP2: vabs.f32 s2, s2 +; VFP2: vabs.f32 s ; NFP1: test: -; NFP1: vabs.f32 d1, d1 +; NFP1: vabs.f32 d ; NFP0: test: -; NFP0: vabs.f32 s2, s2 +; NFP0: vabs.f32 s ; CORTEXA8: test: ; CORTEXA8: vadd.f32 [[D1:d[0-9]+]] diff --git a/test/CodeGen/ARM/fadds.ll b/test/CodeGen/ARM/fadds.ll index 48ef5ed88fb0..c7e2f5d094b8 100644 --- a/test/CodeGen/ARM/fadds.ll +++ b/test/CodeGen/ARM/fadds.ll @@ -1,6 +1,8 @@ ; RUN: llc < %s -march=arm -mattr=+vfp2 | FileCheck %s -check-prefix=VFP2 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s -check-prefix=NFP0 -; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 --enable-unsafe-fp-math | FileCheck %s -check-prefix=CORTEXA8U +; RUN: llc < %s -mtriple=arm-darwin -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8U ; RUN: llc < %s -march=arm -mcpu=cortex-a9 | FileCheck %s -check-prefix=CORTEXA9 define float @test(float %a, float %b) { @@ -18,6 +20,8 @@ entry: ; NFP0: vadd.f32 s ; CORTEXA8: test: -; CORTEXA8: vadd.f32 d +; CORTEXA8: vadd.f32 s +; CORTEXA8U: test: +; CORTEXA8U: vadd.f32 d ; CORTEXA9: test: -; CORTEXA9: vadd.f32 s{{.}}, s{{.}}, s{{.}} +; CORTEXA9: vadd.f32 s diff --git a/test/CodeGen/ARM/fast-isel-GEP-coalesce.ll b/test/CodeGen/ARM/fast-isel-GEP-coalesce.ll index dbb634df0a1e..60bc6a62f5d3 100644 --- a/test/CodeGen/ARM/fast-isel-GEP-coalesce.ll +++ b/test/CodeGen/ARM/fast-isel-GEP-coalesce.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM -; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB %struct.A = type { i32, [2 x [2 x i32]], i8, [3 x [3 x [3 x i32]]] } %struct.B = type { i32, [2 x [2 x [2 x %struct.A]]] } diff --git a/test/CodeGen/ARM/fast-isel-br-const.ll b/test/CodeGen/ARM/fast-isel-br-const.ll index 7c532d5fba38..4e6efd248997 100644 --- a/test/CodeGen/ARM/fast-isel-br-const.ll +++ b/test/CodeGen/ARM/fast-isel-br-const.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM -; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB define i32 @t1(i32 %a, i32 %b) nounwind uwtable ssp { entry: diff --git a/test/CodeGen/ARM/fast-isel-call-multi-reg-return.ll b/test/CodeGen/ARM/fast-isel-call-multi-reg-return.ll index 14721a4d8024..b6f201728c2b 100644 --- a/test/CodeGen/ARM/fast-isel-call-multi-reg-return.ll +++ b/test/CodeGen/ARM/fast-isel-call-multi-reg-return.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -O0 -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM -; RUN: llc < %s -O0 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB +; RUN: llc < %s -O0 -verify-machineinstrs -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM +; RUN: llc < %s -O0 -verify-machineinstrs -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB ; Fast-isel can't handle non-double multi-reg retvals. ; This test just check to make sure we don't hit the assert in FinishCall. diff --git a/test/CodeGen/ARM/fast-isel-crash.ll b/test/CodeGen/ARM/fast-isel-crash.ll index 370c70f174fd..8fb4b66b7dd4 100644 --- a/test/CodeGen/ARM/fast-isel-crash.ll +++ b/test/CodeGen/ARM/fast-isel-crash.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -O0 -mtriple=thumbv7-apple-darwin +; RUN: llc < %s -O0 -verify-machineinstrs -mtriple=thumbv7-apple-darwin %union.anon = type { <16 x i32> } diff --git a/test/CodeGen/ARM/fast-isel-crash2.ll b/test/CodeGen/ARM/fast-isel-crash2.ll index aa0629928846..f245168a8e30 100644 --- a/test/CodeGen/ARM/fast-isel-crash2.ll +++ b/test/CodeGen/ARM/fast-isel-crash2.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -O0 -mtriple=thumbv7-apple-darwin +; RUN: llc < %s -O0 -verify-machineinstrs -mtriple=thumbv7-apple-darwin ; rdar://9515076 ; (Make sure this doesn't crash.) diff --git a/test/CodeGen/ARM/fast-isel-deadcode.ll b/test/CodeGen/ARM/fast-isel-deadcode.ll index 7e147c7b4d7d..3a943d854b4a 100644 --- a/test/CodeGen/ARM/fast-isel-deadcode.ll +++ b/test/CodeGen/ARM/fast-isel-deadcode.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -O0 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB +; RUN: llc < %s -O0 -verify-machineinstrs -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB ; Target-specific selector can't properly handle the double because it isn't ; being passed via a register, so the materialized arguments become dead code. diff --git a/test/CodeGen/ARM/fast-isel-fold.ll b/test/CodeGen/ARM/fast-isel-fold.ll index 61bd18504c5c..7a65295f01b6 100644 --- a/test/CodeGen/ARM/fast-isel-fold.ll +++ b/test/CodeGen/ARM/fast-isel-fold.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM -; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB @a = global i8 1, align 1 @b = global i16 2, align 2 diff --git a/test/CodeGen/ARM/fast-isel-frameaddr.ll b/test/CodeGen/ARM/fast-isel-frameaddr.ll index 8f7b2943b56d..c256e73ab98c 100644 --- a/test/CodeGen/ARM/fast-isel-frameaddr.ll +++ b/test/CodeGen/ARM/fast-isel-frameaddr.ll @@ -1,7 +1,7 @@ -; RUN: llc < %s -O0 -fast-isel-abort -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=DARWIN-ARM -; RUN: llc < %s -O0 -fast-isel-abort -mtriple=armv7-linux-gnueabi | FileCheck %s --check-prefix=LINUX-ARM -; RUN: llc < %s -O0 -fast-isel-abort -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=DARWIN-THUMB2 -; RUN: llc < %s -O0 -fast-isel-abort -mtriple=thumbv7-linux-gnueabi | FileCheck %s --check-prefix=LINUX-THUMB2 +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=DARWIN-ARM +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=armv7-linux-gnueabi | FileCheck %s --check-prefix=LINUX-ARM +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=DARWIN-THUMB2 +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=thumbv7-linux-gnueabi | FileCheck %s --check-prefix=LINUX-THUMB2 define i8* @frameaddr_index0() nounwind { entry: diff --git a/test/CodeGen/ARM/fast-isel-icmp.ll b/test/CodeGen/ARM/fast-isel-icmp.ll index 8764bef7dab9..8357ed5c549c 100644 --- a/test/CodeGen/ARM/fast-isel-icmp.ll +++ b/test/CodeGen/ARM/fast-isel-icmp.ll @@ -1,6 +1,21 @@ ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB +define i32 @icmp_i16_signed(i16 %a, i16 %b) nounwind { +entry: +; ARM: icmp_i16_signed +; ARM: sxth r0, r0 +; ARM: sxth r1, r1 +; ARM: cmp r0, r1 +; THUMB: icmp_i16_signed +; THUMB: sxth r0, r0 +; THUMB: sxth r1, r1 +; THUMB: cmp r0, r1 + %cmp = icmp slt i16 %a, %b + %conv2 = zext i1 %cmp to i32 + ret i32 %conv2 +} + define i32 @icmp_i16_unsigned(i16 %a, i16 %b) nounwind { entry: ; ARM: icmp_i16_unsigned @@ -31,6 +46,21 @@ entry: ret i32 %conv2 } +define i32 @icmp_i8_unsigned(i8 %a, i8 %b) nounwind { +entry: +; ARM: icmp_i8_unsigned +; ARM: uxtb r0, r0 +; ARM: uxtb r1, r1 +; ARM: cmp r0, r1 +; THUMB: icmp_i8_unsigned +; THUMB: uxtb r0, r0 +; THUMB: uxtb r1, r1 +; THUMB: cmp r0, r1 + %cmp = icmp ugt i8 %a, %b + %conv2 = zext i1 %cmp to i32 + ret i32 %conv2 +} + define i32 @icmp_i1_unsigned(i1 %a, i1 %b) nounwind { entry: ; ARM: icmp_i1_unsigned diff --git a/test/CodeGen/ARM/fast-isel-indirectbr.ll b/test/CodeGen/ARM/fast-isel-indirectbr.ll index be8035ec794d..ebc0e8426d55 100644 --- a/test/CodeGen/ARM/fast-isel-indirectbr.ll +++ b/test/CodeGen/ARM/fast-isel-indirectbr.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM -; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM +; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB define void @t1(i8* %x) { entry: diff --git a/test/CodeGen/ARM/fast-isel-intrinsic.ll b/test/CodeGen/ARM/fast-isel-intrinsic.ll index b73fceff6cd0..48105dd3893b 100644 --- a/test/CodeGen/ARM/fast-isel-intrinsic.ll +++ b/test/CodeGen/ARM/fast-isel-intrinsic.ll @@ -35,7 +35,7 @@ define void @t1() nounwind ssp { ; THUMB-LONG: movt r3, :upper16:L_memset$non_lazy_ptr ; THUMB-LONG: ldr r3, [r3] ; THUMB-LONG: blx r3 - call void @llvm.memset.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @message1, i32 0, i32 5), i8 64, i32 10, i32 1, i1 false) + call void @llvm.memset.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @message1, i32 0, i32 5), i8 64, i32 10, i32 4, i1 false) ret void } @@ -73,7 +73,7 @@ define void @t2() nounwind ssp { ; THUMB-LONG: movt r3, :upper16:L_memcpy$non_lazy_ptr ; THUMB-LONG: ldr r3, [r3] ; THUMB-LONG: blx r3 - call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 17, i32 1, i1 false) + call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 17, i32 4, i1 false) ret void } @@ -125,6 +125,7 @@ define void @t4() nounwind ssp { ; ARM: ldrh r1, [r0, #24] ; ARM: strh r1, [r0, #12] ; ARM: bx lr +; THUMB: t4 ; THUMB: movw r0, :lower16:L_temp$non_lazy_ptr ; THUMB: movt r0, :upper16:L_temp$non_lazy_ptr ; THUMB: ldr r0, [r0] @@ -135,8 +136,117 @@ define void @t4() nounwind ssp { ; THUMB: ldrh r1, [r0, #24] ; THUMB: strh r1, [r0, #12] ; THUMB: bx lr - call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 1, i1 false) + call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 4, i1 false) ret void } declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind + +define void @t5() nounwind ssp { +; ARM: t5 +; ARM: movw r0, :lower16:L_temp$non_lazy_ptr +; ARM: movt r0, :upper16:L_temp$non_lazy_ptr +; ARM: ldr r0, [r0] +; ARM: ldrh r1, [r0, #16] +; ARM: strh r1, [r0, #4] +; ARM: ldrh r1, [r0, #18] +; ARM: strh r1, [r0, #6] +; ARM: ldrh r1, [r0, #20] +; ARM: strh r1, [r0, #8] +; ARM: ldrh r1, [r0, #22] +; ARM: strh r1, [r0, #10] +; ARM: ldrh r1, [r0, #24] +; ARM: strh r1, [r0, #12] +; ARM: bx lr +; THUMB: t5 +; THUMB: movw r0, :lower16:L_temp$non_lazy_ptr +; THUMB: movt r0, :upper16:L_temp$non_lazy_ptr +; THUMB: ldr r0, [r0] +; THUMB: ldrh r1, [r0, #16] +; THUMB: strh r1, [r0, #4] +; THUMB: ldrh r1, [r0, #18] +; THUMB: strh r1, [r0, #6] +; THUMB: ldrh r1, [r0, #20] +; THUMB: strh r1, [r0, #8] +; THUMB: ldrh r1, [r0, #22] +; THUMB: strh r1, [r0, #10] +; THUMB: ldrh r1, [r0, #24] +; THUMB: strh r1, [r0, #12] +; THUMB: bx lr + call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 2, i1 false) + ret void +} + +define void @t6() nounwind ssp { +; ARM: t6 +; ARM: movw r0, :lower16:L_temp$non_lazy_ptr +; ARM: movt r0, :upper16:L_temp$non_lazy_ptr +; ARM: ldr r0, [r0] +; ARM: ldrb r1, [r0, #16] +; ARM: strb r1, [r0, #4] +; ARM: ldrb r1, [r0, #17] +; ARM: strb r1, [r0, #5] +; ARM: ldrb r1, [r0, #18] +; ARM: strb r1, [r0, #6] +; ARM: ldrb r1, [r0, #19] +; ARM: strb r1, [r0, #7] +; ARM: ldrb r1, [r0, #20] +; ARM: strb r1, [r0, #8] +; ARM: ldrb r1, [r0, #21] +; ARM: strb r1, [r0, #9] +; ARM: ldrb r1, [r0, #22] +; ARM: strb r1, [r0, #10] +; ARM: ldrb r1, [r0, #23] +; ARM: strb r1, [r0, #11] +; ARM: ldrb r1, [r0, #24] +; ARM: strb r1, [r0, #12] +; ARM: ldrb r1, [r0, #25] +; ARM: strb r1, [r0, #13] +; ARM: bx lr +; THUMB: t6 +; THUMB: movw r0, :lower16:L_temp$non_lazy_ptr +; THUMB: movt r0, :upper16:L_temp$non_lazy_ptr +; THUMB: ldr r0, [r0] +; THUMB: ldrb r1, [r0, #16] +; THUMB: strb r1, [r0, #4] +; THUMB: ldrb r1, [r0, #17] +; THUMB: strb r1, [r0, #5] +; THUMB: ldrb r1, [r0, #18] +; THUMB: strb r1, [r0, #6] +; THUMB: ldrb r1, [r0, #19] +; THUMB: strb r1, [r0, #7] +; THUMB: ldrb r1, [r0, #20] +; THUMB: strb r1, [r0, #8] +; THUMB: ldrb r1, [r0, #21] +; THUMB: strb r1, [r0, #9] +; THUMB: ldrb r1, [r0, #22] +; THUMB: strb r1, [r0, #10] +; THUMB: ldrb r1, [r0, #23] +; THUMB: strb r1, [r0, #11] +; THUMB: ldrb r1, [r0, #24] +; THUMB: strb r1, [r0, #12] +; THUMB: ldrb r1, [r0, #25] +; THUMB: strb r1, [r0, #13] +; THUMB: bx lr + call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 1, i1 false) + ret void +} + +; rdar://13202135 +define void @t7() nounwind ssp { +; Just make sure this doesn't assert when we have an odd length and an alignment of 2. + call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 3, i32 2, i1 false) + ret void +} + +define i32 @t8(i32 %x) nounwind { +entry: +; ARM: t8 +; ARM-NOT: FastISel missed call: %expval = call i32 @llvm.expect.i32(i32 %x, i32 1) +; THUMB: t8 +; THUMB-NOT: FastISel missed call: %expval = call i32 @llvm.expect.i32(i32 %x, i32 1) + %expval = call i32 @llvm.expect.i32(i32 %x, i32 1) + ret i32 %expval +} + +declare i32 @llvm.expect.i32(i32, i32) nounwind readnone diff --git a/test/CodeGen/ARM/fast-isel-ldrh-strh-arm.ll b/test/CodeGen/ARM/fast-isel-ldrh-strh-arm.ll index e8cc2b238dff..0b5267ddc973 100644 --- a/test/CodeGen/ARM/fast-isel-ldrh-strh-arm.ll +++ b/test/CodeGen/ARM/fast-isel-ldrh-strh-arm.ll @@ -103,7 +103,7 @@ entry: ; ARM: t11 %add.ptr = getelementptr inbounds i16* %a, i64 8 store i16 0, i16* %add.ptr, align 2 -; ARM strh r{{[1-9]}}, [r0, #16] +; ARM: strh r{{[1-9]}}, [r0, #16] ret void } diff --git a/test/CodeGen/ARM/fast-isel-pred.ll b/test/CodeGen/ARM/fast-isel-pred.ll index 8de54ad5332b..27731def1f57 100644 --- a/test/CodeGen/ARM/fast-isel-pred.ll +++ b/test/CodeGen/ARM/fast-isel-pred.ll @@ -1,4 +1,4 @@ -; RUN: llc -O0 -mtriple=armv7-apple-darwin < %s +; RUN: llc -O0 -verify-machineinstrs -mtriple=armv7-apple-darwin < %s define i32 @main() nounwind ssp { entry: diff --git a/test/CodeGen/ARM/fast-isel-redefinition.ll b/test/CodeGen/ARM/fast-isel-redefinition.ll index e50c3a4954e1..563880dab0a9 100644 --- a/test/CodeGen/ARM/fast-isel-redefinition.ll +++ b/test/CodeGen/ARM/fast-isel-redefinition.ll @@ -1,4 +1,4 @@ -; RUN: llc -O0 -optimize-regalloc -regalloc=basic < %s +; RUN: llc -O0 -verify-machineinstrs -optimize-regalloc -regalloc=basic < %s ; This isn't exactly a useful set of command-line options, but check that it ; doesn't crash. (It was crashing because a register was getting redefined.) diff --git a/test/CodeGen/ARM/fast-isel-static.ll b/test/CodeGen/ARM/fast-isel-static.ll index a86e3251f715..e8759a7fc4ce 100644 --- a/test/CodeGen/ARM/fast-isel-static.ll +++ b/test/CodeGen/ARM/fast-isel-static.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -mtriple=thumbv7-apple-darwin -O0 -relocation-model=static -arm-long-calls | FileCheck -check-prefix=LONG %s -; RUN: llc < %s -mtriple=thumbv7-apple-darwin -O0 -relocation-model=static | FileCheck -check-prefix=NORM %s +; RUN: llc < %s -mtriple=thumbv7-apple-darwin -O0 -verify-machineinstrs -relocation-model=static -arm-long-calls | FileCheck -check-prefix=LONG %s +; RUN: llc < %s -mtriple=thumbv7-apple-darwin -O0 -verify-machineinstrs -relocation-model=static | FileCheck -check-prefix=NORM %s define void @myadd(float* %sum, float* %addend) nounwind { entry: diff --git a/test/CodeGen/ARM/fdivs.ll b/test/CodeGen/ARM/fdivs.ll index 8fab00213585..8f13f395e078 100644 --- a/test/CodeGen/ARM/fdivs.ll +++ b/test/CodeGen/ARM/fdivs.ll @@ -10,14 +10,14 @@ entry: } ; VFP2: test: -; VFP2: vdiv.f32 s0, s2, s0 +; VFP2: vdiv.f32 s{{.}}, s{{.}}, s{{.}} ; NFP1: test: -; NFP1: vdiv.f32 s0, s2, s0 +; NFP1: vdiv.f32 s{{.}}, s{{.}}, s{{.}} ; NFP0: test: -; NFP0: vdiv.f32 s0, s2, s0 +; NFP0: vdiv.f32 s{{.}}, s{{.}}, s{{.}} ; CORTEXA8: test: -; CORTEXA8: vdiv.f32 s0, s2, s0 +; CORTEXA8: vdiv.f32 s{{.}}, s{{.}}, s{{.}} ; CORTEXA9: test: ; CORTEXA9: vdiv.f32 s{{.}}, s{{.}}, s{{.}} diff --git a/test/CodeGen/ARM/fmuls.ll b/test/CodeGen/ARM/fmuls.ll index 1566a9272db1..f5245c946398 100644 --- a/test/CodeGen/ARM/fmuls.ll +++ b/test/CodeGen/ARM/fmuls.ll @@ -1,6 +1,8 @@ ; RUN: llc < %s -march=arm -mattr=+vfp2 | FileCheck %s -check-prefix=VFP2 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s -check-prefix=NFP0 -; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 --enable-unsafe-fp-math | FileCheck %s -check-prefix=CORTEXA8U +; RUN: llc < %s -mtriple=arm-darwin -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8U ; RUN: llc < %s -march=arm -mcpu=cortex-a9 | FileCheck %s -check-prefix=CORTEXA9 define float @test(float %a, float %b) { @@ -18,9 +20,11 @@ entry: ; NFP0: vmul.f32 s ; CORTEXA8: test: -; CORTEXA8: vmul.f32 d +; CORTEXA8: vmul.f32 s +; CORTEXA8U: test: +; CORTEXA8U: vmul.f32 d ; CORTEXA9: test: -; CORTEXA9: vmul.f32 s{{.}}, s{{.}}, s{{.}} +; CORTEXA9: vmul.f32 s ; VFP2: test2 define float @test2(float %a) nounwind { diff --git a/test/CodeGen/ARM/fnegs.ll b/test/CodeGen/ARM/fnegs.ll index 418b59803d30..d84690ba4e4b 100644 --- a/test/CodeGen/ARM/fnegs.ll +++ b/test/CodeGen/ARM/fnegs.ll @@ -1,6 +1,8 @@ ; RUN: llc < %s -march=arm -mattr=+vfp2 | FileCheck %s -check-prefix=VFP2 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s -check-prefix=NFP0 -; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 --enable-unsafe-fp-math | FileCheck %s -check-prefix=CORTEXA8U +; RUN: llc < %s -mtriple=arm-darwin -mcpu=cortex-a8 | FileCheck %s -check-prefix=CORTEXA8U ; RUN: llc < %s -march=arm -mcpu=cortex-a9 | FileCheck %s -check-prefix=CORTEXA9 define float @test1(float* %a) { @@ -22,7 +24,10 @@ entry: ; NFP0: vneg.f32 s{{.*}}, s{{.*}} ; CORTEXA8: test1: -; CORTEXA8: vneg.f32 d{{.*}}, d{{.*}} +; CORTEXA8: vneg.f32 s{{.*}}, s{{.*}} + +; CORTEXA8U: test1: +; CORTEXA8U: vneg.f32 d{{.*}}, d{{.*}} ; CORTEXA9: test1: ; CORTEXA9: vneg.f32 s{{.*}}, s{{.*}} @@ -46,7 +51,10 @@ entry: ; NFP0: vneg.f32 s{{.*}}, s{{.*}} ; CORTEXA8: test2: -; CORTEXA8: vneg.f32 d{{.*}}, d{{.*}} +; CORTEXA8: vneg.f32 s{{.*}}, s{{.*}} + +; CORTEXA8U: test2: +; CORTEXA8U: vneg.f32 d{{.*}}, d{{.*}} ; CORTEXA9: test2: ; CORTEXA9: vneg.f32 s{{.*}}, s{{.*}} diff --git a/test/CodeGen/ARM/fnmscs.ll b/test/CodeGen/ARM/fnmscs.ll index 6081712829a2..c30806173428 100644 --- a/test/CodeGen/ARM/fnmscs.ll +++ b/test/CodeGen/ARM/fnmscs.ll @@ -1,7 +1,9 @@ ; RUN: llc < %s -march=arm -mattr=+vfp2 | FileCheck %s -check-prefix=VFP2 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s -check-prefix=NEON -; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s -check-prefix=A8 -; RUN: llc < %s -march=arm -mcpu=cortex-a8 -regalloc=basic | FileCheck %s -check-prefix=A8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 | FileCheck %s -check-prefix=A8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 -regalloc=basic | FileCheck %s -check-prefix=A8 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 --enable-unsafe-fp-math | FileCheck %s -check-prefix=A8U +; RUN: llc < %s -mtriple=arm-darwin -mcpu=cortex-a8 | FileCheck %s -check-prefix=A8U define float @t1(float %acc, float %a, float %b) nounwind { entry: @@ -11,9 +13,13 @@ entry: ; NEON: t1: ; NEON: vnmla.f32 +; A8U: t1: +; A8U: vnmul.f32 s{{[0-9]}}, s{{[0-9]}}, s{{[0-9]}} +; A8U: vsub.f32 d{{[0-9]}}, d{{[0-9]}}, d{{[0-9]}} + ; A8: t1: ; A8: vnmul.f32 s{{[0-9]}}, s{{[0-9]}}, s{{[0-9]}} -; A8: vsub.f32 d{{[0-9]}}, d{{[0-9]}}, d{{[0-9]}} +; A8: vsub.f32 s{{[0-9]}}, s{{[0-9]}}, s{{[0-9]}} %0 = fmul float %a, %b %1 = fsub float -0.0, %0 %2 = fsub float %1, %acc @@ -28,9 +34,13 @@ entry: ; NEON: t2: ; NEON: vnmla.f32 +; A8U: t2: +; A8U: vnmul.f32 s{{[01234]}}, s{{[01234]}}, s{{[01234]}} +; A8U: vsub.f32 d{{[0-9]}}, d{{[0-9]}}, d{{[0-9]}} + ; A8: t2: ; A8: vnmul.f32 s{{[01234]}}, s{{[01234]}}, s{{[01234]}} -; A8: vsub.f32 d{{[0-9]}}, d{{[0-9]}}, d{{[0-9]}} +; A8: vsub.f32 s{{[0-9]}}, s{{[0-9]}}, s{{[0-9]}} %0 = fmul float %a, %b %1 = fmul float -1.0, %0 %2 = fsub float %1, %acc @@ -45,9 +55,13 @@ entry: ; NEON: t3: ; NEON: vnmla.f64 +; A8U: t3: +; A8U: vnmul.f64 d +; A8U: vsub.f64 d + ; A8: t3: -; A8: vnmul.f64 d1{{[67]}}, d1{{[67]}}, d1{{[67]}} -; A8: vsub.f64 d1{{[67]}}, d1{{[67]}}, d1{{[67]}} +; A8: vnmul.f64 d +; A8: vsub.f64 d %0 = fmul double %a, %b %1 = fsub double -0.0, %0 %2 = fsub double %1, %acc @@ -62,9 +76,13 @@ entry: ; NEON: t4: ; NEON: vnmla.f64 +; A8U: t4: +; A8U: vnmul.f64 d +; A8U: vsub.f64 d + ; A8: t4: -; A8: vnmul.f64 d1{{[67]}}, d1{{[67]}}, d1{{[67]}} -; A8: vsub.f64 d1{{[67]}}, d1{{[67]}}, d1{{[67]}} +; A8: vnmul.f64 d +; A8: vsub.f64 d %0 = fmul double %a, %b %1 = fmul double -1.0, %0 %2 = fsub double %1, %acc diff --git a/test/CodeGen/ARM/fp_convert.ll b/test/CodeGen/ARM/fp_convert.ll index 44298b9c5d8d..3c47eb580ff1 100644 --- a/test/CodeGen/ARM/fp_convert.ll +++ b/test/CodeGen/ARM/fp_convert.ll @@ -1,6 +1,8 @@ ; RUN: llc < %s -march=arm -mattr=+vfp2 | FileCheck %s -check-prefix=VFP2 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s -check-prefix=VFP2 -; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s -check-prefix=NEON +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 | FileCheck %s -check-prefix=VFP2 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 --enable-unsafe-fp-math | FileCheck %s -check-prefix=NEON +; RUN: llc < %s -mtriple=arm-darwin -mcpu=cortex-a8 | FileCheck %s -check-prefix=NEON ; RUN: llc < %s -march=arm -mcpu=cortex-a9 | FileCheck %s -check-prefix=VFP2 define i32 @test1(float %a, float %b) { diff --git a/test/CodeGen/ARM/fsubs.ll b/test/CodeGen/ARM/fsubs.ll index f039e74c8ee6..617b01881a2e 100644 --- a/test/CodeGen/ARM/fsubs.ll +++ b/test/CodeGen/ARM/fsubs.ll @@ -1,5 +1,7 @@ ; RUN: llc < %s -march=arm -mattr=+vfp2 | FileCheck %s -check-prefix=VFP2 -; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s -check-prefix=NFP1 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 | FileCheck %s -check-prefix=NFP1 +; RUN: llc < %s -mtriple=arm-eabi -mcpu=cortex-a8 --enable-unsafe-fp-math | FileCheck %s -check-prefix=NFP1U +; RUN: llc < %s -mtriple=arm-darwin -mcpu=cortex-a8 | FileCheck %s -check-prefix=NFP1U ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s -check-prefix=NFP0 define float @test(float %a, float %b) { @@ -9,5 +11,6 @@ entry: } ; VFP2: vsub.f32 s -; NFP1: vsub.f32 d +; NFP1U: vsub.f32 d +; NFP1: vsub.f32 s ; NFP0: vsub.f32 s diff --git a/test/CodeGen/ARM/global-merge-addrspace.ll b/test/CodeGen/ARM/global-merge-addrspace.ll new file mode 100644 index 000000000000..0efa690bde28 --- /dev/null +++ b/test/CodeGen/ARM/global-merge-addrspace.ll @@ -0,0 +1,12 @@ +; RUN: llc < %s -mtriple=thumb-apple-darwin | FileCheck %s +; Test the GlobalMerge pass. Check that the pass does not crash when using +; multiple address spaces. + +; CHECK: _MergedGlobals: +@g1 = internal addrspace(1) global i32 1 +@g2 = internal addrspace(1) global i32 2 + + +; CHECK: _MergedGlobals1: +@g3 = internal addrspace(2) global i32 3 +@g4 = internal addrspace(2) global i32 4 diff --git a/test/CodeGen/ARM/global-merge.ll b/test/CodeGen/ARM/global-merge.ll index 1732df3fa5ef..f88e92796196 100644 --- a/test/CodeGen/ARM/global-merge.ll +++ b/test/CodeGen/ARM/global-merge.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=thumb-apple-darwin | FileCheck %s +; RUN: llc < %s -mtriple=thumb-apple-darwin -global-merge-on-const=true | FileCheck %s ; Test the ARMGlobalMerge pass. Use -march=thumb because it has a small ; value for the maximum offset (127). @@ -6,6 +6,52 @@ ; CHECK: g0: @g0 = internal global [32 x i32] [ i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2 ] +; Global variables marked with "used" attribute must be kept +; CHECK: g8 +@g8 = internal global i32 0 +@llvm.used = appending global [1 x i8*] [i8* bitcast (i32* @g8 to i8*)], section "llvm.metadata" + +; Global used in landing pad instruction must be kept +; CHECK: ZTIi +@_ZTIi = internal global i8* null + +define i32 @_Z9exceptioni(i32 %arg) { +bb: + %tmp = invoke i32 @_Z14throwSomethingi(i32 %arg) + to label %bb9 unwind label %bb1 + +bb1: ; preds = %bb + %tmp2 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* bitcast (i8** @_ZTIi to i8*) + %tmp3 = extractvalue { i8*, i32 } %tmp2, 1 + %tmp4 = tail call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) + %tmp5 = icmp eq i32 %tmp3, %tmp4 + br i1 %tmp5, label %bb6, label %bb10 + +bb6: ; preds = %bb1 + %tmp7 = extractvalue { i8*, i32 } %tmp2, 0 + %tmp8 = tail call i8* @__cxa_begin_catch(i8* %tmp7) + tail call void @__cxa_end_catch() + br label %bb9 + +bb9: ; preds = %bb6, %bb + %res.0 = phi i32 [ 0, %bb6 ], [ %tmp, %bb ] + ret i32 %res.0 + +bb10: ; preds = %bb1 + resume { i8*, i32 } %tmp2 +} + +declare i32 @_Z14throwSomethingi(i32) + +declare i32 @__gxx_personality_sj0(...) + +declare i32 @llvm.eh.typeid.for(i8*) + +declare i8* @__cxa_begin_catch(i8*) + +declare void @__cxa_end_catch() + ; CHECK: _MergedGlobals: @g1 = internal global i32 1 @g2 = internal global i32 2 @@ -21,3 +67,8 @@ ; CHECK: _MergedGlobals2 @g4 = internal global i32 0 @g5 = internal global i32 0 + +; Global variables that are constant can be merged together +; CHECK: _MergedGlobals3 +@g6 = internal constant [12 x i32] zeroinitializer, align 4 +@g7 = internal constant [12 x i32] zeroinitializer, align 4 diff --git a/test/CodeGen/ARM/indirect-reg-input.ll b/test/CodeGen/ARM/indirect-reg-input.ll new file mode 100644 index 000000000000..86728fa61934 --- /dev/null +++ b/test/CodeGen/ARM/indirect-reg-input.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -march=arm -mcpu=cortex-a8 2>&1 | FileCheck %s + +; Check for error message: +; CHECK: error: inline asm not supported yet: don't know how to handle tied indirect register inputs + +%struct.my_stack = type { %struct.myjmp_buf } +%struct.myjmp_buf = type { [6 x i32] } + +define void @switch_to_stack(%struct.my_stack* %stack) nounwind { +entry: + %regs = getelementptr inbounds %struct.my_stack* %stack, i32 0, i32 0 + tail call void asm "\0A", "=*r,*0"(%struct.myjmp_buf* %regs, %struct.myjmp_buf* %regs) + ret void +} diff --git a/test/CodeGen/ARM/inlineasm-64bit.ll b/test/CodeGen/ARM/inlineasm-64bit.ll new file mode 100644 index 000000000000..be5eb8157317 --- /dev/null +++ b/test/CodeGen/ARM/inlineasm-64bit.ll @@ -0,0 +1,54 @@ +; RUN: llc < %s -O3 -mtriple=arm-linux-gnueabi | FileCheck %s + +; check if regs are passing correctly +define void @i64_write(i64* %p, i64 %val) nounwind { +; CHECK: i64_write: +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; CHECK: strexd [[REG1]], {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} + %1 = tail call i64 asm sideeffect "1: ldrexd $0, ${0:H}, [$2]\0A strexd $0, $3, ${3:H}, [$2]\0A teq $0, #0\0A bne 1b", "=&r,=*Qo,r,r,~{cc}"(i64* %p, i64* %p, i64 %val) nounwind + ret void +} + +; check if register allocation can reuse the registers +define void @multi_writes(i64* %p, i64 %val1, i64 %val2, i64 %val3, i64 %val4, i64 %val5, i64 %val6) nounwind { +entry: +; CHECK: multi_writes: +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] + +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] + +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; check: strexd {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}, [r{{[0-9]+}}] + + tail call void asm sideeffect " strexd $1, ${1:H}, [$0]\0A strexd $2, ${2:H}, [$0]\0A strexd $3, ${3:H}, [$0]\0A strexd $4, ${4:H}, [$0]\0A strexd $5, ${5:H}, [$0]\0A strexd $6, ${6:H}, [$0]\0A", "r,r,r,r,r,r,r"(i64* %p, i64 %val1, i64 %val2, i64 %val3, i64 %val4, i64 %val5, i64 %val6) nounwind + %incdec.ptr = getelementptr inbounds i64* %p, i32 1 + tail call void asm sideeffect " strexd $1, ${1:H}, [$0]\0A strexd $2, ${2:H}, [$0]\0A strexd $3, ${3:H}, [$0]\0A strexd $4, ${4:H}, [$0]\0A strexd $5, ${5:H}, [$0]\0A strexd $6, ${6:H}, [$0]\0A", "r,r,r,r,r,r,r"(i64* %incdec.ptr, i64 %val1, i64 %val2, i64 %val3, i64 %val4, i64 %val5, i64 %val6) nounwind + tail call void asm sideeffect " strexd $1, ${1:H}, [$0]\0A strexd $2, ${2:H}, [$0]\0A strexd $3, ${3:H}, [$0]\0A strexd $4, ${4:H}, [$0]\0A strexd $5, ${5:H}, [$0]\0A strexd $6, ${6:H}, [$0]\0A", "r,r,r,r,r,r,r"(i64* %incdec.ptr, i64 %val1, i64 %val2, i64 %val3, i64 %val4, i64 %val5, i64 %val6) nounwind + ret void +} + + +; check if callee-saved registers used by inline asm are saved/restored +define void @foo(i64* %p, i64 %i) nounwind { +; CHECK:foo: +; CHECK: push {{{r[4-9]|r10|r11}} +; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], {{r[0-9]?[13579]}}, [r{{[0-9]+}}] +; CHECK: strexd [[REG1]], {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}} +; CHECK: pop {{{r[4-9]|r10|r11}} + %1 = tail call { i64, i64 } asm sideeffect "@ atomic64_set\0A1: ldrexd $0, ${0:H}, [$3]\0Aldrexd $1, ${1:H}, [$3]\0A strexd $0, $4, ${4:H}, [$3]\0A teq $0, #0\0A bne 1b", "=&r,=&r,=*Qo,r,r,~{cc}"(i64* %p, i64* %p, i64 %i) nounwind + ret void +} diff --git a/test/CodeGen/ARM/inlineasm3.ll b/test/CodeGen/ARM/inlineasm3.ll index 2fcc45f4af9c..390a44e375b9 100644 --- a/test/CodeGen/ARM/inlineasm3.ll +++ b/test/CodeGen/ARM/inlineasm3.ll @@ -30,7 +30,7 @@ entry: define hidden void @conv4_8_E() nounwind { entry: -%asmtmp31 = call %0 asm "vld1.u8 {$0}, [$1, :128]!\0A", "=w,=r,1"(<16 x i8>* undef) nounwind +%asmtmp31 = call %0 asm "vld1.u8 {$0}, [$1:128]!\0A", "=w,=r,1"(<16 x i8>* undef) nounwind unreachable } diff --git a/test/CodeGen/ARM/invoke-donothing-assert.ll b/test/CodeGen/ARM/invoke-donothing-assert.ll new file mode 100644 index 000000000000..0b607f7edf38 --- /dev/null +++ b/test/CodeGen/ARM/invoke-donothing-assert.ll @@ -0,0 +1,73 @@ +; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s +; This testcase makes sure we can handle invoke @llvm.donothing without +; assertion failure. +; <rdar://problem/13228754> & <rdar://problem/13316637> + +; CHECK: .globl _foo +define void @foo() { +invoke.cont: + invoke void @callA() + to label %invoke.cont25 unwind label %lpad2 +invoke.cont25: + invoke void @llvm.donothing() + to label %invoke.cont27 unwind label %lpad15 + +invoke.cont27: + invoke void @callB() + to label %invoke.cont75 unwind label %lpad15 + +invoke.cont75: + ret void + +lpad2: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + br label %eh.resume + +lpad15: + %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + br label %eh.resume + +eh.resume: + resume { i8*, i32 } zeroinitializer +} + +; CHECK: .globl _bar +define linkonce_odr void @bar(i32* %a) { +if.end.i.i.i: + invoke void @llvm.donothing() + to label %call.i.i.i.noexc unwind label %eh.resume + +call.i.i.i.noexc: + br i1 false, label %cleanup, label %new.notnull.i.i + +new.notnull.i.i: + br label %cleanup + +cleanup: + %0 = load i32* %a, align 4 + %inc294 = add nsw i32 %0, 4 + store i32 %inc294, i32* %a, align 4 + br i1 false, label %_ZN3lol5ArrayIivvvvvvvED1Ev.exit, label %delete.notnull.i.i.i1409 + +delete.notnull.i.i.i1409: + br label %_ZN3lol5ArrayIivvvvvvvED1Ev.exit + +_ZN3lol5ArrayIivvvvvvvED1Ev.exit: + ret void + +eh.resume: + %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + %2 = extractvalue { i8*, i32 } %1, 0 + %3 = extractvalue { i8*, i32 } %1, 1 + %lpad.val = insertvalue { i8*, i32 } undef, i8* %2, 0 + %lpad.val395 = insertvalue { i8*, i32 } %lpad.val, i32 %3, 1 + resume { i8*, i32 } %lpad.val395 +} + +declare void @callA() +declare void @callB() +declare void @llvm.donothing() nounwind readnone +declare i32 @__gxx_personality_sj0(...) diff --git a/test/CodeGen/ARM/lit.local.cfg b/test/CodeGen/ARM/lit.local.cfg index cb77b09ef4ad..4d75f581a1d2 100644 --- a/test/CodeGen/ARM/lit.local.cfg +++ b/test/CodeGen/ARM/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'ARM' in targets: diff --git a/test/CodeGen/ARM/lsr-icmp-imm.ll b/test/CodeGen/ARM/lsr-icmp-imm.ll index 5283f5747d96..248c4bd1beea 100644 --- a/test/CodeGen/ARM/lsr-icmp-imm.ll +++ b/test/CodeGen/ARM/lsr-icmp-imm.ll @@ -1,5 +1,5 @@ -; RUN: llc -mtriple=thumbv7-apple-ios -disable-code-place < %s | FileCheck %s -; RUN: llc -mtriple=armv7-apple-ios -disable-code-place < %s | FileCheck %s +; RUN: llc -mtriple=thumbv7-apple-ios -disable-block-placement < %s | FileCheck %s +; RUN: llc -mtriple=armv7-apple-ios -disable-block-placement < %s | FileCheck %s ; LSR should compare against the post-incremented induction variable. ; In this case, the immediate value is -2 which requires a cmn instruction. diff --git a/test/CodeGen/ARM/machine-cse-cmp.ll b/test/CodeGen/ARM/machine-cse-cmp.ll index 3ac7d77d6f79..03abd762a261 100644 --- a/test/CodeGen/ARM/machine-cse-cmp.ll +++ b/test/CodeGen/ARM/machine-cse-cmp.ll @@ -45,3 +45,35 @@ for.cond1.preheader: ; preds = %entry } declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind + +; rdar://12462006 +define i8* @f3(i8* %base, i32* nocapture %offset, i32 %size) nounwind { +entry: +; CHECK: f3: +; CHECK-NOT: sub +; CHECK: cmp +; CHECK: blt +%0 = load i32* %offset, align 4 +%cmp = icmp slt i32 %0, %size +%s = sub nsw i32 %0, %size +%size2 = sub nsw i32 %size, 0 +br i1 %cmp, label %return, label %if.end + +if.end: +; We are checking cse between %sub here and %s in entry block. +%sub = sub nsw i32 %0, %size2 +%s2 = sub nsw i32 %s, %size +%s3 = sub nsw i32 %sub, %s2 +; CHECK: sub [[R1:r[0-9]+]], [[R2:r[0-9]+]], r2 +; CHECK: sub [[R3:r[0-9]+]], [[R1]], r2 +; CHECK: sub [[R4:r[0-9]+]], [[R1]], [[R3]] +; CHECK-NOT: sub +; CHECK: str +store i32 %s3, i32* %offset, align 4 +%add.ptr = getelementptr inbounds i8* %base, i32 %sub +br label %return + +return: +%retval.0 = phi i8* [ %add.ptr, %if.end ], [ null, %entry ] +ret i8* %retval.0 +} diff --git a/test/CodeGen/ARM/memcpy-inline.ll b/test/CodeGen/ARM/memcpy-inline.ll index dc772827f270..d846e5cb268b 100644 --- a/test/CodeGen/ARM/memcpy-inline.ll +++ b/test/CodeGen/ARM/memcpy-inline.ll @@ -1,18 +1,115 @@ -; RUN: llc < %s -mtriple=thumbv7-apple-darwin -disable-post-ra | FileCheck %s - -; CHECK: ldrd -; CHECK: strd -; CHECK: ldrb +; RUN: llc < %s -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 -pre-RA-sched=source -disable-post-ra | FileCheck %s %struct.x = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 } @src = external global %struct.x @dst = external global %struct.x -define i32 @t() { +@.str1 = private unnamed_addr constant [31 x i8] c"DHRYSTONE PROGRAM, SOME STRING\00", align 1 +@.str2 = private unnamed_addr constant [36 x i8] c"DHRYSTONE PROGRAM, SOME STRING BLAH\00", align 1 +@.str3 = private unnamed_addr constant [24 x i8] c"DHRYSTONE PROGRAM, SOME\00", align 1 +@.str4 = private unnamed_addr constant [18 x i8] c"DHRYSTONE PROGR \00", align 1 +@.str5 = private unnamed_addr constant [7 x i8] c"DHRYST\00", align 1 +@.str6 = private unnamed_addr constant [14 x i8] c"/tmp/rmXXXXXX\00", align 1 +@spool.splbuf = internal global [512 x i8] zeroinitializer, align 16 + +define i32 @t0() { entry: +; CHECK: t0: +; CHECK: vldr [[REG1:d[0-9]+]], +; CHECK: vstr [[REG1]], call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds (%struct.x* @dst, i32 0, i32 0), i8* getelementptr inbounds (%struct.x* @src, i32 0, i32 0), i32 11, i32 8, i1 false) ret i32 0 } +define void @t1(i8* nocapture %C) nounwind { +entry: +; CHECK: t1: +; CHECK: vld1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r1] +; CHECK: vst1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r0] +; CHECK: adds r0, #15 +; CHECK: adds r1, #15 +; CHECK: vld1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r1] +; CHECK: vst1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r0] + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %C, i8* getelementptr inbounds ([31 x i8]* @.str1, i64 0, i64 0), i64 31, i32 1, i1 false) + ret void +} + +define void @t2(i8* nocapture %C) nounwind { +entry: +; CHECK: t2: +; CHECK: ldr [[REG2:r[0-9]+]], [r1, #32] +; CHECK: str [[REG2]], [r0, #32] +; CHECK: vld1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r1] +; CHECK: vst1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r0] +; CHECK: adds r0, #16 +; CHECK: adds r1, #16 +; CHECK: vld1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r1] +; CHECK: vst1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r0] + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %C, i8* getelementptr inbounds ([36 x i8]* @.str2, i64 0, i64 0), i64 36, i32 1, i1 false) + ret void +} + +define void @t3(i8* nocapture %C) nounwind { +entry: +; CHECK: t3: +; CHECK: vld1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r1] +; CHECK: vst1.8 {d{{[0-9]+}}, d{{[0-9]+}}}, [r0] +; CHECK: adds r0, #16 +; CHECK: adds r1, #16 +; CHECK: vld1.8 {d{{[0-9]+}}}, [r1] +; CHECK: vst1.8 {d{{[0-9]+}}}, [r0] + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %C, i8* getelementptr inbounds ([24 x i8]* @.str3, i64 0, i64 0), i64 24, i32 1, i1 false) + ret void +} + +define void @t4(i8* nocapture %C) nounwind { +entry: +; CHECK: t4: +; CHECK: vld1.8 {[[REG3:d[0-9]+]], [[REG4:d[0-9]+]]}, [r1] +; CHECK: vst1.8 {[[REG3]], [[REG4]]}, [r0] + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %C, i8* getelementptr inbounds ([18 x i8]* @.str4, i64 0, i64 0), i64 18, i32 1, i1 false) + ret void +} + +define void @t5(i8* nocapture %C) nounwind { +entry: +; CHECK: t5: +; CHECK: movs [[REG5:r[0-9]+]], #0 +; CHECK: strb [[REG5]], [r0, #6] +; CHECK: movw [[REG6:r[0-9]+]], #21587 +; CHECK: strh [[REG6]], [r0, #4] +; CHECK: ldr [[REG7:r[0-9]+]], +; CHECK: str [[REG7]] + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %C, i8* getelementptr inbounds ([7 x i8]* @.str5, i64 0, i64 0), i64 7, i32 1, i1 false) + ret void +} + +define void @t6() nounwind { +entry: +; CHECK: t6: +; CHECK: vld1.8 {[[REG8:d[0-9]+]]}, [r0] +; CHECK: vstr [[REG8]], [r1] +; CHECK: adds r1, #6 +; CHECK: adds r0, #6 +; CHECK: vld1.8 +; CHECK: vst1.16 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* getelementptr inbounds ([512 x i8]* @spool.splbuf, i64 0, i64 0), i8* getelementptr inbounds ([14 x i8]* @.str6, i64 0, i64 0), i64 14, i32 1, i1 false) + ret void +} + +%struct.Foo = type { i32, i32, i32, i32 } + +define void @t7(%struct.Foo* nocapture %a, %struct.Foo* nocapture %b) nounwind { +entry: +; CHECK: t7 +; CHECK: vld1.32 +; CHECK: vst1.32 + %0 = bitcast %struct.Foo* %a to i8* + %1 = bitcast %struct.Foo* %b to i8* + tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %0, i8* %1, i32 16, i32 4, i1 false) + ret void +} + declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind diff --git a/test/CodeGen/ARM/memset-inline.ll b/test/CodeGen/ARM/memset-inline.ll new file mode 100644 index 000000000000..ee8c36433885 --- /dev/null +++ b/test/CodeGen/ARM/memset-inline.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 -pre-RA-sched=source -disable-post-ra | FileCheck %s + +define void @t1(i8* nocapture %c) nounwind optsize { +entry: +; CHECK: t1: +; CHECK: movs r1, #0 +; CHECK: str r1, [r0] +; CHECK: str r1, [r0, #4] +; CHECK: str r1, [r0, #8] + call void @llvm.memset.p0i8.i64(i8* %c, i8 0, i64 12, i32 8, i1 false) + ret void +} + +define void @t2() nounwind ssp { +entry: +; CHECK: t2: +; CHECK: add.w r1, r0, #10 +; CHECK: vmov.i32 {{q[0-9]+}}, #0x0 +; CHECK: vst1.16 {d{{[0-9]+}}, d{{[0-9]+}}}, [r1] +; CHECK: vst1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [r0] + %buf = alloca [26 x i8], align 1 + %0 = getelementptr inbounds [26 x i8]* %buf, i32 0, i32 0 + call void @llvm.memset.p0i8.i32(i8* %0, i8 0, i32 26, i32 1, i1 false) + call void @something(i8* %0) nounwind + ret void +} + +declare void @something(i8*) nounwind +declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind diff --git a/test/CodeGen/ARM/neon-spfp.ll b/test/CodeGen/ARM/neon-spfp.ll new file mode 100644 index 000000000000..c00f0d17c9f5 --- /dev/null +++ b/test/CodeGen/ARM/neon-spfp.ll @@ -0,0 +1,76 @@ +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=cortex-a5 | FileCheck %s -check-prefix=LINUXA5 +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=cortex-a8 | FileCheck %s -check-prefix=LINUXA8 +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=cortex-a9 | FileCheck %s -check-prefix=LINUXA9 +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=cortex-a15 | FileCheck %s -check-prefix=LINUXA15 +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=swift | FileCheck %s -check-prefix=LINUXSWIFT + +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=cortex-a5 --enable-unsafe-fp-math | FileCheck %s -check-prefix=UNSAFEA5 +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=cortex-a8 --enable-unsafe-fp-math | FileCheck %s -check-prefix=UNSAFEA8 +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=cortex-a9 --enable-unsafe-fp-math | FileCheck %s -check-prefix=UNSAFEA9 +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=cortex-a15 --enable-unsafe-fp-math | FileCheck %s -check-prefix=UNSAFEA15 +; RUN: llc < %s -mtriple armv7a-none-linux-gnueabihf -mcpu=swift --enable-unsafe-fp-math | FileCheck %s -check-prefix=UNSAFESWIFT + +; RUN: llc < %s -mtriple armv7a-none-darwin -mcpu=cortex-a5 | FileCheck %s -check-prefix=DARWINA5 +; RUN: llc < %s -mtriple armv7a-none-darwin -mcpu=cortex-a8 | FileCheck %s -check-prefix=DARWINA8 +; RUN: llc < %s -mtriple armv7a-none-darwin -mcpu=cortex-a9 | FileCheck %s -check-prefix=DARWINA9 +; RUN: llc < %s -mtriple armv7a-none-darwin -mcpu=cortex-a15 | FileCheck %s -check-prefix=DARWINA15 +; RUN: llc < %s -mtriple armv7a-none-darwin -mcpu=swift | FileCheck %s -check-prefix=DARWINSWIFT + +; This test makes sure we're not lowering VMUL.f32 D* (aka. NEON) for single-prec. FP ops, since +; NEON is not fully IEEE 754 compliant, unless unsafe-math is selected. + +@.str = private unnamed_addr constant [12 x i8] c"S317\09%.5g \0A\00", align 1 + +; CHECK-LINUXA5: main: +; CHECK-LINUXA8: main: +; CHECK-LINUXA9: main: +; CHECK-LINUXA15: main: +; CHECK-LINUXSWIFT: main: +; CHECK-UNSAFEA5: main: +; CHECK-UNSAFEA8: main: +; CHECK-UNSAFEA9: main: +; CHECK-UNSAFEA15: main: +; CHECK-UNSAFESWIFT: main: +; CHECK-DARWINA5: main: +; CHECK-DARWINA8: main: +; CHECK-DARWINA9: main: +; CHECK-DARWINA15: main: +; CHECK-DARWINSWIFT: main: +define i32 @main() { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %i.04 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %q.03 = phi float [ 1.000000e+00, %entry ], [ %mul, %for.body ] + %mul = fmul float %q.03, 0x3FEFAE1480000000 +; CHECK-LINUXA5: vmul.f32 s{{[0-9]*}} +; CHECK-LINUXA8: vmul.f32 s{{[0-9]*}} +; CHECK-LINUXA9: vmul.f32 s{{[0-9]*}} +; CHECK-LINUXA15: vmul.f32 s{{[0-9]*}} +; Swift is *always* unsafe +; CHECK-LINUXSWIFT: vmul.f32 d{{[0-9]*}} + +; CHECK-UNSAFEA5: vmul.f32 d{{[0-9]*}} +; CHECK-UNSAFEA8: vmul.f32 d{{[0-9]*}} +; A9 and A15 don't need this +; CHECK-UNSAFEA9: vmul.f32 s{{[0-9]*}} +; CHECK-UNSAFEA15: vmul.f32 s{{[0-9]*}} +; CHECK-UNSAFESWIFT: vmul.f32 d{{[0-9]*}} + +; CHECK-DARWINA5: vmul.f32 d{{[0-9]*}} +; CHECK-DARWINA8: vmul.f32 d{{[0-9]*}} +; CHECK-DARWINA9: vmul.f32 s{{[0-9]*}} +; CHECK-DARWINA15: vmul.f32 s{{[0-9]*}} +; CHECK-DARWINSWIFT: vmul.f32 d{{[0-9]*}} + %conv = fpext float %mul to double + %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([12 x i8]* @.str, i32 0, i32 0), double %conv) #1 + %inc = add nsw i32 %i.04, 1 + %exitcond = icmp eq i32 %inc, 16000 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret i32 0 +} + +declare i32 @printf(i8* nocapture, ...) diff --git a/test/CodeGen/ARM/neon_cmp.ll b/test/CodeGen/ARM/neon_cmp.ll new file mode 100644 index 000000000000..046b5da22899 --- /dev/null +++ b/test/CodeGen/ARM/neon_cmp.ll @@ -0,0 +1,15 @@ +; RUN: llc < %s -march=arm -mcpu=cortex-a9 | FileCheck %s +; bug 15283 +; radar://13191881 +; CHECK: vfcmp +define void @vfcmp(<2 x double>* %a, <2 x double>* %b) { + %wide.load = load <2 x double>* %a, align 4 + %wide.load2 = load <2 x double>* %b, align 4 +; CHECK-NOT: vdup.32 +; CHECK-NOT: vmovn.i64 + %v1 = fcmp olt <2 x double> %wide.load, %wide.load2 + %v2 = zext <2 x i1> %v1 to <2 x i32> + %v3 = sitofp <2 x i32> %v2 to <2 x double> + store <2 x double> %v3, <2 x double>* %b, align 4 + ret void +} diff --git a/test/CodeGen/ARM/neon_fpconv.ll b/test/CodeGen/ARM/neon_fpconv.ll new file mode 100644 index 000000000000..149f4c777003 --- /dev/null +++ b/test/CodeGen/ARM/neon_fpconv.ll @@ -0,0 +1,42 @@ +; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s + +; PR12540: ARM backend lowering of FP_ROUND v2f64 to v2f32. +define <2 x float> @vtrunc(<2 x double> %a) { +; CHECK: vcvt.f32.f64 [[S0:s[0-9]+]], [[D0:d[0-9]+]] +; CHECK: vcvt.f32.f64 [[S1:s[0-9]+]], [[D1:d[0-9]+]] + %vt = fptrunc <2 x double> %a to <2 x float> + ret <2 x float> %vt +} + +define <2 x double> @vextend(<2 x float> %a) { +; CHECK: vcvt.f64.f32 [[D0:d[0-9]+]], [[S0:s[0-9]+]] +; CHECK: vcvt.f64.f32 [[D1:d[0-9]+]], [[S1:s[0-9]+]] + %ve = fpext <2 x float> %a to <2 x double> + ret <2 x double> %ve +} + +; We used to generate vmovs between scalar and vfp/neon registers. +; CHECK: vsitofp_double +define void @vsitofp_double(<2 x i32>* %loadaddr, + <2 x double>* %storeaddr) { + %v0 = load <2 x i32>* %loadaddr +; CHECK: vldr +; CHECK-NEXT: vcvt.f64.s32 +; CHECK-NEXT: vcvt.f64.s32 +; CHECK-NEXT: vst + %r = sitofp <2 x i32> %v0 to <2 x double> + store <2 x double> %r, <2 x double>* %storeaddr + ret void +} +; CHECK: vuitofp_double +define void @vuitofp_double(<2 x i32>* %loadaddr, + <2 x double>* %storeaddr) { + %v0 = load <2 x i32>* %loadaddr +; CHECK: vldr +; CHECK-NEXT: vcvt.f64.u32 +; CHECK-NEXT: vcvt.f64.u32 +; CHECK-NEXT: vst + %r = uitofp <2 x i32> %v0 to <2 x double> + store <2 x double> %r, <2 x double>* %storeaddr + ret void +} diff --git a/test/CodeGen/ARM/neon_ld2.ll b/test/CodeGen/ARM/neon_ld2.ll index 497619ed746a..25a670b09778 100644 --- a/test/CodeGen/ARM/neon_ld2.ll +++ b/test/CodeGen/ARM/neon_ld2.ll @@ -7,10 +7,10 @@ ; CHECK: vadd.i64 q ; CHECK: vst1.64 ; SWIFT: t1 -; SWIFT: vld1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+, :128\]}} -; SWIFT: vld1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+, :128\]}} +; SWIFT: vld1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+:128\]}} +; SWIFT: vld1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+:128\]}} ; SWIFT: vadd.i64 q -; SWIFT: vst1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+, :128\]}} +; SWIFT: vst1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+:128\]}} define void @t1(<4 x i32>* %r, <2 x i64>* %a, <2 x i64>* %b) nounwind { entry: %0 = load <2 x i64>* %a, align 16 ; <<2 x i64>> [#uses=1] @@ -28,8 +28,8 @@ entry: ; CHECK: vmov r0, r1, d ; CHECK: vmov r2, r3, d ; SWIFT: t2 -; SWIFT: vld1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+, :128\]}} -; SWIFT: vld1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+, :128\]}} +; SWIFT: vld1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+:128\]}} +; SWIFT: vld1.64 {{.d[0-9]+, d[0-9]+}, \[r[0-9]+:128\]}} ; SWIFT: vsub.i64 q ; SWIFT: vmov r0, r1, d ; SWIFT: vmov r2, r3, d diff --git a/test/CodeGen/ARM/neon_minmax.ll b/test/CodeGen/ARM/neon_minmax.ll index d301c6a4ca90..0a7c8b2b6aae 100644 --- a/test/CodeGen/ARM/neon_minmax.ll +++ b/test/CodeGen/ARM/neon_minmax.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s +; RUN: llc < %s -march=arm -mcpu=swift | FileCheck %s define float @fmin_ole(float %x) nounwind { ;CHECK: fmin_ole: diff --git a/test/CodeGen/ARM/popcnt.ll b/test/CodeGen/ARM/popcnt.ll new file mode 100644 index 000000000000..0b9c9467c206 --- /dev/null +++ b/test/CodeGen/ARM/popcnt.ll @@ -0,0 +1,191 @@ +; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s +; Implement ctpop with vcnt + +define <8 x i8> @vcnt8(<8 x i8>* %A) nounwind { +;CHECK: vcnt8: +;CHECK: vcnt.8 {{d[0-9]+}}, {{d[0-9]+}} + %tmp1 = load <8 x i8>* %A + %tmp2 = call <8 x i8> @llvm.ctpop.v8i8(<8 x i8> %tmp1) + ret <8 x i8> %tmp2 +} + +define <16 x i8> @vcntQ8(<16 x i8>* %A) nounwind { +;CHECK: vcntQ8: +;CHECK: vcnt.8 {{q[0-9]+}}, {{q[0-9]+}} + %tmp1 = load <16 x i8>* %A + %tmp2 = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %tmp1) + ret <16 x i8> %tmp2 +} + +define <4 x i16> @vcnt16(<4 x i16>* %A) nounwind { +; CHECK: vcnt16: +; CHECK: vcnt.8 {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vrev16.8 {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vadd.i8 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vuzp.8 {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vmovl.u8 {{q[0-9]+}}, {{d[0-9]+}} + %tmp1 = load <4 x i16>* %A + %tmp2 = call <4 x i16> @llvm.ctpop.v4i16(<4 x i16> %tmp1) + ret <4 x i16> %tmp2 +} + +define <8 x i16> @vcntQ16(<8 x i16>* %A) nounwind { +; CHECK: vcntQ16: +; CHECK: vcnt.8 {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vrev16.8 {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vadd.i8 {{q[0-9]+}}, {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vuzp.8 {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vmovl.u8 {{q[0-9]+}}, {{d[0-9]+}} + %tmp1 = load <8 x i16>* %A + %tmp2 = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %tmp1) + ret <8 x i16> %tmp2 +} + +define <2 x i32> @vcnt32(<2 x i32>* %A) nounwind { +; CHECK: vcnt32: +; CHECK: vcnt.8 {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vrev16.8 {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vadd.i8 {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vuzp.8 {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vmovl.u8 {{q[0-9]+}}, {{d[0-9]+}} +; CHECK: vrev32.16 {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vuzp.16 {{d[0-9]+}}, {{d[0-9]+}} +; CHECK: vmovl.u16 {{q[0-9]+}}, {{d[0-9]+}} + %tmp1 = load <2 x i32>* %A + %tmp2 = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %tmp1) + ret <2 x i32> %tmp2 +} + +define <4 x i32> @vcntQ32(<4 x i32>* %A) nounwind { +; CHECK: vcntQ32: +; CHECK: vcnt.8 {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vrev16.8 {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vadd.i8 {{q[0-9]+}}, {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vuzp.8 {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vmovl.u8 {{q[0-9]+}}, {{d[0-9]+}} +; CHECK: vrev32.16 {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vuzp.16 {{q[0-9]+}}, {{q[0-9]+}} +; CHECK: vmovl.u16 {{q[0-9]+}}, {{d[0-9]+}} + %tmp1 = load <4 x i32>* %A + %tmp2 = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %tmp1) + ret <4 x i32> %tmp2 +} + +declare <8 x i8> @llvm.ctpop.v8i8(<8 x i8>) nounwind readnone +declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>) nounwind readnone +declare <4 x i16> @llvm.ctpop.v4i16(<4 x i16>) nounwind readnone +declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>) nounwind readnone +declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>) nounwind readnone +declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>) nounwind readnone + +define <8 x i8> @vclz8(<8 x i8>* %A) nounwind { +;CHECK: vclz8: +;CHECK: vclz.i8 {{d[0-9]+}}, {{d[0-9]+}} + %tmp1 = load <8 x i8>* %A + %tmp2 = call <8 x i8> @llvm.ctlz.v8i8(<8 x i8> %tmp1, i1 0) + ret <8 x i8> %tmp2 +} + +define <4 x i16> @vclz16(<4 x i16>* %A) nounwind { +;CHECK: vclz16: +;CHECK: vclz.i16 {{d[0-9]+}}, {{d[0-9]+}} + %tmp1 = load <4 x i16>* %A + %tmp2 = call <4 x i16> @llvm.ctlz.v4i16(<4 x i16> %tmp1, i1 0) + ret <4 x i16> %tmp2 +} + +define <2 x i32> @vclz32(<2 x i32>* %A) nounwind { +;CHECK: vclz32: +;CHECK: vclz.i32 {{d[0-9]+}}, {{d[0-9]+}} + %tmp1 = load <2 x i32>* %A + %tmp2 = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %tmp1, i1 0) + ret <2 x i32> %tmp2 +} + +define <16 x i8> @vclzQ8(<16 x i8>* %A) nounwind { +;CHECK: vclzQ8: +;CHECK: vclz.i8 {{q[0-9]+}}, {{q[0-9]+}} + %tmp1 = load <16 x i8>* %A + %tmp2 = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %tmp1, i1 0) + ret <16 x i8> %tmp2 +} + +define <8 x i16> @vclzQ16(<8 x i16>* %A) nounwind { +;CHECK: vclzQ16: +;CHECK: vclz.i16 {{q[0-9]+}}, {{q[0-9]+}} + %tmp1 = load <8 x i16>* %A + %tmp2 = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %tmp1, i1 0) + ret <8 x i16> %tmp2 +} + +define <4 x i32> @vclzQ32(<4 x i32>* %A) nounwind { +;CHECK: vclzQ32: +;CHECK: vclz.i32 {{q[0-9]+}}, {{q[0-9]+}} + %tmp1 = load <4 x i32>* %A + %tmp2 = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %tmp1, i1 0) + ret <4 x i32> %tmp2 +} + +declare <8 x i8> @llvm.ctlz.v8i8(<8 x i8>, i1) nounwind readnone +declare <4 x i16> @llvm.ctlz.v4i16(<4 x i16>, i1) nounwind readnone +declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1) nounwind readnone + +declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1) nounwind readnone +declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1) nounwind readnone +declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1) nounwind readnone + +define <8 x i8> @vclss8(<8 x i8>* %A) nounwind { +;CHECK: vclss8: +;CHECK: vcls.s8 + %tmp1 = load <8 x i8>* %A + %tmp2 = call <8 x i8> @llvm.arm.neon.vcls.v8i8(<8 x i8> %tmp1) + ret <8 x i8> %tmp2 +} + +define <4 x i16> @vclss16(<4 x i16>* %A) nounwind { +;CHECK: vclss16: +;CHECK: vcls.s16 + %tmp1 = load <4 x i16>* %A + %tmp2 = call <4 x i16> @llvm.arm.neon.vcls.v4i16(<4 x i16> %tmp1) + ret <4 x i16> %tmp2 +} + +define <2 x i32> @vclss32(<2 x i32>* %A) nounwind { +;CHECK: vclss32: +;CHECK: vcls.s32 + %tmp1 = load <2 x i32>* %A + %tmp2 = call <2 x i32> @llvm.arm.neon.vcls.v2i32(<2 x i32> %tmp1) + ret <2 x i32> %tmp2 +} + +define <16 x i8> @vclsQs8(<16 x i8>* %A) nounwind { +;CHECK: vclsQs8: +;CHECK: vcls.s8 + %tmp1 = load <16 x i8>* %A + %tmp2 = call <16 x i8> @llvm.arm.neon.vcls.v16i8(<16 x i8> %tmp1) + ret <16 x i8> %tmp2 +} + +define <8 x i16> @vclsQs16(<8 x i16>* %A) nounwind { +;CHECK: vclsQs16: +;CHECK: vcls.s16 + %tmp1 = load <8 x i16>* %A + %tmp2 = call <8 x i16> @llvm.arm.neon.vcls.v8i16(<8 x i16> %tmp1) + ret <8 x i16> %tmp2 +} + +define <4 x i32> @vclsQs32(<4 x i32>* %A) nounwind { +;CHECK: vclsQs32: +;CHECK: vcls.s32 + %tmp1 = load <4 x i32>* %A + %tmp2 = call <4 x i32> @llvm.arm.neon.vcls.v4i32(<4 x i32> %tmp1) + ret <4 x i32> %tmp2 +} + +declare <8 x i8> @llvm.arm.neon.vcls.v8i8(<8 x i8>) nounwind readnone +declare <4 x i16> @llvm.arm.neon.vcls.v4i16(<4 x i16>) nounwind readnone +declare <2 x i32> @llvm.arm.neon.vcls.v2i32(<2 x i32>) nounwind readnone + +declare <16 x i8> @llvm.arm.neon.vcls.v16i8(<16 x i8>) nounwind readnone +declare <8 x i16> @llvm.arm.neon.vcls.v8i16(<8 x i16>) nounwind readnone +declare <4 x i32> @llvm.arm.neon.vcls.v4i32(<4 x i32>) nounwind readnone diff --git a/test/CodeGen/ARM/reg_asc_order.ll b/test/CodeGen/ARM/reg_asc_order.ll deleted file mode 100644 index d1d0ee5f3e7b..000000000000 --- a/test/CodeGen/ARM/reg_asc_order.ll +++ /dev/null @@ -1,16 +0,0 @@ -; RUN: llc < %s -march=arm -mcpu=cortex-a8 | FileCheck %s -; Check that memcpy gets lowered to ldm/stm, at least in this very smple case. - -%struct.Foo = type { i32, i32, i32, i32 } - -define void @_Z10CopyStructP3FooS0_(%struct.Foo* nocapture %a, %struct.Foo* nocapture %b) nounwind { -entry: -;CHECK: ldm -;CHECK: stm - %0 = bitcast %struct.Foo* %a to i8* - %1 = bitcast %struct.Foo* %b to i8* - tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %0, i8* %1, i32 16, i32 4, i1 false) - ret void -} - -declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind diff --git a/test/CodeGen/ARM/reg_sequence.ll b/test/CodeGen/ARM/reg_sequence.ll index 6d6586e4f283..fd2083cf9f41 100644 --- a/test/CodeGen/ARM/reg_sequence.ll +++ b/test/CodeGen/ARM/reg_sequence.ll @@ -242,8 +242,8 @@ define arm_aapcs_vfpcc float @t9(%0* nocapture, %3* nocapture) nounwind { ; CHECK: vldr ; CHECK-NOT: vmov d{{.*}}, d16 ; CHECK: vmov.i32 d17 -; CHECK-NEXT: vst1.64 {d16, d17}, [r0, :128] -; CHECK-NEXT: vst1.64 {d16, d17}, [r0, :128] +; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128] +; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128] %3 = bitcast double 0.000000e+00 to <2 x float> ; <<2 x float>> [#uses=2] %4 = shufflevector <2 x float> %3, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1] store <4 x float> %4, <4 x float>* undef, align 16 diff --git a/test/CodeGen/ARM/ret_sret_vector.ll b/test/CodeGen/ARM/ret_sret_vector.ll new file mode 100644 index 000000000000..9bb3519555e8 --- /dev/null +++ b/test/CodeGen/ARM/ret_sret_vector.ll @@ -0,0 +1,12 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios3.0.0" + +define <4 x double> @PR14337(<4 x double> %a, <4 x double> %b) { + %foo = fadd <4 x double> %a, %b + ret <4 x double> %foo +; CHECK: PR14337: +; CHECK: vst1.64 +; CHECK: vst1.64 +} diff --git a/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll b/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll new file mode 100644 index 000000000000..d8241d0dc380 --- /dev/null +++ b/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll @@ -0,0 +1,67 @@ +; RUN: llc < %s -O1 -mtriple thumbv7-apple-ios6 +; Just make sure no one tries to make the assumption that the normal edge of an +; invoke is never a critical edge. Previously, this code would assert. + +%struct.__CFString = type opaque + +declare void @bar(%struct.__CFString*, %struct.__CFString*) + +define noalias i8* @foo(i8* nocapture %inRefURL) noreturn ssp { +entry: + %call = tail call %struct.__CFString* @bar3() + %call2 = invoke i8* @bar2() + to label %for.cond unwind label %lpad + +for.cond: ; preds = %entry, %for.cond + invoke void @bar(%struct.__CFString* undef, %struct.__CFString* null) + to label %for.cond unwind label %lpad5 + +lpad: ; preds = %entry + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + %1 = extractvalue { i8*, i32 } %0, 0 + %2 = extractvalue { i8*, i32 } %0, 1 + br label %ehcleanup + +lpad5: ; preds = %for.cond + %3 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + %4 = extractvalue { i8*, i32 } %3, 0 + %5 = extractvalue { i8*, i32 } %3, 1 + invoke void @release(i8* %call2) + to label %ehcleanup unwind label %terminate.lpad.i.i16 + +terminate.lpad.i.i16: ; preds = %lpad5 + %6 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* null + tail call void @terminatev() noreturn nounwind + unreachable + +ehcleanup: ; preds = %lpad5, %lpad + %exn.slot.0 = phi i8* [ %1, %lpad ], [ %4, %lpad5 ] + %ehselector.slot.0 = phi i32 [ %2, %lpad ], [ %5, %lpad5 ] + %7 = bitcast %struct.__CFString* %call to i8* + invoke void @release(i8* %7) + to label %_ZN5SmartIPK10__CFStringED1Ev.exit unwind label %terminate.lpad.i.i + +terminate.lpad.i.i: ; preds = %ehcleanup + %8 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* null + tail call void @terminatev() noreturn nounwind + unreachable + +_ZN5SmartIPK10__CFStringED1Ev.exit: ; preds = %ehcleanup + %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn.slot.0, 0 + %lpad.val12 = insertvalue { i8*, i32 } %lpad.val, i32 %ehselector.slot.0, 1 + resume { i8*, i32 } %lpad.val12 +} + +declare %struct.__CFString* @bar3() + +declare i8* @bar2() + +declare i32 @__gxx_personality_sj0(...) + +declare void @release(i8*) + +declare void @terminatev() diff --git a/test/CodeGen/ARM/spill-q.ll b/test/CodeGen/ARM/spill-q.ll index 057ea11389ac..e93cdbc10a46 100644 --- a/test/CodeGen/ARM/spill-q.ll +++ b/test/CodeGen/ARM/spill-q.ll @@ -12,8 +12,8 @@ declare <4 x float> @llvm.arm.neon.vld1.v4f32(i8*, i32) nounwind readonly define void @aaa(%quuz* %this, i8* %block) { ; CHECK: aaa: ; CHECK: bic {{.*}}, #15 -; CHECK: vst1.64 {{.*}}sp, :128 -; CHECK: vld1.64 {{.*}}sp, :128 +; CHECK: vst1.64 {{.*}}sp:128 +; CHECK: vld1.64 {{.*}}sp:128 entry: %aligned_vec = alloca <4 x float>, align 16 %"alloca point" = bitcast i32 0 to i32 diff --git a/test/CodeGen/ARM/subreg-remat.ll b/test/CodeGen/ARM/subreg-remat.ll index 455bfce0f2e5..1bc0315354cb 100644 --- a/test/CodeGen/ARM/subreg-remat.ll +++ b/test/CodeGen/ARM/subreg-remat.ll @@ -12,7 +12,7 @@ target triple = "thumbv7-apple-ios" ; ; CHECK: f1 ; CHECK: vmov d0, r0, r0 -; CHECK: vldr s0, LCPI +; CHECK: vldr s1, LCPI ; The vector must be spilled: ; CHECK: vstr d0, ; CHECK: asm clobber d0 @@ -20,8 +20,8 @@ target triple = "thumbv7-apple-ios" ; CHECK: vldr [[D16:d[0-9]+]], ; CHECK: vstr [[D16]], [r1] define void @f1(float %x, <2 x float>* %p) { - %v1 = insertelement <2 x float> undef, float %x, i32 1 - %v2 = insertelement <2 x float> %v1, float 0x400921FB60000000, i32 0 + %v1 = insertelement <2 x float> undef, float %x, i32 0 + %v2 = insertelement <2 x float> %v1, float 0x400921FB60000000, i32 1 %y = call double asm sideeffect "asm clobber $0", "=w,0,~{d1},~{d2},~{d3},~{d4},~{d5},~{d6},~{d7},~{d8},~{d9},~{d10},~{d11},~{d12},~{d13},~{d14},~{d15},~{d16},~{d17},~{d18},~{d19},~{d20},~{d21},~{d22},~{d23},~{d24},~{d25},~{d26},~{d27},~{d28},~{d29},~{d30},~{d31}"(<2 x float> %v2) nounwind store <2 x float> %v2, <2 x float>* %p, align 8 ret void diff --git a/test/CodeGen/ARM/trap.ll b/test/CodeGen/ARM/trap.ll index 21865f8e4aed..a4e3c3c0efa9 100644 --- a/test/CodeGen/ARM/trap.ll +++ b/test/CodeGen/ARM/trap.ll @@ -1,5 +1,23 @@ ; RUN: llc < %s -mtriple=arm-apple-darwin | FileCheck %s -check-prefix=INSTR ; RUN: llc < %s -mtriple=arm-apple-darwin -trap-func=_trap | FileCheck %s -check-prefix=FUNC +; RUN: llc -mtriple=armv7-unknown-nacl -filetype=obj %s -o - \ +; RUN: | llvm-objdump -disassemble -triple armv7-unknown-nacl - \ +; RUN: | FileCheck %s -check-prefix=ENCODING-NACL +; RUN: llc -mtriple=armv7-unknown-nacl -filetype=obj %s -o - \ +; RUN: | llvm-objdump -disassemble -triple armv7 -mattr=+nacl-trap - \ +; RUN: | FileCheck %s -check-prefix=ENCODING-NACL +; RUN: llc -mtriple=armv7 -mattr=+nacl-trap -filetype=obj %s -o - \ +; RUN: | llvm-objdump -disassemble -triple armv7 -mattr=+nacl-trap - \ +; RUN: | FileCheck %s -check-prefix=ENCODING-NACL +; RUN: llc -fast-isel -mtriple=armv7-unknown-nacl -filetype=obj %s -o - \ +; RUN: | llvm-objdump -disassemble -triple armv7-unknown-nacl - \ +; RUN: | FileCheck %s -check-prefix=ENCODING-NACL +; RUN: llc -mtriple=armv7 -filetype=obj %s -o - \ +; RUN: | llvm-objdump -disassemble -triple armv7 - \ +; RUN: | FileCheck %s -check-prefix=ENCODING-ALL +; RUN: llc -fast-isel -mtriple=armv7 -filetype=obj %s -o - \ +; RUN: | llvm-objdump -disassemble -triple armv7 - \ +; RUN: | FileCheck %s -check-prefix=ENCODING-ALL ; rdar://7961298 ; rdar://9249183 @@ -10,6 +28,11 @@ entry: ; FUNC: t: ; FUNC: bl __trap + +; ENCODING-NACL: f0 de fe e7 + +; ENCODING-ALL: fe de ff e7 + call void @llvm.trap() unreachable } @@ -21,6 +44,11 @@ entry: ; FUNC: t2: ; FUNC: bl __trap + +; ENCODING-NACL: f0 de fe e7 + +; ENCODING-ALL: fe de ff e7 + call void @llvm.debugtrap() unreachable } diff --git a/test/CodeGen/ARM/vcvt.ll b/test/CodeGen/ARM/vcvt.ll index c078f493094b..e67b4788a37d 100644 --- a/test/CodeGen/ARM/vcvt.ll +++ b/test/CodeGen/ARM/vcvt.ll @@ -156,3 +156,175 @@ define <4 x i16> @vcvt_f32tof16(<4 x float>* %A) nounwind { declare <4 x float> @llvm.arm.neon.vcvthf2fp(<4 x i16>) nounwind readnone declare <4 x i16> @llvm.arm.neon.vcvtfp2hf(<4 x float>) nounwind readnone + +; We currently estimate the cost of sext/zext/trunc v8(v16)i32 <-> v8(v16)i8 +; instructions as expensive. If lowering is improved the cost model needs to +; change. +; RUN: opt < %s -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -march=arm -mcpu=cortex-a8 | FileCheck %s --check-prefix=COST +%T0_5 = type <8 x i8> +%T1_5 = type <8 x i32> +; CHECK: func_cvt5: +define void @func_cvt5(%T0_5* %loadaddr, %T1_5* %storeaddr) { +; CHECK: vmovl.s8 +; CHECK: vmovl.s16 +; CHECK: vmovl.s16 + %v0 = load %T0_5* %loadaddr +; COST: func_cvt5 +; COST: cost of 3 {{.*}} sext + %r = sext %T0_5 %v0 to %T1_5 + store %T1_5 %r, %T1_5* %storeaddr + ret void +} +;; We currently estimate the cost of this instruction as expensive. If lowering +;; is improved the cost needs to change. +%TA0_5 = type <8 x i8> +%TA1_5 = type <8 x i32> +; CHECK: func_cvt1: +define void @func_cvt1(%TA0_5* %loadaddr, %TA1_5* %storeaddr) { +; CHECK: vmovl.u8 +; CHECK: vmovl.u16 +; CHECK: vmovl.u16 + %v0 = load %TA0_5* %loadaddr +; COST: func_cvt1 +; COST: cost of 3 {{.*}} zext + %r = zext %TA0_5 %v0 to %TA1_5 + store %TA1_5 %r, %TA1_5* %storeaddr + ret void +} +;; We currently estimate the cost of this instruction as expensive. If lowering +;; is improved the cost needs to change. +%T0_51 = type <8 x i32> +%T1_51 = type <8 x i8> +; CHECK: func_cvt51: +define void @func_cvt51(%T0_51* %loadaddr, %T1_51* %storeaddr) { +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb + %v0 = load %T0_51* %loadaddr +; COST: func_cvt51 +; COST: cost of 19 {{.*}} trunc + %r = trunc %T0_51 %v0 to %T1_51 + store %T1_51 %r, %T1_51* %storeaddr + ret void +} +;; We currently estimate the cost of this instruction as expensive. If lowering +;; is improved the cost needs to change. +%TT0_5 = type <16 x i8> +%TT1_5 = type <16 x i32> +; CHECK: func_cvt52: +define void @func_cvt52(%TT0_5* %loadaddr, %TT1_5* %storeaddr) { +; CHECK: vmovl.s16 +; CHECK: vmovl.s16 +; CHECK: vmovl.s16 +; CHECK: vmovl.s16 + %v0 = load %TT0_5* %loadaddr +; COST: func_cvt52 +; COST: cost of 6 {{.*}} sext + %r = sext %TT0_5 %v0 to %TT1_5 + store %TT1_5 %r, %TT1_5* %storeaddr + ret void +} +;; We currently estimate the cost of this instruction as expensive. If lowering +;; is improved the cost needs to change. +%TTA0_5 = type <16 x i8> +%TTA1_5 = type <16 x i32> +; CHECK: func_cvt12: +define void @func_cvt12(%TTA0_5* %loadaddr, %TTA1_5* %storeaddr) { +; CHECK: vmovl.u16 +; CHECK: vmovl.u16 +; CHECK: vmovl.u16 +; CHECK: vmovl.u16 + %v0 = load %TTA0_5* %loadaddr +; COST: func_cvt12 +; COST: cost of 6 {{.*}} zext + %r = zext %TTA0_5 %v0 to %TTA1_5 + store %TTA1_5 %r, %TTA1_5* %storeaddr + ret void +} +;; We currently estimate the cost of this instruction as expensive. If lowering +;; is improved the cost needs to change. +%TT0_51 = type <16 x i32> +%TT1_51 = type <16 x i8> +; CHECK: func_cvt512: +define void @func_cvt512(%TT0_51* %loadaddr, %TT1_51* %storeaddr) { +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb + %v0 = load %TT0_51* %loadaddr +; COST: func_cvt512 +; COST: cost of 38 {{.*}} trunc + %r = trunc %TT0_51 %v0 to %TT1_51 + store %TT1_51 %r, %TT1_51* %storeaddr + ret void +} + +; CHECK: sext_v4i16_v4i64: +define void @sext_v4i16_v4i64(<4 x i16>* %loadaddr, <4 x i64>* %storeaddr) { +; CHECK: vmovl.s32 +; CHECK: vmovl.s32 + %v0 = load <4 x i16>* %loadaddr +; COST: sext_v4i16_v4i64 +; COST: cost of 3 {{.*}} sext + %r = sext <4 x i16> %v0 to <4 x i64> + store <4 x i64> %r, <4 x i64>* %storeaddr + ret void +} + +; CHECK: zext_v4i16_v4i64: +define void @zext_v4i16_v4i64(<4 x i16>* %loadaddr, <4 x i64>* %storeaddr) { +; CHECK: vmovl.u32 +; CHECK: vmovl.u32 + %v0 = load <4 x i16>* %loadaddr +; COST: zext_v4i16_v4i64 +; COST: cost of 3 {{.*}} zext + %r = zext <4 x i16> %v0 to <4 x i64> + store <4 x i64> %r, <4 x i64>* %storeaddr + ret void +} + +; CHECK: sext_v8i16_v8i64: +define void @sext_v8i16_v8i64(<8 x i16>* %loadaddr, <8 x i64>* %storeaddr) { +; CHECK: vmovl.s32 +; CHECK: vmovl.s32 +; CHECK: vmovl.s32 +; CHECK: vmovl.s32 + %v0 = load <8 x i16>* %loadaddr +; COST: sext_v8i16_v8i64 +; COST: cost of 6 {{.*}} sext + %r = sext <8 x i16> %v0 to <8 x i64> + store <8 x i64> %r, <8 x i64>* %storeaddr + ret void +} + +; CHECK: zext_v8i16_v8i64: +define void @zext_v8i16_v8i64(<8 x i16>* %loadaddr, <8 x i64>* %storeaddr) { +; CHECK: vmovl.u32 +; CHECK: vmovl.u32 +; CHECK: vmovl.u32 +; CHECK: vmovl.u32 + %v0 = load <8 x i16>* %loadaddr +; COST: zext_v8i16_v8i64 +; COST: cost of 6 {{.*}} zext + %r = zext <8 x i16> %v0 to <8 x i64> + store <8 x i64> %r, <8 x i64>* %storeaddr + ret void +} + diff --git a/test/CodeGen/ARM/vector-DAGCombine.ll b/test/CodeGen/ARM/vector-DAGCombine.ll index a38a0feae042..42964deb0b5e 100644 --- a/test/CodeGen/ARM/vector-DAGCombine.ll +++ b/test/CodeGen/ARM/vector-DAGCombine.ll @@ -133,3 +133,30 @@ define i16 @foldBuildVectors() { %3 = extractelement <8 x i16> %2, i32 0 ret i16 %3 } + +; Test that we are generating vrev and vext for reverse shuffles of v8i16 +; shuffles. +; CHECK: reverse_v8i16 +define void @reverse_v8i16(<8 x i16>* %loadaddr, <8 x i16>* %storeaddr) { + %v0 = load <8 x i16>* %loadaddr + ; CHECK: vrev64.16 + ; CHECK: vext.16 + %v1 = shufflevector <8 x i16> %v0, <8 x i16> undef, + <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + store <8 x i16> %v1, <8 x i16>* %storeaddr + ret void +} + +; Test that we are generating vrev and vext for reverse shuffles of v16i8 +; shuffles. +; CHECK: reverse_v16i8 +define void @reverse_v16i8(<16 x i8>* %loadaddr, <16 x i8>* %storeaddr) { + %v0 = load <16 x i8>* %loadaddr + ; CHECK: vrev64.8 + ; CHECK: vext.8 + %v1 = shufflevector <16 x i8> %v0, <16 x i8> undef, + <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, + i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + store <16 x i8> %v1, <16 x i8>* %storeaddr + ret void +} diff --git a/test/CodeGen/ARM/vfloatintrinsics.ll b/test/CodeGen/ARM/vfloatintrinsics.ll new file mode 100644 index 000000000000..6f53b2ccd96c --- /dev/null +++ b/test/CodeGen/ARM/vfloatintrinsics.ll @@ -0,0 +1,377 @@ +; RUN: llc -mcpu=swift -march=arm < %s | FileCheck %s +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios6.1.0" + +;;; Float vectors + +%v2f32 = type <2 x float> +; CHECK: test_v2f32.sqrt: +define %v2f32 @test_v2f32.sqrt(%v2f32 %a) { + ; CHECK: sqrt + %1 = call %v2f32 @llvm.sqrt.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.powi: +define %v2f32 @test_v2f32.powi(%v2f32 %a, i32 %b) { + ; CHECK: pow + %1 = call %v2f32 @llvm.powi.v2f32(%v2f32 %a, i32 %b) + ret %v2f32 %1 +} +; CHECK: test_v2f32.sin: +define %v2f32 @test_v2f32.sin(%v2f32 %a) { + ; CHECK: sin + %1 = call %v2f32 @llvm.sin.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.cos: +define %v2f32 @test_v2f32.cos(%v2f32 %a) { + ; CHECK: cos + %1 = call %v2f32 @llvm.cos.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.pow: +define %v2f32 @test_v2f32.pow(%v2f32 %a, %v2f32 %b) { + ; CHECK: pow + %1 = call %v2f32 @llvm.pow.v2f32(%v2f32 %a, %v2f32 %b) + ret %v2f32 %1 +} +; CHECK: test_v2f32.exp: +define %v2f32 @test_v2f32.exp(%v2f32 %a) { + ; CHECK: exp + %1 = call %v2f32 @llvm.exp.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.exp2: +define %v2f32 @test_v2f32.exp2(%v2f32 %a) { + ; CHECK: exp + %1 = call %v2f32 @llvm.exp2.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.log: +define %v2f32 @test_v2f32.log(%v2f32 %a) { + ; CHECK: log + %1 = call %v2f32 @llvm.log.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.log10: +define %v2f32 @test_v2f32.log10(%v2f32 %a) { + ; CHECK: log + %1 = call %v2f32 @llvm.log10.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.log2: +define %v2f32 @test_v2f32.log2(%v2f32 %a) { + ; CHECK: log + %1 = call %v2f32 @llvm.log2.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.fma: +define %v2f32 @test_v2f32.fma(%v2f32 %a, %v2f32 %b, %v2f32 %c) { + ; CHECK: fma + %1 = call %v2f32 @llvm.fma.v2f32(%v2f32 %a, %v2f32 %b, %v2f32 %c) + ret %v2f32 %1 +} +; CHECK: test_v2f32.fabs: +define %v2f32 @test_v2f32.fabs(%v2f32 %a) { + ; CHECK: fabs + %1 = call %v2f32 @llvm.fabs.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.floor: +define %v2f32 @test_v2f32.floor(%v2f32 %a) { + ; CHECK: floor + %1 = call %v2f32 @llvm.floor.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.fceil: +define %v2f32 @test_v2f32.fceil(%v2f32 %a) { + ; CHECK: ceil + %1 = call %v2f32 @llvm.fceil.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.trunc: +define %v2f32 @test_v2f32.trunc(%v2f32 %a) { + ; CHECK: trunc + %1 = call %v2f32 @llvm.trunc.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.rint: +define %v2f32 @test_v2f32.rint(%v2f32 %a) { + ; CHECK: rint + %1 = call %v2f32 @llvm.rint.v2f32(%v2f32 %a) + ret %v2f32 %1 +} +; CHECK: test_v2f32.nearbyint: +define %v2f32 @test_v2f32.nearbyint(%v2f32 %a) { + ; CHECK: nearbyint + %1 = call %v2f32 @llvm.nearbyint.v2f32(%v2f32 %a) + ret %v2f32 %1 +} + +declare %v2f32 @llvm.sqrt.v2f32(%v2f32) #0 +declare %v2f32 @llvm.powi.v2f32(%v2f32, i32) #0 +declare %v2f32 @llvm.sin.v2f32(%v2f32) #0 +declare %v2f32 @llvm.cos.v2f32(%v2f32) #0 +declare %v2f32 @llvm.pow.v2f32(%v2f32, %v2f32) #0 +declare %v2f32 @llvm.exp.v2f32(%v2f32) #0 +declare %v2f32 @llvm.exp2.v2f32(%v2f32) #0 +declare %v2f32 @llvm.log.v2f32(%v2f32) #0 +declare %v2f32 @llvm.log10.v2f32(%v2f32) #0 +declare %v2f32 @llvm.log2.v2f32(%v2f32) #0 +declare %v2f32 @llvm.fma.v2f32(%v2f32, %v2f32, %v2f32) #0 +declare %v2f32 @llvm.fabs.v2f32(%v2f32) #0 +declare %v2f32 @llvm.floor.v2f32(%v2f32) #0 +declare %v2f32 @llvm.fceil.v2f32(%v2f32) #0 +declare %v2f32 @llvm.trunc.v2f32(%v2f32) #0 +declare %v2f32 @llvm.rint.v2f32(%v2f32) #0 +declare %v2f32 @llvm.nearbyint.v2f32(%v2f32) #0 + +;;; + +%v4f32 = type <4 x float> +; CHECK: test_v4f32.sqrt: +define %v4f32 @test_v4f32.sqrt(%v4f32 %a) { + ; CHECK: sqrt + %1 = call %v4f32 @llvm.sqrt.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.powi: +define %v4f32 @test_v4f32.powi(%v4f32 %a, i32 %b) { + ; CHECK: pow + %1 = call %v4f32 @llvm.powi.v4f32(%v4f32 %a, i32 %b) + ret %v4f32 %1 +} +; CHECK: test_v4f32.sin: +define %v4f32 @test_v4f32.sin(%v4f32 %a) { + ; CHECK: sin + %1 = call %v4f32 @llvm.sin.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.cos: +define %v4f32 @test_v4f32.cos(%v4f32 %a) { + ; CHECK: cos + %1 = call %v4f32 @llvm.cos.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.pow: +define %v4f32 @test_v4f32.pow(%v4f32 %a, %v4f32 %b) { + ; CHECK: pow + %1 = call %v4f32 @llvm.pow.v4f32(%v4f32 %a, %v4f32 %b) + ret %v4f32 %1 +} +; CHECK: test_v4f32.exp: +define %v4f32 @test_v4f32.exp(%v4f32 %a) { + ; CHECK: exp + %1 = call %v4f32 @llvm.exp.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.exp2: +define %v4f32 @test_v4f32.exp2(%v4f32 %a) { + ; CHECK: exp + %1 = call %v4f32 @llvm.exp2.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.log: +define %v4f32 @test_v4f32.log(%v4f32 %a) { + ; CHECK: log + %1 = call %v4f32 @llvm.log.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.log10: +define %v4f32 @test_v4f32.log10(%v4f32 %a) { + ; CHECK: log + %1 = call %v4f32 @llvm.log10.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.log2: +define %v4f32 @test_v4f32.log2(%v4f32 %a) { + ; CHECK: log + %1 = call %v4f32 @llvm.log2.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.fma: +define %v4f32 @test_v4f32.fma(%v4f32 %a, %v4f32 %b, %v4f32 %c) { + ; CHECK: fma + %1 = call %v4f32 @llvm.fma.v4f32(%v4f32 %a, %v4f32 %b, %v4f32 %c) + ret %v4f32 %1 +} +; CHECK: test_v4f32.fabs: +define %v4f32 @test_v4f32.fabs(%v4f32 %a) { + ; CHECK: fabs + %1 = call %v4f32 @llvm.fabs.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.floor: +define %v4f32 @test_v4f32.floor(%v4f32 %a) { + ; CHECK: floor + %1 = call %v4f32 @llvm.floor.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.fceil: +define %v4f32 @test_v4f32.fceil(%v4f32 %a) { + ; CHECK: ceil + %1 = call %v4f32 @llvm.fceil.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.trunc: +define %v4f32 @test_v4f32.trunc(%v4f32 %a) { + ; CHECK: trunc + %1 = call %v4f32 @llvm.trunc.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.rint: +define %v4f32 @test_v4f32.rint(%v4f32 %a) { + ; CHECK: rint + %1 = call %v4f32 @llvm.rint.v4f32(%v4f32 %a) + ret %v4f32 %1 +} +; CHECK: test_v4f32.nearbyint: +define %v4f32 @test_v4f32.nearbyint(%v4f32 %a) { + ; CHECK: nearbyint + %1 = call %v4f32 @llvm.nearbyint.v4f32(%v4f32 %a) + ret %v4f32 %1 +} + +declare %v4f32 @llvm.sqrt.v4f32(%v4f32) #0 +declare %v4f32 @llvm.powi.v4f32(%v4f32, i32) #0 +declare %v4f32 @llvm.sin.v4f32(%v4f32) #0 +declare %v4f32 @llvm.cos.v4f32(%v4f32) #0 +declare %v4f32 @llvm.pow.v4f32(%v4f32, %v4f32) #0 +declare %v4f32 @llvm.exp.v4f32(%v4f32) #0 +declare %v4f32 @llvm.exp2.v4f32(%v4f32) #0 +declare %v4f32 @llvm.log.v4f32(%v4f32) #0 +declare %v4f32 @llvm.log10.v4f32(%v4f32) #0 +declare %v4f32 @llvm.log2.v4f32(%v4f32) #0 +declare %v4f32 @llvm.fma.v4f32(%v4f32, %v4f32, %v4f32) #0 +declare %v4f32 @llvm.fabs.v4f32(%v4f32) #0 +declare %v4f32 @llvm.floor.v4f32(%v4f32) #0 +declare %v4f32 @llvm.fceil.v4f32(%v4f32) #0 +declare %v4f32 @llvm.trunc.v4f32(%v4f32) #0 +declare %v4f32 @llvm.rint.v4f32(%v4f32) #0 +declare %v4f32 @llvm.nearbyint.v4f32(%v4f32) #0 + +;;; Double vector + +%v2f64 = type <2 x double> +; CHECK: test_v2f64.sqrt: +define %v2f64 @test_v2f64.sqrt(%v2f64 %a) { + ; CHECK: sqrt + %1 = call %v2f64 @llvm.sqrt.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.powi: +define %v2f64 @test_v2f64.powi(%v2f64 %a, i32 %b) { + ; CHECK: pow + %1 = call %v2f64 @llvm.powi.v2f64(%v2f64 %a, i32 %b) + ret %v2f64 %1 +} +; CHECK: test_v2f64.sin: +define %v2f64 @test_v2f64.sin(%v2f64 %a) { + ; CHECK: sin + %1 = call %v2f64 @llvm.sin.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.cos: +define %v2f64 @test_v2f64.cos(%v2f64 %a) { + ; CHECK: cos + %1 = call %v2f64 @llvm.cos.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.pow: +define %v2f64 @test_v2f64.pow(%v2f64 %a, %v2f64 %b) { + ; CHECK: pow + %1 = call %v2f64 @llvm.pow.v2f64(%v2f64 %a, %v2f64 %b) + ret %v2f64 %1 +} +; CHECK: test_v2f64.exp: +define %v2f64 @test_v2f64.exp(%v2f64 %a) { + ; CHECK: exp + %1 = call %v2f64 @llvm.exp.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.exp2: +define %v2f64 @test_v2f64.exp2(%v2f64 %a) { + ; CHECK: exp + %1 = call %v2f64 @llvm.exp2.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.log: +define %v2f64 @test_v2f64.log(%v2f64 %a) { + ; CHECK: log + %1 = call %v2f64 @llvm.log.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.log10: +define %v2f64 @test_v2f64.log10(%v2f64 %a) { + ; CHECK: log + %1 = call %v2f64 @llvm.log10.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.log2: +define %v2f64 @test_v2f64.log2(%v2f64 %a) { + ; CHECK: log + %1 = call %v2f64 @llvm.log2.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.fma: +define %v2f64 @test_v2f64.fma(%v2f64 %a, %v2f64 %b, %v2f64 %c) { + ; CHECK: fma + %1 = call %v2f64 @llvm.fma.v2f64(%v2f64 %a, %v2f64 %b, %v2f64 %c) + ret %v2f64 %1 +} +; CHECK: test_v2f64.fabs: +define %v2f64 @test_v2f64.fabs(%v2f64 %a) { + ; CHECK: fabs + %1 = call %v2f64 @llvm.fabs.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.floor: +define %v2f64 @test_v2f64.floor(%v2f64 %a) { + ; CHECK: floor + %1 = call %v2f64 @llvm.floor.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.fceil: +define %v2f64 @test_v2f64.fceil(%v2f64 %a) { + ; CHECK: ceil + %1 = call %v2f64 @llvm.fceil.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.trunc: +define %v2f64 @test_v2f64.trunc(%v2f64 %a) { + ; CHECK: trunc + %1 = call %v2f64 @llvm.trunc.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.rint: +define %v2f64 @test_v2f64.rint(%v2f64 %a) { + ; CHECK: rint + %1 = call %v2f64 @llvm.rint.v2f64(%v2f64 %a) + ret %v2f64 %1 +} +; CHECK: test_v2f64.nearbyint: +define %v2f64 @test_v2f64.nearbyint(%v2f64 %a) { + ; CHECK: nearbyint + %1 = call %v2f64 @llvm.nearbyint.v2f64(%v2f64 %a) + ret %v2f64 %1 +} + +declare %v2f64 @llvm.sqrt.v2f64(%v2f64) #0 +declare %v2f64 @llvm.powi.v2f64(%v2f64, i32) #0 +declare %v2f64 @llvm.sin.v2f64(%v2f64) #0 +declare %v2f64 @llvm.cos.v2f64(%v2f64) #0 +declare %v2f64 @llvm.pow.v2f64(%v2f64, %v2f64) #0 +declare %v2f64 @llvm.exp.v2f64(%v2f64) #0 +declare %v2f64 @llvm.exp2.v2f64(%v2f64) #0 +declare %v2f64 @llvm.log.v2f64(%v2f64) #0 +declare %v2f64 @llvm.log10.v2f64(%v2f64) #0 +declare %v2f64 @llvm.log2.v2f64(%v2f64) #0 +declare %v2f64 @llvm.fma.v2f64(%v2f64, %v2f64, %v2f64) #0 +declare %v2f64 @llvm.fabs.v2f64(%v2f64) #0 +declare %v2f64 @llvm.floor.v2f64(%v2f64) #0 +declare %v2f64 @llvm.fceil.v2f64(%v2f64) #0 +declare %v2f64 @llvm.trunc.v2f64(%v2f64) #0 +declare %v2f64 @llvm.rint.v2f64(%v2f64) #0 +declare %v2f64 @llvm.nearbyint.v2f64(%v2f64) #0 + +attributes #0 = { nounwind readonly } diff --git a/test/CodeGen/ARM/vld1.ll b/test/CodeGen/ARM/vld1.ll index e524395c501a..994f05dacb84 100644 --- a/test/CodeGen/ARM/vld1.ll +++ b/test/CodeGen/ARM/vld1.ll @@ -4,7 +4,7 @@ define <8 x i8> @vld1i8(i8* %A) nounwind { ;CHECK: vld1i8: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vld1.8 {d16}, [r0, :64] +;CHECK: vld1.8 {d16}, [r0:64] %tmp1 = call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %A, i32 16) ret <8 x i8> %tmp1 } @@ -68,7 +68,7 @@ define <1 x i64> @vld1i64(i64* %A) nounwind { define <16 x i8> @vld1Qi8(i8* %A) nounwind { ;CHECK: vld1Qi8: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vld1.8 {d16, d17}, [r0, :64] +;CHECK: vld1.8 {d16, d17}, [r0:64] %tmp1 = call <16 x i8> @llvm.arm.neon.vld1.v16i8(i8* %A, i32 8) ret <16 x i8> %tmp1 } @@ -76,7 +76,7 @@ define <16 x i8> @vld1Qi8(i8* %A) nounwind { ;Check for a post-increment updating load. define <16 x i8> @vld1Qi8_update(i8** %ptr) nounwind { ;CHECK: vld1Qi8_update: -;CHECK: vld1.8 {d16, d17}, [{{r[0-9]+}}, :64]! +;CHECK: vld1.8 {d16, d17}, [{{r[0-9]+}}:64]! %A = load i8** %ptr %tmp1 = call <16 x i8> @llvm.arm.neon.vld1.v16i8(i8* %A, i32 8) %tmp2 = getelementptr i8* %A, i32 16 @@ -87,7 +87,7 @@ define <16 x i8> @vld1Qi8_update(i8** %ptr) nounwind { define <8 x i16> @vld1Qi16(i16* %A) nounwind { ;CHECK: vld1Qi16: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vld1.16 {d16, d17}, [r0, :128] +;CHECK: vld1.16 {d16, d17}, [r0:128] %tmp0 = bitcast i16* %A to i8* %tmp1 = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %tmp0, i32 32) ret <8 x i16> %tmp1 diff --git a/test/CodeGen/ARM/vld2.ll b/test/CodeGen/ARM/vld2.ll index 29b379465db5..caa016e929d8 100644 --- a/test/CodeGen/ARM/vld2.ll +++ b/test/CodeGen/ARM/vld2.ll @@ -14,7 +14,7 @@ define <8 x i8> @vld2i8(i8* %A) nounwind { ;CHECK: vld2i8: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vld2.8 {d16, d17}, [r0, :64] +;CHECK: vld2.8 {d16, d17}, [r0:64] %tmp1 = call %struct.__neon_int8x8x2_t @llvm.arm.neon.vld2.v8i8(i8* %A, i32 8) %tmp2 = extractvalue %struct.__neon_int8x8x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int8x8x2_t %tmp1, 1 @@ -25,7 +25,7 @@ define <8 x i8> @vld2i8(i8* %A) nounwind { define <4 x i16> @vld2i16(i16* %A) nounwind { ;CHECK: vld2i16: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vld2.16 {d16, d17}, [r0, :128] +;CHECK: vld2.16 {d16, d17}, [r0:128] %tmp0 = bitcast i16* %A to i8* %tmp1 = call %struct.__neon_int16x4x2_t @llvm.arm.neon.vld2.v4i16(i8* %tmp0, i32 32) %tmp2 = extractvalue %struct.__neon_int16x4x2_t %tmp1, 0 @@ -74,7 +74,7 @@ define <2 x float> @vld2f_update(float** %ptr) nounwind { define <1 x i64> @vld2i64(i64* %A) nounwind { ;CHECK: vld2i64: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vld1.64 {d16, d17}, [r0, :128] +;CHECK: vld1.64 {d16, d17}, [r0:128] %tmp0 = bitcast i64* %A to i8* %tmp1 = call %struct.__neon_int64x1x2_t @llvm.arm.neon.vld2.v1i64(i8* %tmp0, i32 32) %tmp2 = extractvalue %struct.__neon_int64x1x2_t %tmp1, 0 @@ -86,7 +86,7 @@ define <1 x i64> @vld2i64(i64* %A) nounwind { define <16 x i8> @vld2Qi8(i8* %A) nounwind { ;CHECK: vld2Qi8: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vld2.8 {d16, d17, d18, d19}, [r0, :64] +;CHECK: vld2.8 {d16, d17, d18, d19}, [r0:64] %tmp1 = call %struct.__neon_int8x16x2_t @llvm.arm.neon.vld2.v16i8(i8* %A, i32 8) %tmp2 = extractvalue %struct.__neon_int8x16x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int8x16x2_t %tmp1, 1 @@ -97,7 +97,7 @@ define <16 x i8> @vld2Qi8(i8* %A) nounwind { ;Check for a post-increment updating load with register increment. define <16 x i8> @vld2Qi8_update(i8** %ptr, i32 %inc) nounwind { ;CHECK: vld2Qi8_update: -;CHECK: vld2.8 {d16, d17, d18, d19}, [r2, :128], r1 +;CHECK: vld2.8 {d16, d17, d18, d19}, [r2:128], r1 %A = load i8** %ptr %tmp1 = call %struct.__neon_int8x16x2_t @llvm.arm.neon.vld2.v16i8(i8* %A, i32 16) %tmp2 = extractvalue %struct.__neon_int8x16x2_t %tmp1, 0 @@ -111,7 +111,7 @@ define <16 x i8> @vld2Qi8_update(i8** %ptr, i32 %inc) nounwind { define <8 x i16> @vld2Qi16(i16* %A) nounwind { ;CHECK: vld2Qi16: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vld2.16 {d16, d17, d18, d19}, [r0, :128] +;CHECK: vld2.16 {d16, d17, d18, d19}, [r0:128] %tmp0 = bitcast i16* %A to i8* %tmp1 = call %struct.__neon_int16x8x2_t @llvm.arm.neon.vld2.v8i16(i8* %tmp0, i32 16) %tmp2 = extractvalue %struct.__neon_int16x8x2_t %tmp1, 0 @@ -123,7 +123,7 @@ define <8 x i16> @vld2Qi16(i16* %A) nounwind { define <4 x i32> @vld2Qi32(i32* %A) nounwind { ;CHECK: vld2Qi32: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vld2.32 {d16, d17, d18, d19}, [r0, :256] +;CHECK: vld2.32 {d16, d17, d18, d19}, [r0:256] %tmp0 = bitcast i32* %A to i8* %tmp1 = call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2.v4i32(i8* %tmp0, i32 64) %tmp2 = extractvalue %struct.__neon_int32x4x2_t %tmp1, 0 diff --git a/test/CodeGen/ARM/vld3.ll b/test/CodeGen/ARM/vld3.ll index b495319830b0..ad63e1f716b2 100644 --- a/test/CodeGen/ARM/vld3.ll +++ b/test/CodeGen/ARM/vld3.ll @@ -15,7 +15,7 @@ define <8 x i8> @vld3i8(i8* %A) nounwind { ;CHECK: vld3i8: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vld3.8 {d16, d17, d18}, [r0, :64] +;CHECK: vld3.8 {d16, d17, d18}, [r0:64] %tmp1 = call %struct.__neon_int8x8x3_t @llvm.arm.neon.vld3.v8i8(i8* %A, i32 32) %tmp2 = extractvalue %struct.__neon_int8x8x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int8x8x3_t %tmp1, 2 @@ -74,7 +74,7 @@ define <2 x float> @vld3f(float* %A) nounwind { define <1 x i64> @vld3i64(i64* %A) nounwind { ;CHECK: vld3i64: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vld1.64 {d16, d17, d18}, [r0, :64] +;CHECK: vld1.64 {d16, d17, d18}, [r0:64] %tmp0 = bitcast i64* %A to i8* %tmp1 = call %struct.__neon_int64x1x3_t @llvm.arm.neon.vld3.v1i64(i8* %tmp0, i32 16) %tmp2 = extractvalue %struct.__neon_int64x1x3_t %tmp1, 0 @@ -86,8 +86,8 @@ define <1 x i64> @vld3i64(i64* %A) nounwind { define <16 x i8> @vld3Qi8(i8* %A) nounwind { ;CHECK: vld3Qi8: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vld3.8 {d16, d18, d20}, [r0, :64]! -;CHECK: vld3.8 {d17, d19, d21}, [r0, :64] +;CHECK: vld3.8 {d16, d18, d20}, [r0:64]! +;CHECK: vld3.8 {d17, d19, d21}, [r0:64] %tmp1 = call %struct.__neon_int8x16x3_t @llvm.arm.neon.vld3.v16i8(i8* %A, i32 32) %tmp2 = extractvalue %struct.__neon_int8x16x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int8x16x3_t %tmp1, 2 diff --git a/test/CodeGen/ARM/vld4.ll b/test/CodeGen/ARM/vld4.ll index 59a73db3187e..9ee5fe46eea2 100644 --- a/test/CodeGen/ARM/vld4.ll +++ b/test/CodeGen/ARM/vld4.ll @@ -14,7 +14,7 @@ define <8 x i8> @vld4i8(i8* %A) nounwind { ;CHECK: vld4i8: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vld4.8 {d16, d17, d18, d19}, [r0, :64] +;CHECK: vld4.8 {d16, d17, d18, d19}, [r0:64] %tmp1 = call %struct.__neon_int8x8x4_t @llvm.arm.neon.vld4.v8i8(i8* %A, i32 8) %tmp2 = extractvalue %struct.__neon_int8x8x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int8x8x4_t %tmp1, 2 @@ -25,7 +25,7 @@ define <8 x i8> @vld4i8(i8* %A) nounwind { ;Check for a post-increment updating load with register increment. define <8 x i8> @vld4i8_update(i8** %ptr, i32 %inc) nounwind { ;CHECK: vld4i8_update: -;CHECK: vld4.8 {d16, d17, d18, d19}, [r2, :128], r1 +;CHECK: vld4.8 {d16, d17, d18, d19}, [r2:128], r1 %A = load i8** %ptr %tmp1 = call %struct.__neon_int8x8x4_t @llvm.arm.neon.vld4.v8i8(i8* %A, i32 16) %tmp2 = extractvalue %struct.__neon_int8x8x4_t %tmp1, 0 @@ -39,7 +39,7 @@ define <8 x i8> @vld4i8_update(i8** %ptr, i32 %inc) nounwind { define <4 x i16> @vld4i16(i16* %A) nounwind { ;CHECK: vld4i16: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vld4.16 {d16, d17, d18, d19}, [r0, :128] +;CHECK: vld4.16 {d16, d17, d18, d19}, [r0:128] %tmp0 = bitcast i16* %A to i8* %tmp1 = call %struct.__neon_int16x4x4_t @llvm.arm.neon.vld4.v4i16(i8* %tmp0, i32 16) %tmp2 = extractvalue %struct.__neon_int16x4x4_t %tmp1, 0 @@ -51,7 +51,7 @@ define <4 x i16> @vld4i16(i16* %A) nounwind { define <2 x i32> @vld4i32(i32* %A) nounwind { ;CHECK: vld4i32: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vld4.32 {d16, d17, d18, d19}, [r0, :256] +;CHECK: vld4.32 {d16, d17, d18, d19}, [r0:256] %tmp0 = bitcast i32* %A to i8* %tmp1 = call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4.v2i32(i8* %tmp0, i32 32) %tmp2 = extractvalue %struct.__neon_int32x2x4_t %tmp1, 0 @@ -74,7 +74,7 @@ define <2 x float> @vld4f(float* %A) nounwind { define <1 x i64> @vld4i64(i64* %A) nounwind { ;CHECK: vld4i64: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vld1.64 {d16, d17, d18, d19}, [r0, :256] +;CHECK: vld1.64 {d16, d17, d18, d19}, [r0:256] %tmp0 = bitcast i64* %A to i8* %tmp1 = call %struct.__neon_int64x1x4_t @llvm.arm.neon.vld4.v1i64(i8* %tmp0, i32 64) %tmp2 = extractvalue %struct.__neon_int64x1x4_t %tmp1, 0 @@ -86,8 +86,8 @@ define <1 x i64> @vld4i64(i64* %A) nounwind { define <16 x i8> @vld4Qi8(i8* %A) nounwind { ;CHECK: vld4Qi8: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vld4.8 {d16, d18, d20, d22}, [r0, :256]! -;CHECK: vld4.8 {d17, d19, d21, d23}, [r0, :256] +;CHECK: vld4.8 {d16, d18, d20, d22}, [r0:256]! +;CHECK: vld4.8 {d17, d19, d21, d23}, [r0:256] %tmp1 = call %struct.__neon_int8x16x4_t @llvm.arm.neon.vld4.v16i8(i8* %A, i32 64) %tmp2 = extractvalue %struct.__neon_int8x16x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int8x16x4_t %tmp1, 2 @@ -111,8 +111,8 @@ define <8 x i16> @vld4Qi16(i16* %A) nounwind { ;Check for a post-increment updating load. define <8 x i16> @vld4Qi16_update(i16** %ptr) nounwind { ;CHECK: vld4Qi16_update: -;CHECK: vld4.16 {d16, d18, d20, d22}, [r1, :64]! -;CHECK: vld4.16 {d17, d19, d21, d23}, [r1, :64]! +;CHECK: vld4.16 {d16, d18, d20, d22}, [r1:64]! +;CHECK: vld4.16 {d17, d19, d21, d23}, [r1:64]! %A = load i16** %ptr %tmp0 = bitcast i16* %A to i8* %tmp1 = call %struct.__neon_int16x8x4_t @llvm.arm.neon.vld4.v8i16(i8* %tmp0, i32 8) diff --git a/test/CodeGen/ARM/vlddup.ll b/test/CodeGen/ARM/vlddup.ll index c69473f87f98..7c7319c090ba 100644 --- a/test/CodeGen/ARM/vlddup.ll +++ b/test/CodeGen/ARM/vlddup.ll @@ -13,7 +13,7 @@ define <8 x i8> @vld1dupi8(i8* %A) nounwind { define <4 x i16> @vld1dupi16(i16* %A) nounwind { ;CHECK: vld1dupi16: ;Check the alignment value. Max for this instruction is 16 bits: -;CHECK: vld1.16 {d16[]}, [r0, :16] +;CHECK: vld1.16 {d16[]}, [r0:16] %tmp1 = load i16* %A, align 8 %tmp2 = insertelement <4 x i16> undef, i16 %tmp1, i32 0 %tmp3 = shufflevector <4 x i16> %tmp2, <4 x i16> undef, <4 x i32> zeroinitializer @@ -23,7 +23,7 @@ define <4 x i16> @vld1dupi16(i16* %A) nounwind { define <2 x i32> @vld1dupi32(i32* %A) nounwind { ;CHECK: vld1dupi32: ;Check the alignment value. Max for this instruction is 32 bits: -;CHECK: vld1.32 {d16[]}, [r0, :32] +;CHECK: vld1.32 {d16[]}, [r0:32] %tmp1 = load i32* %A, align 8 %tmp2 = insertelement <2 x i32> undef, i32 %tmp1, i32 0 %tmp3 = shufflevector <2 x i32> %tmp2, <2 x i32> undef, <2 x i32> zeroinitializer @@ -32,7 +32,7 @@ define <2 x i32> @vld1dupi32(i32* %A) nounwind { define <2 x float> @vld1dupf(float* %A) nounwind { ;CHECK: vld1dupf: -;CHECK: vld1.32 {d16[]}, [r0, :32] +;CHECK: vld1.32 {d16[]}, [r0:32] %tmp0 = load float* %A %tmp1 = insertelement <2 x float> undef, float %tmp0, i32 0 %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer @@ -51,7 +51,7 @@ define <16 x i8> @vld1dupQi8(i8* %A) nounwind { define <4 x float> @vld1dupQf(float* %A) nounwind { ;CHECK: vld1dupQf: -;CHECK: vld1.32 {d16[], d17[]}, [r0, :32] +;CHECK: vld1.32 {d16[], d17[]}, [r0:32] %tmp0 = load float* %A %tmp1 = insertelement <4 x float> undef, float %tmp0, i32 0 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer @@ -109,7 +109,7 @@ define <4 x i16> @vld2dupi16_update(i16** %ptr) nounwind { define <2 x i32> @vld2dupi32(i8* %A) nounwind { ;CHECK: vld2dupi32: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vld2.32 {d16[], d17[]}, [r0, :64] +;CHECK: vld2.32 {d16[], d17[]}, [r0:64] %tmp0 = tail call %struct.__neon_int2x32x2_t @llvm.arm.neon.vld2lane.v2i32(i8* %A, <2 x i32> undef, <2 x i32> undef, i32 0, i32 16) %tmp1 = extractvalue %struct.__neon_int2x32x2_t %tmp0, 0 %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer @@ -194,7 +194,7 @@ define <2 x i32> @vld4dupi32(i8* %A) nounwind { ;CHECK: vld4dupi32: ;Check the alignment value. An 8-byte alignment is allowed here even though ;it is smaller than the total size of the memory being loaded. -;CHECK: vld4.32 {d16[], d17[], d18[], d19[]}, [r0, :64] +;CHECK: vld4.32 {d16[], d17[], d18[], d19[]}, [r0:64] %tmp0 = tail call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4lane.v2i32(i8* %A, <2 x i32> undef, <2 x i32> undef, <2 x i32> undef, <2 x i32> undef, i32 0, i32 8) %tmp1 = extractvalue %struct.__neon_int32x2x4_t %tmp0, 0 %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer diff --git a/test/CodeGen/ARM/vldlane.ll b/test/CodeGen/ARM/vldlane.ll index 7bd0cbda02b1..f35fa92f5dc7 100644 --- a/test/CodeGen/ARM/vldlane.ll +++ b/test/CodeGen/ARM/vldlane.ll @@ -14,7 +14,7 @@ define <8 x i8> @vld1lanei8(i8* %A, <8 x i8>* %B) nounwind { define <4 x i16> @vld1lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vld1lanei16: ;Check the alignment value. Max for this instruction is 16 bits: -;CHECK: vld1.16 {d16[2]}, [r0, :16] +;CHECK: vld1.16 {d16[2]}, [r0:16] %tmp1 = load <4 x i16>* %B %tmp2 = load i16* %A, align 8 %tmp3 = insertelement <4 x i16> %tmp1, i16 %tmp2, i32 2 @@ -24,7 +24,7 @@ define <4 x i16> @vld1lanei16(i16* %A, <4 x i16>* %B) nounwind { define <2 x i32> @vld1lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vld1lanei32: ;Check the alignment value. Max for this instruction is 32 bits: -;CHECK: vld1.32 {d16[1]}, [r0, :32] +;CHECK: vld1.32 {d16[1]}, [r0:32] %tmp1 = load <2 x i32>* %B %tmp2 = load i32* %A, align 8 %tmp3 = insertelement <2 x i32> %tmp1, i32 %tmp2, i32 1 @@ -34,7 +34,7 @@ define <2 x i32> @vld1lanei32(i32* %A, <2 x i32>* %B) nounwind { define <2 x i32> @vld1lanei32a32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vld1lanei32a32: ;Check the alignment value. Legal values are none or :32. -;CHECK: vld1.32 {d16[1]}, [r0, :32] +;CHECK: vld1.32 {d16[1]}, [r0:32] %tmp1 = load <2 x i32>* %B %tmp2 = load i32* %A, align 4 %tmp3 = insertelement <2 x i32> %tmp1, i32 %tmp2, i32 1 @@ -43,7 +43,7 @@ define <2 x i32> @vld1lanei32a32(i32* %A, <2 x i32>* %B) nounwind { define <2 x float> @vld1lanef(float* %A, <2 x float>* %B) nounwind { ;CHECK: vld1lanef: -;CHECK: vld1.32 {d16[1]}, [r0, :32] +;CHECK: vld1.32 {d16[1]}, [r0:32] %tmp1 = load <2 x float>* %B %tmp2 = load float* %A, align 4 %tmp3 = insertelement <2 x float> %tmp1, float %tmp2, i32 1 @@ -61,7 +61,7 @@ define <16 x i8> @vld1laneQi8(i8* %A, <16 x i8>* %B) nounwind { define <8 x i16> @vld1laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vld1laneQi16: -;CHECK: vld1.16 {d17[1]}, [r0, :16] +;CHECK: vld1.16 {d17[1]}, [r0:16] %tmp1 = load <8 x i16>* %B %tmp2 = load i16* %A, align 8 %tmp3 = insertelement <8 x i16> %tmp1, i16 %tmp2, i32 5 @@ -70,7 +70,7 @@ define <8 x i16> @vld1laneQi16(i16* %A, <8 x i16>* %B) nounwind { define <4 x i32> @vld1laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vld1laneQi32: -;CHECK: vld1.32 {d17[1]}, [r0, :32] +;CHECK: vld1.32 {d17[1]}, [r0:32] %tmp1 = load <4 x i32>* %B %tmp2 = load i32* %A, align 8 %tmp3 = insertelement <4 x i32> %tmp1, i32 %tmp2, i32 3 @@ -79,7 +79,7 @@ define <4 x i32> @vld1laneQi32(i32* %A, <4 x i32>* %B) nounwind { define <4 x float> @vld1laneQf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vld1laneQf: -;CHECK: vld1.32 {d16[0]}, [r0, :32] +;CHECK: vld1.32 {d16[0]}, [r0:32] %tmp1 = load <4 x float>* %B %tmp2 = load float* %A %tmp3 = insertelement <4 x float> %tmp1, float %tmp2, i32 0 @@ -98,7 +98,7 @@ define <4 x float> @vld1laneQf(float* %A, <4 x float>* %B) nounwind { define <8 x i8> @vld2lanei8(i8* %A, <8 x i8>* %B) nounwind { ;CHECK: vld2lanei8: ;Check the alignment value. Max for this instruction is 16 bits: -;CHECK: vld2.8 {d16[1], d17[1]}, [r0, :16] +;CHECK: vld2.8 {d16[1], d17[1]}, [r0:16] %tmp1 = load <8 x i8>* %B %tmp2 = call %struct.__neon_int8x8x2_t @llvm.arm.neon.vld2lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 4) %tmp3 = extractvalue %struct.__neon_int8x8x2_t %tmp2, 0 @@ -110,7 +110,7 @@ define <8 x i8> @vld2lanei8(i8* %A, <8 x i8>* %B) nounwind { define <4 x i16> @vld2lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vld2lanei16: ;Check the alignment value. Max for this instruction is 32 bits: -;CHECK: vld2.16 {d16[1], d17[1]}, [r0, :32] +;CHECK: vld2.16 {d16[1], d17[1]}, [r0:32] %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B %tmp2 = call %struct.__neon_int16x4x2_t @llvm.arm.neon.vld2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 8) @@ -176,7 +176,7 @@ define <8 x i16> @vld2laneQi16(i16* %A, <8 x i16>* %B) nounwind { define <4 x i32> @vld2laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vld2laneQi32: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vld2.32 {d17[0], d19[0]}, [{{r[0-9]+}}, :64] +;CHECK: vld2.32 {d17[0], d19[0]}, [{{r[0-9]+}}:64] %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B %tmp2 = call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 16) @@ -354,7 +354,7 @@ declare %struct.__neon_float32x4x3_t @llvm.arm.neon.vld3lane.v4f32(i8*, <4 x flo define <8 x i8> @vld4lanei8(i8* %A, <8 x i8>* %B) nounwind { ;CHECK: vld4lanei8: ;Check the alignment value. Max for this instruction is 32 bits: -;CHECK: vld4.8 {d{{.*}}[1], d{{.*}}[1], d{{.*}}[1], d{{.*}}[1]}, [{{r[0-9]+}}, :32] +;CHECK: vld4.8 {d{{.*}}[1], d{{.*}}[1], d{{.*}}[1], d{{.*}}[1]}, [{{r[0-9]+}}:32] %tmp1 = load <8 x i8>* %B %tmp2 = call %struct.__neon_int8x8x4_t @llvm.arm.neon.vld4lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 8) %tmp3 = extractvalue %struct.__neon_int8x8x4_t %tmp2, 0 @@ -370,7 +370,7 @@ define <8 x i8> @vld4lanei8(i8* %A, <8 x i8>* %B) nounwind { ;Check for a post-increment updating load. define <8 x i8> @vld4lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind { ;CHECK: vld4lanei8_update: -;CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [{{r[0-9]+}}, :32]! +;CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [{{r[0-9]+}}:32]! %A = load i8** %ptr %tmp1 = load <8 x i8>* %B %tmp2 = call %struct.__neon_int8x8x4_t @llvm.arm.neon.vld4lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 8) @@ -408,7 +408,7 @@ define <2 x i32> @vld4lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vld4lanei32: ;Check the alignment value. An 8-byte alignment is allowed here even though ;it is smaller than the total size of the memory being loaded. -;CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [{{r[0-9]+}}, :64] +;CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [{{r[0-9]+}}:64] %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B %tmp2 = call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 8) @@ -441,7 +441,7 @@ define <2 x float> @vld4lanef(float* %A, <2 x float>* %B) nounwind { define <8 x i16> @vld4laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vld4laneQi16: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [{{r[0-9]+}}, :64] +;CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [{{r[0-9]+}}:64] %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B %tmp2 = call %struct.__neon_int16x8x4_t @llvm.arm.neon.vld4lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1, i32 16) diff --git a/test/CodeGen/ARM/vselect_imax.ll b/test/CodeGen/ARM/vselect_imax.ll index f5994046de4b..7e79d6c68c2b 100644 --- a/test/CodeGen/ARM/vselect_imax.ll +++ b/test/CodeGen/ARM/vselect_imax.ll @@ -10,3 +10,114 @@ define void @vmax_v4i32(<4 x i32>* %m, <4 x i32> %a, <4 x i32> %b) { ret void } +; We adjusted the cost model of the following selects. When we improve code +; lowering we also need to adjust the cost. +%T0_10 = type <16 x i16> +%T1_10 = type <16 x i1> +; CHECK: func_blend10: +define void @func_blend10(%T0_10* %loadaddr, %T0_10* %loadaddr2, + %T1_10* %blend, %T0_10* %storeaddr) { + %v0 = load %T0_10* %loadaddr + %v1 = load %T0_10* %loadaddr2 + %c = icmp slt %T0_10 %v0, %v1 +; CHECK: vst1 +; CHECK: vst1 +; CHECK: vst1 +; CHECK: vst1 +; CHECK: vld +; COST: func_blend10 +; COST: cost of 40 {{.*}} select + %r = select %T1_10 %c, %T0_10 %v0, %T0_10 %v1 + store %T0_10 %r, %T0_10* %storeaddr + ret void +} +%T0_14 = type <8 x i32> +%T1_14 = type <8 x i1> +; CHECK: func_blend14: +define void @func_blend14(%T0_14* %loadaddr, %T0_14* %loadaddr2, + %T1_14* %blend, %T0_14* %storeaddr) { + %v0 = load %T0_14* %loadaddr + %v1 = load %T0_14* %loadaddr2 + %c = icmp slt %T0_14 %v0, %v1 +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; COST: func_blend14 +; COST: cost of 41 {{.*}} select + %r = select %T1_14 %c, %T0_14 %v0, %T0_14 %v1 + store %T0_14 %r, %T0_14* %storeaddr + ret void +} +%T0_15 = type <16 x i32> +%T1_15 = type <16 x i1> +; CHECK: func_blend15: +define void @func_blend15(%T0_15* %loadaddr, %T0_15* %loadaddr2, + %T1_15* %blend, %T0_15* %storeaddr) { + %v0 = load %T0_15* %loadaddr + %v1 = load %T0_15* %loadaddr2 + %c = icmp slt %T0_15 %v0, %v1 +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; COST: func_blend15 +; COST: cost of 82 {{.*}} select + %r = select %T1_15 %c, %T0_15 %v0, %T0_15 %v1 + store %T0_15 %r, %T0_15* %storeaddr + ret void +} +%T0_18 = type <4 x i64> +%T1_18 = type <4 x i1> +; CHECK: func_blend18: +define void @func_blend18(%T0_18* %loadaddr, %T0_18* %loadaddr2, + %T1_18* %blend, %T0_18* %storeaddr) { + %v0 = load %T0_18* %loadaddr + %v1 = load %T0_18* %loadaddr2 + %c = icmp slt %T0_18 %v0, %v1 +; CHECK: strh +; CHECK: strh +; CHECK: strh +; CHECK: strh +; COST: func_blend18 +; COST: cost of 19 {{.*}} select + %r = select %T1_18 %c, %T0_18 %v0, %T0_18 %v1 + store %T0_18 %r, %T0_18* %storeaddr + ret void +} +%T0_19 = type <8 x i64> +%T1_19 = type <8 x i1> +; CHECK: func_blend19: +define void @func_blend19(%T0_19* %loadaddr, %T0_19* %loadaddr2, + %T1_19* %blend, %T0_19* %storeaddr) { + %v0 = load %T0_19* %loadaddr + %v1 = load %T0_19* %loadaddr2 + %c = icmp slt %T0_19 %v0, %v1 +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; COST: func_blend19 +; COST: cost of 50 {{.*}} select + %r = select %T1_19 %c, %T0_19 %v0, %T0_19 %v1 + store %T0_19 %r, %T0_19* %storeaddr + ret void +} +%T0_20 = type <16 x i64> +%T1_20 = type <16 x i1> +; CHECK: func_blend20: +define void @func_blend20(%T0_20* %loadaddr, %T0_20* %loadaddr2, + %T1_20* %blend, %T0_20* %storeaddr) { + %v0 = load %T0_20* %loadaddr + %v1 = load %T0_20* %loadaddr2 + %c = icmp slt %T0_20 %v0, %v1 +; CHECK: strb +; CHECK: strb +; CHECK: strb +; CHECK: strb +; COST: func_blend20 +; COST: cost of 100 {{.*}} select + %r = select %T1_20 %c, %T0_20 %v0, %T0_20 %v1 + store %T0_20 %r, %T0_20* %storeaddr + ret void +} diff --git a/test/CodeGen/ARM/vst1.ll b/test/CodeGen/ARM/vst1.ll index 364d44b7116f..e1f3e8890724 100644 --- a/test/CodeGen/ARM/vst1.ll +++ b/test/CodeGen/ARM/vst1.ll @@ -3,7 +3,7 @@ define void @vst1i8(i8* %A, <8 x i8>* %B) nounwind { ;CHECK: vst1i8: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vst1.8 {d16}, [r0, :64] +;CHECK: vst1.8 {d16}, [r0:64] %tmp1 = load <8 x i8>* %B call void @llvm.arm.neon.vst1.v8i8(i8* %A, <8 x i8> %tmp1, i32 16) ret void @@ -61,7 +61,7 @@ define void @vst1i64(i64* %A, <1 x i64>* %B) nounwind { define void @vst1Qi8(i8* %A, <16 x i8>* %B) nounwind { ;CHECK: vst1Qi8: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vst1.8 {d16, d17}, [r0, :64] +;CHECK: vst1.8 {d16, d17}, [r0:64] %tmp1 = load <16 x i8>* %B call void @llvm.arm.neon.vst1.v16i8(i8* %A, <16 x i8> %tmp1, i32 8) ret void @@ -70,7 +70,7 @@ define void @vst1Qi8(i8* %A, <16 x i8>* %B) nounwind { define void @vst1Qi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst1Qi16: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vst1.16 {d16, d17}, [r0, :128] +;CHECK: vst1.16 {d16, d17}, [r0:128] %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B call void @llvm.arm.neon.vst1.v8i16(i8* %tmp0, <8 x i16> %tmp1, i32 32) @@ -80,7 +80,7 @@ define void @vst1Qi16(i16* %A, <8 x i16>* %B) nounwind { ;Check for a post-increment updating store with register increment. define void @vst1Qi16_update(i16** %ptr, <8 x i16>* %B, i32 %inc) nounwind { ;CHECK: vst1Qi16_update: -;CHECK: vst1.16 {d16, d17}, [r1, :64], r2 +;CHECK: vst1.16 {d16, d17}, [r1:64], r2 %A = load i16** %ptr %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B diff --git a/test/CodeGen/ARM/vst2.ll b/test/CodeGen/ARM/vst2.ll index fb05a20f6695..a31f8635fe3b 100644 --- a/test/CodeGen/ARM/vst2.ll +++ b/test/CodeGen/ARM/vst2.ll @@ -3,7 +3,7 @@ define void @vst2i8(i8* %A, <8 x i8>* %B) nounwind { ;CHECK: vst2i8: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vst2.8 {d16, d17}, [r0, :64] +;CHECK: vst2.8 {d16, d17}, [r0:64] %tmp1 = load <8 x i8>* %B call void @llvm.arm.neon.vst2.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 8) ret void @@ -24,7 +24,7 @@ define void @vst2i8_update(i8** %ptr, <8 x i8>* %B, i32 %inc) nounwind { define void @vst2i16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst2i16: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vst2.16 {d16, d17}, [r0, :128] +;CHECK: vst2.16 {d16, d17}, [r0:128] %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B call void @llvm.arm.neon.vst2.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 32) @@ -52,7 +52,7 @@ define void @vst2f(float* %A, <2 x float>* %B) nounwind { define void @vst2i64(i64* %A, <1 x i64>* %B) nounwind { ;CHECK: vst2i64: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vst1.64 {d16, d17}, [r0, :128] +;CHECK: vst1.64 {d16, d17}, [r0:128] %tmp0 = bitcast i64* %A to i8* %tmp1 = load <1 x i64>* %B call void @llvm.arm.neon.vst2.v1i64(i8* %tmp0, <1 x i64> %tmp1, <1 x i64> %tmp1, i32 32) @@ -62,7 +62,7 @@ define void @vst2i64(i64* %A, <1 x i64>* %B) nounwind { ;Check for a post-increment updating store. define void @vst2i64_update(i64** %ptr, <1 x i64>* %B) nounwind { ;CHECK: vst2i64_update: -;CHECK: vst1.64 {d16, d17}, [r1, :64]! +;CHECK: vst1.64 {d16, d17}, [r1:64]! %A = load i64** %ptr %tmp0 = bitcast i64* %A to i8* %tmp1 = load <1 x i64>* %B @@ -75,7 +75,7 @@ define void @vst2i64_update(i64** %ptr, <1 x i64>* %B) nounwind { define void @vst2Qi8(i8* %A, <16 x i8>* %B) nounwind { ;CHECK: vst2Qi8: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vst2.8 {d16, d17, d18, d19}, [r0, :64] +;CHECK: vst2.8 {d16, d17, d18, d19}, [r0:64] %tmp1 = load <16 x i8>* %B call void @llvm.arm.neon.vst2.v16i8(i8* %A, <16 x i8> %tmp1, <16 x i8> %tmp1, i32 8) ret void @@ -84,7 +84,7 @@ define void @vst2Qi8(i8* %A, <16 x i8>* %B) nounwind { define void @vst2Qi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst2Qi16: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vst2.16 {d16, d17, d18, d19}, [r0, :128] +;CHECK: vst2.16 {d16, d17, d18, d19}, [r0:128] %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B call void @llvm.arm.neon.vst2.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 16) @@ -94,7 +94,7 @@ define void @vst2Qi16(i16* %A, <8 x i16>* %B) nounwind { define void @vst2Qi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vst2Qi32: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vst2.32 {d16, d17, d18, d19}, [r0, :256] +;CHECK: vst2.32 {d16, d17, d18, d19}, [r0:256] %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B call void @llvm.arm.neon.vst2.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 64) diff --git a/test/CodeGen/ARM/vst3.ll b/test/CodeGen/ARM/vst3.ll index f117ab205d41..281bb730feb7 100644 --- a/test/CodeGen/ARM/vst3.ll +++ b/test/CodeGen/ARM/vst3.ll @@ -4,7 +4,7 @@ define void @vst3i8(i8* %A, <8 x i8>* %B) nounwind { ;CHECK: vst3i8: ;Check the alignment value. Max for this instruction is 64 bits: ;This test runs at -O0 so do not check for specific register numbers. -;CHECK: vst3.8 {d{{.*}}, d{{.*}}, d{{.*}}}, [r{{.*}}, :64] +;CHECK: vst3.8 {d{{.*}}, d{{.*}}, d{{.*}}}, [r{{.*}}:64] %tmp1 = load <8 x i8>* %B call void @llvm.arm.neon.vst3.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 32) ret void @@ -54,7 +54,7 @@ define void @vst3i64(i64* %A, <1 x i64>* %B) nounwind { ;CHECK: vst3i64: ;Check the alignment value. Max for this instruction is 64 bits: ;This test runs at -O0 so do not check for specific register numbers. -;CHECK: vst1.64 {d{{.*}}, d{{.*}}, d{{.*}}}, [r{{.*}}, :64] +;CHECK: vst1.64 {d{{.*}}, d{{.*}}, d{{.*}}}, [r{{.*}}:64] %tmp0 = bitcast i64* %A to i8* %tmp1 = load <1 x i64>* %B call void @llvm.arm.neon.vst3.v1i64(i8* %tmp0, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1, i32 16) @@ -65,8 +65,8 @@ define void @vst3Qi8(i8* %A, <16 x i8>* %B) nounwind { ;CHECK: vst3Qi8: ;Check the alignment value. Max for this instruction is 64 bits: ;This test runs at -O0 so do not check for specific register numbers. -;CHECK: vst3.8 {d{{.*}}, d{{.*}}, d{{.*}}}, [r{{.*}}, :64]! -;CHECK: vst3.8 {d{{.*}}, d{{.*}}, d{{.*}}}, [r{{.*}}, :64] +;CHECK: vst3.8 {d{{.*}}, d{{.*}}, d{{.*}}}, [r{{.*}}:64]! +;CHECK: vst3.8 {d{{.*}}, d{{.*}}, d{{.*}}}, [r{{.*}}:64] %tmp1 = load <16 x i8>* %B call void @llvm.arm.neon.vst3.v16i8(i8* %A, <16 x i8> %tmp1, <16 x i8> %tmp1, <16 x i8> %tmp1, i32 32) ret void diff --git a/test/CodeGen/ARM/vst4.ll b/test/CodeGen/ARM/vst4.ll index e94acb66bf2e..7dedb2fafee2 100644 --- a/test/CodeGen/ARM/vst4.ll +++ b/test/CodeGen/ARM/vst4.ll @@ -3,7 +3,7 @@ define void @vst4i8(i8* %A, <8 x i8>* %B) nounwind { ;CHECK: vst4i8: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vst4.8 {d16, d17, d18, d19}, [r0, :64] +;CHECK: vst4.8 {d16, d17, d18, d19}, [r0:64] %tmp1 = load <8 x i8>* %B call void @llvm.arm.neon.vst4.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 8) ret void @@ -12,7 +12,7 @@ define void @vst4i8(i8* %A, <8 x i8>* %B) nounwind { ;Check for a post-increment updating store with register increment. define void @vst4i8_update(i8** %ptr, <8 x i8>* %B, i32 %inc) nounwind { ;CHECK: vst4i8_update: -;CHECK: vst4.8 {d16, d17, d18, d19}, [r1, :128], r2 +;CHECK: vst4.8 {d16, d17, d18, d19}, [r1:128], r2 %A = load i8** %ptr %tmp1 = load <8 x i8>* %B call void @llvm.arm.neon.vst4.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 16) @@ -24,7 +24,7 @@ define void @vst4i8_update(i8** %ptr, <8 x i8>* %B, i32 %inc) nounwind { define void @vst4i16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst4i16: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vst4.16 {d16, d17, d18, d19}, [r0, :128] +;CHECK: vst4.16 {d16, d17, d18, d19}, [r0:128] %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B call void @llvm.arm.neon.vst4.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 16) @@ -34,7 +34,7 @@ define void @vst4i16(i16* %A, <4 x i16>* %B) nounwind { define void @vst4i32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst4i32: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vst4.32 {d16, d17, d18, d19}, [r0, :256] +;CHECK: vst4.32 {d16, d17, d18, d19}, [r0:256] %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B call void @llvm.arm.neon.vst4.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 32) @@ -53,7 +53,7 @@ define void @vst4f(float* %A, <2 x float>* %B) nounwind { define void @vst4i64(i64* %A, <1 x i64>* %B) nounwind { ;CHECK: vst4i64: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vst1.64 {d16, d17, d18, d19}, [r0, :256] +;CHECK: vst1.64 {d16, d17, d18, d19}, [r0:256] %tmp0 = bitcast i64* %A to i8* %tmp1 = load <1 x i64>* %B call void @llvm.arm.neon.vst4.v1i64(i8* %tmp0, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1, i32 64) @@ -63,8 +63,8 @@ define void @vst4i64(i64* %A, <1 x i64>* %B) nounwind { define void @vst4Qi8(i8* %A, <16 x i8>* %B) nounwind { ;CHECK: vst4Qi8: ;Check the alignment value. Max for this instruction is 256 bits: -;CHECK: vst4.8 {d16, d18, d20, d22}, [r0, :256]! -;CHECK: vst4.8 {d17, d19, d21, d23}, [r0, :256] +;CHECK: vst4.8 {d16, d18, d20, d22}, [r0:256]! +;CHECK: vst4.8 {d17, d19, d21, d23}, [r0:256] %tmp1 = load <16 x i8>* %B call void @llvm.arm.neon.vst4.v16i8(i8* %A, <16 x i8> %tmp1, <16 x i8> %tmp1, <16 x i8> %tmp1, <16 x i8> %tmp1, i32 64) ret void diff --git a/test/CodeGen/ARM/vstlane.ll b/test/CodeGen/ARM/vstlane.ll index 758b355736d0..67f251f70689 100644 --- a/test/CodeGen/ARM/vstlane.ll +++ b/test/CodeGen/ARM/vstlane.ll @@ -26,7 +26,7 @@ define void @vst1lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind { define void @vst1lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst1lanei16: ;Check the alignment value. Max for this instruction is 16 bits: -;CHECK: vst1.16 {d16[2]}, [r0, :16] +;CHECK: vst1.16 {d16[2]}, [r0:16] %tmp1 = load <4 x i16>* %B %tmp2 = extractelement <4 x i16> %tmp1, i32 2 store i16 %tmp2, i16* %A, align 8 @@ -36,7 +36,7 @@ define void @vst1lanei16(i16* %A, <4 x i16>* %B) nounwind { define void @vst1lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst1lanei32: ;Check the alignment value. Max for this instruction is 32 bits: -;CHECK: vst1.32 {d16[1]}, [r0, :32] +;CHECK: vst1.32 {d16[1]}, [r0:32] %tmp1 = load <2 x i32>* %B %tmp2 = extractelement <2 x i32> %tmp1, i32 1 store i32 %tmp2, i32* %A, align 8 @@ -45,7 +45,7 @@ define void @vst1lanei32(i32* %A, <2 x i32>* %B) nounwind { define void @vst1lanef(float* %A, <2 x float>* %B) nounwind { ;CHECK: vst1lanef: -;CHECK: vst1.32 {d16[1]}, [r0, :32] +;CHECK: vst1.32 {d16[1]}, [r0:32] %tmp1 = load <2 x float>* %B %tmp2 = extractelement <2 x float> %tmp1, i32 1 store float %tmp2, float* %A @@ -64,7 +64,7 @@ define void @vst1laneQi8(i8* %A, <16 x i8>* %B) nounwind { define void @vst1laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst1laneQi16: -;CHECK: vst1.16 {d17[1]}, [r0, :16] +;CHECK: vst1.16 {d17[1]}, [r0:16] %tmp1 = load <8 x i16>* %B %tmp2 = extractelement <8 x i16> %tmp1, i32 5 store i16 %tmp2, i16* %A, align 8 @@ -74,7 +74,7 @@ define void @vst1laneQi16(i16* %A, <8 x i16>* %B) nounwind { define void @vst1laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vst1laneQi32: ; // Can use scalar load. No need to use vectors. -; // CHE-CK: vst1.32 {d17[1]}, [r0, :32] +; // CHE-CK: vst1.32 {d17[1]}, [r0:32] %tmp1 = load <4 x i32>* %B %tmp2 = extractelement <4 x i32> %tmp1, i32 3 store i32 %tmp2, i32* %A, align 8 @@ -85,7 +85,7 @@ define void @vst1laneQi32(i32* %A, <4 x i32>* %B) nounwind { define void @vst1laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind { ;CHECK: vst1laneQi32_update: ; // Can use scalar load. No need to use vectors. -; // CHE-CK: vst1.32 {d17[1]}, [r1, :32]! +; // CHE-CK: vst1.32 {d17[1]}, [r1:32]! %A = load i32** %ptr %tmp1 = load <4 x i32>* %B %tmp2 = extractelement <4 x i32> %tmp1, i32 3 @@ -108,7 +108,7 @@ define void @vst1laneQf(float* %A, <4 x float>* %B) nounwind { define void @vst2lanei8(i8* %A, <8 x i8>* %B) nounwind { ;CHECK: vst2lanei8: ;Check the alignment value. Max for this instruction is 16 bits: -;CHECK: vst2.8 {d16[1], d17[1]}, [r0, :16] +;CHECK: vst2.8 {d16[1], d17[1]}, [r0:16] %tmp1 = load <8 x i8>* %B call void @llvm.arm.neon.vst2lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 4) ret void @@ -117,7 +117,7 @@ define void @vst2lanei8(i8* %A, <8 x i8>* %B) nounwind { define void @vst2lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst2lanei16: ;Check the alignment value. Max for this instruction is 32 bits: -;CHECK: vst2.16 {d16[1], d17[1]}, [r0, :32] +;CHECK: vst2.16 {d16[1], d17[1]}, [r0:32] %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B call void @llvm.arm.neon.vst2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 8) @@ -168,7 +168,7 @@ define void @vst2laneQi16(i16* %A, <8 x i16>* %B) nounwind { define void @vst2laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vst2laneQi32: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64] +;CHECK: vst2.32 {d17[0], d19[0]}, [r0:64] %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B call void @llvm.arm.neon.vst2lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 16) @@ -283,7 +283,7 @@ declare void @llvm.arm.neon.vst3lane.v4f32(i8*, <4 x float>, <4 x float>, <4 x f define void @vst4lanei8(i8* %A, <8 x i8>* %B) nounwind { ;CHECK: vst4lanei8: ;Check the alignment value. Max for this instruction is 32 bits: -;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] +;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] %tmp1 = load <8 x i8>* %B call void @llvm.arm.neon.vst4lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 8) ret void @@ -292,7 +292,7 @@ define void @vst4lanei8(i8* %A, <8 x i8>* %B) nounwind { ;Check for a post-increment updating store. define void @vst4lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind { ;CHECK: vst4lanei8_update: -;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32]! +;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32]! %A = load i8** %ptr %tmp1 = load <8 x i8>* %B call void @llvm.arm.neon.vst4lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 8) @@ -313,7 +313,7 @@ define void @vst4lanei16(i16* %A, <4 x i16>* %B) nounwind { define void @vst4lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst4lanei32: ;Check the alignment value. Max for this instruction is 128 bits: -;CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] +;CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B call void @llvm.arm.neon.vst4lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 16) @@ -332,7 +332,7 @@ define void @vst4lanef(float* %A, <2 x float>* %B) nounwind { define void @vst4laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst4laneQi16: ;Check the alignment value. Max for this instruction is 64 bits: -;CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0, :64] +;CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0:64] %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B call void @llvm.arm.neon.vst4lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 7, i32 16) diff --git a/test/CodeGen/ARM/widen-vmovs.ll b/test/CodeGen/ARM/widen-vmovs.ll index 679e3f434733..1efbc73650d8 100644 --- a/test/CodeGen/ARM/widen-vmovs.ll +++ b/test/CodeGen/ARM/widen-vmovs.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -widen-vmovs -mcpu=cortex-a8 -verify-machineinstrs -disable-code-place | FileCheck %s +; RUN: llc < %s -widen-vmovs -mcpu=cortex-a8 -verify-machineinstrs -disable-block-placement | FileCheck %s target triple = "thumbv7-apple-ios" ; The 1.0e+10 constant is loaded from the constant pool and kept in a register. diff --git a/test/CodeGen/ARM/zextload_demandedbits.ll b/test/CodeGen/ARM/zextload_demandedbits.ll new file mode 100644 index 000000000000..3d3269cae236 --- /dev/null +++ b/test/CodeGen/ARM/zextload_demandedbits.ll @@ -0,0 +1,35 @@ +; RUN: llc < %s -march=arm -mtriple="thumbv7-apple-ios3.0.0" | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" + +%struct.eggs = type { %struct.spam, i16 } +%struct.spam = type { [3 x i32] } +%struct.barney = type { [2 x i32], [2 x i32] } + +; Make sure that the sext op does not get lost due to ComputeMaskedBits. +; CHECK: quux +; CHECK: lsl +; CHECK: asr +; CHECK: bl +; CHECK: pop +define void @quux(%struct.eggs* %arg) { +bb: + %tmp1 = getelementptr inbounds %struct.eggs* %arg, i32 0, i32 1 + %0 = load i16* %tmp1, align 2 + %tobool = icmp eq i16 %0, 0 + br i1 %tobool, label %bb16, label %bb3 + +bb3: ; preds = %bb + %tmp4 = bitcast i16* %tmp1 to i8* + %tmp5 = ptrtoint i16* %tmp1 to i32 + %tmp6 = shl i32 %tmp5, 20 + %tmp7 = ashr exact i32 %tmp6, 20 + %tmp14 = getelementptr inbounds %struct.barney* undef, i32 %tmp7 + %tmp15 = tail call i32 @widget(%struct.barney* %tmp14, i8* %tmp4, i32 %tmp7) + br label %bb16 + +bb16: ; preds = %bb3, %bb + ret void +} + +declare i32 @widget(%struct.barney*, i8*, i32) diff --git a/test/CodeGen/CPP/2007-06-16-Funcname.ll b/test/CodeGen/CPP/2007-06-16-Funcname.ll index 16e9798481fe..71fea12d9c2c 100644 --- a/test/CodeGen/CPP/2007-06-16-Funcname.ll +++ b/test/CodeGen/CPP/2007-06-16-Funcname.ll @@ -5,4 +5,3 @@ define void @foo() { ret void } - diff --git a/test/CodeGen/CellSPU/2009-01-01-BrCond.ll b/test/CodeGen/CellSPU/2009-01-01-BrCond.ll deleted file mode 100644 index 35422311c574..000000000000 --- a/test/CodeGen/CellSPU/2009-01-01-BrCond.ll +++ /dev/null @@ -1,31 +0,0 @@ -; RUN: llc < %s -march=cellspu -o - | grep brz -; PR3274 - -target datalayout = "E-p:32:32:128-i1:8:128-i8:8:128-i16:16:128-i32:32:128-i64:32:128-f32:32:128-f64:64:128-v64:64:64-v128:128:128-a0:0:128-s0:128:128" -target triple = "spu" - %struct.anon = type { i64 } - %struct.fp_number_type = type { i32, i32, i32, [4 x i8], %struct.anon } - -define double @__floatunsidf(i32 %arg_a) nounwind { -entry: - %in = alloca %struct.fp_number_type, align 16 - %0 = getelementptr %struct.fp_number_type* %in, i32 0, i32 1 - store i32 0, i32* %0, align 4 - %1 = icmp eq i32 %arg_a, 0 - %2 = getelementptr %struct.fp_number_type* %in, i32 0, i32 0 - br i1 %1, label %bb, label %bb1 - -bb: ; preds = %entry - store i32 2, i32* %2, align 8 - br label %bb7 - -bb1: ; preds = %entry - ret double 0.0 - -bb7: ; preds = %bb5, %bb1, %bb - ret double 1.0 -} - -; declare i32 @llvm.ctlz.i32(i32) nounwind readnone - -declare double @__pack_d(%struct.fp_number_type*) diff --git a/test/CodeGen/CellSPU/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/CellSPU/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index 401399face9a..000000000000 --- a/test/CodeGen/CellSPU/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=cellspu -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/CellSPU/and_ops.ll b/test/CodeGen/CellSPU/and_ops.ll deleted file mode 100644 index 4203e91068d0..000000000000 --- a/test/CodeGen/CellSPU/and_ops.ll +++ /dev/null @@ -1,282 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep and %t1.s | count 234 -; RUN: grep andc %t1.s | count 85 -; RUN: grep andi %t1.s | count 37 -; RUN: grep andhi %t1.s | count 30 -; RUN: grep andbi %t1.s | count 4 - -; CellSPU legalization is over-sensitive to Legalize's traversal order. -; XFAIL: * - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; AND instruction generation: -define <4 x i32> @and_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = and <4 x i32> %arg1, %arg2 - ret <4 x i32> %A -} - -define <4 x i32> @and_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = and <4 x i32> %arg2, %arg1 - ret <4 x i32> %A -} - -define <8 x i16> @and_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = and <8 x i16> %arg1, %arg2 - ret <8 x i16> %A -} - -define <8 x i16> @and_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = and <8 x i16> %arg2, %arg1 - ret <8 x i16> %A -} - -define <16 x i8> @and_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = and <16 x i8> %arg2, %arg1 - ret <16 x i8> %A -} - -define <16 x i8> @and_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = and <16 x i8> %arg1, %arg2 - ret <16 x i8> %A -} - -define i32 @and_i32_1(i32 %arg1, i32 %arg2) { - %A = and i32 %arg2, %arg1 - ret i32 %A -} - -define i32 @and_i32_2(i32 %arg1, i32 %arg2) { - %A = and i32 %arg1, %arg2 - ret i32 %A -} - -define i16 @and_i16_1(i16 %arg1, i16 %arg2) { - %A = and i16 %arg2, %arg1 - ret i16 %A -} - -define i16 @and_i16_2(i16 %arg1, i16 %arg2) { - %A = and i16 %arg1, %arg2 - ret i16 %A -} - -define i8 @and_i8_1(i8 %arg1, i8 %arg2) { - %A = and i8 %arg2, %arg1 - ret i8 %A -} - -define i8 @and_i8_2(i8 %arg1, i8 %arg2) { - %A = and i8 %arg1, %arg2 - ret i8 %A -} - -; ANDC instruction generation: -define <4 x i32> @andc_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = xor <4 x i32> %arg2, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = and <4 x i32> %arg1, %A - ret <4 x i32> %B -} - -define <4 x i32> @andc_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = and <4 x i32> %arg2, %A - ret <4 x i32> %B -} - -define <4 x i32> @andc_v4i32_3(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = and <4 x i32> %A, %arg2 - ret <4 x i32> %B -} - -define <8 x i16> @andc_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = xor <8 x i16> %arg2, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %arg1, %A - ret <8 x i16> %B -} - -define <8 x i16> @andc_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = xor <8 x i16> %arg1, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %arg2, %A - ret <8 x i16> %B -} - -define <16 x i8> @andc_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = xor <16 x i8> %arg1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %arg2, %A - ret <16 x i8> %B -} - -define <16 x i8> @andc_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %arg1, %A - ret <16 x i8> %B -} - -define <16 x i8> @andc_v16i8_3(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %A, %arg1 - ret <16 x i8> %B -} - -define i32 @andc_i32_1(i32 %arg1, i32 %arg2) { - %A = xor i32 %arg2, -1 - %B = and i32 %A, %arg1 - ret i32 %B -} - -define i32 @andc_i32_2(i32 %arg1, i32 %arg2) { - %A = xor i32 %arg1, -1 - %B = and i32 %A, %arg2 - ret i32 %B -} - -define i32 @andc_i32_3(i32 %arg1, i32 %arg2) { - %A = xor i32 %arg2, -1 - %B = and i32 %arg1, %A - ret i32 %B -} - -define i16 @andc_i16_1(i16 %arg1, i16 %arg2) { - %A = xor i16 %arg2, -1 - %B = and i16 %A, %arg1 - ret i16 %B -} - -define i16 @andc_i16_2(i16 %arg1, i16 %arg2) { - %A = xor i16 %arg1, -1 - %B = and i16 %A, %arg2 - ret i16 %B -} - -define i16 @andc_i16_3(i16 %arg1, i16 %arg2) { - %A = xor i16 %arg2, -1 - %B = and i16 %arg1, %A - ret i16 %B -} - -define i8 @andc_i8_1(i8 %arg1, i8 %arg2) { - %A = xor i8 %arg2, -1 - %B = and i8 %A, %arg1 - ret i8 %B -} - -define i8 @andc_i8_2(i8 %arg1, i8 %arg2) { - %A = xor i8 %arg1, -1 - %B = and i8 %A, %arg2 - ret i8 %B -} - -define i8 @andc_i8_3(i8 %arg1, i8 %arg2) { - %A = xor i8 %arg2, -1 - %B = and i8 %arg1, %A - ret i8 %B -} - -; ANDI instruction generation (i32 data type): -define <4 x i32> @andi_v4i32_1(<4 x i32> %in) { - %tmp2 = and <4 x i32> %in, < i32 511, i32 511, i32 511, i32 511 > - ret <4 x i32> %tmp2 -} - -define <4 x i32> @andi_v4i32_2(<4 x i32> %in) { - %tmp2 = and <4 x i32> %in, < i32 510, i32 510, i32 510, i32 510 > - ret <4 x i32> %tmp2 -} - -define <4 x i32> @andi_v4i32_3(<4 x i32> %in) { - %tmp2 = and <4 x i32> %in, < i32 -1, i32 -1, i32 -1, i32 -1 > - ret <4 x i32> %tmp2 -} - -define <4 x i32> @andi_v4i32_4(<4 x i32> %in) { - %tmp2 = and <4 x i32> %in, < i32 -512, i32 -512, i32 -512, i32 -512 > - ret <4 x i32> %tmp2 -} - -define zeroext i32 @andi_u32(i32 zeroext %in) { - %tmp37 = and i32 %in, 37 - ret i32 %tmp37 -} - -define signext i32 @andi_i32(i32 signext %in) { - %tmp38 = and i32 %in, 37 - ret i32 %tmp38 -} - -define i32 @andi_i32_1(i32 %in) { - %tmp37 = and i32 %in, 37 - ret i32 %tmp37 -} - -; ANDHI instruction generation (i16 data type): -define <8 x i16> @andhi_v8i16_1(<8 x i16> %in) { - %tmp2 = and <8 x i16> %in, < i16 511, i16 511, i16 511, i16 511, - i16 511, i16 511, i16 511, i16 511 > - ret <8 x i16> %tmp2 -} - -define <8 x i16> @andhi_v8i16_2(<8 x i16> %in) { - %tmp2 = and <8 x i16> %in, < i16 510, i16 510, i16 510, i16 510, - i16 510, i16 510, i16 510, i16 510 > - ret <8 x i16> %tmp2 -} - -define <8 x i16> @andhi_v8i16_3(<8 x i16> %in) { - %tmp2 = and <8 x i16> %in, < i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1 > - ret <8 x i16> %tmp2 -} - -define <8 x i16> @andhi_v8i16_4(<8 x i16> %in) { - %tmp2 = and <8 x i16> %in, < i16 -512, i16 -512, i16 -512, i16 -512, - i16 -512, i16 -512, i16 -512, i16 -512 > - ret <8 x i16> %tmp2 -} - -define zeroext i16 @andhi_u16(i16 zeroext %in) { - %tmp37 = and i16 %in, 37 ; <i16> [#uses=1] - ret i16 %tmp37 -} - -define signext i16 @andhi_i16(i16 signext %in) { - %tmp38 = and i16 %in, 37 ; <i16> [#uses=1] - ret i16 %tmp38 -} - -; i8 data type (s/b ANDBI if 8-bit registers were supported): -define <16 x i8> @and_v16i8(<16 x i8> %in) { - ; ANDBI generated for vector types - %tmp2 = and <16 x i8> %in, < i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, - i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, - i8 42, i8 42, i8 42, i8 42 > - ret <16 x i8> %tmp2 -} - -define zeroext i8 @and_u8(i8 zeroext %in) { - ; ANDBI generated: - %tmp37 = and i8 %in, 37 - ret i8 %tmp37 -} - -define signext i8 @and_sext8(i8 signext %in) { - ; ANDBI generated - %tmp38 = and i8 %in, 37 - ret i8 %tmp38 -} - -define i8 @and_i8(i8 %in) { - ; ANDBI generated - %tmp38 = and i8 %in, 205 - ret i8 %tmp38 -} diff --git a/test/CodeGen/CellSPU/arg_ret.ll b/test/CodeGen/CellSPU/arg_ret.ll deleted file mode 100644 index 7410b724d6fc..000000000000 --- a/test/CodeGen/CellSPU/arg_ret.ll +++ /dev/null @@ -1,34 +0,0 @@ -; Test parameter passing and return values -;RUN: llc --march=cellspu %s -o - | FileCheck %s - -; this fits into registers r3-r74 -%paramstruct = type { i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32, - i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32, - i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32, - i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32, - i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32, - i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32,i32} -define ccc i32 @test_regs( %paramstruct %prm ) -{ -;CHECK: lr $3, $74 -;CHECK: bi $lr - %1 = extractvalue %paramstruct %prm, 71 - ret i32 %1 -} - -define ccc i32 @test_regs_and_stack( %paramstruct %prm, i32 %stackprm ) -{ -;CHECK-NOT: a $3, $74, $75 - %1 = extractvalue %paramstruct %prm, 71 - %2 = add i32 %1, %stackprm - ret i32 %2 -} - -define ccc %paramstruct @test_return( i32 %param, %paramstruct %prm ) -{ -;CHECK: lqd {{\$[0-9]+}}, 80($sp) -;CHECK-NOT: ori {{\$[0-9]+, \$[0-9]+, 0}} -;CHECK: lr $3, $4 - ret %paramstruct %prm -} - diff --git a/test/CodeGen/CellSPU/bigstack.ll b/test/CodeGen/CellSPU/bigstack.ll deleted file mode 100644 index 63293e2aecb1..000000000000 --- a/test/CodeGen/CellSPU/bigstack.ll +++ /dev/null @@ -1,17 +0,0 @@ -; RUN: llc < %s -march=cellspu -o %t1.s -; RUN: grep lqx %t1.s | count 3 -; RUN: grep il %t1.s | grep -v file | count 5 -; RUN: grep stqx %t1.s | count 1 - -define i32 @bigstack() nounwind { -entry: - %avar = alloca i32 - %big_data = alloca [2048 x i32] - store i32 3840, i32* %avar, align 4 - br label %return - -return: - %retval = load i32* %avar - ret i32 %retval -} - diff --git a/test/CodeGen/CellSPU/bss.ll b/test/CodeGen/CellSPU/bss.ll deleted file mode 100644 index 327800d09cbf..000000000000 --- a/test/CodeGen/CellSPU/bss.ll +++ /dev/null @@ -1,11 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -@bssVar = global i32 zeroinitializer -; CHECK: .section .bss -; CHECK-NEXT: .globl - -@localVar= internal global i32 zeroinitializer -; CHECK-NOT: .lcomm -; CHECK: .local -; CHECK-NEXT: .comm - diff --git a/test/CodeGen/CellSPU/call.ll b/test/CodeGen/CellSPU/call.ll deleted file mode 100644 index 11cf770145ba..000000000000 --- a/test/CodeGen/CellSPU/call.ll +++ /dev/null @@ -1,49 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define i32 @main() { -entry: - %a = call i32 @stub_1(i32 1, float 0x400921FA00000000) - call void @extern_stub_1(i32 %a, i32 4) - ret i32 %a -} - -declare void @extern_stub_1(i32, i32) - -define i32 @stub_1(i32 %x, float %y) { - ; CHECK: il $3, 0 - ; CHECK: bi $lr -entry: - ret i32 0 -} - -; vararg call: ensure that all caller-saved registers are spilled to the -; stack: -define i32 @stub_2(...) { -entry: - ret i32 0 -} - -; check that struct is passed in r3-> -; assert this by changing the second field in the struct -%0 = type { i32, i32, i32 } -declare %0 @callee() -define %0 @test_structret() -{ -;CHECK: stqd $lr, 16($sp) -;CHECK: stqd $sp, -48($sp) -;CHECK: ai $sp, $sp, -48 -;CHECK: brasl $lr, callee - %rv = call %0 @callee() -;CHECK: ai $4, $4, 1 -;CHECK: lqd $lr, 64($sp) -;CHECK: ai $sp, $sp, 48 -;CHECK: bi $lr - %oldval = extractvalue %0 %rv, 1 - %newval = add i32 %oldval,1 - %newrv = insertvalue %0 %rv, i32 %newval, 1 - ret %0 %newrv -} - diff --git a/test/CodeGen/CellSPU/crash.ll b/test/CodeGen/CellSPU/crash.ll deleted file mode 100644 index cc2ab71db3b3..000000000000 --- a/test/CodeGen/CellSPU/crash.ll +++ /dev/null @@ -1,8 +0,0 @@ -; RUN: llc %s -march=cellspu -o - -declare i8 @return_i8() -declare i16 @return_i16() -define void @testfunc() { - %rv1 = call i8 @return_i8() - %rv2 = call i16 @return_i16() - ret void -}
\ No newline at end of file diff --git a/test/CodeGen/CellSPU/ctpop.ll b/test/CodeGen/CellSPU/ctpop.ll deleted file mode 100644 index e1a6cd829260..000000000000 --- a/test/CodeGen/CellSPU/ctpop.ll +++ /dev/null @@ -1,30 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep cntb %t1.s | count 3 -; RUN: grep andi %t1.s | count 3 -; RUN: grep rotmi %t1.s | count 2 -; RUN: grep rothmi %t1.s | count 1 -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -declare i8 @llvm.ctpop.i8(i8) -declare i16 @llvm.ctpop.i16(i16) -declare i32 @llvm.ctpop.i32(i32) - -define i32 @test_i8(i8 %X) { - call i8 @llvm.ctpop.i8(i8 %X) - %Y = zext i8 %1 to i32 - ret i32 %Y -} - -define i32 @test_i16(i16 %X) { - call i16 @llvm.ctpop.i16(i16 %X) - %Y = zext i16 %1 to i32 - ret i32 %Y -} - -define i32 @test_i32(i32 %X) { - call i32 @llvm.ctpop.i32(i32 %X) - %Y = bitcast i32 %1 to i32 - ret i32 %Y -} - diff --git a/test/CodeGen/CellSPU/div_ops.ll b/test/CodeGen/CellSPU/div_ops.ll deleted file mode 100644 index 0c93d83ca76d..000000000000 --- a/test/CodeGen/CellSPU/div_ops.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: llc --march=cellspu %s -o - | FileCheck %s - -; signed division rounds towards zero, rotma don't. -define i32 @sdivide (i32 %val ) -{ -; CHECK: rotmai -; CHECK: rotmi -; CHECK: a -; CHECK: rotmai -; CHECK: bi $lr - %rv = sdiv i32 %val, 4 - ret i32 %rv -} - -define i32 @udivide (i32 %val ) -{ -; CHECK: rotmi -; CHECK: bi $lr - %rv = udiv i32 %val, 4 - ret i32 %rv -} - diff --git a/test/CodeGen/CellSPU/dp_farith.ll b/test/CodeGen/CellSPU/dp_farith.ll deleted file mode 100644 index 66bff3eb7835..000000000000 --- a/test/CodeGen/CellSPU/dp_farith.ll +++ /dev/null @@ -1,102 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep dfa %t1.s | count 2 -; RUN: grep dfs %t1.s | count 2 -; RUN: grep dfm %t1.s | count 6 -; RUN: grep dfma %t1.s | count 2 -; RUN: grep dfms %t1.s | count 2 -; RUN: grep dfnms %t1.s | count 4 -; -; This file includes double precision floating point arithmetic instructions -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define double @fadd(double %arg1, double %arg2) { - %A = fadd double %arg1, %arg2 - ret double %A -} - -define <2 x double> @fadd_vec(<2 x double> %arg1, <2 x double> %arg2) { - %A = fadd <2 x double> %arg1, %arg2 - ret <2 x double> %A -} - -define double @fsub(double %arg1, double %arg2) { - %A = fsub double %arg1, %arg2 - ret double %A -} - -define <2 x double> @fsub_vec(<2 x double> %arg1, <2 x double> %arg2) { - %A = fsub <2 x double> %arg1, %arg2 - ret <2 x double> %A -} - -define double @fmul(double %arg1, double %arg2) { - %A = fmul double %arg1, %arg2 - ret double %A -} - -define <2 x double> @fmul_vec(<2 x double> %arg1, <2 x double> %arg2) { - %A = fmul <2 x double> %arg1, %arg2 - ret <2 x double> %A -} - -define double @fma(double %arg1, double %arg2, double %arg3) { - %A = fmul double %arg1, %arg2 - %B = fadd double %A, %arg3 - ret double %B -} - -define <2 x double> @fma_vec(<2 x double> %arg1, <2 x double> %arg2, <2 x double> %arg3) { - %A = fmul <2 x double> %arg1, %arg2 - %B = fadd <2 x double> %A, %arg3 - ret <2 x double> %B -} - -define double @fms(double %arg1, double %arg2, double %arg3) { - %A = fmul double %arg1, %arg2 - %B = fsub double %A, %arg3 - ret double %B -} - -define <2 x double> @fms_vec(<2 x double> %arg1, <2 x double> %arg2, <2 x double> %arg3) { - %A = fmul <2 x double> %arg1, %arg2 - %B = fsub <2 x double> %A, %arg3 - ret <2 x double> %B -} - -; - (a * b - c) -define double @d_fnms_1(double %arg1, double %arg2, double %arg3) { - %A = fmul double %arg1, %arg2 - %B = fsub double %A, %arg3 - %C = fsub double -0.000000e+00, %B ; <double> [#uses=1] - ret double %C -} - -; Annother way of getting fnms -; - ( a * b ) + c => c - (a * b) -define double @d_fnms_2(double %arg1, double %arg2, double %arg3) { - %A = fmul double %arg1, %arg2 - %B = fsub double %arg3, %A - ret double %B -} - -; FNMS: - (a * b - c) => c - (a * b) -define <2 x double> @d_fnms_vec_1(<2 x double> %arg1, <2 x double> %arg2, <2 x double> %arg3) { - %A = fmul <2 x double> %arg1, %arg2 - %B = fsub <2 x double> %arg3, %A - ret <2 x double> %B -} - -; Another way to get fnms using a constant vector -; - ( a * b - c) -define <2 x double> @d_fnms_vec_2(<2 x double> %arg1, <2 x double> %arg2, <2 x double> %arg3) { - %A = fmul <2 x double> %arg1, %arg2 ; <<2 x double>> [#uses=1] - %B = fsub <2 x double> %A, %arg3 ; <<2 x double>> [#uses=1] - %C = fsub <2 x double> < double -0.00000e+00, double -0.00000e+00 >, %B - ret <2 x double> %C -} - -;define double @fdiv_1(double %arg1, double %arg2) { -; %A = fdiv double %arg1, %arg2 ; <double> [#uses=1] -; ret double %A -;} diff --git a/test/CodeGen/CellSPU/eqv.ll b/test/CodeGen/CellSPU/eqv.ll deleted file mode 100644 index 79676814f282..000000000000 --- a/test/CodeGen/CellSPU/eqv.ll +++ /dev/null @@ -1,152 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep eqv %t1.s | count 18 -; RUN: grep xshw %t1.s | count 6 -; RUN: grep xsbh %t1.s | count 3 -; RUN: grep andi %t1.s | count 3 - -; Test the 'eqv' instruction, whose boolean expression is: -; (a & b) | (~a & ~b), which simplifies to -; (a & b) | ~(a | b) -; Alternatively, a ^ ~b, which the compiler will also match. - -; ModuleID = 'eqv.bc' -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define <4 x i32> @equiv_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = and <4 x i32> %arg1, %arg2 - %B = or <4 x i32> %arg1, %arg2 - %Bnot = xor <4 x i32> %B, < i32 -1, i32 -1, i32 -1, i32 -1 > - %C = or <4 x i32> %A, %Bnot - ret <4 x i32> %C -} - -define <4 x i32> @equiv_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { - %B = or <4 x i32> %arg1, %arg2 ; <<4 x i32>> [#uses=1] - %Bnot = xor <4 x i32> %B, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] - %A = and <4 x i32> %arg1, %arg2 ; <<4 x i32>> [#uses=1] - %C = or <4 x i32> %A, %Bnot ; <<4 x i32>> [#uses=1] - ret <4 x i32> %C -} - -define <4 x i32> @equiv_v4i32_3(<4 x i32> %arg1, <4 x i32> %arg2) { - %B = or <4 x i32> %arg1, %arg2 ; <<4 x i32>> [#uses=1] - %A = and <4 x i32> %arg1, %arg2 ; <<4 x i32>> [#uses=1] - %Bnot = xor <4 x i32> %B, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] - %C = or <4 x i32> %A, %Bnot ; <<4 x i32>> [#uses=1] - ret <4 x i32> %C -} - -define <4 x i32> @equiv_v4i32_4(<4 x i32> %arg1, <4 x i32> %arg2) { - %arg2not = xor <4 x i32> %arg2, < i32 -1, i32 -1, i32 -1, i32 -1 > - %C = xor <4 x i32> %arg1, %arg2not - ret <4 x i32> %C -} - -define i32 @equiv_i32_1(i32 %arg1, i32 %arg2) { - %A = and i32 %arg1, %arg2 ; <i32> [#uses=1] - %B = or i32 %arg1, %arg2 ; <i32> [#uses=1] - %Bnot = xor i32 %B, -1 ; <i32> [#uses=1] - %C = or i32 %A, %Bnot ; <i32> [#uses=1] - ret i32 %C -} - -define i32 @equiv_i32_2(i32 %arg1, i32 %arg2) { - %B = or i32 %arg1, %arg2 ; <i32> [#uses=1] - %Bnot = xor i32 %B, -1 ; <i32> [#uses=1] - %A = and i32 %arg1, %arg2 ; <i32> [#uses=1] - %C = or i32 %A, %Bnot ; <i32> [#uses=1] - ret i32 %C -} - -define i32 @equiv_i32_3(i32 %arg1, i32 %arg2) { - %B = or i32 %arg1, %arg2 ; <i32> [#uses=1] - %A = and i32 %arg1, %arg2 ; <i32> [#uses=1] - %Bnot = xor i32 %B, -1 ; <i32> [#uses=1] - %C = or i32 %A, %Bnot ; <i32> [#uses=1] - ret i32 %C -} - -define i32 @equiv_i32_4(i32 %arg1, i32 %arg2) { - %arg2not = xor i32 %arg2, -1 - %C = xor i32 %arg1, %arg2not - ret i32 %C -} - -define i32 @equiv_i32_5(i32 %arg1, i32 %arg2) { - %arg1not = xor i32 %arg1, -1 - %C = xor i32 %arg2, %arg1not - ret i32 %C -} - -define signext i16 @equiv_i16_1(i16 signext %arg1, i16 signext %arg2) { - %A = and i16 %arg1, %arg2 ; <i16> [#uses=1] - %B = or i16 %arg1, %arg2 ; <i16> [#uses=1] - %Bnot = xor i16 %B, -1 ; <i16> [#uses=1] - %C = or i16 %A, %Bnot ; <i16> [#uses=1] - ret i16 %C -} - -define signext i16 @equiv_i16_2(i16 signext %arg1, i16 signext %arg2) { - %B = or i16 %arg1, %arg2 ; <i16> [#uses=1] - %Bnot = xor i16 %B, -1 ; <i16> [#uses=1] - %A = and i16 %arg1, %arg2 ; <i16> [#uses=1] - %C = or i16 %A, %Bnot ; <i16> [#uses=1] - ret i16 %C -} - -define signext i16 @equiv_i16_3(i16 signext %arg1, i16 signext %arg2) { - %B = or i16 %arg1, %arg2 ; <i16> [#uses=1] - %A = and i16 %arg1, %arg2 ; <i16> [#uses=1] - %Bnot = xor i16 %B, -1 ; <i16> [#uses=1] - %C = or i16 %A, %Bnot ; <i16> [#uses=1] - ret i16 %C -} - -define signext i8 @equiv_i8_1(i8 signext %arg1, i8 signext %arg2) { - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %B = or i8 %arg1, %arg2 ; <i8> [#uses=1] - %Bnot = xor i8 %B, -1 ; <i8> [#uses=1] - %C = or i8 %A, %Bnot ; <i8> [#uses=1] - ret i8 %C -} - -define signext i8 @equiv_i8_2(i8 signext %arg1, i8 signext %arg2) { - %B = or i8 %arg1, %arg2 ; <i8> [#uses=1] - %Bnot = xor i8 %B, -1 ; <i8> [#uses=1] - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %C = or i8 %A, %Bnot ; <i8> [#uses=1] - ret i8 %C -} - -define signext i8 @equiv_i8_3(i8 signext %arg1, i8 signext %arg2) { - %B = or i8 %arg1, %arg2 ; <i8> [#uses=1] - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %Bnot = xor i8 %B, -1 ; <i8> [#uses=1] - %C = or i8 %A, %Bnot ; <i8> [#uses=1] - ret i8 %C -} - -define zeroext i8 @equiv_u8_1(i8 zeroext %arg1, i8 zeroext %arg2) { - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %B = or i8 %arg1, %arg2 ; <i8> [#uses=1] - %Bnot = xor i8 %B, -1 ; <i8> [#uses=1] - %C = or i8 %A, %Bnot ; <i8> [#uses=1] - ret i8 %C -} - -define zeroext i8 @equiv_u8_2(i8 zeroext %arg1, i8 zeroext %arg2) { - %B = or i8 %arg1, %arg2 ; <i8> [#uses=1] - %Bnot = xor i8 %B, -1 ; <i8> [#uses=1] - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %C = or i8 %A, %Bnot ; <i8> [#uses=1] - ret i8 %C -} - -define zeroext i8 @equiv_u8_3(i8 zeroext %arg1, i8 zeroext %arg2) { - %B = or i8 %arg1, %arg2 ; <i8> [#uses=1] - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %Bnot = xor i8 %B, -1 ; <i8> [#uses=1] - %C = or i8 %A, %Bnot ; <i8> [#uses=1] - ret i8 %C -} diff --git a/test/CodeGen/CellSPU/extract_elt.ll b/test/CodeGen/CellSPU/extract_elt.ll deleted file mode 100644 index 0ac971c58c5b..000000000000 --- a/test/CodeGen/CellSPU/extract_elt.ll +++ /dev/null @@ -1,277 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep shufb %t1.s | count 39 -; RUN: grep ilhu %t1.s | count 27 -; RUN: grep iohl %t1.s | count 27 -; RUN: grep lqa %t1.s | count 10 -; RUN: grep shlqby %t1.s | count 12 -; RUN: grep 515 %t1.s | count 1 -; RUN: grep 1029 %t1.s | count 2 -; RUN: grep 1543 %t1.s | count 2 -; RUN: grep 2057 %t1.s | count 2 -; RUN: grep 2571 %t1.s | count 2 -; RUN: grep 3085 %t1.s | count 2 -; RUN: grep 3599 %t1.s | count 2 -; RUN: grep 32768 %t1.s | count 1 -; RUN: grep 32769 %t1.s | count 1 -; RUN: grep 32770 %t1.s | count 1 -; RUN: grep 32771 %t1.s | count 1 -; RUN: grep 32772 %t1.s | count 1 -; RUN: grep 32773 %t1.s | count 1 -; RUN: grep 32774 %t1.s | count 1 -; RUN: grep 32775 %t1.s | count 1 -; RUN: grep 32776 %t1.s | count 1 -; RUN: grep 32777 %t1.s | count 1 -; RUN: grep 32778 %t1.s | count 1 -; RUN: grep 32779 %t1.s | count 1 -; RUN: grep 32780 %t1.s | count 1 -; RUN: grep 32781 %t1.s | count 1 -; RUN: grep 32782 %t1.s | count 1 -; RUN: grep 32783 %t1.s | count 1 -; RUN: grep 32896 %t1.s | count 24 - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define i32 @i32_extract_0(<4 x i32> %v) { -entry: - %a = extractelement <4 x i32> %v, i32 0 - ret i32 %a -} - -define i32 @i32_extract_1(<4 x i32> %v) { -entry: - %a = extractelement <4 x i32> %v, i32 1 - ret i32 %a -} - -define i32 @i32_extract_2(<4 x i32> %v) { -entry: - %a = extractelement <4 x i32> %v, i32 2 - ret i32 %a -} - -define i32 @i32_extract_3(<4 x i32> %v) { -entry: - %a = extractelement <4 x i32> %v, i32 3 - ret i32 %a -} - -define i16 @i16_extract_0(<8 x i16> %v) { -entry: - %a = extractelement <8 x i16> %v, i32 0 - ret i16 %a -} - -define i16 @i16_extract_1(<8 x i16> %v) { -entry: - %a = extractelement <8 x i16> %v, i32 1 - ret i16 %a -} - -define i16 @i16_extract_2(<8 x i16> %v) { -entry: - %a = extractelement <8 x i16> %v, i32 2 - ret i16 %a -} - -define i16 @i16_extract_3(<8 x i16> %v) { -entry: - %a = extractelement <8 x i16> %v, i32 3 - ret i16 %a -} - -define i16 @i16_extract_4(<8 x i16> %v) { -entry: - %a = extractelement <8 x i16> %v, i32 4 - ret i16 %a -} - -define i16 @i16_extract_5(<8 x i16> %v) { -entry: - %a = extractelement <8 x i16> %v, i32 5 - ret i16 %a -} - -define i16 @i16_extract_6(<8 x i16> %v) { -entry: - %a = extractelement <8 x i16> %v, i32 6 - ret i16 %a -} - -define i16 @i16_extract_7(<8 x i16> %v) { -entry: - %a = extractelement <8 x i16> %v, i32 7 - ret i16 %a -} - -define i8 @i8_extract_0(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 0 - ret i8 %a -} - -define i8 @i8_extract_1(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 1 - ret i8 %a -} - -define i8 @i8_extract_2(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 2 - ret i8 %a -} - -define i8 @i8_extract_3(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 3 - ret i8 %a -} - -define i8 @i8_extract_4(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 4 - ret i8 %a -} - -define i8 @i8_extract_5(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 5 - ret i8 %a -} - -define i8 @i8_extract_6(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 6 - ret i8 %a -} - -define i8 @i8_extract_7(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 7 - ret i8 %a -} - -define i8 @i8_extract_8(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 8 - ret i8 %a -} - -define i8 @i8_extract_9(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 9 - ret i8 %a -} - -define i8 @i8_extract_10(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 10 - ret i8 %a -} - -define i8 @i8_extract_11(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 11 - ret i8 %a -} - -define i8 @i8_extract_12(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 12 - ret i8 %a -} - -define i8 @i8_extract_13(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 13 - ret i8 %a -} - -define i8 @i8_extract_14(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 14 - ret i8 %a -} - -define i8 @i8_extract_15(<16 x i8> %v) { -entry: - %a = extractelement <16 x i8> %v, i32 15 - ret i8 %a -} - -;;-------------------------------------------------------------------------- -;; extract element, variable index: -;;-------------------------------------------------------------------------- - -define i8 @extract_varadic_i8(i32 %i) nounwind readnone { -entry: - %0 = extractelement <16 x i8> < i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, i32 %i - ret i8 %0 -} - -define i8 @extract_varadic_i8_1(<16 x i8> %v, i32 %i) nounwind readnone { -entry: - %0 = extractelement <16 x i8> %v, i32 %i - ret i8 %0 -} - -define i16 @extract_varadic_i16(i32 %i) nounwind readnone { -entry: - %0 = extractelement <8 x i16> < i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, i32 %i - ret i16 %0 -} - -define i16 @extract_varadic_i16_1(<8 x i16> %v, i32 %i) nounwind readnone { -entry: - %0 = extractelement <8 x i16> %v, i32 %i - ret i16 %0 -} - -define i32 @extract_varadic_i32(i32 %i) nounwind readnone { -entry: - %0 = extractelement <4 x i32> < i32 0, i32 1, i32 2, i32 3>, i32 %i - ret i32 %0 -} - -define i32 @extract_varadic_i32_1(<4 x i32> %v, i32 %i) nounwind readnone { -entry: - %0 = extractelement <4 x i32> %v, i32 %i - ret i32 %0 -} - -define float @extract_varadic_f32(i32 %i) nounwind readnone { -entry: - %0 = extractelement <4 x float> < float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00 >, i32 %i - ret float %0 -} - -define float @extract_varadic_f32_1(<4 x float> %v, i32 %i) nounwind readnone { -entry: - %0 = extractelement <4 x float> %v, i32 %i - ret float %0 -} - -define i64 @extract_varadic_i64(i32 %i) nounwind readnone { -entry: - %0 = extractelement <2 x i64> < i64 0, i64 1>, i32 %i - ret i64 %0 -} - -define i64 @extract_varadic_i64_1(<2 x i64> %v, i32 %i) nounwind readnone { -entry: - %0 = extractelement <2 x i64> %v, i32 %i - ret i64 %0 -} - -define double @extract_varadic_f64(i32 %i) nounwind readnone { -entry: - %0 = extractelement <2 x double> < double 1.000000e+00, double 2.000000e+00>, i32 %i - ret double %0 -} - -define double @extract_varadic_f64_1(<2 x double> %v, i32 %i) nounwind readnone { -entry: - %0 = extractelement <2 x double> %v, i32 %i - ret double %0 -} diff --git a/test/CodeGen/CellSPU/fcmp32.ll b/test/CodeGen/CellSPU/fcmp32.ll deleted file mode 100644 index f6b028dbb88a..000000000000 --- a/test/CodeGen/CellSPU/fcmp32.ll +++ /dev/null @@ -1,36 +0,0 @@ -; RUN: llc --mtriple=cellspu-unknown-elf %s -o - | FileCheck %s - -; Exercise the floating point comparison operators for f32: - -declare double @fabs(double) -declare float @fabsf(float) - -define i1 @fcmp_eq(float %arg1, float %arg2) { -; CHECK: fceq -; CHECK: bi $lr - %A = fcmp oeq float %arg1, %arg2 - ret i1 %A -} - -define i1 @fcmp_mag_eq(float %arg1, float %arg2) { -; CHECK: fcmeq -; CHECK: bi $lr - %1 = call float @fabsf(float %arg1) readnone - %2 = call float @fabsf(float %arg2) readnone - %3 = fcmp oeq float %1, %2 - ret i1 %3 -} - -define i1 @test_ogt(float %a, float %b) { -; CHECK: fcgt -; CHECK: bi $lr - %cmp = fcmp ogt float %a, %b - ret i1 %cmp -} - -define i1 @test_ugt(float %a, float %b) { -; CHECK: fcgt -; CHECK: bi $lr - %cmp = fcmp ugt float %a, %b - ret i1 %cmp -} diff --git a/test/CodeGen/CellSPU/fcmp64.ll b/test/CodeGen/CellSPU/fcmp64.ll deleted file mode 100644 index 2b61fa6d2dc2..000000000000 --- a/test/CodeGen/CellSPU/fcmp64.ll +++ /dev/null @@ -1,7 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s - -define i1 @fcmp_eq_setcc_f64(double %arg1, double %arg2) nounwind { -entry: - %A = fcmp oeq double %arg1, %arg2 - ret i1 %A -} diff --git a/test/CodeGen/CellSPU/fdiv.ll b/test/CodeGen/CellSPU/fdiv.ll deleted file mode 100644 index 9921626b79cb..000000000000 --- a/test/CodeGen/CellSPU/fdiv.ll +++ /dev/null @@ -1,22 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep frest %t1.s | count 2 -; RUN: grep -w fi %t1.s | count 2 -; RUN: grep -w fm %t1.s | count 2 -; RUN: grep fma %t1.s | count 2 -; RUN: grep fnms %t1.s | count 4 -; RUN: grep cgti %t1.s | count 2 -; RUN: grep selb %t1.s | count 2 -; -; This file includes standard floating point arithmetic instructions -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define float @fdiv32(float %arg1, float %arg2) { - %A = fdiv float %arg1, %arg2 - ret float %A -} - -define <4 x float> @fdiv_v4f32(<4 x float> %arg1, <4 x float> %arg2) { - %A = fdiv <4 x float> %arg1, %arg2 - ret <4 x float> %A -} diff --git a/test/CodeGen/CellSPU/fneg-fabs.ll b/test/CodeGen/CellSPU/fneg-fabs.ll deleted file mode 100644 index 6e01906dae69..000000000000 --- a/test/CodeGen/CellSPU/fneg-fabs.ll +++ /dev/null @@ -1,42 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep 32768 %t1.s | count 2 -; RUN: grep xor %t1.s | count 4 -; RUN: grep and %t1.s | count 2 - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define double @fneg_dp(double %X) { - %Y = fsub double -0.000000e+00, %X - ret double %Y -} - -define <2 x double> @fneg_dp_vec(<2 x double> %X) { - %Y = fsub <2 x double> < double -0.0000e+00, double -0.0000e+00 >, %X - ret <2 x double> %Y -} - -define float @fneg_sp(float %X) { - %Y = fsub float -0.000000e+00, %X - ret float %Y -} - -define <4 x float> @fneg_sp_vec(<4 x float> %X) { - %Y = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, - float -0.000000e+00, float -0.000000e+00>, %X - ret <4 x float> %Y -} - -declare double @fabs(double) - -declare float @fabsf(float) - -define double @fabs_dp(double %X) { - %Y = call double @fabs( double %X ) readnone - ret double %Y -} - -define float @fabs_sp(float %X) { - %Y = call float @fabsf( float %X ) readnone - ret float %Y -} diff --git a/test/CodeGen/CellSPU/i64ops.ll b/test/CodeGen/CellSPU/i64ops.ll deleted file mode 100644 index 3553cbbf7b5c..000000000000 --- a/test/CodeGen/CellSPU/i64ops.ll +++ /dev/null @@ -1,57 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep xswd %t1.s | count 3 -; RUN: grep xsbh %t1.s | count 1 -; RUN: grep xshw %t1.s | count 2 -; RUN: grep shufb %t1.s | count 7 -; RUN: grep cg %t1.s | count 4 -; RUN: grep addx %t1.s | count 4 -; RUN: grep fsmbi %t1.s | count 3 -; RUN: grep il %t1.s | count 2 -; RUN: grep mpy %t1.s | count 10 -; RUN: grep mpyh %t1.s | count 6 -; RUN: grep mpyhhu %t1.s | count 2 -; RUN: grep mpyu %t1.s | count 4 - -; ModuleID = 'stores.bc' -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define i64 @sext_i64_i8(i8 %a) nounwind { - %1 = sext i8 %a to i64 - ret i64 %1 -} - -define i64 @sext_i64_i16(i16 %a) nounwind { - %1 = sext i16 %a to i64 - ret i64 %1 -} - -define i64 @sext_i64_i32(i32 %a) nounwind { - %1 = sext i32 %a to i64 - ret i64 %1 -} - -define i64 @zext_i64_i8(i8 %a) nounwind { - %1 = zext i8 %a to i64 - ret i64 %1 -} - -define i64 @zext_i64_i16(i16 %a) nounwind { - %1 = zext i16 %a to i64 - ret i64 %1 -} - -define i64 @zext_i64_i32(i32 %a) nounwind { - %1 = zext i32 %a to i64 - ret i64 %1 -} - -define i64 @add_i64(i64 %a, i64 %b) nounwind { - %1 = add i64 %a, %b - ret i64 %1 -} - -define i64 @mul_i64(i64 %a, i64 %b) nounwind { - %1 = mul i64 %a, %b - ret i64 %1 -} diff --git a/test/CodeGen/CellSPU/i8ops.ll b/test/CodeGen/CellSPU/i8ops.ll deleted file mode 100644 index 57a2aa894725..000000000000 --- a/test/CodeGen/CellSPU/i8ops.ll +++ /dev/null @@ -1,25 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s - -; ModuleID = 'i8ops.bc' -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define i8 @add_i8(i8 %a, i8 %b) nounwind { - %1 = add i8 %a, %b - ret i8 %1 -} - -define i8 @add_i8_imm(i8 %a, i8 %b) nounwind { - %1 = add i8 %a, 15 - ret i8 %1 -} - -define i8 @sub_i8(i8 %a, i8 %b) nounwind { - %1 = sub i8 %a, %b - ret i8 %1 -} - -define i8 @sub_i8_imm(i8 %a, i8 %b) nounwind { - %1 = sub i8 %a, 15 - ret i8 %1 -} diff --git a/test/CodeGen/CellSPU/icmp16.ll b/test/CodeGen/CellSPU/icmp16.ll deleted file mode 100644 index 853ae1db160f..000000000000 --- a/test/CodeGen/CellSPU/icmp16.ll +++ /dev/null @@ -1,574 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; $3 = %arg1, $4 = %arg2, $5 = %val1, $6 = %val2 -; $3 = %arg1, $4 = %val1, $5 = %val2 -; -; For "positive" comparisons: -; selb $3, $6, $5, <i1> -; selb $3, $5, $4, <i1> -; -; For "negative" comparisons, i.e., those where the result of the comparison -; must be inverted (setne, for example): -; selb $3, $5, $6, <i1> -; selb $3, $4, $5, <i1> - -; i16 integer comparisons: -define i16 @icmp_eq_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_eq_select_i16: -; CHECK: ceqh -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp eq i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_eq_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_eq_setcc_i16: -; CHECK: ilhu -; CHECK: ceqh -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp eq i16 %arg1, %arg2 - ret i1 %A -} - -define i16 @icmp_eq_immed01_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_eq_immed01_i16: -; CHECK: ceqhi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i16 %arg1, 511 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_eq_immed02_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_eq_immed02_i16: -; CHECK: ceqhi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i16 %arg1, -512 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_eq_immed03_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_eq_immed03_i16: -; CHECK: ceqhi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i16 %arg1, -1 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_eq_immed04_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_eq_immed04_i16: -; CHECK: ilh -; CHECK: ceqh -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i16 %arg1, 32768 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ne_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ne_select_i16: -; CHECK: ceqh -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp ne i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_ne_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ne_setcc_i16: -; CHECK: ceqh -; CHECK: ilhu -; CHECK: xorhi -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp ne i16 %arg1, %arg2 - ret i1 %A -} - -define i16 @icmp_ne_immed01_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ne_immed01_i16: -; CHECK: ceqhi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i16 %arg1, 511 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ne_immed02_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ne_immed02_i16: -; CHECK: ceqhi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i16 %arg1, -512 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ne_immed03_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ne_immed03_i16: -; CHECK: ceqhi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i16 %arg1, -1 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ne_immed04_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ne_immed04_i16: -; CHECK: ilh -; CHECK: ceqh -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i16 %arg1, 32768 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ugt_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ugt_select_i16: -; CHECK: clgth -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp ugt i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_ugt_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ugt_setcc_i16: -; CHECK: ilhu -; CHECK: clgth -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp ugt i16 %arg1, %arg2 - ret i1 %A -} - -define i16 @icmp_ugt_immed01_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ugt_immed01_i16: -; CHECK: clgthi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ugt i16 %arg1, 500 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ugt_immed02_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ugt_immed02_i16: -; CHECK: ceqhi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ugt i16 %arg1, 0 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ugt_immed03_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ugt_immed03_i16: -; CHECK: clgthi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ugt i16 %arg1, 65024 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ugt_immed04_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ugt_immed04_i16: -; CHECK: ilh -; CHECK: clgth -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ugt i16 %arg1, 32768 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_uge_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_uge_select_i16: -; CHECK: ceqh -; CHECK: clgth -; CHECK: or -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp uge i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_uge_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_uge_setcc_i16: -; CHECK: ceqh -; CHECK: clgth -; CHECK: ilhu -; CHECK: or -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp uge i16 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp uge i16 %arg1, <immed> can always be transformed into -;; icmp ugt i16 %arg1, <immed>-1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i16 @icmp_ult_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ult_select_i16: -; CHECK: ceqh -; CHECK: clgth -; CHECK: nor -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp ult i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_ult_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ult_setcc_i16: -; CHECK: ceqh -; CHECK: clgth -; CHECK: ilhu -; CHECK: nor -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp ult i16 %arg1, %arg2 - ret i1 %A -} - -define i16 @icmp_ult_immed01_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ult_immed01_i16: -; CHECK: ceqhi -; CHECK: clgthi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i16 %arg1, 511 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ult_immed02_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ult_immed02_i16: -; CHECK: ceqhi -; CHECK: clgthi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i16 %arg1, 65534 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ult_immed03_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ult_immed03_i16: -; CHECK: ceqhi -; CHECK: clgthi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i16 %arg1, 65024 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ult_immed04_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ult_immed04_i16: -; CHECK: ilh -; CHECK: ceqh -; CHECK: clgth -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i16 %arg1, 32769 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_ule_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ule_select_i16: -; CHECK: clgth -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp ule i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_ule_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_ule_setcc_i16: -; CHECK: clgth -; CHECK: ilhu -; CHECK: xorhi -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp ule i16 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp ule i16 %arg1, <immed> can always be transformed into -;; icmp ult i16 %arg1, <immed>+1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i16 @icmp_sgt_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sgt_select_i16: -; CHECK: cgth -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp sgt i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_sgt_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sgt_setcc_i16: -; CHECK: ilhu -; CHECK: cgth -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp sgt i16 %arg1, %arg2 - ret i1 %A -} - -define i16 @icmp_sgt_immed01_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sgt_immed01_i16: -; CHECK: cgthi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i16 %arg1, 511 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_sgt_immed02_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sgt_immed02_i16: -; CHECK: cgthi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i16 %arg1, -1 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_sgt_immed03_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sgt_immed03_i16: -; CHECK: cgthi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i16 %arg1, -512 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_sgt_immed04_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sgt_immed04_i16: -; CHECK: ilh -; CHECK: ceqh -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp sgt i16 %arg1, 32768 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_sge_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sge_select_i16: -; CHECK: ceqh -; CHECK: cgth -; CHECK: or -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp sge i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_sge_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sge_setcc_i16: -; CHECK: ceqh -; CHECK: cgth -; CHECK: ilhu -; CHECK: or -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp sge i16 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp sge i16 %arg1, <immed> can always be transformed into -;; icmp sgt i16 %arg1, <immed>-1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i16 @icmp_slt_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_slt_select_i16: -; CHECK: ceqh -; CHECK: cgth -; CHECK: nor -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp slt i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_slt_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_slt_setcc_i16: -; CHECK: ceqh -; CHECK: cgth -; CHECK: ilhu -; CHECK: nor -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp slt i16 %arg1, %arg2 - ret i1 %A -} - -define i16 @icmp_slt_immed01_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_slt_immed01_i16: -; CHECK: ceqhi -; CHECK: cgthi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i16 %arg1, 511 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_slt_immed02_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_slt_immed02_i16: -; CHECK: ceqhi -; CHECK: cgthi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i16 %arg1, -512 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_slt_immed03_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_slt_immed03_i16: -; CHECK: ceqhi -; CHECK: cgthi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i16 %arg1, -1 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_slt_immed04_i16(i16 %arg1, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_slt_immed04_i16: -; CHECK: lr -; CHECK-NEXT: bi - -entry: - %A = icmp slt i16 %arg1, 32768 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i16 @icmp_sle_select_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sle_select_i16: -; CHECK: cgth -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp sle i16 %arg1, %arg2 - %B = select i1 %A, i16 %val1, i16 %val2 - ret i16 %B -} - -define i1 @icmp_sle_setcc_i16(i16 %arg1, i16 %arg2, i16 %val1, i16 %val2) nounwind { -; CHECK: icmp_sle_setcc_i16: -; CHECK: cgth -; CHECK: ilhu -; CHECK: xorhi -; CHECK: iohl -; CHECK: bi - -entry: - %A = icmp sle i16 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp sle i16 %arg1, <immed> can always be transformed into -;; icmp slt i16 %arg1, <immed>+1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - diff --git a/test/CodeGen/CellSPU/icmp32.ll b/test/CodeGen/CellSPU/icmp32.ll deleted file mode 100644 index 1794f4cd7b66..000000000000 --- a/test/CodeGen/CellSPU/icmp32.ll +++ /dev/null @@ -1,575 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; $3 = %arg1, $4 = %arg2, $5 = %val1, $6 = %val2 -; $3 = %arg1, $4 = %val1, $5 = %val2 -; -; For "positive" comparisons: -; selb $3, $6, $5, <i1> -; selb $3, $5, $4, <i1> -; -; For "negative" comparisons, i.e., those where the result of the comparison -; must be inverted (setne, for example): -; selb $3, $5, $6, <i1> -; selb $3, $4, $5, <i1> - -; i32 integer comparisons: -define i32 @icmp_eq_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_eq_select_i32: -; CHECK: ceq -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp eq i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_eq_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_eq_setcc_i32: -; CHECK: ilhu -; CHECK: ceq -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp eq i32 %arg1, %arg2 - ret i1 %A -} - -define i32 @icmp_eq_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_eq_immed01_i32: -; CHECK: ceqi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i32 %arg1, 511 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_eq_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_eq_immed02_i32: -; CHECK: ceqi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i32 %arg1, -512 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_eq_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_eq_immed03_i32: -; CHECK: ceqi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i32 %arg1, -1 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_eq_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_eq_immed04_i32: -; CHECK: ila -; CHECK: ceq -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i32 %arg1, 32768 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ne_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ne_select_i32: -; CHECK: ceq -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp ne i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_ne_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ne_setcc_i32: -; CHECK: ceq -; CHECK: ilhu -; CHECK: xori -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp ne i32 %arg1, %arg2 - ret i1 %A -} - -define i32 @icmp_ne_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ne_immed01_i32: -; CHECK: ceqi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i32 %arg1, 511 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ne_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ne_immed02_i32: -; CHECK: ceqi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i32 %arg1, -512 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ne_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ne_immed03_i32: -; CHECK: ceqi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i32 %arg1, -1 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ne_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ne_immed04_i32: -; CHECK: ila -; CHECK: ceq -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i32 %arg1, 32768 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ugt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ugt_select_i32: -; CHECK: clgt -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp ugt i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_ugt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ugt_setcc_i32: -; CHECK: ilhu -; CHECK: clgt -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp ugt i32 %arg1, %arg2 - ret i1 %A -} - -define i32 @icmp_ugt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ugt_immed01_i32: -; CHECK: clgti -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ugt i32 %arg1, 511 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ugt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ugt_immed02_i32: -; CHECK: clgti -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ugt i32 %arg1, 4294966784 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ugt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ugt_immed03_i32: -; CHECK: clgti -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ugt i32 %arg1, 4294967293 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ugt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ugt_immed04_i32: -; CHECK: ila -; CHECK: clgt -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ugt i32 %arg1, 32768 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_uge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_uge_select_i32: -; CHECK: ceq -; CHECK: clgt -; CHECK: or -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp uge i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_uge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_uge_setcc_i32: -; CHECK: ceq -; CHECK: clgt -; CHECK: ilhu -; CHECK: or -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp uge i32 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp uge i32 %arg1, <immed> can always be transformed into -;; icmp ugt i32 %arg1, <immed>-1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i32 @icmp_ult_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ult_select_i32: -; CHECK: ceq -; CHECK: clgt -; CHECK: nor -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp ult i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_ult_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ult_setcc_i32: -; CHECK: ceq -; CHECK: clgt -; CHECK: ilhu -; CHECK: nor -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp ult i32 %arg1, %arg2 - ret i1 %A -} - -define i32 @icmp_ult_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ult_immed01_i32: -; CHECK: ceqi -; CHECK: clgti -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i32 %arg1, 511 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ult_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ult_immed02_i32: -; CHECK: ceqi -; CHECK: clgti -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i32 %arg1, 4294966784 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ult_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ult_immed03_i32: -; CHECK: ceqi -; CHECK: clgti -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i32 %arg1, 4294967293 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ult_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ult_immed04_i32: -; CHECK: rotmi -; CHECK: ceqi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i32 %arg1, 32768 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_ule_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ule_select_i32: -; CHECK: clgt -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp ule i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_ule_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_ule_setcc_i32: -; CHECK: clgt -; CHECK: ilhu -; CHECK: xori -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp ule i32 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp ule i32 %arg1, <immed> can always be transformed into -;; icmp ult i32 %arg1, <immed>+1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i32 @icmp_sgt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sgt_select_i32: -; CHECK: cgt -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp sgt i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_sgt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sgt_setcc_i32: -; CHECK: ilhu -; CHECK: cgt -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp sgt i32 %arg1, %arg2 - ret i1 %A -} - -define i32 @icmp_sgt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sgt_immed01_i32: -; CHECK: cgti -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i32 %arg1, 511 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_sgt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sgt_immed02_i32: -; CHECK: cgti -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i32 %arg1, 4294966784 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_sgt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sgt_immed03_i32: -; CHECK: cgti -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i32 %arg1, 4294967293 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_sgt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sgt_immed04_i32: -; CHECK: ila -; CHECK: cgt -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i32 %arg1, 32768 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_sge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sge_select_i32: -; CHECK: ceq -; CHECK: cgt -; CHECK: or -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp sge i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_sge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sge_setcc_i32: -; CHECK: ceq -; CHECK: cgt -; CHECK: ilhu -; CHECK: or -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp sge i32 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp sge i32 %arg1, <immed> can always be transformed into -;; icmp sgt i32 %arg1, <immed>-1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i32 @icmp_slt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_slt_select_i32: -; CHECK: ceq -; CHECK: cgt -; CHECK: nor -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp slt i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_slt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_slt_setcc_i32: -; CHECK: ceq -; CHECK: cgt -; CHECK: ilhu -; CHECK: nor -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp slt i32 %arg1, %arg2 - ret i1 %A -} - -define i32 @icmp_slt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_slt_immed01_i32: -; CHECK: ceqi -; CHECK: cgti -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i32 %arg1, 511 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_slt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_slt_immed02_i32: -; CHECK: ceqi -; CHECK: cgti -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i32 %arg1, -512 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_slt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_slt_immed03_i32: -; CHECK: ceqi -; CHECK: cgti -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i32 %arg1, -1 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_slt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_slt_immed04_i32: -; CHECK: ila -; CHECK: ceq -; CHECK: cgt -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i32 %arg1, 32768 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i32 @icmp_sle_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sle_select_i32: -; CHECK: cgt -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp sle i32 %arg1, %arg2 - %B = select i1 %A, i32 %val1, i32 %val2 - ret i32 %B -} - -define i1 @icmp_sle_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind { -; CHECK: icmp_sle_setcc_i32: -; CHECK: cgt -; CHECK: ilhu -; CHECK: xori -; CHECK: iohl -; CHECK: shufb - -entry: - %A = icmp sle i32 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp sle i32 %arg1, <immed> can always be transformed into -;; icmp slt i32 %arg1, <immed>+1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - diff --git a/test/CodeGen/CellSPU/icmp64.ll b/test/CodeGen/CellSPU/icmp64.ll deleted file mode 100644 index 9dd2cdc0dea9..000000000000 --- a/test/CodeGen/CellSPU/icmp64.ll +++ /dev/null @@ -1,146 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep ceq %t1.s | count 20 -; RUN: grep cgti %t1.s | count 12 -; RUN: grep cgt %t1.s | count 16 -; RUN: grep clgt %t1.s | count 12 -; RUN: grep gb %t1.s | count 12 -; RUN: grep fsm %t1.s | count 10 -; RUN: grep xori %t1.s | count 5 -; RUN: grep selb %t1.s | count 18 - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; $3 = %arg1, $4 = %arg2, $5 = %val1, $6 = %val2 -; $3 = %arg1, $4 = %val1, $5 = %val2 -; -; i64 integer comparisons: -define i64 @icmp_eq_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp eq i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_eq_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp eq i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_ne_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp ne i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_ne_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp ne i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_ugt_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp ugt i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_ugt_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp ugt i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_uge_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp uge i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_uge_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp uge i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_ult_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp ult i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_ult_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp ult i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_ule_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp ule i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_ule_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp ule i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_sgt_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp sgt i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_sgt_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp sgt i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_sge_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp sge i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_sge_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp sge i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_slt_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp slt i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_slt_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp slt i64 %arg1, %arg2 - ret i1 %A -} - -define i64 @icmp_sle_select_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp sle i64 %arg1, %arg2 - %B = select i1 %A, i64 %val1, i64 %val2 - ret i64 %B -} - -define i1 @icmp_sle_setcc_i64(i64 %arg1, i64 %arg2, i64 %val1, i64 %val2) nounwind { -entry: - %A = icmp sle i64 %arg1, %arg2 - ret i1 %A -} diff --git a/test/CodeGen/CellSPU/icmp8.ll b/test/CodeGen/CellSPU/icmp8.ll deleted file mode 100644 index 1db641e5a853..000000000000 --- a/test/CodeGen/CellSPU/icmp8.ll +++ /dev/null @@ -1,446 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; $3 = %arg1, $4 = %arg2, $5 = %val1, $6 = %val2 -; $3 = %arg1, $4 = %val1, $5 = %val2 -; -; For "positive" comparisons: -; selb $3, $6, $5, <i1> -; selb $3, $5, $4, <i1> -; -; For "negative" comparisons, i.e., those where the result of the comparison -; must be inverted (setne, for example): -; selb $3, $5, $6, <i1> -; selb $3, $4, $5, <i1> - -; i8 integer comparisons: -define i8 @icmp_eq_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_eq_select_i8: -; CHECK: ceqb -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp eq i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_eq_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_eq_setcc_i8: -; CHECK: ceqb -; CHECK-NEXT: bi - -entry: - %A = icmp eq i8 %arg1, %arg2 - ret i1 %A -} - -define i8 @icmp_eq_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_eq_immed01_i8: -; CHECK: ceqbi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i8 %arg1, 127 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_eq_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_eq_immed02_i8: -; CHECK: ceqbi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i8 %arg1, -128 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_eq_immed03_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_eq_immed03_i8: -; CHECK: ceqbi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp eq i8 %arg1, -1 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_ne_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ne_select_i8: -; CHECK: ceqb -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp ne i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_ne_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ne_setcc_i8: -; CHECK: ceqb -; CHECK: xorbi -; CHECK-NEXT: bi - -entry: - %A = icmp ne i8 %arg1, %arg2 - ret i1 %A -} - -define i8 @icmp_ne_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ne_immed01_i8: -; CHECK: ceqbi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i8 %arg1, 127 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_ne_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ne_immed02_i8: -; CHECK: ceqbi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i8 %arg1, -128 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_ne_immed03_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ne_immed03_i8: -; CHECK: ceqbi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp ne i8 %arg1, -1 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_ugt_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ugt_select_i8: -; CHECK: clgtb -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp ugt i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_ugt_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ugt_setcc_i8: -; CHECK: clgtb -; CHECK-NEXT: bi - -entry: - %A = icmp ugt i8 %arg1, %arg2 - ret i1 %A -} - -define i8 @icmp_ugt_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ugt_immed01_i8: -; CHECK: clgtbi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ugt i8 %arg1, 126 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_uge_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_uge_select_i8: -; CHECK: ceqb -; CHECK: clgtb -; CHECK: or -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp uge i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_uge_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_uge_setcc_i8: -; CHECK: ceqb -; CHECK: clgtb -; CHECK: or -; CHECK-NEXT: bi - -entry: - %A = icmp uge i8 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp uge i8 %arg1, <immed> can always be transformed into -;; icmp ugt i8 %arg1, <immed>-1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i8 @icmp_ult_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ult_select_i8: -; CHECK: ceqb -; CHECK: clgtb -; CHECK: nor -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp ult i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_ult_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ult_setcc_i8: -; CHECK: ceqb -; CHECK: clgtb -; CHECK: nor -; CHECK-NEXT: bi - -entry: - %A = icmp ult i8 %arg1, %arg2 - ret i1 %A -} - -define i8 @icmp_ult_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ult_immed01_i8: -; CHECK: ceqbi -; CHECK: clgtbi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i8 %arg1, 253 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_ult_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ult_immed02_i8: -; CHECK: ceqbi -; CHECK: clgtbi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp ult i8 %arg1, 129 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_ule_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ule_select_i8: -; CHECK: clgtb -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp ule i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_ule_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_ule_setcc_i8: -; CHECK: clgtb -; CHECK: xorbi -; CHECK-NEXT: bi - -entry: - %A = icmp ule i8 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp ule i8 %arg1, <immed> can always be transformed into -;; icmp ult i8 %arg1, <immed>+1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i8 @icmp_sgt_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sgt_select_i8: -; CHECK: cgtb -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp sgt i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_sgt_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sgt_setcc_i8: -; CHECK: cgtb -; CHECK-NEXT: bi - -entry: - %A = icmp sgt i8 %arg1, %arg2 - ret i1 %A -} - -define i8 @icmp_sgt_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sgt_immed01_i8: -; CHECK: cgtbi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i8 %arg1, 96 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_sgt_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sgt_immed02_i8: -; CHECK: cgtbi -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp sgt i8 %arg1, -1 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_sgt_immed03_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sgt_immed03_i8: -; CHECK: ceqbi -; CHECK: selb $3, $4, $5, $3 - -entry: - %A = icmp sgt i8 %arg1, -128 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_sge_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sge_select_i8: -; CHECK: ceqb -; CHECK: cgtb -; CHECK: or -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp sge i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_sge_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sge_setcc_i8: -; CHECK: ceqb -; CHECK: cgtb -; CHECK: or -; CHECK-NEXT: bi - -entry: - %A = icmp sge i8 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp sge i8 %arg1, <immed> can always be transformed into -;; icmp sgt i8 %arg1, <immed>-1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - -define i8 @icmp_slt_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_slt_select_i8: -; CHECK: ceqb -; CHECK: cgtb -; CHECK: nor -; CHECK: selb $3, $6, $5, $3 - -entry: - %A = icmp slt i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_slt_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_slt_setcc_i8: -; CHECK: ceqb -; CHECK: cgtb -; CHECK: nor -; CHECK-NEXT: bi - -entry: - %A = icmp slt i8 %arg1, %arg2 - ret i1 %A -} - -define i8 @icmp_slt_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_slt_immed01_i8: -; CHECK: ceqbi -; CHECK: cgtbi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i8 %arg1, 96 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_slt_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_slt_immed02_i8: -; CHECK: ceqbi -; CHECK: cgtbi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i8 %arg1, -120 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_slt_immed03_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_slt_immed03_i8: -; CHECK: ceqbi -; CHECK: cgtbi -; CHECK: nor -; CHECK: selb $3, $5, $4, $3 - -entry: - %A = icmp slt i8 %arg1, -1 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i8 @icmp_sle_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sle_select_i8: -; CHECK: cgtb -; CHECK: selb $3, $5, $6, $3 - -entry: - %A = icmp sle i8 %arg1, %arg2 - %B = select i1 %A, i8 %val1, i8 %val2 - ret i8 %B -} - -define i1 @icmp_sle_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind { -; CHECK: icmp_sle_setcc_i8: -; CHECK: cgtb -; CHECK: xorbi -; CHECK-NEXT: bi - -entry: - %A = icmp sle i8 %arg1, %arg2 - ret i1 %A -} - -;; Note: icmp sle i8 %arg1, <immed> can always be transformed into -;; icmp slt i8 %arg1, <immed>+1 -;; -;; Consequently, even though the patterns exist to match, it's unlikely -;; they'll ever be generated. - diff --git a/test/CodeGen/CellSPU/immed16.ll b/test/CodeGen/CellSPU/immed16.ll deleted file mode 100644 index 077d07169e45..000000000000 --- a/test/CodeGen/CellSPU/immed16.ll +++ /dev/null @@ -1,40 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep "ilh" %t1.s | count 11 -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define i16 @test_1() { - %x = alloca i16, align 16 - store i16 419, i16* %x ;; ILH via pattern - ret i16 0 -} - -define i16 @test_2() { - %x = alloca i16, align 16 - store i16 1023, i16* %x ;; ILH via pattern - ret i16 0 -} - -define i16 @test_3() { - %x = alloca i16, align 16 - store i16 -1023, i16* %x ;; ILH via pattern - ret i16 0 -} - -define i16 @test_4() { - %x = alloca i16, align 16 - store i16 32767, i16* %x ;; ILH via pattern - ret i16 0 -} - -define i16 @test_5() { - %x = alloca i16, align 16 - store i16 -32768, i16* %x ;; ILH via pattern - ret i16 0 -} - -define i16 @test_6() { - ret i16 0 -} - - diff --git a/test/CodeGen/CellSPU/immed32.ll b/test/CodeGen/CellSPU/immed32.ll deleted file mode 100644 index 8e48f0b52c17..000000000000 --- a/test/CodeGen/CellSPU/immed32.ll +++ /dev/null @@ -1,83 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep ilhu %t1.s | count 9 -; RUN: grep iohl %t1.s | count 7 -; RUN: grep -w il %t1.s | count 3 -; RUN: grep 16429 %t1.s | count 1 -; RUN: grep 63572 %t1.s | count 1 -; RUN: grep 128 %t1.s | count 1 -; RUN: grep 32639 %t1.s | count 1 -; RUN: grep 65535 %t1.s | count 1 -; RUN: grep 16457 %t1.s | count 1 -; RUN: grep 4059 %t1.s | count 1 -; RUN: grep 49077 %t1.s | count 1 -; RUN: grep 1267 %t1.s | count 2 -; RUN: grep 16309 %t1.s | count 1 -; RUN: cat %t1.s | FileCheck %s -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define i32 @test_1() { - ret i32 4784128 ;; ILHU via pattern (0x49000) -} - -define i32 @test_2() { - ret i32 5308431 ;; ILHU/IOHL via pattern (0x5100f) -} - -define i32 @test_3() { - ret i32 511 ;; IL via pattern -} - -define i32 @test_4() { - ret i32 -512 ;; IL via pattern -} - -define i32 @test_5() -{ -;CHECK: test_5: -;CHECK-NOT: ila $3, 40000 -;CHECK: ilhu -;CHECK: iohl -;CHECK: bi $lr - ret i32 400000 -} - -;; double float floatval -;; 0x4005bf0a80000000 0x402d|f854 2.718282 -define float @float_const_1() { - ret float 0x4005BF0A80000000 ;; ILHU/IOHL -} - -;; double float floatval -;; 0x3810000000000000 0x0080|0000 0.000000 -define float @float_const_2() { - ret float 0x3810000000000000 ;; IL 128 -} - -;; double float floatval -;; 0x47efffffe0000000 0x7f7f|ffff NaN -define float @float_const_3() { - ret float 0x47EFFFFFE0000000 ;; ILHU/IOHL via pattern -} - -;; double float floatval -;; 0x400921fb60000000 0x4049|0fdb 3.141593 -define float @float_const_4() { - ret float 0x400921FB60000000 ;; ILHU/IOHL via pattern -} - -;; double float floatval -;; 0xbff6a09e60000000 0xbfb5|04f3 -1.414214 -define float @float_const_5() { - ret float 0xBFF6A09E60000000 ;; ILHU/IOHL via pattern -} - -;; double float floatval -;; 0x3ff6a09e60000000 0x3fb5|04f3 1.414214 -define float @float_const_6() { - ret float 0x3FF6A09E60000000 ;; ILHU/IOHL via pattern -} - -define float @float_const_7() { - ret float 0.000000e+00 ;; IL 0 via pattern -} diff --git a/test/CodeGen/CellSPU/immed64.ll b/test/CodeGen/CellSPU/immed64.ll deleted file mode 100644 index fd483651756e..000000000000 --- a/test/CodeGen/CellSPU/immed64.ll +++ /dev/null @@ -1,95 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep lqa %t1.s | count 13 -; RUN: grep ilhu %t1.s | count 15 -; RUN: grep ila %t1.s | count 1 -; RUN: grep -w il %t1.s | count 6 -; RUN: grep shufb %t1.s | count 13 -; RUN: grep 65520 %t1.s | count 1 -; RUN: grep 43981 %t1.s | count 1 -; RUN: grep 13702 %t1.s | count 1 -; RUN: grep 28225 %t1.s | count 1 -; RUN: grep 30720 %t1.s | count 1 -; RUN: grep 3233857728 %t1.s | count 8 -; RUN: grep 2155905152 %t1.s | count 6 -; RUN: grep 66051 %t1.s | count 7 -; RUN: grep 471670303 %t1.s | count 11 - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; 1311768467750121234 => 0x 12345678 abcdef12 (4660,22136/43981,61202) -; 18446744073709551591 => 0x ffffffff ffffffe7 (-25) -; 18446744073708516742 => 0x ffffffff fff03586 (-1034874) -; 5308431 => 0x 00000000 0051000F -; 9223372038704560128 => 0x 80000000 6e417800 - -define i64 @i64_const_1() { - ret i64 1311768467750121234 ;; Constant pool spill -} - -define i64 @i64_const_2() { - ret i64 18446744073709551591 ;; IL/SHUFB -} - -define i64 @i64_const_3() { - ret i64 18446744073708516742 ;; IHLU/IOHL/SHUFB -} - -define i64 @i64_const_4() { - ret i64 5308431 ;; ILHU/IOHL/SHUFB -} - -define i64 @i64_const_5() { - ret i64 511 ;; IL/SHUFB -} - -define i64 @i64_const_6() { - ret i64 -512 ;; IL/SHUFB -} - -define i64 @i64_const_7() { - ret i64 9223372038704560128 ;; IHLU/IOHL/SHUFB -} - -define i64 @i64_const_8() { - ret i64 0 ;; IL -} - -define i64 @i64_const_9() { - ret i64 -1 ;; IL -} - -define i64 @i64_const_10() { - ret i64 281470681808895 ;; IL 65535 -} - -; 0x4005bf0a8b145769 -> -; (ILHU 0x4005 [16389]/IOHL 0xbf0a [48906]) -; (ILHU 0x8b14 [35604]/IOHL 0x5769 [22377]) -define double @f64_const_1() { - ret double 0x4005bf0a8b145769 ;; ILHU/IOHL via pattern -} - -define double @f64_const_2() { - ret double 0x0010000000000000 -} - -define double @f64_const_3() { - ret double 0x7fefffffffffffff -} - -define double @f64_const_4() { - ret double 0x400921fb54442d18 -} - -define double @f64_const_5() { - ret double 0xbff6a09e667f3bcd ;; ILHU/IOHL via pattern -} - -define double @f64_const_6() { - ret double 0x3ff6a09e667f3bcd -} - -define double @f64_const_7() { - ret double 0.000000e+00 -} diff --git a/test/CodeGen/CellSPU/int2fp.ll b/test/CodeGen/CellSPU/int2fp.ll deleted file mode 100644 index 984c017c96d1..000000000000 --- a/test/CodeGen/CellSPU/int2fp.ll +++ /dev/null @@ -1,41 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep csflt %t1.s | count 5 -; RUN: grep cuflt %t1.s | count 1 -; RUN: grep xshw %t1.s | count 2 -; RUN: grep xsbh %t1.s | count 1 -; RUN: grep and %t1.s | count 2 -; RUN: grep andi %t1.s | count 1 -; RUN: grep ila %t1.s | count 1 - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define float @sitofp_i32(i32 %arg1) { - %A = sitofp i32 %arg1 to float ; <float> [#uses=1] - ret float %A -} - -define float @uitofp_u32(i32 %arg1) { - %A = uitofp i32 %arg1 to float ; <float> [#uses=1] - ret float %A -} - -define float @sitofp_i16(i16 %arg1) { - %A = sitofp i16 %arg1 to float ; <float> [#uses=1] - ret float %A -} - -define float @uitofp_i16(i16 %arg1) { - %A = uitofp i16 %arg1 to float ; <float> [#uses=1] - ret float %A -} - -define float @sitofp_i8(i8 %arg1) { - %A = sitofp i8 %arg1 to float ; <float> [#uses=1] - ret float %A -} - -define float @uitofp_i8(i8 %arg1) { - %A = uitofp i8 %arg1 to float ; <float> [#uses=1] - ret float %A -} diff --git a/test/CodeGen/CellSPU/intrinsics_branch.ll b/test/CodeGen/CellSPU/intrinsics_branch.ll deleted file mode 100644 index b0f6a6247e41..000000000000 --- a/test/CodeGen/CellSPU/intrinsics_branch.ll +++ /dev/null @@ -1,150 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep ceq %t1.s | count 30 -; RUN: grep ceqb %t1.s | count 10 -; RUN: grep ceqhi %t1.s | count 5 -; RUN: grep ceqi %t1.s | count 5 -; RUN: grep cgt %t1.s | count 30 -; RUN: grep cgtb %t1.s | count 10 -; RUN: grep cgthi %t1.s | count 5 -; RUN: grep cgti %t1.s | count 5 -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -declare <4 x i32> @llvm.spu.si.shli(<4 x i32>, i8) - -declare <4 x i32> @llvm.spu.si.ceq(<4 x i32>, <4 x i32>) -declare <16 x i8> @llvm.spu.si.ceqb(<16 x i8>, <16 x i8>) -declare <8 x i16> @llvm.spu.si.ceqh(<8 x i16>, <8 x i16>) -declare <4 x i32> @llvm.spu.si.ceqi(<4 x i32>, i16) -declare <8 x i16> @llvm.spu.si.ceqhi(<8 x i16>, i16) -declare <16 x i8> @llvm.spu.si.ceqbi(<16 x i8>, i8) - -declare <4 x i32> @llvm.spu.si.cgt(<4 x i32>, <4 x i32>) -declare <16 x i8> @llvm.spu.si.cgtb(<16 x i8>, <16 x i8>) -declare <8 x i16> @llvm.spu.si.cgth(<8 x i16>, <8 x i16>) -declare <4 x i32> @llvm.spu.si.cgti(<4 x i32>, i16) -declare <8 x i16> @llvm.spu.si.cgthi(<8 x i16>, i16) -declare <16 x i8> @llvm.spu.si.cgtbi(<16 x i8>, i8) - -declare <4 x i32> @llvm.spu.si.clgt(<4 x i32>, <4 x i32>) -declare <16 x i8> @llvm.spu.si.clgtb(<16 x i8>, <16 x i8>) -declare <8 x i16> @llvm.spu.si.clgth(<8 x i16>, <8 x i16>) -declare <4 x i32> @llvm.spu.si.clgti(<4 x i32>, i16) -declare <8 x i16> @llvm.spu.si.clgthi(<8 x i16>, i16) -declare <16 x i8> @llvm.spu.si.clgtbi(<16 x i8>, i8) - - - -define <4 x i32> @test(<4 x i32> %A) { - call <4 x i32> @llvm.spu.si.shli(<4 x i32> %A, i8 3) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <4 x i32> @ceqtest(<4 x i32> %A, <4 x i32> %B) { - call <4 x i32> @llvm.spu.si.ceq(<4 x i32> %A, <4 x i32> %B) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <8 x i16> @ceqhtest(<8 x i16> %A, <8 x i16> %B) { - call <8 x i16> @llvm.spu.si.ceqh(<8 x i16> %A, <8 x i16> %B) - %Y = bitcast <8 x i16> %1 to <8 x i16> - ret <8 x i16> %Y -} - -define <16 x i8> @ceqbtest(<16 x i8> %A, <16 x i8> %B) { - call <16 x i8> @llvm.spu.si.ceqb(<16 x i8> %A, <16 x i8> %B) - %Y = bitcast <16 x i8> %1 to <16 x i8> - ret <16 x i8> %Y -} - -define <4 x i32> @ceqitest(<4 x i32> %A) { - call <4 x i32> @llvm.spu.si.ceqi(<4 x i32> %A, i16 65) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <8 x i16> @ceqhitest(<8 x i16> %A) { - call <8 x i16> @llvm.spu.si.ceqhi(<8 x i16> %A, i16 65) - %Y = bitcast <8 x i16> %1 to <8 x i16> - ret <8 x i16> %Y -} - -define <16 x i8> @ceqbitest(<16 x i8> %A) { - call <16 x i8> @llvm.spu.si.ceqbi(<16 x i8> %A, i8 65) - %Y = bitcast <16 x i8> %1 to <16 x i8> - ret <16 x i8> %Y -} - -define <4 x i32> @cgttest(<4 x i32> %A, <4 x i32> %B) { - call <4 x i32> @llvm.spu.si.cgt(<4 x i32> %A, <4 x i32> %B) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <8 x i16> @cgthtest(<8 x i16> %A, <8 x i16> %B) { - call <8 x i16> @llvm.spu.si.cgth(<8 x i16> %A, <8 x i16> %B) - %Y = bitcast <8 x i16> %1 to <8 x i16> - ret <8 x i16> %Y -} - -define <16 x i8> @cgtbtest(<16 x i8> %A, <16 x i8> %B) { - call <16 x i8> @llvm.spu.si.cgtb(<16 x i8> %A, <16 x i8> %B) - %Y = bitcast <16 x i8> %1 to <16 x i8> - ret <16 x i8> %Y -} - -define <4 x i32> @cgtitest(<4 x i32> %A) { - call <4 x i32> @llvm.spu.si.cgti(<4 x i32> %A, i16 65) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <8 x i16> @cgthitest(<8 x i16> %A) { - call <8 x i16> @llvm.spu.si.cgthi(<8 x i16> %A, i16 65) - %Y = bitcast <8 x i16> %1 to <8 x i16> - ret <8 x i16> %Y -} - -define <16 x i8> @cgtbitest(<16 x i8> %A) { - call <16 x i8> @llvm.spu.si.cgtbi(<16 x i8> %A, i8 65) - %Y = bitcast <16 x i8> %1 to <16 x i8> - ret <16 x i8> %Y -} - -define <4 x i32> @clgttest(<4 x i32> %A, <4 x i32> %B) { - call <4 x i32> @llvm.spu.si.clgt(<4 x i32> %A, <4 x i32> %B) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <8 x i16> @clgthtest(<8 x i16> %A, <8 x i16> %B) { - call <8 x i16> @llvm.spu.si.clgth(<8 x i16> %A, <8 x i16> %B) - %Y = bitcast <8 x i16> %1 to <8 x i16> - ret <8 x i16> %Y -} - -define <16 x i8> @clgtbtest(<16 x i8> %A, <16 x i8> %B) { - call <16 x i8> @llvm.spu.si.clgtb(<16 x i8> %A, <16 x i8> %B) - %Y = bitcast <16 x i8> %1 to <16 x i8> - ret <16 x i8> %Y -} - -define <4 x i32> @clgtitest(<4 x i32> %A) { - call <4 x i32> @llvm.spu.si.clgti(<4 x i32> %A, i16 65) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <8 x i16> @clgthitest(<8 x i16> %A) { - call <8 x i16> @llvm.spu.si.clgthi(<8 x i16> %A, i16 65) - %Y = bitcast <8 x i16> %1 to <8 x i16> - ret <8 x i16> %Y -} - -define <16 x i8> @clgtbitest(<16 x i8> %A) { - call <16 x i8> @llvm.spu.si.clgtbi(<16 x i8> %A, i8 65) - %Y = bitcast <16 x i8> %1 to <16 x i8> - ret <16 x i8> %Y -} diff --git a/test/CodeGen/CellSPU/intrinsics_float.ll b/test/CodeGen/CellSPU/intrinsics_float.ll deleted file mode 100644 index 81373470d069..000000000000 --- a/test/CodeGen/CellSPU/intrinsics_float.ll +++ /dev/null @@ -1,94 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep fa %t1.s | count 5 -; RUN: grep fs %t1.s | count 5 -; RUN: grep fm %t1.s | count 15 -; RUN: grep fceq %t1.s | count 5 -; RUN: grep fcmeq %t1.s | count 5 -; RUN: grep fcgt %t1.s | count 5 -; RUN: grep fcmgt %t1.s | count 5 -; RUN: grep fma %t1.s | count 5 -; RUN: grep fnms %t1.s | count 5 -; RUN: grep fms %t1.s | count 5 -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -declare <4 x i32> @llvm.spu.si.shli(<4 x i32>, i8) - -declare <4 x float> @llvm.spu.si.fa(<4 x float>, <4 x float>) -declare <4 x float> @llvm.spu.si.fs(<4 x float>, <4 x float>) -declare <4 x float> @llvm.spu.si.fm(<4 x float>, <4 x float>) - -declare <4 x float> @llvm.spu.si.fceq(<4 x float>, <4 x float>) -declare <4 x float> @llvm.spu.si.fcmeq(<4 x float>, <4 x float>) -declare <4 x float> @llvm.spu.si.fcgt(<4 x float>, <4 x float>) -declare <4 x float> @llvm.spu.si.fcmgt(<4 x float>, <4 x float>) - -declare <4 x float> @llvm.spu.si.fma(<4 x float>, <4 x float>, <4 x float>) -declare <4 x float> @llvm.spu.si.fnms(<4 x float>, <4 x float>, <4 x float>) -declare <4 x float> @llvm.spu.si.fms(<4 x float>, <4 x float>, <4 x float>) - -define <4 x i32> @test(<4 x i32> %A) { - call <4 x i32> @llvm.spu.si.shli(<4 x i32> %A, i8 3) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <4 x float> @fatest(<4 x float> %A, <4 x float> %B) { - call <4 x float> @llvm.spu.si.fa(<4 x float> %A, <4 x float> %B) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fstest(<4 x float> %A, <4 x float> %B) { - call <4 x float> @llvm.spu.si.fs(<4 x float> %A, <4 x float> %B) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fmtest(<4 x float> %A, <4 x float> %B) { - call <4 x float> @llvm.spu.si.fm(<4 x float> %A, <4 x float> %B) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fceqtest(<4 x float> %A, <4 x float> %B) { - call <4 x float> @llvm.spu.si.fceq(<4 x float> %A, <4 x float> %B) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fcmeqtest(<4 x float> %A, <4 x float> %B) { - call <4 x float> @llvm.spu.si.fcmeq(<4 x float> %A, <4 x float> %B) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fcgttest(<4 x float> %A, <4 x float> %B) { - call <4 x float> @llvm.spu.si.fcgt(<4 x float> %A, <4 x float> %B) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fcmgttest(<4 x float> %A, <4 x float> %B) { - call <4 x float> @llvm.spu.si.fcmgt(<4 x float> %A, <4 x float> %B) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fmatest(<4 x float> %A, <4 x float> %B, <4 x float> %C) { - call <4 x float> @llvm.spu.si.fma(<4 x float> %A, <4 x float> %B, <4 x float> %C) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fnmstest(<4 x float> %A, <4 x float> %B, <4 x float> %C) { - call <4 x float> @llvm.spu.si.fnms(<4 x float> %A, <4 x float> %B, <4 x float> %C) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} - -define <4 x float> @fmstest(<4 x float> %A, <4 x float> %B, <4 x float> %C) { - call <4 x float> @llvm.spu.si.fms(<4 x float> %A, <4 x float> %B, <4 x float> %C) - %Y = bitcast <4 x float> %1 to <4 x float> - ret <4 x float> %Y -} diff --git a/test/CodeGen/CellSPU/intrinsics_logical.ll b/test/CodeGen/CellSPU/intrinsics_logical.ll deleted file mode 100644 index a29ee4c2405d..000000000000 --- a/test/CodeGen/CellSPU/intrinsics_logical.ll +++ /dev/null @@ -1,49 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep and %t1.s | count 20 -; RUN: grep andc %t1.s | count 5 -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -declare <4 x i32> @llvm.spu.si.and(<4 x i32>, <4 x i32>) -declare <4 x i32> @llvm.spu.si.andc(<4 x i32>, <4 x i32>) -declare <4 x i32> @llvm.spu.si.andi(<4 x i32>, i16) -declare <8 x i16> @llvm.spu.si.andhi(<8 x i16>, i16) -declare <16 x i8> @llvm.spu.si.andbi(<16 x i8>, i8) - -declare <4 x i32> @llvm.spu.si.or(<4 x i32>, <4 x i32>) -declare <4 x i32> @llvm.spu.si.orc(<4 x i32>, <4 x i32>) -declare <4 x i32> @llvm.spu.si.ori(<4 x i32>, i16) -declare <8 x i16> @llvm.spu.si.orhi(<8 x i16>, i16) -declare <16 x i8> @llvm.spu.si.orbi(<16 x i8>, i8) - -declare <4 x i32> @llvm.spu.si.xor(<4 x i32>, <4 x i32>) -declare <4 x i32> @llvm.spu.si.xori(<4 x i32>, i16) -declare <8 x i16> @llvm.spu.si.xorhi(<8 x i16>, i16) -declare <16 x i8> @llvm.spu.si.xorbi(<16 x i8>, i8) - -declare <4 x i32> @llvm.spu.si.nand(<4 x i32>, <4 x i32>) -declare <4 x i32> @llvm.spu.si.nor(<4 x i32>, <4 x i32>) - -define <4 x i32> @andtest(<4 x i32> %A, <4 x i32> %B) { - call <4 x i32> @llvm.spu.si.and(<4 x i32> %A, <4 x i32> %B) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <4 x i32> @andctest(<4 x i32> %A, <4 x i32> %B) { - call <4 x i32> @llvm.spu.si.andc(<4 x i32> %A, <4 x i32> %B) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <4 x i32> @anditest(<4 x i32> %A) { - call <4 x i32> @llvm.spu.si.andi(<4 x i32> %A, i16 65) - %Y = bitcast <4 x i32> %1 to <4 x i32> - ret <4 x i32> %Y -} - -define <8 x i16> @andhitest(<8 x i16> %A) { - call <8 x i16> @llvm.spu.si.andhi(<8 x i16> %A, i16 65) - %Y = bitcast <8 x i16> %1 to <8 x i16> - ret <8 x i16> %Y -} diff --git a/test/CodeGen/CellSPU/jumptable.ll b/test/CodeGen/CellSPU/jumptable.ll deleted file mode 100644 index 66c2fdeb51fd..000000000000 --- a/test/CodeGen/CellSPU/jumptable.ll +++ /dev/null @@ -1,21 +0,0 @@ -;RUN: llc --march=cellspu -disable-cgp-branch-opts %s -o - | FileCheck %s -; This is to check that emitting jumptables doesn't crash llc -define i32 @test(i32 %param) { -entry: -;CHECK: ai {{\$.}}, $3, -1 -;CHECK: clgti {{\$., \$.}}, 3 -;CHECK: brnz {{\$.}},.LBB0_ - switch i32 %param, label %bb2 [ - i32 1, label %bb1 - i32 2, label %bb2 - i32 3, label %bb3 - i32 4, label %bb2 - ] -;CHECK-NOT: # BB#2 -bb1: - ret i32 1 -bb2: - ret i32 2 -bb3: - ret i32 %param -} diff --git a/test/CodeGen/CellSPU/loads.ll b/test/CodeGen/CellSPU/loads.ll deleted file mode 100644 index 4771752f5f4c..000000000000 --- a/test/CodeGen/CellSPU/loads.ll +++ /dev/null @@ -1,59 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -; ModuleID = 'loads.bc' -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define <4 x float> @load_v4f32_1(<4 x float>* %a) nounwind readonly { -entry: - %tmp1 = load <4 x float>* %a - ret <4 x float> %tmp1 -; CHECK: lqd $3, 0($3) -} - -define <4 x float> @load_v4f32_2(<4 x float>* %a) nounwind readonly { -entry: - %arrayidx = getelementptr <4 x float>* %a, i32 1 - %tmp1 = load <4 x float>* %arrayidx - ret <4 x float> %tmp1 -; CHECK: lqd $3, 16($3) -} - - -declare <4 x i32>* @getv4f32ptr() -define <4 x i32> @func() { - ;CHECK: brasl - ; we need to have some instruction to move the result to safety. - ; which instruction (lr, stqd...) depends on the regalloc - ;CHECK: {{.*}} - ;CHECK: brasl - %rv1 = call <4 x i32>* @getv4f32ptr() - %rv2 = call <4 x i32>* @getv4f32ptr() - %rv3 = load <4 x i32>* %rv1 - ret <4 x i32> %rv3 -} - -define <4 x float> @load_undef(){ - ; CHECK: lqd $3, 0($3) - %val = load <4 x float>* undef - ret <4 x float> %val -} - -;check that 'misaligned' loads that may span two memory chunks -;have two loads. Don't check for the bitmanipulation, as that -;might change with improved algorithms or scheduling -define i32 @load_misaligned( i32* %ptr ){ -;CHECK: load_misaligned -;CHECK: lqd -;CHECK: lqd -;CHECK: bi $lr - %rv = load i32* %ptr, align 2 - ret i32 %rv -} - -define <4 x i32> @load_null_vec( ) { -;CHECK: lqa -;CHECK: bi $lr - %rv = load <4 x i32>* null - ret <4 x i32> %rv -} diff --git a/test/CodeGen/CellSPU/mul-with-overflow.ll b/test/CodeGen/CellSPU/mul-with-overflow.ll deleted file mode 100644 index c04e69e3e193..000000000000 --- a/test/CodeGen/CellSPU/mul-with-overflow.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: llc < %s -march=cellspu - -declare {i16, i1} @llvm.smul.with.overflow.i16(i16 %a, i16 %b) -define zeroext i1 @a(i16 %x) nounwind { - %res = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %x, i16 3) - %obil = extractvalue {i16, i1} %res, 1 - ret i1 %obil -} - -declare {i16, i1} @llvm.umul.with.overflow.i16(i16 %a, i16 %b) -define zeroext i1 @b(i16 %x) nounwind { - %res = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %x, i16 3) - %obil = extractvalue {i16, i1} %res, 1 - ret i1 %obil -} diff --git a/test/CodeGen/CellSPU/mul_ops.ll b/test/CodeGen/CellSPU/mul_ops.ll deleted file mode 100644 index 1e28fc7a918d..000000000000 --- a/test/CodeGen/CellSPU/mul_ops.ll +++ /dev/null @@ -1,88 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep mpy %t1.s | count 44 -; RUN: grep mpyu %t1.s | count 4 -; RUN: grep mpyh %t1.s | count 10 -; RUN: grep mpyhh %t1.s | count 2 -; RUN: grep rotma %t1.s | count 12 -; RUN: grep rotmahi %t1.s | count 4 -; RUN: grep and %t1.s | count 2 -; RUN: grep selb %t1.s | count 6 -; RUN: grep fsmbi %t1.s | count 4 -; RUN: grep shli %t1.s | count 4 -; RUN: grep shlhi %t1.s | count 4 -; RUN: grep ila %t1.s | count 2 -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; 32-bit multiply instruction generation: -define <4 x i32> @mpy_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { -entry: - %A = mul <4 x i32> %arg1, %arg2 - ret <4 x i32> %A -} - -define <4 x i32> @mpy_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { -entry: - %A = mul <4 x i32> %arg2, %arg1 - ret <4 x i32> %A -} - -define <8 x i16> @mpy_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { -entry: - %A = mul <8 x i16> %arg1, %arg2 - ret <8 x i16> %A -} - -define <8 x i16> @mpy_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { -entry: - %A = mul <8 x i16> %arg2, %arg1 - ret <8 x i16> %A -} - -define <16 x i8> @mul_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { -entry: - %A = mul <16 x i8> %arg2, %arg1 - ret <16 x i8> %A -} - -define <16 x i8> @mul_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { -entry: - %A = mul <16 x i8> %arg1, %arg2 - ret <16 x i8> %A -} - -define i32 @mul_i32_1(i32 %arg1, i32 %arg2) { -entry: - %A = mul i32 %arg2, %arg1 - ret i32 %A -} - -define i32 @mul_i32_2(i32 %arg1, i32 %arg2) { -entry: - %A = mul i32 %arg1, %arg2 - ret i32 %A -} - -define i16 @mul_i16_1(i16 %arg1, i16 %arg2) { -entry: - %A = mul i16 %arg2, %arg1 - ret i16 %A -} - -define i16 @mul_i16_2(i16 %arg1, i16 %arg2) { -entry: - %A = mul i16 %arg1, %arg2 - ret i16 %A -} - -define i8 @mul_i8_1(i8 %arg1, i8 %arg2) { -entry: - %A = mul i8 %arg2, %arg1 - ret i8 %A -} - -define i8 @mul_i8_2(i8 %arg1, i8 %arg2) { -entry: - %A = mul i8 %arg1, %arg2 - ret i8 %A -} diff --git a/test/CodeGen/CellSPU/nand.ll b/test/CodeGen/CellSPU/nand.ll deleted file mode 100644 index 57ac709c5414..000000000000 --- a/test/CodeGen/CellSPU/nand.ll +++ /dev/null @@ -1,125 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep nand %t1.s | count 90 -; RUN: grep and %t1.s | count 94 -; RUN: grep xsbh %t1.s | count 2 -; RUN: grep xshw %t1.s | count 4 - -; CellSPU legalization is over-sensitive to Legalize's traversal order. -; XFAIL: * - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define <4 x i32> @nand_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = and <4 x i32> %arg2, %arg1 ; <<4 x i32>> [#uses=1] - %B = xor <4 x i32> %A, < i32 -1, i32 -1, i32 -1, i32 -1 > - ret <4 x i32> %B -} - -define <4 x i32> @nand_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = and <4 x i32> %arg1, %arg2 ; <<4 x i32>> [#uses=1] - %B = xor <4 x i32> %A, < i32 -1, i32 -1, i32 -1, i32 -1 > - ret <4 x i32> %B -} - -define <8 x i16> @nand_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = and <8 x i16> %arg2, %arg1 ; <<8 x i16>> [#uses=1] - %B = xor <8 x i16> %A, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - ret <8 x i16> %B -} - -define <8 x i16> @nand_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = and <8 x i16> %arg1, %arg2 ; <<8 x i16>> [#uses=1] - %B = xor <8 x i16> %A, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - ret <8 x i16> %B -} - -define <16 x i8> @nand_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = and <16 x i8> %arg2, %arg1 ; <<16 x i8>> [#uses=1] - %B = xor <16 x i8> %A, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - ret <16 x i8> %B -} - -define <16 x i8> @nand_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = and <16 x i8> %arg1, %arg2 ; <<16 x i8>> [#uses=1] - %B = xor <16 x i8> %A, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - ret <16 x i8> %B -} - -define i32 @nand_i32_1(i32 %arg1, i32 %arg2) { - %A = and i32 %arg2, %arg1 ; <i32> [#uses=1] - %B = xor i32 %A, -1 ; <i32> [#uses=1] - ret i32 %B -} - -define i32 @nand_i32_2(i32 %arg1, i32 %arg2) { - %A = and i32 %arg1, %arg2 ; <i32> [#uses=1] - %B = xor i32 %A, -1 ; <i32> [#uses=1] - ret i32 %B -} - -define signext i16 @nand_i16_1(i16 signext %arg1, i16 signext %arg2) { - %A = and i16 %arg2, %arg1 ; <i16> [#uses=1] - %B = xor i16 %A, -1 ; <i16> [#uses=1] - ret i16 %B -} - -define signext i16 @nand_i16_2(i16 signext %arg1, i16 signext %arg2) { - %A = and i16 %arg1, %arg2 ; <i16> [#uses=1] - %B = xor i16 %A, -1 ; <i16> [#uses=1] - ret i16 %B -} - -define zeroext i16 @nand_i16u_1(i16 zeroext %arg1, i16 zeroext %arg2) { - %A = and i16 %arg2, %arg1 ; <i16> [#uses=1] - %B = xor i16 %A, -1 ; <i16> [#uses=1] - ret i16 %B -} - -define zeroext i16 @nand_i16u_2(i16 zeroext %arg1, i16 zeroext %arg2) { - %A = and i16 %arg1, %arg2 ; <i16> [#uses=1] - %B = xor i16 %A, -1 ; <i16> [#uses=1] - ret i16 %B -} - -define zeroext i8 @nand_i8u_1(i8 zeroext %arg1, i8 zeroext %arg2) { - %A = and i8 %arg2, %arg1 ; <i8> [#uses=1] - %B = xor i8 %A, -1 ; <i8> [#uses=1] - ret i8 %B -} - -define zeroext i8 @nand_i8u_2(i8 zeroext %arg1, i8 zeroext %arg2) { - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %B = xor i8 %A, -1 ; <i8> [#uses=1] - ret i8 %B -} - -define signext i8 @nand_i8_1(i8 signext %arg1, i8 signext %arg2) { - %A = and i8 %arg2, %arg1 ; <i8> [#uses=1] - %B = xor i8 %A, -1 ; <i8> [#uses=1] - ret i8 %B -} - -define signext i8 @nand_i8_2(i8 signext %arg1, i8 signext %arg2) { - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %B = xor i8 %A, -1 ; <i8> [#uses=1] - ret i8 %B -} - -define i8 @nand_i8_3(i8 %arg1, i8 %arg2) { - %A = and i8 %arg2, %arg1 ; <i8> [#uses=1] - %B = xor i8 %A, -1 ; <i8> [#uses=1] - ret i8 %B -} - -define i8 @nand_i8_4(i8 %arg1, i8 %arg2) { - %A = and i8 %arg1, %arg2 ; <i8> [#uses=1] - %B = xor i8 %A, -1 ; <i8> [#uses=1] - ret i8 %B -} diff --git a/test/CodeGen/CellSPU/or_ops.ll b/test/CodeGen/CellSPU/or_ops.ll deleted file mode 100644 index f329266a3c23..000000000000 --- a/test/CodeGen/CellSPU/or_ops.ll +++ /dev/null @@ -1,278 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep and %t1.s | count 2 -; RUN: grep orc %t1.s | count 85 -; RUN: grep ori %t1.s | count 34 -; RUN: grep orhi %t1.s | count 30 -; RUN: grep orbi %t1.s | count 15 -; RUN: FileCheck %s < %t1.s - -; CellSPU legalization is over-sensitive to Legalize's traversal order. -; XFAIL: * - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; OR instruction generation: -define <4 x i32> @or_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = or <4 x i32> %arg1, %arg2 - ret <4 x i32> %A -} - -define <4 x i32> @or_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = or <4 x i32> %arg2, %arg1 - ret <4 x i32> %A -} - -define <8 x i16> @or_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = or <8 x i16> %arg1, %arg2 - ret <8 x i16> %A -} - -define <8 x i16> @or_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = or <8 x i16> %arg2, %arg1 - ret <8 x i16> %A -} - -define <16 x i8> @or_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = or <16 x i8> %arg2, %arg1 - ret <16 x i8> %A -} - -define <16 x i8> @or_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = or <16 x i8> %arg1, %arg2 - ret <16 x i8> %A -} - -define i32 @or_i32_1(i32 %arg1, i32 %arg2) { - %A = or i32 %arg2, %arg1 - ret i32 %A -} - -define i32 @or_i32_2(i32 %arg1, i32 %arg2) { - %A = or i32 %arg1, %arg2 - ret i32 %A -} - -define i16 @or_i16_1(i16 %arg1, i16 %arg2) { - %A = or i16 %arg2, %arg1 - ret i16 %A -} - -define i16 @or_i16_2(i16 %arg1, i16 %arg2) { - %A = or i16 %arg1, %arg2 - ret i16 %A -} - -define i8 @or_i8_1(i8 %arg1, i8 %arg2) { - %A = or i8 %arg2, %arg1 - ret i8 %A -} - -define i8 @or_i8_2(i8 %arg1, i8 %arg2) { - %A = or i8 %arg1, %arg2 - ret i8 %A -} - -; ORC instruction generation: -define <4 x i32> @orc_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = xor <4 x i32> %arg2, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = or <4 x i32> %arg1, %A - ret <4 x i32> %B -} - -define <4 x i32> @orc_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = or <4 x i32> %arg2, %A - ret <4 x i32> %B -} - -define <4 x i32> @orc_v4i32_3(<4 x i32> %arg1, <4 x i32> %arg2) { - %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = or <4 x i32> %A, %arg2 - ret <4 x i32> %B -} - -define <8 x i16> @orc_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = xor <8 x i16> %arg2, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = or <8 x i16> %arg1, %A - ret <8 x i16> %B -} - -define <8 x i16> @orc_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { - %A = xor <8 x i16> %arg1, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = or <8 x i16> %arg2, %A - ret <8 x i16> %B -} - -define <16 x i8> @orc_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = xor <16 x i8> %arg1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = or <16 x i8> %arg2, %A - ret <16 x i8> %B -} - -define <16 x i8> @orc_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = or <16 x i8> %arg1, %A - ret <16 x i8> %B -} - -define <16 x i8> @orc_v16i8_3(<16 x i8> %arg1, <16 x i8> %arg2) { - %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = or <16 x i8> %A, %arg1 - ret <16 x i8> %B -} - -define i32 @orc_i32_1(i32 %arg1, i32 %arg2) { - %A = xor i32 %arg2, -1 - %B = or i32 %A, %arg1 - ret i32 %B -} - -define i32 @orc_i32_2(i32 %arg1, i32 %arg2) { - %A = xor i32 %arg1, -1 - %B = or i32 %A, %arg2 - ret i32 %B -} - -define i32 @orc_i32_3(i32 %arg1, i32 %arg2) { - %A = xor i32 %arg2, -1 - %B = or i32 %arg1, %A - ret i32 %B -} - -define i16 @orc_i16_1(i16 %arg1, i16 %arg2) { - %A = xor i16 %arg2, -1 - %B = or i16 %A, %arg1 - ret i16 %B -} - -define i16 @orc_i16_2(i16 %arg1, i16 %arg2) { - %A = xor i16 %arg1, -1 - %B = or i16 %A, %arg2 - ret i16 %B -} - -define i16 @orc_i16_3(i16 %arg1, i16 %arg2) { - %A = xor i16 %arg2, -1 - %B = or i16 %arg1, %A - ret i16 %B -} - -define i8 @orc_i8_1(i8 %arg1, i8 %arg2) { - %A = xor i8 %arg2, -1 - %B = or i8 %A, %arg1 - ret i8 %B -} - -define i8 @orc_i8_2(i8 %arg1, i8 %arg2) { - %A = xor i8 %arg1, -1 - %B = or i8 %A, %arg2 - ret i8 %B -} - -define i8 @orc_i8_3(i8 %arg1, i8 %arg2) { - %A = xor i8 %arg2, -1 - %B = or i8 %arg1, %A - ret i8 %B -} - -; ORI instruction generation (i32 data type): -define <4 x i32> @ori_v4i32_1(<4 x i32> %in) { - %tmp2 = or <4 x i32> %in, < i32 511, i32 511, i32 511, i32 511 > - ret <4 x i32> %tmp2 -} - -define <4 x i32> @ori_v4i32_2(<4 x i32> %in) { - %tmp2 = or <4 x i32> %in, < i32 510, i32 510, i32 510, i32 510 > - ret <4 x i32> %tmp2 -} - -define <4 x i32> @ori_v4i32_3(<4 x i32> %in) { - %tmp2 = or <4 x i32> %in, < i32 -1, i32 -1, i32 -1, i32 -1 > - ret <4 x i32> %tmp2 -} - -define <4 x i32> @ori_v4i32_4(<4 x i32> %in) { - %tmp2 = or <4 x i32> %in, < i32 -512, i32 -512, i32 -512, i32 -512 > - ret <4 x i32> %tmp2 -} - -define zeroext i32 @ori_u32(i32 zeroext %in) { - %tmp37 = or i32 %in, 37 ; <i32> [#uses=1] - ret i32 %tmp37 -} - -define signext i32 @ori_i32(i32 signext %in) { - %tmp38 = or i32 %in, 37 ; <i32> [#uses=1] - ret i32 %tmp38 -} - -define i32 @ori_i32_600(i32 %in) { - ;600 does not fit into 'ori' immediate field - ;CHECK: ori_i32_600 - ;CHECK: il - ;CHECK: ori - %tmp = or i32 %in, 600 - ret i32 %tmp -} - -; ORHI instruction generation (i16 data type): -define <8 x i16> @orhi_v8i16_1(<8 x i16> %in) { - %tmp2 = or <8 x i16> %in, < i16 511, i16 511, i16 511, i16 511, - i16 511, i16 511, i16 511, i16 511 > - ret <8 x i16> %tmp2 -} - -define <8 x i16> @orhi_v8i16_2(<8 x i16> %in) { - %tmp2 = or <8 x i16> %in, < i16 510, i16 510, i16 510, i16 510, - i16 510, i16 510, i16 510, i16 510 > - ret <8 x i16> %tmp2 -} - -define <8 x i16> @orhi_v8i16_3(<8 x i16> %in) { - %tmp2 = or <8 x i16> %in, < i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1 > - ret <8 x i16> %tmp2 -} - -define <8 x i16> @orhi_v8i16_4(<8 x i16> %in) { - %tmp2 = or <8 x i16> %in, < i16 -512, i16 -512, i16 -512, i16 -512, - i16 -512, i16 -512, i16 -512, i16 -512 > - ret <8 x i16> %tmp2 -} - -define zeroext i16 @orhi_u16(i16 zeroext %in) { - %tmp37 = or i16 %in, 37 ; <i16> [#uses=1] - ret i16 %tmp37 -} - -define signext i16 @orhi_i16(i16 signext %in) { - %tmp38 = or i16 %in, 37 ; <i16> [#uses=1] - ret i16 %tmp38 -} - -; ORBI instruction generation (i8 data type): -define <16 x i8> @orbi_v16i8(<16 x i8> %in) { - %tmp2 = or <16 x i8> %in, < i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, - i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, - i8 42, i8 42, i8 42, i8 42 > - ret <16 x i8> %tmp2 -} - -define zeroext i8 @orbi_u8(i8 zeroext %in) { - %tmp37 = or i8 %in, 37 ; <i8> [#uses=1] - ret i8 %tmp37 -} - -define signext i8 @orbi_i8(i8 signext %in) { - %tmp38 = or i8 %in, 37 ; <i8> [#uses=1] - ret i8 %tmp38 -} diff --git a/test/CodeGen/CellSPU/private.ll b/test/CodeGen/CellSPU/private.ll deleted file mode 100644 index 1d933adac939..000000000000 --- a/test/CodeGen/CellSPU/private.ll +++ /dev/null @@ -1,19 +0,0 @@ -; Test to make sure that the 'private' is used correctly. -; -; RUN: llc < %s -march=cellspu > %t -; RUN: grep .Lfoo: %t -; RUN: grep brsl.*\.Lfoo %t -; RUN: grep .Lbaz: %t -; RUN: grep ila.*\.Lbaz %t - -define private void @foo() { - ret void -} - -@baz = private global i32 4 - -define i32 @bar() { - call void @foo() - %1 = load i32* @baz, align 4 - ret i32 %1 -} diff --git a/test/CodeGen/CellSPU/rotate_ops.ll b/test/CodeGen/CellSPU/rotate_ops.ll deleted file mode 100644 index 977093527609..000000000000 --- a/test/CodeGen/CellSPU/rotate_ops.ll +++ /dev/null @@ -1,172 +0,0 @@ -; RUN: llc < %s -march=cellspu -o %t1.s -; RUN: grep rot %t1.s | count 86 -; RUN: grep roth %t1.s | count 8 -; RUN: grep roti.*5 %t1.s | count 1 -; RUN: grep roti.*27 %t1.s | count 1 -; RUN: grep rothi.*5 %t1.s | count 2 -; RUN: grep rothi.*11 %t1.s | count 1 -; RUN: grep rothi.*,.3 %t1.s | count 1 -; RUN: grep andhi %t1.s | count 4 -; RUN: grep shlhi %t1.s | count 4 -; RUN: cat %t1.s | FileCheck %s - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; Vector rotates are not currently supported in gcc or llvm assembly. These are -; not tested. - -; 32-bit rotates: -define i32 @rotl32_1a(i32 %arg1, i8 %arg2) { - %tmp1 = zext i8 %arg2 to i32 ; <i32> [#uses=1] - %B = shl i32 %arg1, %tmp1 ; <i32> [#uses=1] - %arg22 = sub i8 32, %arg2 ; <i8> [#uses=1] - %tmp2 = zext i8 %arg22 to i32 ; <i32> [#uses=1] - %C = lshr i32 %arg1, %tmp2 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -define i32 @rotl32_1b(i32 %arg1, i16 %arg2) { - %tmp1 = zext i16 %arg2 to i32 ; <i32> [#uses=1] - %B = shl i32 %arg1, %tmp1 ; <i32> [#uses=1] - %arg22 = sub i16 32, %arg2 ; <i8> [#uses=1] - %tmp2 = zext i16 %arg22 to i32 ; <i32> [#uses=1] - %C = lshr i32 %arg1, %tmp2 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -define i32 @rotl32_2(i32 %arg1, i32 %arg2) { - %B = shl i32 %arg1, %arg2 ; <i32> [#uses=1] - %tmp1 = sub i32 32, %arg2 ; <i32> [#uses=1] - %C = lshr i32 %arg1, %tmp1 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -define i32 @rotl32_3(i32 %arg1, i32 %arg2) { - %tmp1 = sub i32 32, %arg2 ; <i32> [#uses=1] - %B = shl i32 %arg1, %arg2 ; <i32> [#uses=1] - %C = lshr i32 %arg1, %tmp1 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -define i32 @rotl32_4(i32 %arg1, i32 %arg2) { - %tmp1 = sub i32 32, %arg2 ; <i32> [#uses=1] - %C = lshr i32 %arg1, %tmp1 ; <i32> [#uses=1] - %B = shl i32 %arg1, %arg2 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -define i32 @rotr32_1(i32 %A, i8 %Amt) { - %tmp1 = zext i8 %Amt to i32 ; <i32> [#uses=1] - %B = lshr i32 %A, %tmp1 ; <i32> [#uses=1] - %Amt2 = sub i8 32, %Amt ; <i8> [#uses=1] - %tmp2 = zext i8 %Amt2 to i32 ; <i32> [#uses=1] - %C = shl i32 %A, %tmp2 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -define i32 @rotr32_2(i32 %A, i8 %Amt) { - %Amt2 = sub i8 32, %Amt ; <i8> [#uses=1] - %tmp1 = zext i8 %Amt to i32 ; <i32> [#uses=1] - %B = lshr i32 %A, %tmp1 ; <i32> [#uses=1] - %tmp2 = zext i8 %Amt2 to i32 ; <i32> [#uses=1] - %C = shl i32 %A, %tmp2 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -; Rotate left with immediate -define i32 @rotli32(i32 %A) { - %B = shl i32 %A, 5 ; <i32> [#uses=1] - %C = lshr i32 %A, 27 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -; Rotate right with immediate -define i32 @rotri32(i32 %A) { - %B = lshr i32 %A, 5 ; <i32> [#uses=1] - %C = shl i32 %A, 27 ; <i32> [#uses=1] - %D = or i32 %B, %C ; <i32> [#uses=1] - ret i32 %D -} - -; 16-bit rotates: -define i16 @rotr16_1(i16 %arg1, i8 %arg) { - %tmp1 = zext i8 %arg to i16 ; <i16> [#uses=1] - %B = lshr i16 %arg1, %tmp1 ; <i16> [#uses=1] - %arg2 = sub i8 16, %arg ; <i8> [#uses=1] - %tmp2 = zext i8 %arg2 to i16 ; <i16> [#uses=1] - %C = shl i16 %arg1, %tmp2 ; <i16> [#uses=1] - %D = or i16 %B, %C ; <i16> [#uses=1] - ret i16 %D -} - -define i16 @rotr16_2(i16 %arg1, i16 %arg) { - %B = lshr i16 %arg1, %arg ; <i16> [#uses=1] - %tmp1 = sub i16 16, %arg ; <i16> [#uses=1] - %C = shl i16 %arg1, %tmp1 ; <i16> [#uses=1] - %D = or i16 %B, %C ; <i16> [#uses=1] - ret i16 %D -} - -define i16 @rotli16(i16 %A) { - %B = shl i16 %A, 5 ; <i16> [#uses=1] - %C = lshr i16 %A, 11 ; <i16> [#uses=1] - %D = or i16 %B, %C ; <i16> [#uses=1] - ret i16 %D -} - -define i16 @rotri16(i16 %A) { - %B = lshr i16 %A, 5 ; <i16> [#uses=1] - %C = shl i16 %A, 11 ; <i16> [#uses=1] - %D = or i16 %B, %C ; <i16> [#uses=1] - ret i16 %D -} - -define i8 @rotl8(i8 %A, i8 %Amt) { - %B = shl i8 %A, %Amt ; <i8> [#uses=1] - %Amt2 = sub i8 8, %Amt ; <i8> [#uses=1] - %C = lshr i8 %A, %Amt2 ; <i8> [#uses=1] - %D = or i8 %B, %C ; <i8> [#uses=1] - ret i8 %D -} - -define i8 @rotr8(i8 %A, i8 %Amt) { - %B = lshr i8 %A, %Amt ; <i8> [#uses=1] - %Amt2 = sub i8 8, %Amt ; <i8> [#uses=1] - %C = shl i8 %A, %Amt2 ; <i8> [#uses=1] - %D = or i8 %B, %C ; <i8> [#uses=1] - ret i8 %D -} - -define i8 @rotli8(i8 %A) { - %B = shl i8 %A, 5 ; <i8> [#uses=1] - %C = lshr i8 %A, 3 ; <i8> [#uses=1] - %D = or i8 %B, %C ; <i8> [#uses=1] - ret i8 %D -} - -define i8 @rotri8(i8 %A) { - %B = lshr i8 %A, 5 ; <i8> [#uses=1] - %C = shl i8 %A, 3 ; <i8> [#uses=1] - %D = or i8 %B, %C ; <i8> [#uses=1] - ret i8 %D -} - -define <2 x float> @test1(<4 x float> %param ) -{ -; CHECK: test1 -; CHECK: shufb - %el = extractelement <4 x float> %param, i32 1 - %vec1 = insertelement <1 x float> undef, float %el, i32 0 - %rv = shufflevector <1 x float> %vec1, <1 x float> undef, <2 x i32><i32 0,i32 0> -; CHECK: bi $lr - ret <2 x float> %rv -} diff --git a/test/CodeGen/CellSPU/select_bits.ll b/test/CodeGen/CellSPU/select_bits.ll deleted file mode 100644 index 65e0aa6fa0b0..000000000000 --- a/test/CodeGen/CellSPU/select_bits.ll +++ /dev/null @@ -1,572 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep selb %t1.s | count 56 - -; CellSPU legalization is over-sensitive to Legalize's traversal order. -; XFAIL: * - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ -; v2i64 -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ - -; (or (and rC, rB), (and (not rC), rA)) -define <2 x i64> @selectbits_v2i64_01(<2 x i64> %rA, <2 x i64> %rB, <2 x i64> %rC) { - %C = and <2 x i64> %rC, %rB - %A = xor <2 x i64> %rC, < i64 -1, i64 -1 > - %B = and <2 x i64> %A, %rA - %D = or <2 x i64> %C, %B - ret <2 x i64> %D -} - -; (or (and rB, rC), (and (not rC), rA)) -define <2 x i64> @selectbits_v2i64_02(<2 x i64> %rA, <2 x i64> %rB, <2 x i64> %rC) { - %C = and <2 x i64> %rB, %rC - %A = xor <2 x i64> %rC, < i64 -1, i64 -1 > - %B = and <2 x i64> %A, %rA - %D = or <2 x i64> %C, %B - ret <2 x i64> %D -} - -; (or (and (not rC), rA), (and rB, rC)) -define <2 x i64> @selectbits_v2i64_03(<2 x i64> %rA, <2 x i64> %rB, <2 x i64> %rC) { - %A = xor <2 x i64> %rC, < i64 -1, i64 -1 > - %B = and <2 x i64> %A, %rA - %C = and <2 x i64> %rB, %rC - %D = or <2 x i64> %C, %B - ret <2 x i64> %D -} - -; (or (and (not rC), rA), (and rC, rB)) -define <2 x i64> @selectbits_v2i64_04(<2 x i64> %rA, <2 x i64> %rB, <2 x i64> %rC) { - %A = xor <2 x i64> %rC, < i64 -1, i64 -1 > - %B = and <2 x i64> %A, %rA - %C = and <2 x i64> %rC, %rB - %D = or <2 x i64> %C, %B - ret <2 x i64> %D -} - -; (or (and rC, rB), (and rA, (not rC))) -define <2 x i64> @selectbits_v2i64_05(<2 x i64> %rA, <2 x i64> %rB, <2 x i64> %rC) { - %C = and <2 x i64> %rC, %rB - %A = xor <2 x i64> %rC, < i64 -1, i64 -1 > - %B = and <2 x i64> %rA, %A - %D = or <2 x i64> %C, %B - ret <2 x i64> %D -} - -; (or (and rB, rC), (and rA, (not rC))) -define <2 x i64> @selectbits_v2i64_06(<2 x i64> %rA, <2 x i64> %rB, <2 x i64> %rC) { - %C = and <2 x i64> %rB, %rC - %A = xor <2 x i64> %rC, < i64 -1, i64 -1 > - %B = and <2 x i64> %rA, %A - %D = or <2 x i64> %C, %B - ret <2 x i64> %D -} - -; (or (and rA, (not rC)), (and rB, rC)) -define <2 x i64> @selectbits_v2i64_07(<2 x i64> %rA, <2 x i64> %rB, <2 x i64> %rC) { - %A = xor <2 x i64> %rC, < i64 -1, i64 -1 > - %B = and <2 x i64> %rA, %A - %C = and <2 x i64> %rB, %rC - %D = or <2 x i64> %C, %B - ret <2 x i64> %D -} - -; (or (and rA, (not rC)), (and rC, rB)) -define <2 x i64> @selectbits_v2i64_08(<2 x i64> %rA, <2 x i64> %rB, <2 x i64> %rC) { - %A = xor <2 x i64> %rC, < i64 -1, i64 -1 > - %B = and <2 x i64> %rA, %A - %C = and <2 x i64> %rC, %rB - %D = or <2 x i64> %C, %B - ret <2 x i64> %D -} - -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ -; v4i32 -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ - -; (or (and rC, rB), (and (not rC), rA)) -define <4 x i32> @selectbits_v4i32_01(<4 x i32> %rA, <4 x i32> %rB, <4 x i32> %rC) { - %C = and <4 x i32> %rC, %rB - %A = xor <4 x i32> %rC, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = and <4 x i32> %A, %rA - %D = or <4 x i32> %C, %B - ret <4 x i32> %D -} - -; (or (and rB, rC), (and (not rC), rA)) -define <4 x i32> @selectbits_v4i32_02(<4 x i32> %rA, <4 x i32> %rB, <4 x i32> %rC) { - %C = and <4 x i32> %rB, %rC - %A = xor <4 x i32> %rC, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = and <4 x i32> %A, %rA - %D = or <4 x i32> %C, %B - ret <4 x i32> %D -} - -; (or (and (not rC), rA), (and rB, rC)) -define <4 x i32> @selectbits_v4i32_03(<4 x i32> %rA, <4 x i32> %rB, <4 x i32> %rC) { - %A = xor <4 x i32> %rC, < i32 -1, i32 -1, i32 -1, i32 -1 > - %B = and <4 x i32> %A, %rA - %C = and <4 x i32> %rB, %rC - %D = or <4 x i32> %C, %B - ret <4 x i32> %D -} - -; (or (and (not rC), rA), (and rC, rB)) -define <4 x i32> @selectbits_v4i32_04(<4 x i32> %rA, <4 x i32> %rB, <4 x i32> %rC) { - %A = xor <4 x i32> %rC, < i32 -1, i32 -1, i32 -1, i32 -1> - %B = and <4 x i32> %A, %rA - %C = and <4 x i32> %rC, %rB - %D = or <4 x i32> %C, %B - ret <4 x i32> %D -} - -; (or (and rC, rB), (and rA, (not rC))) -define <4 x i32> @selectbits_v4i32_05(<4 x i32> %rA, <4 x i32> %rB, <4 x i32> %rC) { - %C = and <4 x i32> %rC, %rB - %A = xor <4 x i32> %rC, < i32 -1, i32 -1, i32 -1, i32 -1> - %B = and <4 x i32> %rA, %A - %D = or <4 x i32> %C, %B - ret <4 x i32> %D -} - -; (or (and rB, rC), (and rA, (not rC))) -define <4 x i32> @selectbits_v4i32_06(<4 x i32> %rA, <4 x i32> %rB, <4 x i32> %rC) { - %C = and <4 x i32> %rB, %rC - %A = xor <4 x i32> %rC, < i32 -1, i32 -1, i32 -1, i32 -1> - %B = and <4 x i32> %rA, %A - %D = or <4 x i32> %C, %B - ret <4 x i32> %D -} - -; (or (and rA, (not rC)), (and rB, rC)) -define <4 x i32> @selectbits_v4i32_07(<4 x i32> %rA, <4 x i32> %rB, <4 x i32> %rC) { - %A = xor <4 x i32> %rC, < i32 -1, i32 -1, i32 -1, i32 -1> - %B = and <4 x i32> %rA, %A - %C = and <4 x i32> %rB, %rC - %D = or <4 x i32> %C, %B - ret <4 x i32> %D -} - -; (or (and rA, (not rC)), (and rC, rB)) -define <4 x i32> @selectbits_v4i32_08(<4 x i32> %rA, <4 x i32> %rB, <4 x i32> %rC) { - %A = xor <4 x i32> %rC, < i32 -1, i32 -1, i32 -1, i32 -1> - %B = and <4 x i32> %rA, %A - %C = and <4 x i32> %rC, %rB - %D = or <4 x i32> %C, %B - ret <4 x i32> %D -} - -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ -; v8i16 -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ - -; (or (and rC, rB), (and (not rC), rA)) -define <8 x i16> @selectbits_v8i16_01(<8 x i16> %rA, <8 x i16> %rB, <8 x i16> %rC) { - %C = and <8 x i16> %rC, %rB - %A = xor <8 x i16> %rC, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %A, %rA - %D = or <8 x i16> %C, %B - ret <8 x i16> %D -} - -; (or (and rB, rC), (and (not rC), rA)) -define <8 x i16> @selectbits_v8i16_02(<8 x i16> %rA, <8 x i16> %rB, <8 x i16> %rC) { - %C = and <8 x i16> %rB, %rC - %A = xor <8 x i16> %rC, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %A, %rA - %D = or <8 x i16> %C, %B - ret <8 x i16> %D -} - -; (or (and (not rC), rA), (and rB, rC)) -define <8 x i16> @selectbits_v8i16_03(<8 x i16> %rA, <8 x i16> %rB, <8 x i16> %rC) { - %A = xor <8 x i16> %rC, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %A, %rA - %C = and <8 x i16> %rB, %rC - %D = or <8 x i16> %C, %B - ret <8 x i16> %D -} - -; (or (and (not rC), rA), (and rC, rB)) -define <8 x i16> @selectbits_v8i16_04(<8 x i16> %rA, <8 x i16> %rB, <8 x i16> %rC) { - %A = xor <8 x i16> %rC, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %A, %rA - %C = and <8 x i16> %rC, %rB - %D = or <8 x i16> %C, %B - ret <8 x i16> %D -} - -; (or (and rC, rB), (and rA, (not rC))) -define <8 x i16> @selectbits_v8i16_05(<8 x i16> %rA, <8 x i16> %rB, <8 x i16> %rC) { - %C = and <8 x i16> %rC, %rB - %A = xor <8 x i16> %rC, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %rA, %A - %D = or <8 x i16> %C, %B - ret <8 x i16> %D -} - -; (or (and rB, rC), (and rA, (not rC))) -define <8 x i16> @selectbits_v8i16_06(<8 x i16> %rA, <8 x i16> %rB, <8 x i16> %rC) { - %C = and <8 x i16> %rB, %rC - %A = xor <8 x i16> %rC, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %rA, %A - %D = or <8 x i16> %C, %B - ret <8 x i16> %D -} - -; (or (and rA, (not rC)), (and rB, rC)) -define <8 x i16> @selectbits_v8i16_07(<8 x i16> %rA, <8 x i16> %rB, <8 x i16> %rC) { - %A = xor <8 x i16> %rC, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %rA, %A - %C = and <8 x i16> %rB, %rC - %D = or <8 x i16> %C, %B - ret <8 x i16> %D -} - -; (or (and rA, (not rC)), (and rC, rB)) -define <8 x i16> @selectbits_v8i16_08(<8 x i16> %rA, <8 x i16> %rB, <8 x i16> %rC) { - %A = xor <8 x i16> %rC, < i16 -1, i16 -1, i16 -1, i16 -1, - i16 -1, i16 -1, i16 -1, i16 -1 > - %B = and <8 x i16> %rA, %A - %C = and <8 x i16> %rC, %rB - %D = or <8 x i16> %C, %B - ret <8 x i16> %D -} - -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ -; v16i8 -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ - -; (or (and rC, rB), (and (not rC), rA)) -define <16 x i8> @selectbits_v16i8_01(<16 x i8> %rA, <16 x i8> %rB, <16 x i8> %rC) { - %C = and <16 x i8> %rC, %rB - %A = xor <16 x i8> %rC, < i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %A, %rA - %D = or <16 x i8> %C, %B - ret <16 x i8> %D -} - -; (or (and rB, rC), (and (not rC), rA)) -define <16 x i8> @selectbits_v16i8_02(<16 x i8> %rA, <16 x i8> %rB, <16 x i8> %rC) { - %C = and <16 x i8> %rB, %rC - %A = xor <16 x i8> %rC, < i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %A, %rA - %D = or <16 x i8> %C, %B - ret <16 x i8> %D -} - -; (or (and (not rC), rA), (and rB, rC)) -define <16 x i8> @selectbits_v16i8_03(<16 x i8> %rA, <16 x i8> %rB, <16 x i8> %rC) { - %A = xor <16 x i8> %rC, < i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %A, %rA - %C = and <16 x i8> %rB, %rC - %D = or <16 x i8> %C, %B - ret <16 x i8> %D -} - -; (or (and (not rC), rA), (and rC, rB)) -define <16 x i8> @selectbits_v16i8_04(<16 x i8> %rA, <16 x i8> %rB, <16 x i8> %rC) { - %A = xor <16 x i8> %rC, < i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %A, %rA - %C = and <16 x i8> %rC, %rB - %D = or <16 x i8> %C, %B - ret <16 x i8> %D -} - -; (or (and rC, rB), (and rA, (not rC))) -define <16 x i8> @selectbits_v16i8_05(<16 x i8> %rA, <16 x i8> %rB, <16 x i8> %rC) { - %C = and <16 x i8> %rC, %rB - %A = xor <16 x i8> %rC, < i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %rA, %A - %D = or <16 x i8> %C, %B - ret <16 x i8> %D -} - -; (or (and rB, rC), (and rA, (not rC))) -define <16 x i8> @selectbits_v16i8_06(<16 x i8> %rA, <16 x i8> %rB, <16 x i8> %rC) { - %C = and <16 x i8> %rB, %rC - %A = xor <16 x i8> %rC, < i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %rA, %A - %D = or <16 x i8> %C, %B - ret <16 x i8> %D -} - -; (or (and rA, (not rC)), (and rB, rC)) -define <16 x i8> @selectbits_v16i8_07(<16 x i8> %rA, <16 x i8> %rB, <16 x i8> %rC) { - %A = xor <16 x i8> %rC, < i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %rA, %A - %C = and <16 x i8> %rB, %rC - %D = or <16 x i8> %C, %B - ret <16 x i8> %D -} - -; (or (and rA, (not rC)), (and rC, rB)) -define <16 x i8> @selectbits_v16i8_08(<16 x i8> %rA, <16 x i8> %rB, <16 x i8> %rC) { - %A = xor <16 x i8> %rC, < i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1, - i8 -1, i8 -1, i8 -1, i8 -1 > - %B = and <16 x i8> %rA, %A - %C = and <16 x i8> %rC, %rB - %D = or <16 x i8> %C, %B - ret <16 x i8> %D -} - -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ -; i32 -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ - -; (or (and rC, rB), (and (not rC), rA)) -define i32 @selectbits_i32_01(i32 %rA, i32 %rB, i32 %rC) { - %C = and i32 %rC, %rB - %A = xor i32 %rC, -1 - %B = and i32 %A, %rA - %D = or i32 %C, %B - ret i32 %D -} - -; (or (and rB, rC), (and (not rC), rA)) -define i32 @selectbits_i32_02(i32 %rA, i32 %rB, i32 %rC) { - %C = and i32 %rB, %rC - %A = xor i32 %rC, -1 - %B = and i32 %A, %rA - %D = or i32 %C, %B - ret i32 %D -} - -; (or (and (not rC), rA), (and rB, rC)) -define i32 @selectbits_i32_03(i32 %rA, i32 %rB, i32 %rC) { - %A = xor i32 %rC, -1 - %B = and i32 %A, %rA - %C = and i32 %rB, %rC - %D = or i32 %C, %B - ret i32 %D -} - -; (or (and (not rC), rA), (and rC, rB)) -define i32 @selectbits_i32_04(i32 %rA, i32 %rB, i32 %rC) { - %A = xor i32 %rC, -1 - %B = and i32 %A, %rA - %C = and i32 %rC, %rB - %D = or i32 %C, %B - ret i32 %D -} - -; (or (and rC, rB), (and rA, (not rC))) -define i32 @selectbits_i32_05(i32 %rA, i32 %rB, i32 %rC) { - %C = and i32 %rC, %rB - %A = xor i32 %rC, -1 - %B = and i32 %rA, %A - %D = or i32 %C, %B - ret i32 %D -} - -; (or (and rB, rC), (and rA, (not rC))) -define i32 @selectbits_i32_06(i32 %rA, i32 %rB, i32 %rC) { - %C = and i32 %rB, %rC - %A = xor i32 %rC, -1 - %B = and i32 %rA, %A - %D = or i32 %C, %B - ret i32 %D -} - -; (or (and rA, (not rC)), (and rB, rC)) -define i32 @selectbits_i32_07(i32 %rA, i32 %rB, i32 %rC) { - %A = xor i32 %rC, -1 - %B = and i32 %rA, %A - %C = and i32 %rB, %rC - %D = or i32 %C, %B - ret i32 %D -} - -; (or (and rA, (not rC)), (and rC, rB)) -define i32 @selectbits_i32_08(i32 %rA, i32 %rB, i32 %rC) { - %A = xor i32 %rC, -1 - %B = and i32 %rA, %A - %C = and i32 %rC, %rB - %D = or i32 %C, %B - ret i32 %D -} - -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ -; i16 -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ - -; (or (and rC, rB), (and (not rC), rA)) -define i16 @selectbits_i16_01(i16 %rA, i16 %rB, i16 %rC) { - %C = and i16 %rC, %rB - %A = xor i16 %rC, -1 - %B = and i16 %A, %rA - %D = or i16 %C, %B - ret i16 %D -} - -; (or (and rB, rC), (and (not rC), rA)) -define i16 @selectbits_i16_02(i16 %rA, i16 %rB, i16 %rC) { - %C = and i16 %rB, %rC - %A = xor i16 %rC, -1 - %B = and i16 %A, %rA - %D = or i16 %C, %B - ret i16 %D -} - -; (or (and (not rC), rA), (and rB, rC)) -define i16 @selectbits_i16_03(i16 %rA, i16 %rB, i16 %rC) { - %A = xor i16 %rC, -1 - %B = and i16 %A, %rA - %C = and i16 %rB, %rC - %D = or i16 %C, %B - ret i16 %D -} - -; (or (and (not rC), rA), (and rC, rB)) -define i16 @selectbits_i16_04(i16 %rA, i16 %rB, i16 %rC) { - %A = xor i16 %rC, -1 - %B = and i16 %A, %rA - %C = and i16 %rC, %rB - %D = or i16 %C, %B - ret i16 %D -} - -; (or (and rC, rB), (and rA, (not rC))) -define i16 @selectbits_i16_05(i16 %rA, i16 %rB, i16 %rC) { - %C = and i16 %rC, %rB - %A = xor i16 %rC, -1 - %B = and i16 %rA, %A - %D = or i16 %C, %B - ret i16 %D -} - -; (or (and rB, rC), (and rA, (not rC))) -define i16 @selectbits_i16_06(i16 %rA, i16 %rB, i16 %rC) { - %C = and i16 %rB, %rC - %A = xor i16 %rC, -1 - %B = and i16 %rA, %A - %D = or i16 %C, %B - ret i16 %D -} - -; (or (and rA, (not rC)), (and rB, rC)) -define i16 @selectbits_i16_07(i16 %rA, i16 %rB, i16 %rC) { - %A = xor i16 %rC, -1 - %B = and i16 %rA, %A - %C = and i16 %rB, %rC - %D = or i16 %C, %B - ret i16 %D -} - -; (or (and rA, (not rC)), (and rC, rB)) -define i16 @selectbits_i16_08(i16 %rA, i16 %rB, i16 %rC) { - %A = xor i16 %rC, -1 - %B = and i16 %rA, %A - %C = and i16 %rC, %rB - %D = or i16 %C, %B - ret i16 %D -} - -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ -; i8 -;-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ - -; (or (and rC, rB), (and (not rC), rA)) -define i8 @selectbits_i8_01(i8 %rA, i8 %rB, i8 %rC) { - %C = and i8 %rC, %rB - %A = xor i8 %rC, -1 - %B = and i8 %A, %rA - %D = or i8 %C, %B - ret i8 %D -} - -; (or (and rB, rC), (and (not rC), rA)) -define i8 @selectbits_i8_02(i8 %rA, i8 %rB, i8 %rC) { - %C = and i8 %rB, %rC - %A = xor i8 %rC, -1 - %B = and i8 %A, %rA - %D = or i8 %C, %B - ret i8 %D -} - -; (or (and (not rC), rA), (and rB, rC)) -define i8 @selectbits_i8_03(i8 %rA, i8 %rB, i8 %rC) { - %A = xor i8 %rC, -1 - %B = and i8 %A, %rA - %C = and i8 %rB, %rC - %D = or i8 %C, %B - ret i8 %D -} - -; (or (and (not rC), rA), (and rC, rB)) -define i8 @selectbits_i8_04(i8 %rA, i8 %rB, i8 %rC) { - %A = xor i8 %rC, -1 - %B = and i8 %A, %rA - %C = and i8 %rC, %rB - %D = or i8 %C, %B - ret i8 %D -} - -; (or (and rC, rB), (and rA, (not rC))) -define i8 @selectbits_i8_05(i8 %rA, i8 %rB, i8 %rC) { - %C = and i8 %rC, %rB - %A = xor i8 %rC, -1 - %B = and i8 %rA, %A - %D = or i8 %C, %B - ret i8 %D -} - -; (or (and rB, rC), (and rA, (not rC))) -define i8 @selectbits_i8_06(i8 %rA, i8 %rB, i8 %rC) { - %C = and i8 %rB, %rC - %A = xor i8 %rC, -1 - %B = and i8 %rA, %A - %D = or i8 %C, %B - ret i8 %D -} - -; (or (and rA, (not rC)), (and rB, rC)) -define i8 @selectbits_i8_07(i8 %rA, i8 %rB, i8 %rC) { - %A = xor i8 %rC, -1 - %B = and i8 %rA, %A - %C = and i8 %rB, %rC - %D = or i8 %C, %B - ret i8 %D -} - -; (or (and rA, (not rC)), (and rC, rB)) -define i8 @selectbits_i8_08(i8 %rA, i8 %rB, i8 %rC) { - %A = xor i8 %rC, -1 - %B = and i8 %rA, %A - %C = and i8 %rC, %rB - %D = or i8 %C, %B - ret i8 %D -} diff --git a/test/CodeGen/CellSPU/sext128.ll b/test/CodeGen/CellSPU/sext128.ll deleted file mode 100644 index 6ae9aa51202f..000000000000 --- a/test/CodeGen/CellSPU/sext128.ll +++ /dev/null @@ -1,71 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -; ModuleID = 'sext128.bc' -target datalayout = "E-p:32:32:128-i1:8:128-i8:8:128-i16:16:128-i32:32:128-i64:32:128-f32:32:128-f64:64:128-v64:128:128-v128:128:128-a0:0:128-s0:128:128" -target triple = "spu" - -define i128 @sext_i64_i128(i64 %a) { -entry: - %0 = sext i64 %a to i128 - ret i128 %0 -; CHECK: long 269488144 -; CHECK: long 269488144 -; CHECK: long 66051 -; CHECK: long 67438087 -; CHECK-NOT: rotqmbyi -; CHECK: lqa -; CHECK: rotmai -; CHECK: shufb -} - -define i128 @sext_i32_i128(i32 %a) { -entry: - %0 = sext i32 %a to i128 - ret i128 %0 -; CHECK: long 269488144 -; CHECK: long 269488144 -; CHECK: long 269488144 -; CHECK: long 66051 -; CHECK-NOT: rotqmbyi -; CHECK: lqa -; CHECK: rotmai -; CHECK: shufb -} - -define i128 @sext_i32_i128a(float %a) { -entry: - %0 = call i32 @myfunc(float %a) - %1 = sext i32 %0 to i128 - ret i128 %1 -; CHECK: long 269488144 -; CHECK: long 269488144 -; CHECK: long 269488144 -; CHECK: long 66051 -; CHECK-NOT: rotqmbyi -; CHECK: lqa -; CHECK: rotmai -; CHECK: shufb -} - -declare i32 @myfunc(float) - -define i128 @func1(i8 %u) { -entry: -; CHECK: xsbh -; CHECK: xshw -; CHECK: rotmai -; CHECK: shufb -; CHECK: bi $lr - %0 = sext i8 %u to i128 - ret i128 %0 -} - -define i128 @func2(i16 %u) { -entry: -; CHECK: xshw -; CHECK: rotmai -; CHECK: shufb -; CHECK: bi $lr - %0 = sext i16 %u to i128 - ret i128 %0 -} diff --git a/test/CodeGen/CellSPU/shift_ops.ll b/test/CodeGen/CellSPU/shift_ops.ll deleted file mode 100644 index 1ccc356dcf5a..000000000000 --- a/test/CodeGen/CellSPU/shift_ops.ll +++ /dev/null @@ -1,348 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep "shlh " %t1.s | count 10 -; RUN: grep "shlhi " %t1.s | count 3 -; RUN: grep "shl " %t1.s | count 10 -; RUN: grep "shli " %t1.s | count 3 -; RUN: grep "xshw " %t1.s | count 5 -; RUN: grep "and " %t1.s | count 15 -; RUN: grep "andi " %t1.s | count 4 -; RUN: grep "rotmi " %t1.s | count 4 -; RUN: grep "rotqmbyi " %t1.s | count 1 -; RUN: grep "rotqmbii " %t1.s | count 2 -; RUN: grep "rotqmby " %t1.s | count 1 -; RUN: grep "rotqmbi " %t1.s | count 2 -; RUN: grep "rotqbyi " %t1.s | count 1 -; RUN: grep "rotqbii " %t1.s | count 2 -; RUN: grep "rotqbybi " %t1.s | count 1 -; RUN: grep "sfi " %t1.s | count 6 -; RUN: cat %t1.s | FileCheck %s - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; Shift left i16 via register, note that the second operand to shl is promoted -; to a 32-bit type: - -define i16 @shlh_i16_1(i16 %arg1, i16 %arg2) { - %A = shl i16 %arg1, %arg2 - ret i16 %A -} - -define i16 @shlh_i16_2(i16 %arg1, i16 %arg2) { - %A = shl i16 %arg2, %arg1 - ret i16 %A -} - -define signext i16 @shlh_i16_3(i16 signext %arg1, i16 signext %arg2) { - %A = shl i16 %arg1, %arg2 - ret i16 %A -} - -define signext i16 @shlh_i16_4(i16 signext %arg1, i16 signext %arg2) { - %A = shl i16 %arg2, %arg1 - ret i16 %A -} - -define zeroext i16 @shlh_i16_5(i16 zeroext %arg1, i16 zeroext %arg2) { - %A = shl i16 %arg1, %arg2 - ret i16 %A -} - -define zeroext i16 @shlh_i16_6(i16 zeroext %arg1, i16 zeroext %arg2) { - %A = shl i16 %arg2, %arg1 - ret i16 %A -} - -; Shift left i16 with immediate: -define i16 @shlhi_i16_1(i16 %arg1) { - %A = shl i16 %arg1, 12 - ret i16 %A -} - -; Should not generate anything other than the return, arg1 << 0 = arg1 -define i16 @shlhi_i16_2(i16 %arg1) { - %A = shl i16 %arg1, 0 - ret i16 %A -} - -define i16 @shlhi_i16_3(i16 %arg1) { - %A = shl i16 16383, %arg1 - ret i16 %A -} - -; Should generate 0, 0 << arg1 = 0 -define i16 @shlhi_i16_4(i16 %arg1) { - %A = shl i16 0, %arg1 - ret i16 %A -} - -define signext i16 @shlhi_i16_5(i16 signext %arg1) { - %A = shl i16 %arg1, 12 - ret i16 %A -} - -; Should not generate anything other than the return, arg1 << 0 = arg1 -define signext i16 @shlhi_i16_6(i16 signext %arg1) { - %A = shl i16 %arg1, 0 - ret i16 %A -} - -define signext i16 @shlhi_i16_7(i16 signext %arg1) { - %A = shl i16 16383, %arg1 - ret i16 %A -} - -; Should generate 0, 0 << arg1 = 0 -define signext i16 @shlhi_i16_8(i16 signext %arg1) { - %A = shl i16 0, %arg1 - ret i16 %A -} - -define zeroext i16 @shlhi_i16_9(i16 zeroext %arg1) { - %A = shl i16 %arg1, 12 - ret i16 %A -} - -; Should not generate anything other than the return, arg1 << 0 = arg1 -define zeroext i16 @shlhi_i16_10(i16 zeroext %arg1) { - %A = shl i16 %arg1, 0 - ret i16 %A -} - -define zeroext i16 @shlhi_i16_11(i16 zeroext %arg1) { - %A = shl i16 16383, %arg1 - ret i16 %A -} - -; Should generate 0, 0 << arg1 = 0 -define zeroext i16 @shlhi_i16_12(i16 zeroext %arg1) { - %A = shl i16 0, %arg1 - ret i16 %A -} - -; Shift left i32 via register, note that the second operand to shl is promoted -; to a 32-bit type: - -define i32 @shl_i32_1(i32 %arg1, i32 %arg2) { - %A = shl i32 %arg1, %arg2 - ret i32 %A -} - -define i32 @shl_i32_2(i32 %arg1, i32 %arg2) { - %A = shl i32 %arg2, %arg1 - ret i32 %A -} - -define signext i32 @shl_i32_3(i32 signext %arg1, i32 signext %arg2) { - %A = shl i32 %arg1, %arg2 - ret i32 %A -} - -define signext i32 @shl_i32_4(i32 signext %arg1, i32 signext %arg2) { - %A = shl i32 %arg2, %arg1 - ret i32 %A -} - -define zeroext i32 @shl_i32_5(i32 zeroext %arg1, i32 zeroext %arg2) { - %A = shl i32 %arg1, %arg2 - ret i32 %A -} - -define zeroext i32 @shl_i32_6(i32 zeroext %arg1, i32 zeroext %arg2) { - %A = shl i32 %arg2, %arg1 - ret i32 %A -} - -; Shift left i32 with immediate: -define i32 @shli_i32_1(i32 %arg1) { - %A = shl i32 %arg1, 12 - ret i32 %A -} - -; Should not generate anything other than the return, arg1 << 0 = arg1 -define i32 @shli_i32_2(i32 %arg1) { - %A = shl i32 %arg1, 0 - ret i32 %A -} - -define i32 @shli_i32_3(i32 %arg1) { - %A = shl i32 16383, %arg1 - ret i32 %A -} - -; Should generate 0, 0 << arg1 = 0 -define i32 @shli_i32_4(i32 %arg1) { - %A = shl i32 0, %arg1 - ret i32 %A -} - -define signext i32 @shli_i32_5(i32 signext %arg1) { - %A = shl i32 %arg1, 12 - ret i32 %A -} - -; Should not generate anything other than the return, arg1 << 0 = arg1 -define signext i32 @shli_i32_6(i32 signext %arg1) { - %A = shl i32 %arg1, 0 - ret i32 %A -} - -define signext i32 @shli_i32_7(i32 signext %arg1) { - %A = shl i32 16383, %arg1 - ret i32 %A -} - -; Should generate 0, 0 << arg1 = 0 -define signext i32 @shli_i32_8(i32 signext %arg1) { - %A = shl i32 0, %arg1 - ret i32 %A -} - -define zeroext i32 @shli_i32_9(i32 zeroext %arg1) { - %A = shl i32 %arg1, 12 - ret i32 %A -} - -; Should not generate anything other than the return, arg1 << 0 = arg1 -define zeroext i32 @shli_i32_10(i32 zeroext %arg1) { - %A = shl i32 %arg1, 0 - ret i32 %A -} - -define zeroext i32 @shli_i32_11(i32 zeroext %arg1) { - %A = shl i32 16383, %arg1 - ret i32 %A -} - -; Should generate 0, 0 << arg1 = 0 -define zeroext i32 @shli_i32_12(i32 zeroext %arg1) { - %A = shl i32 0, %arg1 - ret i32 %A -} - -;; i64 shift left - -define i64 @shl_i64_1(i64 %arg1) { - %A = shl i64 %arg1, 9 - ret i64 %A -} - -define i64 @shl_i64_2(i64 %arg1) { - %A = shl i64 %arg1, 3 - ret i64 %A -} - -define i64 @shl_i64_3(i64 %arg1, i32 %shift) { - %1 = zext i32 %shift to i64 - %2 = shl i64 %arg1, %1 - ret i64 %2 -} - -;; i64 shift right logical (shift 0s from the right) - -define i64 @lshr_i64_1(i64 %arg1) { - %1 = lshr i64 %arg1, 9 - ret i64 %1 -} - -define i64 @lshr_i64_2(i64 %arg1) { - %1 = lshr i64 %arg1, 3 - ret i64 %1 -} - -define i64 @lshr_i64_3(i64 %arg1, i32 %shift) { - %1 = zext i32 %shift to i64 - %2 = lshr i64 %arg1, %1 - ret i64 %2 -} - -;; i64 shift right arithmetic (shift 1s from the right) - -define i64 @ashr_i64_1(i64 %arg) { - %1 = ashr i64 %arg, 9 - ret i64 %1 -} - -define i64 @ashr_i64_2(i64 %arg) { - %1 = ashr i64 %arg, 3 - ret i64 %1 -} - -define i64 @ashr_i64_3(i64 %arg1, i32 %shift) { - %1 = zext i32 %shift to i64 - %2 = ashr i64 %arg1, %1 - ret i64 %2 -} - -define i32 @hi32_i64(i64 %arg) { - %1 = lshr i64 %arg, 32 - %2 = trunc i64 %1 to i32 - ret i32 %2 -} - -; some random tests -define i128 @test_lshr_i128( i128 %val ) { - ;CHECK: test_lshr_i128 - ;CHECK: sfi - ;CHECK: rotqmbi - ;CHECK: rotqmbybi - ;CHECK: bi $lr - %rv = lshr i128 %val, 64 - ret i128 %rv -} - -;Vector shifts -define <2 x i32> @shl_v2i32(<2 x i32> %val, <2 x i32> %sh) { -;CHECK: shl -;CHECK: bi $lr - %rv = shl <2 x i32> %val, %sh - ret <2 x i32> %rv -} - -define <4 x i32> @shl_v4i32(<4 x i32> %val, <4 x i32> %sh) { -;CHECK: shl -;CHECK: bi $lr - %rv = shl <4 x i32> %val, %sh - ret <4 x i32> %rv -} - -define <8 x i16> @shl_v8i16(<8 x i16> %val, <8 x i16> %sh) { -;CHECK: shlh -;CHECK: bi $lr - %rv = shl <8 x i16> %val, %sh - ret <8 x i16> %rv -} - -define <4 x i32> @lshr_v4i32(<4 x i32> %val, <4 x i32> %sh) { -;CHECK: rotm -;CHECK: bi $lr - %rv = lshr <4 x i32> %val, %sh - ret <4 x i32> %rv -} - -define <8 x i16> @lshr_v8i16(<8 x i16> %val, <8 x i16> %sh) { -;CHECK: sfhi -;CHECK: rothm -;CHECK: bi $lr - %rv = lshr <8 x i16> %val, %sh - ret <8 x i16> %rv -} - -define <4 x i32> @ashr_v4i32(<4 x i32> %val, <4 x i32> %sh) { -;CHECK: rotma -;CHECK: bi $lr - %rv = ashr <4 x i32> %val, %sh - ret <4 x i32> %rv -} - -define <8 x i16> @ashr_v8i16(<8 x i16> %val, <8 x i16> %sh) { -;CHECK: sfhi -;CHECK: rotmah -;CHECK: bi $lr - %rv = ashr <8 x i16> %val, %sh - ret <8 x i16> %rv -} - -define <2 x i64> @special_const() { - ret <2 x i64> <i64 4294967295, i64 4294967295> -} diff --git a/test/CodeGen/CellSPU/shuffles.ll b/test/CodeGen/CellSPU/shuffles.ll deleted file mode 100644 index 973586bf6cf2..000000000000 --- a/test/CodeGen/CellSPU/shuffles.ll +++ /dev/null @@ -1,69 +0,0 @@ -; RUN: llc -O1 --march=cellspu < %s | FileCheck %s - -;CHECK: shuffle -define <4 x float> @shuffle(<4 x float> %param1, <4 x float> %param2) { - ; CHECK: cwd {{\$.}}, 0($sp) - ; CHECK: shufb {{\$., \$4, \$3, \$.}} - %val= shufflevector <4 x float> %param1, <4 x float> %param2, <4 x i32> <i32 4,i32 1,i32 2,i32 3> - ret <4 x float> %val -} - -;CHECK: splat -define <4 x float> @splat(float %param1) { - ; CHECK: lqa - ; CHECK: shufb $3 - ; CHECK: bi - %vec = insertelement <1 x float> undef, float %param1, i32 0 - %val= shufflevector <1 x float> %vec, <1 x float> undef, <4 x i32> <i32 0,i32 0,i32 0,i32 0> - ret <4 x float> %val -} - -;CHECK: test_insert -define void @test_insert( <2 x float>* %ptr, float %val1, float %val2 ) { - %sl2_17_tmp1 = insertelement <2 x float> zeroinitializer, float %val1, i32 0 -;CHECK: lqa $6, -;CHECK: shufb $4, $4, $5, $6 - %sl2_17 = insertelement <2 x float> %sl2_17_tmp1, float %val2, i32 1 - -;CHECK: cdd $5, 0($3) -;CHECK: lqd $6, 0($3) -;CHECK: shufb $4, $4, $6, $5 -;CHECK: stqd $4, 0($3) -;CHECK: bi $lr - store <2 x float> %sl2_17, <2 x float>* %ptr - ret void -} - -;CHECK: test_insert_1 -define <4 x float> @test_insert_1(<4 x float> %vparam, float %eltparam) { -;CHECK: cwd $5, 4($sp) -;CHECK: shufb $3, $4, $3, $5 -;CHECK: bi $lr - %rv = insertelement <4 x float> %vparam, float %eltparam, i32 1 - ret <4 x float> %rv -} - -;CHECK: test_v2i32 -define <2 x i32> @test_v2i32(<4 x i32>%vec) -{ -;CHECK: rotqbyi $3, $3, 4 -;CHECK: bi $lr - %rv = shufflevector <4 x i32> %vec, <4 x i32> undef, <2 x i32><i32 1,i32 2> - ret <2 x i32> %rv -} - -define <4 x i32> @test_v4i32_rot8(<4 x i32>%vec) -{ - %rv = shufflevector <4 x i32> %vec, <4 x i32> undef, - <4 x i32> <i32 2,i32 3,i32 0, i32 1> - ret <4 x i32> %rv -} - -;CHECK: test_v4i32_rot4 -define <4 x i32> @test_v4i32_rot4(<4 x i32>%vec) -{ - %rv = shufflevector <4 x i32> %vec, <4 x i32> undef, - <4 x i32> <i32 1,i32 2,i32 3, i32 0> - ret <4 x i32> %rv -} - diff --git a/test/CodeGen/CellSPU/sp_farith.ll b/test/CodeGen/CellSPU/sp_farith.ll deleted file mode 100644 index 80bf47ccf5d9..000000000000 --- a/test/CodeGen/CellSPU/sp_farith.ll +++ /dev/null @@ -1,90 +0,0 @@ -; RUN: llc < %s -march=cellspu -enable-unsafe-fp-math > %t1.s -; RUN: grep fa %t1.s | count 2 -; RUN: grep fs %t1.s | count 2 -; RUN: grep fm %t1.s | count 6 -; RUN: grep fma %t1.s | count 2 -; RUN: grep fms %t1.s | count 2 -; RUN: grep fnms %t1.s | count 3 -; -; This file includes standard floating point arithmetic instructions -; NOTE fdiv is tested separately since it is a compound operation -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define float @fp_add(float %arg1, float %arg2) { - %A = fadd float %arg1, %arg2 ; <float> [#uses=1] - ret float %A -} - -define <4 x float> @fp_add_vec(<4 x float> %arg1, <4 x float> %arg2) { - %A = fadd <4 x float> %arg1, %arg2 ; <<4 x float>> [#uses=1] - ret <4 x float> %A -} - -define float @fp_sub(float %arg1, float %arg2) { - %A = fsub float %arg1, %arg2 ; <float> [#uses=1] - ret float %A -} - -define <4 x float> @fp_sub_vec(<4 x float> %arg1, <4 x float> %arg2) { - %A = fsub <4 x float> %arg1, %arg2 ; <<4 x float>> [#uses=1] - ret <4 x float> %A -} - -define float @fp_mul(float %arg1, float %arg2) { - %A = fmul float %arg1, %arg2 ; <float> [#uses=1] - ret float %A -} - -define <4 x float> @fp_mul_vec(<4 x float> %arg1, <4 x float> %arg2) { - %A = fmul <4 x float> %arg1, %arg2 ; <<4 x float>> [#uses=1] - ret <4 x float> %A -} - -define float @fp_mul_add(float %arg1, float %arg2, float %arg3) { - %A = fmul float %arg1, %arg2 ; <float> [#uses=1] - %B = fadd float %A, %arg3 ; <float> [#uses=1] - ret float %B -} - -define <4 x float> @fp_mul_add_vec(<4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3) { - %A = fmul <4 x float> %arg1, %arg2 ; <<4 x float>> [#uses=1] - %B = fadd <4 x float> %A, %arg3 ; <<4 x float>> [#uses=1] - ret <4 x float> %B -} - -define float @fp_mul_sub(float %arg1, float %arg2, float %arg3) { - %A = fmul float %arg1, %arg2 ; <float> [#uses=1] - %B = fsub float %A, %arg3 ; <float> [#uses=1] - ret float %B -} - -define <4 x float> @fp_mul_sub_vec(<4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3) { - %A = fmul <4 x float> %arg1, %arg2 ; <<4 x float>> [#uses=1] - %B = fsub <4 x float> %A, %arg3 ; <<4 x float>> [#uses=1] - ret <4 x float> %B -} - -; Test the straightforward way of getting fnms -; c - a * b -define float @fp_neg_mul_sub_1(float %arg1, float %arg2, float %arg3) { - %A = fmul float %arg1, %arg2 - %B = fsub float %arg3, %A - ret float %B -} - -; Test another way of getting fnms -; - ( a *b -c ) = c - a * b -define float @fp_neg_mul_sub_2(float %arg1, float %arg2, float %arg3) { - %A = fmul float %arg1, %arg2 - %B = fsub float %A, %arg3 - %C = fsub float -0.0, %B - ret float %C -} - -define <4 x float> @fp_neg_mul_sub_vec(<4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3) { - %A = fmul <4 x float> %arg1, %arg2 - %B = fsub <4 x float> %A, %arg3 - %D = fsub <4 x float> < float -0.0, float -0.0, float -0.0, float -0.0 >, %B - ret <4 x float> %D -} diff --git a/test/CodeGen/CellSPU/stores.ll b/test/CodeGen/CellSPU/stores.ll deleted file mode 100644 index 43f8776a3d46..000000000000 --- a/test/CodeGen/CellSPU/stores.ll +++ /dev/null @@ -1,181 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep 'stqd.*0($3)' %t1.s | count 4 -; RUN: grep 'stqd.*16($3)' %t1.s | count 4 -; RUN: grep 16256 %t1.s | count 2 -; RUN: grep 16384 %t1.s | count 1 -; RUN: grep 771 %t1.s | count 4 -; RUN: grep 515 %t1.s | count 2 -; RUN: grep 1799 %t1.s | count 2 -; RUN: grep 1543 %t1.s | count 5 -; RUN: grep 1029 %t1.s | count 3 -; RUN: grep 'shli.*, 4' %t1.s | count 4 -; RUN: grep stqx %t1.s | count 4 -; RUN: grep ilhu %t1.s | count 11 -; RUN: grep iohl %t1.s | count 8 -; RUN: grep shufb %t1.s | count 15 -; RUN: grep frds %t1.s | count 1 -; RUN: llc < %s -march=cellspu | FileCheck %s - -; ModuleID = 'stores.bc' -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -define void @store_v16i8_1(<16 x i8>* %a) nounwind { -entry: - store <16 x i8> < i8 1, i8 2, i8 1, i8 1, i8 1, i8 2, i8 1, i8 1, i8 1, i8 2, i8 1, i8 1, i8 1, i8 2, i8 1, i8 1 >, <16 x i8>* %a - ret void -} - -define void @store_v16i8_2(<16 x i8>* %a) nounwind { -entry: - %arrayidx = getelementptr <16 x i8>* %a, i32 1 - store <16 x i8> < i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2 >, <16 x i8>* %arrayidx - ret void -} - -define void @store_v16i8_3(<16 x i8>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <16 x i8>* %a, i32 %i - store <16 x i8> < i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1 >, <16 x i8>* %arrayidx - ret void -} - -define void @store_v8i16_1(<8 x i16>* %a) nounwind { -entry: - store <8 x i16> < i16 1, i16 2, i16 1, i16 1, i16 1, i16 2, i16 1, i16 1 >, <8 x i16>* %a - ret void -} - -define void @store_v8i16_2(<8 x i16>* %a) nounwind { -entry: - %arrayidx = getelementptr <8 x i16>* %a, i16 1 - store <8 x i16> < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2 >, <8 x i16>* %arrayidx - ret void -} - -define void @store_v8i16_3(<8 x i16>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <8 x i16>* %a, i32 %i - store <8 x i16> < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1 >, <8 x i16>* %arrayidx - ret void -} - -define void @store_v4i32_1(<4 x i32>* %a) nounwind { -entry: - store <4 x i32> < i32 1, i32 2, i32 1, i32 1 >, <4 x i32>* %a - ret void -} - -define void @store_v4i32_2(<4 x i32>* %a) nounwind { -entry: - %arrayidx = getelementptr <4 x i32>* %a, i32 1 - store <4 x i32> < i32 2, i32 2, i32 2, i32 2 >, <4 x i32>* %arrayidx - ret void -} - -define void @store_v4i32_3(<4 x i32>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <4 x i32>* %a, i32 %i - store <4 x i32> < i32 1, i32 1, i32 1, i32 1 >, <4 x i32>* %arrayidx - ret void -} - -define void @store_v4f32_1(<4 x float>* %a) nounwind { -entry: - store <4 x float> < float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00 >, <4 x float>* %a - ret void -} - -define void @store_v4f32_2(<4 x float>* %a) nounwind { -entry: - %arrayidx = getelementptr <4 x float>* %a, i32 1 - store <4 x float> < float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00 >, <4 x float>* %arrayidx - ret void -} - -define void @store_v4f32_3(<4 x float>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <4 x float>* %a, i32 %i - store <4 x float> < float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00 >, <4 x float>* %arrayidx - ret void -} - -; Test truncating stores: - -define zeroext i8 @tstore_i16_i8(i16 signext %val, i8* %dest) nounwind { -entry: - %conv = trunc i16 %val to i8 - store i8 %conv, i8* %dest - ret i8 %conv -} - -define zeroext i8 @tstore_i32_i8(i32 %val, i8* %dest) nounwind { -entry: - %conv = trunc i32 %val to i8 - store i8 %conv, i8* %dest - ret i8 %conv -} - -define signext i16 @tstore_i32_i16(i32 %val, i16* %dest) nounwind { -entry: - %conv = trunc i32 %val to i16 - store i16 %conv, i16* %dest - ret i16 %conv -} - -define zeroext i8 @tstore_i64_i8(i64 %val, i8* %dest) nounwind { -entry: - %conv = trunc i64 %val to i8 - store i8 %conv, i8* %dest - ret i8 %conv -} - -define signext i16 @tstore_i64_i16(i64 %val, i16* %dest) nounwind { -entry: - %conv = trunc i64 %val to i16 - store i16 %conv, i16* %dest - ret i16 %conv -} - -define i32 @tstore_i64_i32(i64 %val, i32* %dest) nounwind { -entry: - %conv = trunc i64 %val to i32 - store i32 %conv, i32* %dest - ret i32 %conv -} - -define float @tstore_f64_f32(double %val, float* %dest) nounwind { -entry: - %conv = fptrunc double %val to float - store float %conv, float* %dest - ret float %conv -} - -;Check stores that might span two 16 byte memory blocks -define void @store_misaligned( i32 %val, i32* %ptr) { -;CHECK: store_misaligned -;CHECK: lqd -;CHECK: lqd -;CHECK: stqd -;CHECK: stqd -;CHECK: bi $lr - store i32 %val, i32*%ptr, align 2 - ret void -} - -define void @store_v8( <8 x float> %val, <8 x float>* %ptr ) -{ -;CHECK: stq -;CHECK: stq -;CHECK: bi $lr - store <8 x float> %val, <8 x float>* %ptr - ret void -} - -define void @store_null_vec( <4 x i32> %val ) { -; FIXME - this is for some reason compiled into a il+stqd, not a sta. -;CHECK: stqd -;CHECK: bi $lr - store <4 x i32> %val, <4 x i32>* null - ret void -} diff --git a/test/CodeGen/CellSPU/storestruct.ll b/test/CodeGen/CellSPU/storestruct.ll deleted file mode 100644 index 47185e829661..000000000000 --- a/test/CodeGen/CellSPU/storestruct.ll +++ /dev/null @@ -1,13 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -%0 = type {i32, i32} -@buffer = global [ 72 x %0 ] zeroinitializer - -define void@test( ) { -; Check that there is no illegal "a rt, ra, imm" instruction -; CHECK-NOT: a {{\$., \$., 5..}} -; CHECK: a {{\$., \$., \$.}} - store %0 {i32 1, i32 2} , - %0* getelementptr ([72 x %0]* @buffer, i32 0, i32 71) - ret void -} diff --git a/test/CodeGen/CellSPU/struct_1.ll b/test/CodeGen/CellSPU/struct_1.ll deleted file mode 100644 index 8c3275080c69..000000000000 --- a/test/CodeGen/CellSPU/struct_1.ll +++ /dev/null @@ -1,147 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: llc < %s -march=cellspu -mattr=large_mem > %t2.s -; RUN: grep lqa %t1.s | count 5 -; RUN: grep lqd %t1.s | count 11 -; RUN: grep rotqbyi %t1.s | count 7 -; RUN: grep xshw %t1.s | count 1 -; RUN: grep andi %t1.s | count 5 -; RUN: grep cbd %t1.s | count 3 -; RUN: grep chd %t1.s | count 1 -; RUN: grep cwd %t1.s | count 3 -; RUN: grep shufb %t1.s | count 7 -; RUN: grep stqd %t1.s | count 7 -; RUN: grep iohl %t2.s | count 16 -; RUN: grep ilhu %t2.s | count 16 -; RUN: grep lqd %t2.s | count 16 -; RUN: grep rotqbyi %t2.s | count 7 -; RUN: grep xshw %t2.s | count 1 -; RUN: grep andi %t2.s | count 5 -; RUN: grep cbd %t2.s | count 3 -; RUN: grep chd %t2.s | count 1 -; RUN: grep cwd %t2.s | count 3 -; RUN: grep shufb %t2.s | count 7 -; RUN: grep stqd %t2.s | count 7 - -; CellSPU legalization is over-sensitive to Legalize's traversal order. -; XFAIL: * - -; ModuleID = 'struct_1.bc' -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" -target triple = "spu" - -; struct hackstate { -; unsigned char c1; // offset 0 (rotate left by 13 bytes to byte 3) -; unsigned char c2; // offset 1 (rotate left by 14 bytes to byte 3) -; unsigned char c3; // offset 2 (rotate left by 15 bytes to byte 3) -; int i1; // offset 4 (rotate left by 4 bytes to byte 0) -; short s1; // offset 8 (rotate left by 6 bytes to byte 2) -; int i2; // offset 12 [ignored] -; unsigned char c4; // offset 16 [ignored] -; unsigned char c5; // offset 17 [ignored] -; unsigned char c6; // offset 18 (rotate left by 14 bytes to byte 3) -; unsigned char c7; // offset 19 (no rotate, in preferred slot) -; int i3; // offset 20 [ignored] -; int i4; // offset 24 [ignored] -; int i5; // offset 28 [ignored] -; int i6; // offset 32 (no rotate, in preferred slot) -; } -%struct.hackstate = type { i8, i8, i8, i32, i16, i32, i8, i8, i8, i8, i32, i32, i32, i32 } - -; struct hackstate state = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -@state = global %struct.hackstate zeroinitializer, align 16 - -define zeroext i8 @get_hackstate_c1() nounwind { -entry: - %tmp2 = load i8* getelementptr (%struct.hackstate* @state, i32 0, i32 0), align 16 - ret i8 %tmp2 -} - -define zeroext i8 @get_hackstate_c2() nounwind { -entry: - %tmp2 = load i8* getelementptr (%struct.hackstate* @state, i32 0, i32 1), align 16 - ret i8 %tmp2 -} - -define zeroext i8 @get_hackstate_c3() nounwind { -entry: - %tmp2 = load i8* getelementptr (%struct.hackstate* @state, i32 0, i32 2), align 16 - ret i8 %tmp2 -} - -define i32 @get_hackstate_i1() nounwind { -entry: - %tmp2 = load i32* getelementptr (%struct.hackstate* @state, i32 0, i32 3), align 16 - ret i32 %tmp2 -} - -define signext i16 @get_hackstate_s1() nounwind { -entry: - %tmp2 = load i16* getelementptr (%struct.hackstate* @state, i32 0, i32 4), align 16 - ret i16 %tmp2 -} - -define zeroext i8 @get_hackstate_c6() nounwind { -entry: - %tmp2 = load i8* getelementptr (%struct.hackstate* @state, i32 0, i32 8), align 16 - ret i8 %tmp2 -} - -define zeroext i8 @get_hackstate_c7() nounwind { -entry: - %tmp2 = load i8* getelementptr (%struct.hackstate* @state, i32 0, i32 9), align 16 - ret i8 %tmp2 -} - -define i32 @get_hackstate_i3() nounwind { -entry: - %tmp2 = load i32* getelementptr (%struct.hackstate* @state, i32 0, i32 10), align 16 - ret i32 %tmp2 -} - -define i32 @get_hackstate_i6() nounwind { -entry: - %tmp2 = load i32* getelementptr (%struct.hackstate* @state, i32 0, i32 13), align 16 - ret i32 %tmp2 -} - -define void @set_hackstate_c1(i8 zeroext %c) nounwind { -entry: - store i8 %c, i8* getelementptr (%struct.hackstate* @state, i32 0, i32 0), align 16 - ret void -} - -define void @set_hackstate_c2(i8 zeroext %c) nounwind { -entry: - store i8 %c, i8* getelementptr (%struct.hackstate* @state, i32 0, i32 1), align 16 - ret void -} - -define void @set_hackstate_c3(i8 zeroext %c) nounwind { -entry: - store i8 %c, i8* getelementptr (%struct.hackstate* @state, i32 0, i32 2), align 16 - ret void -} - -define void @set_hackstate_i1(i32 %i) nounwind { -entry: - store i32 %i, i32* getelementptr (%struct.hackstate* @state, i32 0, i32 3), align 16 - ret void -} - -define void @set_hackstate_s1(i16 signext %s) nounwind { -entry: - store i16 %s, i16* getelementptr (%struct.hackstate* @state, i32 0, i32 4), align 16 - ret void -} - -define void @set_hackstate_i3(i32 %i) nounwind { -entry: - store i32 %i, i32* getelementptr (%struct.hackstate* @state, i32 0, i32 10), align 16 - ret void -} - -define void @set_hackstate_i6(i32 %i) nounwind { -entry: - store i32 %i, i32* getelementptr (%struct.hackstate* @state, i32 0, i32 13), align 16 - ret void -} diff --git a/test/CodeGen/CellSPU/sub_ops.ll b/test/CodeGen/CellSPU/sub_ops.ll deleted file mode 100644 index f0c40d37ce9d..000000000000 --- a/test/CodeGen/CellSPU/sub_ops.ll +++ /dev/null @@ -1,26 +0,0 @@ -; RUN: llc < %s -march=cellspu | FileCheck %s - -define i32 @subword( i32 %param1, i32 %param2) { -; Check ordering of registers ret=param1-param2 -> rt=rb-ra -; CHECK-NOT: sf $3, $3, $4 -; CHECK: sf $3, $4, $3 - %1 = sub i32 %param1, %param2 - ret i32 %1 -} - -define i16 @subhword( i16 %param1, i16 %param2) { -; Check ordering of registers ret=param1-param2 -> rt=rb-ra -; CHECK-NOT: sfh $3, $3, $4 -; CHECK: sfh $3, $4, $3 - %1 = sub i16 %param1, %param2 - ret i16 %1 -} - -define float @subfloat( float %param1, float %param2) { -; Check ordering of registers ret=param1-param2 -> rt=ra-rb -; (yes this is reverse of i32 instruction) -; CHECK-NOT: fs $3, $4, $3 -; CHECK: fs $3, $3, $4 - %1 = fsub float %param1, %param2 - ret float %1 -} diff --git a/test/CodeGen/CellSPU/trunc.ll b/test/CodeGen/CellSPU/trunc.ll deleted file mode 100644 index e4c8fb49a32c..000000000000 --- a/test/CodeGen/CellSPU/trunc.ll +++ /dev/null @@ -1,94 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep shufb %t1.s | count 19 -; RUN: grep "ilhu.*1799" %t1.s | count 1 -; RUN: grep "ilhu.*771" %t1.s | count 2 -; RUN: grep "ilhu.*1543" %t1.s | count 1 -; RUN: grep "ilhu.*1029" %t1.s | count 1 -; RUN: grep "ilhu.*515" %t1.s | count 1 -; RUN: grep "ilhu.*3855" %t1.s | count 1 -; RUN: grep "ilhu.*3599" %t1.s | count 1 -; RUN: grep "ilhu.*3085" %t1.s | count 1 -; RUN: grep "iohl.*3855" %t1.s | count 1 -; RUN: grep "iohl.*3599" %t1.s | count 2 -; RUN: grep "iohl.*1543" %t1.s | count 2 -; RUN: grep "iohl.*771" %t1.s | count 2 -; RUN: grep "iohl.*515" %t1.s | count 1 -; RUN: grep "iohl.*1799" %t1.s | count 1 -; RUN: grep lqa %t1.s | count 1 -; RUN: grep cbd %t1.s | count 4 -; RUN: grep chd %t1.s | count 3 -; RUN: grep cwd %t1.s | count 1 -; RUN: grep cdd %t1.s | count 1 - -; ModuleID = 'trunc.bc' -target datalayout = "E-p:32:32:128-i1:8:128-i8:8:128-i16:16:128-i32:32:128-i64:32:128-f32:32:128-f64:64:128-v64:64:64-v128:128:128-a0:0:128-s0:128:128" -target triple = "spu" - -define <16 x i8> @trunc_i128_i8(i128 %u, <16 x i8> %v) { -entry: - %0 = trunc i128 %u to i8 - %tmp1 = insertelement <16 x i8> %v, i8 %0, i32 15 - ret <16 x i8> %tmp1 -} - -define <8 x i16> @trunc_i128_i16(i128 %u, <8 x i16> %v) { -entry: - %0 = trunc i128 %u to i16 - %tmp1 = insertelement <8 x i16> %v, i16 %0, i32 8 - ret <8 x i16> %tmp1 -} - -define <4 x i32> @trunc_i128_i32(i128 %u, <4 x i32> %v) { -entry: - %0 = trunc i128 %u to i32 - %tmp1 = insertelement <4 x i32> %v, i32 %0, i32 2 - ret <4 x i32> %tmp1 -} - -define <2 x i64> @trunc_i128_i64(i128 %u, <2 x i64> %v) { -entry: - %0 = trunc i128 %u to i64 - %tmp1 = insertelement <2 x i64> %v, i64 %0, i32 1 - ret <2 x i64> %tmp1 -} - -define <16 x i8> @trunc_i64_i8(i64 %u, <16 x i8> %v) { -entry: - %0 = trunc i64 %u to i8 - %tmp1 = insertelement <16 x i8> %v, i8 %0, i32 10 - ret <16 x i8> %tmp1 -} - -define <8 x i16> @trunc_i64_i16(i64 %u, <8 x i16> %v) { -entry: - %0 = trunc i64 %u to i16 - %tmp1 = insertelement <8 x i16> %v, i16 %0, i32 6 - ret <8 x i16> %tmp1 -} - -define i32 @trunc_i64_i32(i64 %u) { -entry: - %0 = trunc i64 %u to i32 - ret i32 %0 -} - -define <16 x i8> @trunc_i32_i8(i32 %u, <16 x i8> %v) { -entry: - %0 = trunc i32 %u to i8 - %tmp1 = insertelement <16 x i8> %v, i8 %0, i32 7 - ret <16 x i8> %tmp1 -} - -define <8 x i16> @trunc_i32_i16(i32 %u, <8 x i16> %v) { -entry: - %0 = trunc i32 %u to i16 - %tmp1 = insertelement <8 x i16> %v, i16 %0, i32 3 - ret <8 x i16> %tmp1 -} - -define <16 x i8> @trunc_i16_i8(i16 %u, <16 x i8> %v) { -entry: - %0 = trunc i16 %u to i8 - %tmp1 = insertelement <16 x i8> %v, i8 %0, i32 5 - ret <16 x i8> %tmp1 -} diff --git a/test/CodeGen/CellSPU/useful-harnesses/README.txt b/test/CodeGen/CellSPU/useful-harnesses/README.txt deleted file mode 100644 index d87b3989e4f7..000000000000 --- a/test/CodeGen/CellSPU/useful-harnesses/README.txt +++ /dev/null @@ -1,5 +0,0 @@ -This directory contains code that's not part of the DejaGNU test suite, -but is generally useful as various test harnesses. - -vecoperations.c: Various vector operation sanity checks, e.g., shuffles, - 8-bit vector add and multiply. diff --git a/test/CodeGen/CellSPU/useful-harnesses/i32operations.c b/test/CodeGen/CellSPU/useful-harnesses/i32operations.c deleted file mode 100644 index 12fc30bf65d7..000000000000 --- a/test/CodeGen/CellSPU/useful-harnesses/i32operations.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <stdio.h> - -typedef unsigned int uint32_t; -typedef int int32_t; - -const char *boolstring(int val) { - return val ? "true" : "false"; -} - -int i32_eq(int32_t a, int32_t b) { - return (a == b); -} - -int i32_neq(int32_t a, int32_t b) { - return (a != b); -} - -int32_t i32_eq_select(int32_t a, int32_t b, int32_t c, int32_t d) { - return ((a == b) ? c : d); -} - -int32_t i32_neq_select(int32_t a, int32_t b, int32_t c, int32_t d) { - return ((a != b) ? c : d); -} - -struct pred_s { - const char *name; - int (*predfunc)(int32_t, int32_t); - int (*selfunc)(int32_t, int32_t, int32_t, int32_t); -}; - -struct pred_s preds[] = { - { "eq", i32_eq, i32_eq_select }, - { "neq", i32_neq, i32_neq_select } -}; - -int main(void) { - int i; - int32_t a = 1234567890; - int32_t b = 345678901; - int32_t c = 1234500000; - int32_t d = 10001; - int32_t e = 10000; - - printf("a = %12d (0x%08x)\n", a, a); - printf("b = %12d (0x%08x)\n", b, b); - printf("c = %12d (0x%08x)\n", c, c); - printf("d = %12d (0x%08x)\n", d, d); - printf("e = %12d (0x%08x)\n", e, e); - printf("----------------------------------------\n"); - - for (i = 0; i < sizeof(preds)/sizeof(preds[0]); ++i) { - printf("a %s a = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(a, a))); - printf("a %s a = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(a, a))); - printf("a %s b = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(a, b))); - printf("a %s c = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(a, c))); - printf("d %s e = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(d, e))); - printf("e %s e = %s\n", preds[i].name, boolstring((*preds[i].predfunc)(e, e))); - - printf("a %s a ? c : d = %d\n", preds[i].name, (*preds[i].selfunc)(a, a, c, d)); - printf("a %s a ? c : d == c (%s)\n", preds[i].name, boolstring((*preds[i].selfunc)(a, a, c, d) == c)); - printf("a %s b ? c : d = %d\n", preds[i].name, (*preds[i].selfunc)(a, b, c, d)); - printf("a %s b ? c : d == d (%s)\n", preds[i].name, boolstring((*preds[i].selfunc)(a, b, c, d) == d)); - - printf("----------------------------------------\n"); - } - - return 0; -} diff --git a/test/CodeGen/CellSPU/useful-harnesses/i64operations.c b/test/CodeGen/CellSPU/useful-harnesses/i64operations.c deleted file mode 100644 index b613bd872e28..000000000000 --- a/test/CodeGen/CellSPU/useful-harnesses/i64operations.c +++ /dev/null @@ -1,673 +0,0 @@ -#include <stdio.h> -#include "i64operations.h" - -int64_t tval_a = 1234567890003LL; -int64_t tval_b = 2345678901235LL; -int64_t tval_c = 1234567890001LL; -int64_t tval_d = 10001LL; -int64_t tval_e = 10000LL; -uint64_t tval_f = 0xffffff0750135eb9; -int64_t tval_g = -1; - -/* ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- */ - -int -i64_eq(int64_t a, int64_t b) -{ - return (a == b); -} - -int -i64_neq(int64_t a, int64_t b) -{ - return (a != b); -} - -int -i64_gt(int64_t a, int64_t b) -{ - return (a > b); -} - -int -i64_le(int64_t a, int64_t b) -{ - return (a <= b); -} - -int -i64_ge(int64_t a, int64_t b) { - return (a >= b); -} - -int -i64_lt(int64_t a, int64_t b) { - return (a < b); -} - -int -i64_uge(uint64_t a, uint64_t b) -{ - return (a >= b); -} - -int -i64_ult(uint64_t a, uint64_t b) -{ - return (a < b); -} - -int -i64_ugt(uint64_t a, uint64_t b) -{ - return (a > b); -} - -int -i64_ule(uint64_t a, uint64_t b) -{ - return (a <= b); -} - -int64_t -i64_eq_select(int64_t a, int64_t b, int64_t c, int64_t d) -{ - return ((a == b) ? c : d); -} - -int64_t -i64_neq_select(int64_t a, int64_t b, int64_t c, int64_t d) -{ - return ((a != b) ? c : d); -} - -int64_t -i64_gt_select(int64_t a, int64_t b, int64_t c, int64_t d) { - return ((a > b) ? c : d); -} - -int64_t -i64_le_select(int64_t a, int64_t b, int64_t c, int64_t d) { - return ((a <= b) ? c : d); -} - -int64_t -i64_ge_select(int64_t a, int64_t b, int64_t c, int64_t d) { - return ((a >= b) ? c : d); -} - -int64_t -i64_lt_select(int64_t a, int64_t b, int64_t c, int64_t d) { - return ((a < b) ? c : d); -} - -uint64_t -i64_ugt_select(uint64_t a, uint64_t b, uint64_t c, uint64_t d) -{ - return ((a > b) ? c : d); -} - -uint64_t -i64_ule_select(uint64_t a, uint64_t b, uint64_t c, uint64_t d) -{ - return ((a <= b) ? c : d); -} - -uint64_t -i64_uge_select(uint64_t a, uint64_t b, uint64_t c, uint64_t d) { - return ((a >= b) ? c : d); -} - -uint64_t -i64_ult_select(uint64_t a, uint64_t b, uint64_t c, uint64_t d) { - return ((a < b) ? c : d); -} - -/* ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- */ - -struct harness_int64_pred int64_tests_eq[] = { - {"a %s a", &tval_a, &tval_a, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"a %s b", &tval_a, &tval_b, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"a %s c", &tval_a, &tval_c, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"d %s e", &tval_d, &tval_e, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"e %s e", &tval_e, &tval_e, &tval_c, &tval_d, TRUE_VAL, &tval_c} -}; - -struct harness_int64_pred int64_tests_neq[] = { - {"a %s a", &tval_a, &tval_a, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"a %s b", &tval_a, &tval_b, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"a %s c", &tval_a, &tval_c, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"d %s e", &tval_d, &tval_e, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"e %s e", &tval_e, &tval_e, &tval_c, &tval_d, FALSE_VAL, &tval_d} -}; - -struct harness_int64_pred int64_tests_sgt[] = { - {"a %s a", &tval_a, &tval_a, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"a %s b", &tval_a, &tval_b, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"a %s c", &tval_a, &tval_c, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"d %s e", &tval_d, &tval_e, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"e %s e", &tval_e, &tval_e, &tval_c, &tval_d, FALSE_VAL, &tval_d} -}; - -struct harness_int64_pred int64_tests_sle[] = { - {"a %s a", &tval_a, &tval_a, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"a %s b", &tval_a, &tval_b, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"a %s c", &tval_a, &tval_c, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"d %s e", &tval_d, &tval_e, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"e %s e", &tval_e, &tval_e, &tval_c, &tval_d, TRUE_VAL, &tval_c} -}; - -struct harness_int64_pred int64_tests_sge[] = { - {"a %s a", &tval_a, &tval_a, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"a %s b", &tval_a, &tval_b, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"a %s c", &tval_a, &tval_c, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"d %s e", &tval_d, &tval_e, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"e %s e", &tval_e, &tval_e, &tval_c, &tval_d, TRUE_VAL, &tval_c} -}; - -struct harness_int64_pred int64_tests_slt[] = { - {"a %s a", &tval_a, &tval_a, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"a %s b", &tval_a, &tval_b, &tval_c, &tval_d, TRUE_VAL, &tval_c}, - {"a %s c", &tval_a, &tval_c, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"d %s e", &tval_d, &tval_e, &tval_c, &tval_d, FALSE_VAL, &tval_d}, - {"e %s e", &tval_e, &tval_e, &tval_c, &tval_d, FALSE_VAL, &tval_d} -}; - -struct int64_pred_s int64_preds[] = { - {"eq", i64_eq, i64_eq_select, - int64_tests_eq, ARR_SIZE(int64_tests_eq)}, - {"neq", i64_neq, i64_neq_select, - int64_tests_neq, ARR_SIZE(int64_tests_neq)}, - {"gt", i64_gt, i64_gt_select, - int64_tests_sgt, ARR_SIZE(int64_tests_sgt)}, - {"le", i64_le, i64_le_select, - int64_tests_sle, ARR_SIZE(int64_tests_sle)}, - {"ge", i64_ge, i64_ge_select, - int64_tests_sge, ARR_SIZE(int64_tests_sge)}, - {"lt", i64_lt, i64_lt_select, - int64_tests_slt, ARR_SIZE(int64_tests_slt)} -}; - -/* ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- */ - -struct harness_uint64_pred uint64_tests_ugt[] = { - {"a %s a", (uint64_t *) &tval_a, (uint64_t *) &tval_a, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d}, - {"a %s b", (uint64_t *) &tval_a, (uint64_t *) &tval_b, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d }, - {"a %s c", (uint64_t *) &tval_a, (uint64_t *) &tval_c, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c }, - {"d %s e", (uint64_t *) &tval_d, (uint64_t *) &tval_e, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c }, - {"e %s e", (uint64_t *) &tval_e, (uint64_t *) &tval_e, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d } -}; - -struct harness_uint64_pred uint64_tests_ule[] = { - {"a %s a", (uint64_t *) &tval_a, (uint64_t *) &tval_a, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c}, - {"a %s b", (uint64_t *) &tval_a, (uint64_t *) &tval_b, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c}, - {"a %s c", (uint64_t *) &tval_a, (uint64_t *) &tval_c, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d}, - {"d %s e", (uint64_t *) &tval_d, (uint64_t *) &tval_e, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d}, - {"e %s e", (uint64_t *) &tval_e, (uint64_t *) &tval_e, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c} -}; - -struct harness_uint64_pred uint64_tests_uge[] = { - {"a %s a", (uint64_t *) &tval_a, (uint64_t *) &tval_a, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c}, - {"a %s b", (uint64_t *) &tval_a, (uint64_t *) &tval_b, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d}, - {"a %s c", (uint64_t *) &tval_a, (uint64_t *) &tval_c, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c}, - {"d %s e", (uint64_t *) &tval_d, (uint64_t *) &tval_e, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c}, - {"e %s e", (uint64_t *) &tval_e, (uint64_t *) &tval_e, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c} -}; - -struct harness_uint64_pred uint64_tests_ult[] = { - {"a %s a", (uint64_t *) &tval_a, (uint64_t *) &tval_a, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d}, - {"a %s b", (uint64_t *) &tval_a, (uint64_t *) &tval_b, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, TRUE_VAL, (uint64_t *) &tval_c}, - {"a %s c", (uint64_t *) &tval_a, (uint64_t *) &tval_c, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d}, - {"d %s e", (uint64_t *) &tval_d, (uint64_t *) &tval_e, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d}, - {"e %s e", (uint64_t *) &tval_e, (uint64_t *) &tval_e, (uint64_t *) &tval_c, - (uint64_t *) &tval_d, FALSE_VAL, (uint64_t *) &tval_d} -}; - -struct uint64_pred_s uint64_preds[] = { - {"ugt", i64_ugt, i64_ugt_select, - uint64_tests_ugt, ARR_SIZE(uint64_tests_ugt)}, - {"ule", i64_ule, i64_ule_select, - uint64_tests_ule, ARR_SIZE(uint64_tests_ule)}, - {"uge", i64_uge, i64_uge_select, - uint64_tests_uge, ARR_SIZE(uint64_tests_uge)}, - {"ult", i64_ult, i64_ult_select, - uint64_tests_ult, ARR_SIZE(uint64_tests_ult)} -}; - -int -compare_expect_int64(const struct int64_pred_s * pred) -{ - int j, failed = 0; - - for (j = 0; j < pred->n_tests; ++j) { - int pred_result; - - pred_result = (*pred->predfunc) (*pred->tests[j].lhs, *pred->tests[j].rhs); - - if (pred_result != pred->tests[j].expected) { - char str[64]; - - sprintf(str, pred->tests[j].fmt_string, pred->name); - printf("%s: returned value is %d, expecting %d\n", str, - pred_result, pred->tests[j].expected); - printf(" lhs = %19lld (0x%016llx)\n", *pred->tests[j].lhs, - *pred->tests[j].lhs); - printf(" rhs = %19lld (0x%016llx)\n", *pred->tests[j].rhs, - *pred->tests[j].rhs); - ++failed; - } else { - int64_t selresult; - - selresult = (pred->selfunc) (*pred->tests[j].lhs, *pred->tests[j].rhs, - *pred->tests[j].select_a, - *pred->tests[j].select_b); - - if (selresult != *pred->tests[j].select_expected) { - char str[64]; - - sprintf(str, pred->tests[j].fmt_string, pred->name); - printf("%s select: returned value is %d, expecting %d\n", str, - pred_result, pred->tests[j].expected); - printf(" lhs = %19lld (0x%016llx)\n", *pred->tests[j].lhs, - *pred->tests[j].lhs); - printf(" rhs = %19lld (0x%016llx)\n", *pred->tests[j].rhs, - *pred->tests[j].rhs); - printf(" true = %19lld (0x%016llx)\n", *pred->tests[j].select_a, - *pred->tests[j].select_a); - printf(" false = %19lld (0x%016llx)\n", *pred->tests[j].select_b, - *pred->tests[j].select_b); - ++failed; - } - } - } - - printf(" %d tests performed, should be %d.\n", j, pred->n_tests); - - return failed; -} - -int -compare_expect_uint64(const struct uint64_pred_s * pred) -{ - int j, failed = 0; - - for (j = 0; j < pred->n_tests; ++j) { - int pred_result; - - pred_result = (*pred->predfunc) (*pred->tests[j].lhs, *pred->tests[j].rhs); - if (pred_result != pred->tests[j].expected) { - char str[64]; - - sprintf(str, pred->tests[j].fmt_string, pred->name); - printf("%s: returned value is %d, expecting %d\n", str, - pred_result, pred->tests[j].expected); - printf(" lhs = %19llu (0x%016llx)\n", *pred->tests[j].lhs, - *pred->tests[j].lhs); - printf(" rhs = %19llu (0x%016llx)\n", *pred->tests[j].rhs, - *pred->tests[j].rhs); - ++failed; - } else { - uint64_t selresult; - - selresult = (pred->selfunc) (*pred->tests[j].lhs, *pred->tests[j].rhs, - *pred->tests[j].select_a, - *pred->tests[j].select_b); - if (selresult != *pred->tests[j].select_expected) { - char str[64]; - - sprintf(str, pred->tests[j].fmt_string, pred->name); - printf("%s select: returned value is %d, expecting %d\n", str, - pred_result, pred->tests[j].expected); - printf(" lhs = %19llu (0x%016llx)\n", *pred->tests[j].lhs, - *pred->tests[j].lhs); - printf(" rhs = %19llu (0x%016llx)\n", *pred->tests[j].rhs, - *pred->tests[j].rhs); - printf(" true = %19llu (0x%016llx)\n", *pred->tests[j].select_a, - *pred->tests[j].select_a); - printf(" false = %19llu (0x%016llx)\n", *pred->tests[j].select_b, - *pred->tests[j].select_b); - ++failed; - } - } - } - - printf(" %d tests performed, should be %d.\n", j, pred->n_tests); - - return failed; -} - -/* ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- */ - -int -test_i64_sext_i32(int in, int64_t expected) { - int64_t result = (int64_t) in; - - if (result != expected) { - char str[64]; - sprintf(str, "i64_sext_i32(%d) returns %lld\n", in, result); - return 1; - } - - return 0; -} - -int -test_i64_sext_i16(short in, int64_t expected) { - int64_t result = (int64_t) in; - - if (result != expected) { - char str[64]; - sprintf(str, "i64_sext_i16(%hd) returns %lld\n", in, result); - return 1; - } - - return 0; -} - -int -test_i64_sext_i8(signed char in, int64_t expected) { - int64_t result = (int64_t) in; - - if (result != expected) { - char str[64]; - sprintf(str, "i64_sext_i8(%d) returns %lld\n", in, result); - return 1; - } - - return 0; -} - -int -test_i64_zext_i32(unsigned int in, uint64_t expected) { - uint64_t result = (uint64_t) in; - - if (result != expected) { - char str[64]; - sprintf(str, "i64_zext_i32(%u) returns %llu\n", in, result); - return 1; - } - - return 0; -} - -int -test_i64_zext_i16(unsigned short in, uint64_t expected) { - uint64_t result = (uint64_t) in; - - if (result != expected) { - char str[64]; - sprintf(str, "i64_zext_i16(%hu) returns %llu\n", in, result); - return 1; - } - - return 0; -} - -int -test_i64_zext_i8(unsigned char in, uint64_t expected) { - uint64_t result = (uint64_t) in; - - if (result != expected) { - char str[64]; - sprintf(str, "i64_zext_i8(%u) returns %llu\n", in, result); - return 1; - } - - return 0; -} - -/* ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- */ - -int64_t -i64_shl_const(int64_t a) { - return a << 10; -} - -int64_t -i64_shl(int64_t a, int amt) { - return a << amt; -} - -uint64_t -u64_shl_const(uint64_t a) { - return a << 10; -} - -uint64_t -u64_shl(uint64_t a, int amt) { - return a << amt; -} - -int64_t -i64_srl_const(int64_t a) { - return a >> 10; -} - -int64_t -i64_srl(int64_t a, int amt) { - return a >> amt; -} - -uint64_t -u64_srl_const(uint64_t a) { - return a >> 10; -} - -uint64_t -u64_srl(uint64_t a, int amt) { - return a >> amt; -} - -int64_t -i64_sra_const(int64_t a) { - return a >> 10; -} - -int64_t -i64_sra(int64_t a, int amt) { - return a >> amt; -} - -uint64_t -u64_sra_const(uint64_t a) { - return a >> 10; -} - -uint64_t -u64_sra(uint64_t a, int amt) { - return a >> amt; -} - -int -test_u64_constant_shift(const char *func_name, uint64_t (*func)(uint64_t), uint64_t a, uint64_t expected) { - uint64_t result = (*func)(a); - - if (result != expected) { - printf("%s(0x%016llx) returns 0x%016llx, expected 0x%016llx\n", func_name, a, result, expected); - return 1; - } - - return 0; -} - -int -test_i64_constant_shift(const char *func_name, int64_t (*func)(int64_t), int64_t a, int64_t expected) { - int64_t result = (*func)(a); - - if (result != expected) { - printf("%s(0x%016llx) returns 0x%016llx, expected 0x%016llx\n", func_name, a, result, expected); - return 1; - } - - return 0; -} - -int -test_u64_variable_shift(const char *func_name, uint64_t (*func)(uint64_t, int), uint64_t a, unsigned int b, uint64_t expected) { - uint64_t result = (*func)(a, b); - - if (result != expected) { - printf("%s(0x%016llx, %d) returns 0x%016llx, expected 0x%016llx\n", func_name, a, b, result, expected); - return 1; - } - - return 0; -} - -int -test_i64_variable_shift(const char *func_name, int64_t (*func)(int64_t, int), int64_t a, unsigned int b, int64_t expected) { - int64_t result = (*func)(a, b); - - if (result != expected) { - printf("%s(0x%016llx, %d) returns 0x%016llx, expected 0x%016llx\n", func_name, a, b, result, expected); - return 1; - } - - return 0; -} - -/* ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- */ - -int64_t i64_mul(int64_t a, int64_t b) { - return a * b; -} - -/* ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- */ - -int -main(void) -{ - int i, j, failed = 0; - const char *something_failed = " %d tests failed.\n"; - const char *all_tests_passed = " All tests passed.\n"; - - printf("tval_a = %20lld (0x%016llx)\n", tval_a, tval_a); - printf("tval_b = %20lld (0x%016llx)\n", tval_b, tval_b); - printf("tval_c = %20lld (0x%016llx)\n", tval_c, tval_c); - printf("tval_d = %20lld (0x%016llx)\n", tval_d, tval_d); - printf("tval_e = %20lld (0x%016llx)\n", tval_e, tval_e); - printf("tval_f = %20llu (0x%016llx)\n", tval_f, tval_f); - printf("tval_g = %20llu (0x%016llx)\n", tval_g, tval_g); - printf("----------------------------------------\n"); - - for (i = 0; i < ARR_SIZE(int64_preds); ++i) { - printf("%s series:\n", int64_preds[i].name); - if ((failed = compare_expect_int64(int64_preds + i)) > 0) { - printf(something_failed, failed); - } else { - printf(all_tests_passed); - } - - printf("----------------------------------------\n"); - } - - for (i = 0; i < ARR_SIZE(uint64_preds); ++i) { - printf("%s series:\n", uint64_preds[i].name); - if ((failed = compare_expect_uint64(uint64_preds + i)) > 0) { - printf(something_failed, failed); - } else { - printf(all_tests_passed); - } - - printf("----------------------------------------\n"); - } - - /*----------------------------------------------------------------------*/ - - puts("signed/zero-extend tests:"); - - failed = 0; - failed += test_i64_sext_i32(-1, -1LL); - failed += test_i64_sext_i32(10, 10LL); - failed += test_i64_sext_i32(0x7fffffff, 0x7fffffffLL); - failed += test_i64_sext_i16(-1, -1LL); - failed += test_i64_sext_i16(10, 10LL); - failed += test_i64_sext_i16(0x7fff, 0x7fffLL); - failed += test_i64_sext_i8(-1, -1LL); - failed += test_i64_sext_i8(10, 10LL); - failed += test_i64_sext_i8(0x7f, 0x7fLL); - - failed += test_i64_zext_i32(0xffffffff, 0x00000000ffffffffLLU); - failed += test_i64_zext_i32(0x01234567, 0x0000000001234567LLU); - failed += test_i64_zext_i16(0xffff, 0x000000000000ffffLLU); - failed += test_i64_zext_i16(0x569a, 0x000000000000569aLLU); - failed += test_i64_zext_i8(0xff, 0x00000000000000ffLLU); - failed += test_i64_zext_i8(0xa0, 0x00000000000000a0LLU); - - if (failed > 0) { - printf(" %d tests failed.\n", failed); - } else { - printf(" All tests passed.\n"); - } - - printf("----------------------------------------\n"); - - failed = 0; - puts("signed left/right shift tests:"); - failed += test_i64_constant_shift("i64_shl_const", i64_shl_const, tval_a, 0x00047dc7ec114c00LL); - failed += test_i64_variable_shift("i64_shl", i64_shl, tval_a, 10, 0x00047dc7ec114c00LL); - failed += test_i64_constant_shift("i64_srl_const", i64_srl_const, tval_a, 0x0000000047dc7ec1LL); - failed += test_i64_variable_shift("i64_srl", i64_srl, tval_a, 10, 0x0000000047dc7ec1LL); - failed += test_i64_constant_shift("i64_sra_const", i64_sra_const, tval_a, 0x0000000047dc7ec1LL); - failed += test_i64_variable_shift("i64_sra", i64_sra, tval_a, 10, 0x0000000047dc7ec1LL); - - if (failed > 0) { - printf(" %d tests ailed.\n", failed); - } else { - printf(" All tests passed.\n"); - } - - printf("----------------------------------------\n"); - - failed = 0; - puts("unsigned left/right shift tests:"); - failed += test_u64_constant_shift("u64_shl_const", u64_shl_const, tval_f, 0xfffc1d404d7ae400LL); - failed += test_u64_variable_shift("u64_shl", u64_shl, tval_f, 10, 0xfffc1d404d7ae400LL); - failed += test_u64_constant_shift("u64_srl_const", u64_srl_const, tval_f, 0x003fffffc1d404d7LL); - failed += test_u64_variable_shift("u64_srl", u64_srl, tval_f, 10, 0x003fffffc1d404d7LL); - failed += test_i64_constant_shift("i64_sra_const", i64_sra_const, tval_f, 0xffffffffc1d404d7LL); - failed += test_i64_variable_shift("i64_sra", i64_sra, tval_f, 10, 0xffffffffc1d404d7LL); - failed += test_u64_constant_shift("u64_sra_const", u64_sra_const, tval_f, 0x003fffffc1d404d7LL); - failed += test_u64_variable_shift("u64_sra", u64_sra, tval_f, 10, 0x003fffffc1d404d7LL); - - if (failed > 0) { - printf(" %d tests ailed.\n", failed); - } else { - printf(" All tests passed.\n"); - } - - printf("----------------------------------------\n"); - - int64_t result; - - result = i64_mul(tval_g, tval_g); - printf("%20lld * %20lld = %20lld (0x%016llx)\n", tval_g, tval_g, result, result); - result = i64_mul(tval_d, tval_e); - printf("%20lld * %20lld = %20lld (0x%016llx)\n", tval_d, tval_e, result, result); - /* 0xba7a664f13077c9 */ - result = i64_mul(tval_a, tval_b); - printf("%20lld * %20lld = %20lld (0x%016llx)\n", tval_a, tval_b, result, result); - - printf("----------------------------------------\n"); - - return 0; -} diff --git a/test/CodeGen/CellSPU/useful-harnesses/i64operations.h b/test/CodeGen/CellSPU/useful-harnesses/i64operations.h deleted file mode 100644 index 7a02794cd7e0..000000000000 --- a/test/CodeGen/CellSPU/useful-harnesses/i64operations.h +++ /dev/null @@ -1,43 +0,0 @@ -#define TRUE_VAL (!0) -#define FALSE_VAL 0 -#define ARR_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) - -typedef unsigned long long int uint64_t; -typedef long long int int64_t; - -/* ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- */ -struct harness_int64_pred { - const char *fmt_string; - int64_t *lhs; - int64_t *rhs; - int64_t *select_a; - int64_t *select_b; - int expected; - int64_t *select_expected; -}; - -struct harness_uint64_pred { - const char *fmt_string; - uint64_t *lhs; - uint64_t *rhs; - uint64_t *select_a; - uint64_t *select_b; - int expected; - uint64_t *select_expected; -}; - -struct int64_pred_s { - const char *name; - int (*predfunc) (int64_t, int64_t); - int64_t (*selfunc) (int64_t, int64_t, int64_t, int64_t); - struct harness_int64_pred *tests; - int n_tests; -}; - -struct uint64_pred_s { - const char *name; - int (*predfunc) (uint64_t, uint64_t); - uint64_t (*selfunc) (uint64_t, uint64_t, uint64_t, uint64_t); - struct harness_uint64_pred *tests; - int n_tests; -}; diff --git a/test/CodeGen/CellSPU/useful-harnesses/vecoperations.c b/test/CodeGen/CellSPU/useful-harnesses/vecoperations.c deleted file mode 100644 index c4c86e37635d..000000000000 --- a/test/CodeGen/CellSPU/useful-harnesses/vecoperations.c +++ /dev/null @@ -1,179 +0,0 @@ -#include <stdio.h> - -typedef unsigned char v16i8 __attribute__((ext_vector_type(16))); -typedef short v8i16 __attribute__((ext_vector_type(16))); -typedef int v4i32 __attribute__((ext_vector_type(4))); -typedef float v4f32 __attribute__((ext_vector_type(4))); -typedef long long v2i64 __attribute__((ext_vector_type(2))); -typedef double v2f64 __attribute__((ext_vector_type(2))); - -void print_v16i8(const char *str, const v16i8 v) { - union { - unsigned char elts[16]; - v16i8 vec; - } tv; - tv.vec = v; - printf("%s = { %hhu, %hhu, %hhu, %hhu, %hhu, %hhu, %hhu, " - "%hhu, %hhu, %hhu, %hhu, %hhu, %hhu, %hhu, " - "%hhu, %hhu }\n", - str, tv.elts[0], tv.elts[1], tv.elts[2], tv.elts[3], tv.elts[4], tv.elts[5], - tv.elts[6], tv.elts[7], tv.elts[8], tv.elts[9], tv.elts[10], tv.elts[11], - tv.elts[12], tv.elts[13], tv.elts[14], tv.elts[15]); -} - -void print_v16i8_hex(const char *str, const v16i8 v) { - union { - unsigned char elts[16]; - v16i8 vec; - } tv; - tv.vec = v; - printf("%s = { 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, " - "0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, " - "0x%02hhx, 0x%02hhx }\n", - str, tv.elts[0], tv.elts[1], tv.elts[2], tv.elts[3], tv.elts[4], tv.elts[5], - tv.elts[6], tv.elts[7], tv.elts[8], tv.elts[9], tv.elts[10], tv.elts[11], - tv.elts[12], tv.elts[13], tv.elts[14], tv.elts[15]); -} - -void print_v8i16_hex(const char *str, v8i16 v) { - union { - short elts[8]; - v8i16 vec; - } tv; - tv.vec = v; - printf("%s = { 0x%04hx, 0x%04hx, 0x%04hx, 0x%04hx, 0x%04hx, " - "0x%04hx, 0x%04hx, 0x%04hx }\n", - str, tv.elts[0], tv.elts[1], tv.elts[2], tv.elts[3], tv.elts[4], - tv.elts[5], tv.elts[6], tv.elts[7]); -} - -void print_v4i32(const char *str, v4i32 v) { - printf("%s = { %d, %d, %d, %d }\n", str, v.x, v.y, v.z, v.w); -} - -void print_v4f32(const char *str, v4f32 v) { - printf("%s = { %f, %f, %f, %f }\n", str, v.x, v.y, v.z, v.w); -} - -void print_v2i64(const char *str, v2i64 v) { - printf("%s = { %lld, %lld }\n", str, v.x, v.y); -} - -void print_v2f64(const char *str, v2f64 v) { - printf("%s = { %g, %g }\n", str, v.x, v.y); -} - -/*----------------------------------------------------------------------*/ - -v16i8 v16i8_mpy(v16i8 v1, v16i8 v2) { - return v1 * v2; -} - -v16i8 v16i8_add(v16i8 v1, v16i8 v2) { - return v1 + v2; -} - -v4i32 v4i32_shuffle_1(v4i32 a) { - v4i32 c2 = a.yzwx; - return c2; -} - -v4i32 v4i32_shuffle_2(v4i32 a) { - v4i32 c2 = a.zwxy; - return c2; -} - -v4i32 v4i32_shuffle_3(v4i32 a) { - v4i32 c2 = a.wxyz; - return c2; -} - -v4i32 v4i32_shuffle_4(v4i32 a) { - v4i32 c2 = a.xyzw; - return c2; -} - -v4i32 v4i32_shuffle_5(v4i32 a) { - v4i32 c2 = a.xwzy; - return c2; -} - -v4f32 v4f32_shuffle_1(v4f32 a) { - v4f32 c2 = a.yzwx; - return c2; -} - -v4f32 v4f32_shuffle_2(v4f32 a) { - v4f32 c2 = a.zwxy; - return c2; -} - -v4f32 v4f32_shuffle_3(v4f32 a) { - v4f32 c2 = a.wxyz; - return c2; -} - -v4f32 v4f32_shuffle_4(v4f32 a) { - v4f32 c2 = a.xyzw; - return c2; -} - -v4f32 v4f32_shuffle_5(v4f32 a) { - v4f32 c2 = a.xwzy; - return c2; -} - -v2i64 v2i64_shuffle(v2i64 a) { - v2i64 c2 = a.yx; - return c2; -} - -v2f64 v2f64_shuffle(v2f64 a) { - v2f64 c2 = a.yx; - return c2; -} - -int main(void) { - v16i8 v00 = { 0xf4, 0xad, 0x01, 0xe9, 0x51, 0x78, 0xc1, 0x8a, - 0x94, 0x7c, 0x49, 0x6c, 0x21, 0x32, 0xb2, 0x04 }; - v16i8 va0 = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; - v16i8 va1 = { 0x11, 0x83, 0x4b, 0x63, 0xff, 0x90, 0x32, 0xe5, - 0x5a, 0xaa, 0x20, 0x01, 0x0d, 0x15, 0x77, 0x05 }; - v8i16 v01 = { 0x1a87, 0x0a14, 0x5014, 0xfff0, - 0xe194, 0x0184, 0x801e, 0x5940 }; - v4i32 v1 = { 1, 2, 3, 4 }; - v4f32 v2 = { 1.0, 2.0, 3.0, 4.0 }; - v2i64 v3 = { 691043ll, 910301513ll }; - v2f64 v4 = { 5.8e56, 9.103e-62 }; - - puts("---- vector tests start ----"); - - print_v16i8_hex("v00 ", v00); - print_v16i8_hex("va0 ", va0); - print_v16i8_hex("va1 ", va1); - print_v16i8_hex("va0 x va1 ", v16i8_mpy(va0, va1)); - print_v16i8_hex("va0 + va1 ", v16i8_add(va0, va1)); - print_v8i16_hex("v01 ", v01); - - print_v4i32("v4i32_shuffle_1(1, 2, 3, 4)", v4i32_shuffle_1(v1)); - print_v4i32("v4i32_shuffle_2(1, 2, 3, 4)", v4i32_shuffle_2(v1)); - print_v4i32("v4i32_shuffle_3(1, 2, 3, 4)", v4i32_shuffle_3(v1)); - print_v4i32("v4i32_shuffle_4(1, 2, 3, 4)", v4i32_shuffle_4(v1)); - print_v4i32("v4i32_shuffle_5(1, 2, 3, 4)", v4i32_shuffle_5(v1)); - - print_v4f32("v4f32_shuffle_1(1, 2, 3, 4)", v4f32_shuffle_1(v2)); - print_v4f32("v4f32_shuffle_2(1, 2, 3, 4)", v4f32_shuffle_2(v2)); - print_v4f32("v4f32_shuffle_3(1, 2, 3, 4)", v4f32_shuffle_3(v2)); - print_v4f32("v4f32_shuffle_4(1, 2, 3, 4)", v4f32_shuffle_4(v2)); - print_v4f32("v4f32_shuffle_5(1, 2, 3, 4)", v4f32_shuffle_5(v2)); - - print_v2i64("v3 ", v3); - print_v2i64("v2i64_shuffle ", v2i64_shuffle(v3)); - print_v2f64("v4 ", v4); - print_v2f64("v2f64_shuffle ", v2f64_shuffle(v4)); - - puts("---- vector tests end ----"); - - return 0; -} diff --git a/test/CodeGen/CellSPU/v2f32.ll b/test/CodeGen/CellSPU/v2f32.ll deleted file mode 100644 index 09e15ffbc75d..000000000000 --- a/test/CodeGen/CellSPU/v2f32.ll +++ /dev/null @@ -1,78 +0,0 @@ -;RUN: llc --march=cellspu %s -o - | FileCheck %s -%vec = type <2 x float> - -define %vec @test_ret(%vec %param) -{ -;CHECK: bi $lr - ret %vec %param -} - -define %vec @test_add(%vec %param) -{ -;CHECK: fa {{\$.}}, $3, $3 - %1 = fadd %vec %param, %param -;CHECK: bi $lr - ret %vec %1 -} - -define %vec @test_sub(%vec %param) -{ -;CHECK: fs {{\$.}}, $3, $3 - %1 = fsub %vec %param, %param - -;CHECK: bi $lr - ret %vec %1 -} - -define %vec @test_mul(%vec %param) -{ -;CHECK: fm {{\$.}}, $3, $3 - %1 = fmul %vec %param, %param - -;CHECK: bi $lr - ret %vec %1 -} - -; CHECK: test_splat: -define %vec @test_splat(float %param ) { -;CHECK: lqa -;CHECK: shufb - %sv = insertelement <1 x float> undef, float %param, i32 0 - %rv = shufflevector <1 x float> %sv, <1 x float> undef, <2 x i32> zeroinitializer -;CHECK: bi $lr - ret %vec %rv -} - -define void @test_store(%vec %val, %vec* %ptr){ -; CHECK: test_store: -;CHECK: stqd - store %vec zeroinitializer, %vec* null - -;CHECK: stqd $3, 0(${{.*}}) -;CHECK: bi $lr - store %vec %val, %vec* %ptr - ret void -} - -; CHECK: test_insert: -define %vec @test_insert(){ -;CHECK: cwd -;CHECK: shufb $3 - %rv = insertelement %vec undef, float 0.0e+00, i32 undef -;CHECK: bi $lr - ret %vec %rv -} - -; CHECK: test_unaligned_store: - -define void @test_unaligned_store() { -;CHECK: cdd -;CHECK: shufb -;CHECK: stqd - %data = alloca [4 x float], align 16 ; <[4 x float]*> [#uses=1] - %ptr = getelementptr [4 x float]* %data, i32 0, i32 2 ; <float*> [#uses=1] - %vptr = bitcast float* %ptr to <2 x float>* ; <[1 x <2 x float>]*> [#uses=1] - store <2 x float> zeroinitializer, <2 x float>* %vptr - ret void -} - diff --git a/test/CodeGen/CellSPU/v2i32.ll b/test/CodeGen/CellSPU/v2i32.ll deleted file mode 100644 index 9c5b89613df9..000000000000 --- a/test/CodeGen/CellSPU/v2i32.ll +++ /dev/null @@ -1,61 +0,0 @@ -;RUN: llc --march=cellspu %s -o - | FileCheck %s -%vec = type <2 x i32> - -define %vec @test_ret(%vec %param) -{ -;CHECK: bi $lr - ret %vec %param -} - -define %vec @test_add(%vec %param) -{ -;CHECK: shufb -;CHECK: addx - %1 = add %vec %param, %param -;CHECK: bi $lr - ret %vec %1 -} - -define %vec @test_sub(%vec %param) -{ - %1 = sub %vec %param, <i32 1, i32 1> -;CHECK: bi $lr - ret %vec %1 -} - -define %vec @test_mul(%vec %param) -{ - %1 = mul %vec %param, %param -;CHECK: bi $lr - ret %vec %1 -} - -define <2 x i32> @test_splat(i32 %param ) { -;see svn log for why this is here... -;CHECK-NOT: or $3, $3, $3 -;CHECK: lqa -;CHECK: shufb - %sv = insertelement <1 x i32> undef, i32 %param, i32 0 - %rv = shufflevector <1 x i32> %sv, <1 x i32> undef, <2 x i32> zeroinitializer -;CHECK: bi $lr - ret <2 x i32> %rv -} - -define i32 @test_extract() { -;CHECK: shufb $3 - %rv = extractelement <2 x i32> zeroinitializer, i32 undef ; <i32> [#uses=1] -;CHECK: bi $lr - ret i32 %rv -} - -define void @test_store( %vec %val, %vec* %ptr) -{ - store %vec %val, %vec* %ptr - ret void -} - -define <2 x i32>* @test_alignment( [2 x <2 x i32>]* %ptr) -{ - %rv = getelementptr [2 x <2 x i32>]* %ptr, i32 0, i32 1 - ret <2 x i32>* %rv -} diff --git a/test/CodeGen/CellSPU/vec_const.ll b/test/CodeGen/CellSPU/vec_const.ll deleted file mode 100644 index 24c05c684084..000000000000 --- a/test/CodeGen/CellSPU/vec_const.ll +++ /dev/null @@ -1,154 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: llc < %s -march=cellspu -mattr=large_mem > %t2.s -; RUN: grep -w il %t1.s | count 3 -; RUN: grep ilhu %t1.s | count 8 -; RUN: grep -w ilh %t1.s | count 5 -; RUN: grep iohl %t1.s | count 7 -; RUN: grep lqa %t1.s | count 6 -; RUN: grep 24672 %t1.s | count 2 -; RUN: grep 16429 %t1.s | count 1 -; RUN: grep 63572 %t1.s | count 1 -; RUN: grep 4660 %t1.s | count 1 -; RUN: grep 22136 %t1.s | count 1 -; RUN: grep 43981 %t1.s | count 1 -; RUN: grep 61202 %t1.s | count 1 -; RUN: grep 16393 %t1.s | count 1 -; RUN: grep 8699 %t1.s | count 1 -; RUN: grep 21572 %t1.s | count 1 -; RUN: grep 11544 %t1.s | count 1 -; RUN: grep 1311768467750121234 %t1.s | count 1 -; RUN: grep lqd %t2.s | count 6 - -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128" -target triple = "spu-unknown-elf" - -; Vector constant load tests: - -; IL <reg>, 2 -define <4 x i32> @v4i32_constvec() { - ret <4 x i32> < i32 2, i32 2, i32 2, i32 2 > -} - -; Spill to constant pool -define <4 x i32> @v4i32_constpool() { - ret <4 x i32> < i32 2, i32 1, i32 1, i32 2 > -} - -; Max negative range for IL -define <4 x i32> @v4i32_constvec_2() { - ret <4 x i32> < i32 -32768, i32 -32768, i32 -32768, i32 -32768 > -} - -; ILHU <reg>, 73 (0x49) -; 4784128 = 0x490000 -define <4 x i32> @v4i32_constvec_3() { - ret <4 x i32> < i32 4784128, i32 4784128, - i32 4784128, i32 4784128 > -} - -; ILHU <reg>, 61 (0x3d) -; IOHL <reg>, 15395 (0x3c23) -define <4 x i32> @v4i32_constvec_4() { - ret <4 x i32> < i32 4013091, i32 4013091, - i32 4013091, i32 4013091 > -} - -; ILHU <reg>, 0x5050 (20560) -; IOHL <reg>, 0x5050 (20560) -; Tests for whether we expand the size of the bit pattern properly, because -; this could be interpreted as an i8 pattern (0x50) -define <4 x i32> @v4i32_constvec_5() { - ret <4 x i32> < i32 1347440720, i32 1347440720, - i32 1347440720, i32 1347440720 > -} - -; ILH -define <8 x i16> @v8i16_constvec_1() { - ret <8 x i16> < i16 32767, i16 32767, i16 32767, i16 32767, - i16 32767, i16 32767, i16 32767, i16 32767 > -} - -; ILH -define <8 x i16> @v8i16_constvec_2() { - ret <8 x i16> < i16 511, i16 511, i16 511, i16 511, i16 511, - i16 511, i16 511, i16 511 > -} - -; ILH -define <8 x i16> @v8i16_constvec_3() { - ret <8 x i16> < i16 -512, i16 -512, i16 -512, i16 -512, i16 -512, - i16 -512, i16 -512, i16 -512 > -} - -; ILH <reg>, 24672 (0x6060) -; Tests whether we expand the size of the bit pattern properly, because -; this could be interpreted as an i8 pattern (0x60) -define <8 x i16> @v8i16_constvec_4() { - ret <8 x i16> < i16 24672, i16 24672, i16 24672, i16 24672, i16 24672, - i16 24672, i16 24672, i16 24672 > -} - -; ILH <reg>, 24672 (0x6060) -; Tests whether we expand the size of the bit pattern properly, because -; this is an i8 pattern but has to be expanded out to i16 to load it -; properly into the vector register. -define <16 x i8> @v16i8_constvec_1() { - ret <16 x i8> < i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, - i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96 > -} - -define <4 x float> @v4f32_constvec_1() { -entry: - ret <4 x float> < float 0x4005BF0A80000000, - float 0x4005BF0A80000000, - float 0x4005BF0A80000000, - float 0x4005BF0A80000000 > -} - -define <4 x float> @v4f32_constvec_2() { -entry: - ret <4 x float> < float 0.000000e+00, - float 0.000000e+00, - float 0.000000e+00, - float 0.000000e+00 > -} - - -define <4 x float> @v4f32_constvec_3() { -entry: - ret <4 x float> < float 0x4005BF0A80000000, - float 0x3810000000000000, - float 0x47EFFFFFE0000000, - float 0x400921FB60000000 > -} - -; 1311768467750121234 => 0x 12345678 abcdef12 -; HI32_hi: 4660 -; HI32_lo: 22136 -; LO32_hi: 43981 -; LO32_lo: 61202 -define <2 x i64> @i64_constvec_1() { -entry: - ret <2 x i64> < i64 1311768467750121234, - i64 1311768467750121234 > -} - -define <2 x i64> @i64_constvec_2() { -entry: - ret <2 x i64> < i64 1, i64 1311768467750121234 > -} - -define <2 x double> @f64_constvec_1() { -entry: - ret <2 x double> < double 0x400921fb54442d18, - double 0xbff6a09e667f3bcd > -} - -; 0x400921fb 54442d18 -> -; (ILHU 0x4009 [16393]/IOHL 0x21fb [ 8699]) -; (ILHU 0x5444 [21572]/IOHL 0x2d18 [11544]) -define <2 x double> @f64_constvec_2() { -entry: - ret <2 x double> < double 0x400921fb54442d18, - double 0x400921fb54442d18 > -} diff --git a/test/CodeGen/CellSPU/vecinsert.ll b/test/CodeGen/CellSPU/vecinsert.ll deleted file mode 100644 index 8dcab1d84c9c..000000000000 --- a/test/CodeGen/CellSPU/vecinsert.ll +++ /dev/null @@ -1,131 +0,0 @@ -; RUN: llc < %s -march=cellspu > %t1.s -; RUN: grep cbd %t1.s | count 5 -; RUN: grep chd %t1.s | count 5 -; RUN: grep cwd %t1.s | count 11 -; RUN: grep -w il %t1.s | count 5 -; RUN: grep -w ilh %t1.s | count 6 -; RUN: grep iohl %t1.s | count 1 -; RUN: grep ilhu %t1.s | count 4 -; RUN: grep shufb %t1.s | count 27 -; RUN: grep 17219 %t1.s | count 1 -; RUN: grep 22598 %t1.s | count 1 -; RUN: grep -- -39 %t1.s | count 1 -; RUN: grep 24 %t1.s | count 1 -; RUN: grep 1159 %t1.s | count 1 -; RUN: FileCheck %s < %t1.s - -; ModuleID = 'vecinsert.bc' -target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128" -target triple = "spu-unknown-elf" - -; 67 -> 0x43, as 8-bit vector constant load = 0x4343 (17219)0x4343 -define <16 x i8> @test_v16i8(<16 x i8> %P, i8 %x) { -entry: - %tmp1 = insertelement <16 x i8> %P, i8 %x, i32 10 - %tmp1.1 = insertelement <16 x i8> %tmp1, i8 67, i32 7 - %tmp1.2 = insertelement <16 x i8> %tmp1.1, i8 %x, i32 15 - ret <16 x i8> %tmp1.2 -} - -; 22598 -> 0x5846 -define <8 x i16> @test_v8i16(<8 x i16> %P, i16 %x) { -entry: - %tmp1 = insertelement <8 x i16> %P, i16 %x, i32 5 - %tmp1.1 = insertelement <8 x i16> %tmp1, i16 22598, i32 7 - %tmp1.2 = insertelement <8 x i16> %tmp1.1, i16 %x, i32 2 - ret <8 x i16> %tmp1.2 -} - -; 1574023 -> 0x180487 (ILHU 24/IOHL 1159) -define <4 x i32> @test_v4i32_1(<4 x i32> %P, i32 %x) { -entry: - %tmp1 = insertelement <4 x i32> %P, i32 %x, i32 2 - %tmp1.1 = insertelement <4 x i32> %tmp1, i32 1574023, i32 1 - %tmp1.2 = insertelement <4 x i32> %tmp1.1, i32 %x, i32 3 - ret <4 x i32> %tmp1.2 -} - -; Should generate IL for the load -define <4 x i32> @test_v4i32_2(<4 x i32> %P, i32 %x) { -entry: - %tmp1 = insertelement <4 x i32> %P, i32 %x, i32 2 - %tmp1.1 = insertelement <4 x i32> %tmp1, i32 -39, i32 1 - %tmp1.2 = insertelement <4 x i32> %tmp1.1, i32 %x, i32 3 - ret <4 x i32> %tmp1.2 -} - -define void @variable_v16i8_1(<16 x i8>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <16 x i8>* %a, i32 %i - %tmp2 = load <16 x i8>* %arrayidx - %tmp3 = insertelement <16 x i8> %tmp2, i8 1, i32 1 - %tmp8 = insertelement <16 x i8> %tmp3, i8 2, i32 11 - store <16 x i8> %tmp8, <16 x i8>* %arrayidx - ret void -} - -define void @variable_v8i16_1(<8 x i16>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <8 x i16>* %a, i32 %i - %tmp2 = load <8 x i16>* %arrayidx - %tmp3 = insertelement <8 x i16> %tmp2, i16 1, i32 1 - %tmp8 = insertelement <8 x i16> %tmp3, i16 2, i32 6 - store <8 x i16> %tmp8, <8 x i16>* %arrayidx - ret void -} - -define void @variable_v4i32_1(<4 x i32>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <4 x i32>* %a, i32 %i - %tmp2 = load <4 x i32>* %arrayidx - %tmp3 = insertelement <4 x i32> %tmp2, i32 1, i32 1 - %tmp8 = insertelement <4 x i32> %tmp3, i32 2, i32 2 - store <4 x i32> %tmp8, <4 x i32>* %arrayidx - ret void -} - -define void @variable_v4f32_1(<4 x float>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <4 x float>* %a, i32 %i - %tmp2 = load <4 x float>* %arrayidx - %tmp3 = insertelement <4 x float> %tmp2, float 1.000000e+00, i32 1 - %tmp8 = insertelement <4 x float> %tmp3, float 2.000000e+00, i32 2 - store <4 x float> %tmp8, <4 x float>* %arrayidx - ret void -} - -define void @variable_v2i64_1(<2 x i64>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <2 x i64>* %a, i32 %i - %tmp2 = load <2 x i64>* %arrayidx - %tmp3 = insertelement <2 x i64> %tmp2, i64 615, i32 0 - store <2 x i64> %tmp3, <2 x i64>* %arrayidx - ret void -} - -define void @variable_v2i64_2(<2 x i64>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <2 x i64>* %a, i32 %i - %tmp2 = load <2 x i64>* %arrayidx - %tmp3 = insertelement <2 x i64> %tmp2, i64 615, i32 1 - store <2 x i64> %tmp3, <2 x i64>* %arrayidx - ret void -} - -define void @variable_v2f64_1(<2 x double>* %a, i32 %i) nounwind { -entry: - %arrayidx = getelementptr <2 x double>* %a, i32 %i - %tmp2 = load <2 x double>* %arrayidx - %tmp3 = insertelement <2 x double> %tmp2, double 1.000000e+00, i32 1 - store <2 x double> %tmp3, <2 x double>* %arrayidx - ret void -} - -define <4 x i32> @undef_v4i32( i32 %param ) { - ;CHECK: cwd - ;CHECK: lqa - ;CHECK: shufb - %val = insertelement <4 x i32> <i32 1, i32 2, i32 3, i32 4>, i32 %param, i32 undef - ret <4 x i32> %val -} - diff --git a/test/CodeGen/Generic/2008-02-20-MatchingMem.ll b/test/CodeGen/Generic/2008-02-20-MatchingMem.ll index da1aeb556a39..7ffb734c713a 100644 --- a/test/CodeGen/Generic/2008-02-20-MatchingMem.ll +++ b/test/CodeGen/Generic/2008-02-20-MatchingMem.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s ; PR1133 +; XFAIL: hexagon define void @test(i32* %X) nounwind { entry: %tmp1 = getelementptr i32* %X, i32 10 ; <i32*> [#uses=2] diff --git a/test/CodeGen/Generic/2013-03-20-APFloatCrash.ll b/test/CodeGen/Generic/2013-03-20-APFloatCrash.ll new file mode 100644 index 000000000000..a1aed0e3a4b6 --- /dev/null +++ b/test/CodeGen/Generic/2013-03-20-APFloatCrash.ll @@ -0,0 +1,7 @@ +; RUN: llc < %s + +define internal i1 @f(float %s) { +entry: + %c = fcmp ogt float %s, 0x41EFFFFFE0000000 + ret i1 %c +} diff --git a/test/CodeGen/Generic/dag-combine-crash.ll b/test/CodeGen/Generic/dag-combine-crash.ll new file mode 100644 index 000000000000..a7810b5c05e2 --- /dev/null +++ b/test/CodeGen/Generic/dag-combine-crash.ll @@ -0,0 +1,21 @@ +; RUN: llc < %s + +define void @main() { +if.end: + br label %block.i.i + +block.i.i: + %tmpbb = load i8* undef + %tmp54 = zext i8 %tmpbb to i64 + %tmp59 = and i64 %tmp54, 8 + %tmp60 = add i64 %tmp59, 3691045929300498764 + %tmp62 = sub i64 %tmp60, 3456506383779105993 + %tmp63 = xor i64 1050774804270620004, %tmp62 + %tmp65 = xor i64 %tmp62, 234539545521392771 + %tmp67 = or i64 %tmp65, %tmp63 + %tmp71 = xor i64 %tmp67, 6781485823212740913 + %tmp72 = trunc i64 %tmp71 to i32 + %tmp74 = lshr i32 2, %tmp72 + store i32 %tmp74, i32* undef + br label %block.i.i +} diff --git a/test/CodeGen/Generic/inline-asm-mem-clobber.ll b/test/CodeGen/Generic/inline-asm-mem-clobber.ll new file mode 100644 index 000000000000..e523d031dc65 --- /dev/null +++ b/test/CodeGen/Generic/inline-asm-mem-clobber.ll @@ -0,0 +1,21 @@ +; RUN: llc -O2 < %s | FileCheck %s + +@G = common global i32 0, align 4 + +define i32 @foo(i8* %p) nounwind uwtable { +entry: + %p.addr = alloca i8*, align 8 + %rv = alloca i32, align 4 + store i8* %p, i8** %p.addr, align 8 + store i32 0, i32* @G, align 4 + %0 = load i8** %p.addr, align 8 +; CHECK: blah + %1 = call i32 asm "blah", "=r,r,~{memory}"(i8* %0) nounwind +; CHECK: @G + store i32 %1, i32* %rv, align 4 + %2 = load i32* %rv, align 4 + %3 = load i32* @G, align 4 + %add = add nsw i32 %2, %3 + ret i32 %add +} + diff --git a/test/CodeGen/Generic/multiple-return-values-cross-block-with-invoke.ll b/test/CodeGen/Generic/multiple-return-values-cross-block-with-invoke.ll index e709080bfc5a..a135c625fccc 100644 --- a/test/CodeGen/Generic/multiple-return-values-cross-block-with-invoke.ll +++ b/test/CodeGen/Generic/multiple-return-values-cross-block-with-invoke.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s - +; XFAIL: hexagon declare { i64, double } @wild() define void @foo(i64* %p, double* %q) nounwind { diff --git a/test/CodeGen/Generic/select-cc.ll b/test/CodeGen/Generic/select-cc.ll index b653e2a46dcf..7510f701b147 100644 --- a/test/CodeGen/Generic/select-cc.ll +++ b/test/CodeGen/Generic/select-cc.ll @@ -1,6 +1,6 @@ ; RUN: llc < %s ; PR2504 - +; XFAIL: hexagon define <2 x double> @vector_select(<2 x double> %x, <2 x double> %y) nounwind { %x.lo = extractelement <2 x double> %x, i32 0 ; <double> [#uses=1] %x.lo.ge = fcmp oge double %x.lo, 0.000000e+00 ; <i1> [#uses=1] diff --git a/test/CodeGen/Generic/vector.ll b/test/CodeGen/Generic/vector.ll index a0f9a02d4cbb..bc7c7d00a11c 100644 --- a/test/CodeGen/Generic/vector.ll +++ b/test/CodeGen/Generic/vector.ll @@ -1,6 +1,6 @@ ; Test that vectors are scalarized/lowered correctly. ; RUN: llc < %s - +; XFAIL: hexagon %d8 = type <8 x double> %f1 = type <1 x float> @@ -152,3 +152,8 @@ define void @splat_i4(%i4* %P, %i4* %Q, i32 %X) { store %i4 %R, %i4* %P ret void } + +define <2 x i32*> @vector_gep(<2 x [3 x {i32, i32}]*> %a) { + %w = getelementptr <2 x [3 x {i32, i32}]*> %a, <2 x i32> <i32 1, i32 2>, <2 x i32> <i32 2, i32 3>, <2 x i32> <i32 1, i32 1> + ret <2 x i32*> %w +} diff --git a/test/CodeGen/Hexagon/absaddr-store.ll b/test/CodeGen/Hexagon/absaddr-store.ll new file mode 100644 index 000000000000..5c2554df8aeb --- /dev/null +++ b/test/CodeGen/Hexagon/absaddr-store.ll @@ -0,0 +1,46 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we generate load instructions with absolute addressing mode. + +@a = external global i32 +@b = external global i8 +@c = external global i16 +@d = external global i64 + +define zeroext i8 @absStoreByte() nounwind { +; CHECK: memb(##b){{ *}}={{ *}}r{{[0-9]+}} +entry: + %0 = load i8* @b, align 1 + %conv = zext i8 %0 to i32 + %mul = mul nsw i32 100, %conv + %conv1 = trunc i32 %mul to i8 + store i8 %conv1, i8* @b, align 1 + ret i8 %conv1 +} + +define signext i16 @absStoreHalf() nounwind { +; CHECK: memh(##c){{ *}}={{ *}}r{{[0-9]+}} +entry: + %0 = load i16* @c, align 2 + %conv = sext i16 %0 to i32 + %mul = mul nsw i32 100, %conv + %conv1 = trunc i32 %mul to i16 + store i16 %conv1, i16* @c, align 2 + ret i16 %conv1 +} + +define i32 @absStoreWord() nounwind { +; CHECK: memw(##a){{ *}}={{ *}}r{{[0-9]+}} +entry: + %0 = load i32* @a, align 4 + %mul = mul nsw i32 100, %0 + store i32 %mul, i32* @a, align 4 + ret i32 %mul +} + +define void @absStoreDouble() nounwind { +; CHECK: memd(##d){{ *}}={{ *}}r{{[0-9]+}}:{{[0-9]+}} +entry: + store i64 100, i64* @d, align 8 + ret void +} + diff --git a/test/CodeGen/Hexagon/adde.ll b/test/CodeGen/Hexagon/adde.ll new file mode 100644 index 000000000000..9cee3e215d62 --- /dev/null +++ b/test/CodeGen/Hexagon/adde.ll @@ -0,0 +1,34 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +; CHECK: r{{[0-9]+:[0-9]+}} = #0 +; CHECK: r{{[0-9]+:[0-9]+}} = #1 +; CHECK: r{{[0-9]+:[0-9]+}} = add(r{{[0-9]+:[0-9]+}}, r{{[0-9]+:[0-9]+}}) +; CHECK: p{{[0-9]+}} = cmp.gtu(r{{[0-9]+:[0-9]+}}, r{{[0-9]+:[0-9]+}}) +; CHECK: p{{[0-9]+}} = cmp.gtu(r{{[0-9]+:[0-9]+}}, r{{[0-9]+:[0-9]+}}) +; CHECK: r{{[0-9]+}} = mux(p{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}}) +; CHECK: r{{[0-9]+}} = mux(p{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}}) +; CHECK: r{{[0-9]+:[0-9]+}} = combine(r{{[0-9]+}}, r{{[0-9]+}}) +; CHECK: r{{[0-9]+}} = mux(p{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}}) +; CHECK: r{{[0-9]+}} = mux(p{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}}) +; CHECK: r{{[0-9]+:[0-9]+}} = combine(r{{[0-9]+}}, r{{[0-9]+}}) +; CHECK: r{{[0-9]+:[0-9]+}} = add(r{{[0-9]+:[0-9]+}}, r{{[0-9]+:[0-9]+}}) + + +define void @check_adde_addc (i64 %AL, i64 %AH, i64 %BL, i64 %BH, i64* %RL, i64* %RH) { +entry: + %tmp1 = zext i64 %AL to i128 + %tmp23 = zext i64 %AH to i128 + %tmp4 = shl i128 %tmp23, 64 + %tmp5 = or i128 %tmp4, %tmp1 + %tmp67 = zext i64 %BL to i128 + %tmp89 = zext i64 %BH to i128 + %tmp11 = shl i128 %tmp89, 64 + %tmp12 = or i128 %tmp11, %tmp67 + %tmp15 = add i128 %tmp12, %tmp5 + %tmp1617 = trunc i128 %tmp15 to i64 + store i64 %tmp1617, i64* %RL + %tmp21 = lshr i128 %tmp15, 64 + %tmp2122 = trunc i128 %tmp21 to i64 + store i64 %tmp2122, i64* %RH + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/Hexagon/args.ll b/test/CodeGen/Hexagon/args.ll index 8a6efb620ec0..f8c9e44c831d 100644 --- a/test/CodeGen/Hexagon/args.ll +++ b/test/CodeGen/Hexagon/args.ll @@ -1,12 +1,11 @@ -; RUN: llc -march=hexagon -mcpu=hexagonv4 -disable-hexagon-misched < %s | FileCheck %s -; CHECK: r[[T0:[0-9]+]] = #7 -; CHECK: memw(r29 + #0) = r[[T0]] -; CHECK: r5 = #6 +; RUN: llc -march=hexagon -mcpu=hexagonv4 -disable-dfa-sched -disable-hexagon-misched < %s | FileCheck %s +; CHECK: memw(r29{{ *}}+{{ *}}#0){{ *}}={{ *}}#7 ; CHECK: r0 = #1 ; CHECK: r1 = #2 ; CHECK: r2 = #3 ; CHECK: r3 = #4 ; CHECK: r4 = #5 +; CHECK: r5 = #6 define void @foo() nounwind { diff --git a/test/CodeGen/Hexagon/ashift-left-right.ll b/test/CodeGen/Hexagon/ashift-left-right.ll new file mode 100644 index 000000000000..7c41bc7bbf3b --- /dev/null +++ b/test/CodeGen/Hexagon/ashift-left-right.ll @@ -0,0 +1,21 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s + +define i32 @foo(i32 %a, i32 %b) nounwind readnone { +; CHECK: lsl +; CHECK: aslh +entry: + %shl1 = shl i32 16, %a + %shl2 = shl i32 %b, 16 + %ret = mul i32 %shl1, %shl2 + ret i32 %ret +} + +define i32 @bar(i32 %a, i32 %b) nounwind readnone { +; CHECK: asrh +; CHECK: lsr +entry: + %shl1 = ashr i32 16, %a + %shl2 = ashr i32 %b, 16 + %ret = mul i32 %shl1, %shl2 + ret i32 %ret +} diff --git a/test/CodeGen/Hexagon/block-addr.ll b/test/CodeGen/Hexagon/block-addr.ll new file mode 100644 index 000000000000..54a12bf48448 --- /dev/null +++ b/test/CodeGen/Hexagon/block-addr.ll @@ -0,0 +1,64 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +; CHECK: r{{[0-9]+}} = CONST32(#.LJTI{{[0-9]+_[0-9]+}}) +; CHECK: r{{[0-9]+}} = memw(r{{[0-9]+}}+r{{[0-9]+<<#[0-9]+}}) +; CHECK: jumpr r{{[0-9]+}} + +define void @main() #0 { +entry: + %ret = alloca i32, align 4 + br label %while.body + +while.body: + %ret.0.load17 = load volatile i32* %ret, align 4 + switch i32 %ret.0.load17, label %label6 [ + i32 0, label %label0 + i32 1, label %label1 + i32 2, label %label2 + i32 3, label %label3 + i32 4, label %label4 + i32 5, label %label5 + ] + +label0: + %ret.0.load18 = load volatile i32* %ret, align 4 + %inc = add nsw i32 %ret.0.load18, 1 + store volatile i32 %inc, i32* %ret, align 4 + br label %while.body + +label1: + %ret.0.load19 = load volatile i32* %ret, align 4 + %inc2 = add nsw i32 %ret.0.load19, 1 + store volatile i32 %inc2, i32* %ret, align 4 + br label %while.body + +label2: + %ret.0.load20 = load volatile i32* %ret, align 4 + %inc4 = add nsw i32 %ret.0.load20, 1 + store volatile i32 %inc4, i32* %ret, align 4 + br label %while.body + +label3: + %ret.0.load21 = load volatile i32* %ret, align 4 + %inc6 = add nsw i32 %ret.0.load21, 1 + store volatile i32 %inc6, i32* %ret, align 4 + br label %while.body + +label4: + %ret.0.load22 = load volatile i32* %ret, align 4 + %inc8 = add nsw i32 %ret.0.load22, 1 + store volatile i32 %inc8, i32* %ret, align 4 + br label %while.body + +label5: + %ret.0.load23 = load volatile i32* %ret, align 4 + %inc10 = add nsw i32 %ret.0.load23, 1 + store volatile i32 %inc10, i32* %ret, align 4 + br label %while.body + +label6: + store volatile i32 0, i32* %ret, align 4 + br label %while.body +} + +attributes #0 = { noreturn nounwind "target-cpu"="hexagonv4" } diff --git a/test/CodeGen/Hexagon/cext-check.ll b/test/CodeGen/Hexagon/cext-check.ll new file mode 100644 index 000000000000..7c4b19e5a402 --- /dev/null +++ b/test/CodeGen/Hexagon/cext-check.ll @@ -0,0 +1,57 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we constant extended instructions only when necessary. + +define i32 @cext_test1(i32* %a) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memw(r{{[0-9]+}}+##8000) +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}add(r{{[0-9]+}}{{ *}},{{ *}}##300000) +; CHECK-NOT: r{{[0-9]+}}{{ *}}={{ *}}memw(r{{[0-9]+}}+##4092) +; CHECK-NOT: r{{[0-9]+}}{{ *}}={{ *}}add(r{{[0-9]+}}{{ *}},{{ *}}##300) +entry: + %0 = load i32* %a, align 4 + %tobool = icmp ne i32 %0, 0 + br i1 %tobool, label %if.then, label %if.end + +if.then: + %arrayidx1 = getelementptr inbounds i32* %a, i32 2000 + %1 = load i32* %arrayidx1, align 4 + %add = add nsw i32 %1, 300000 + br label %return + +if.end: + %arrayidx2 = getelementptr inbounds i32* %a, i32 1023 + %2 = load i32* %arrayidx2, align 4 + %add3 = add nsw i32 %2, 300 + br label %return + +return: + %retval.0 = phi i32 [ %add, %if.then ], [ %add3, %if.end ] + ret i32 %retval.0 +} + +define i32 @cext_test2(i8* %a) nounwind { +; CHECK-NOT: r{{[0-9]+}}{{ *}}={{ *}}memub(r{{[0-9]+}}+##1023) +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}add(r{{[0-9]+}}{{ *}},{{ *}}##300000) +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memub(r{{[0-9]+}}+##1024) +; CHECK-NOT: r{{[0-9]+}}{{ *}}={{ *}}add(r{{[0-9]+}}{{ *}},{{ *}}##6000) +entry: + %tobool = icmp ne i8* %a, null + br i1 %tobool, label %if.then, label %if.end + +if.then: + %arrayidx = getelementptr inbounds i8* %a, i32 1023 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 300000 + br label %return + +if.end: + %arrayidx1 = getelementptr inbounds i8* %a, i32 1024 + %1 = load i8* %arrayidx1, align 1 + %conv2 = zext i8 %1 to i32 + %add3 = add nsw i32 %conv2, 6000 + br label %return + +return: + %retval.0 = phi i32 [ %add, %if.then ], [ %add3, %if.end ] + ret i32 %retval.0 +} diff --git a/test/CodeGen/Hexagon/cext-valid-packet1.ll b/test/CodeGen/Hexagon/cext-valid-packet1.ll new file mode 100644 index 000000000000..a479d37e4ae5 --- /dev/null +++ b/test/CodeGen/Hexagon/cext-valid-packet1.ll @@ -0,0 +1,18 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s + +; Check that the packetizer generates valid packets with constant +; extended instructions. +; CHECK: { +; CHECK-NEXT: r{{[0-9]+}}{{ *}}={{ *}}add(r{{[0-9]+}}, ##{{[0-9]+}}) +; CHECK-NEXT: r{{[0-9]+}}{{ *}}={{ *}}add(r{{[0-9]+}}, ##{{[0-9]+}}) +; CHECK-NEXT: } + +define i32 @check-packet1(i32 %a, i32 %b, i32 %c) nounwind readnone { +entry: + %add = add nsw i32 %a, 200000 + %add1 = add nsw i32 %b, 200001 + %add2 = add nsw i32 %c, 200002 + %cmp = icmp sgt i32 %add, %add1 + %b.addr.0 = select i1 %cmp, i32 %add1, i32 %add2 + ret i32 %b.addr.0 +} diff --git a/test/CodeGen/Hexagon/cext-valid-packet2.ll b/test/CodeGen/Hexagon/cext-valid-packet2.ll new file mode 100644 index 000000000000..2788a6b1c865 --- /dev/null +++ b/test/CodeGen/Hexagon/cext-valid-packet2.ll @@ -0,0 +1,43 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that the packetizer generates valid packets with constant +; extended add and base+offset store instructions. + +; CHECK: { +; CHECK-NEXT: r{{[0-9]+}}{{ *}}={{ *}}add(r{{[0-9]+}}, ##{{[0-9]+}}) +; CHECK-NEXT: memw(r{{[0-9]+}}+{{ *}}##{{[0-9]+}}){{ *}}={{ *}}r{{[0-9]+}}.new +; CHECK-NEXT: } + +define i32 @test(i32* nocapture %a, i32* nocapture %b, i32 %c) nounwind { +entry: + %add = add nsw i32 %c, 200002 + %0 = load i32* %a, align 4 + %add1 = add nsw i32 %0, 200000 + %arrayidx2 = getelementptr inbounds i32* %a, i32 3000 + store i32 %add1, i32* %arrayidx2, align 4 + %1 = load i32* %b, align 4 + %add4 = add nsw i32 %1, 200001 + %arrayidx5 = getelementptr inbounds i32* %a, i32 1 + store i32 %add4, i32* %arrayidx5, align 4 + %arrayidx7 = getelementptr inbounds i32* %b, i32 1 + %2 = load i32* %arrayidx7, align 4 + %cmp = icmp sgt i32 %add4, %2 + br i1 %cmp, label %if.then, label %if.else + +if.then: ; preds = %entry + %arrayidx8 = getelementptr inbounds i32* %a, i32 2 + %3 = load i32* %arrayidx8, align 4 + %arrayidx9 = getelementptr inbounds i32* %b, i32 2000 + %4 = load i32* %arrayidx9, align 4 + %sub = sub nsw i32 %3, %4 + %arrayidx10 = getelementptr inbounds i32* %a, i32 4000 + store i32 %sub, i32* %arrayidx10, align 4 + br label %if.end + +if.else: ; preds = %entry + %arrayidx11 = getelementptr inbounds i32* %b, i32 3200 + store i32 %add, i32* %arrayidx11, align 4 + br label %if.end + +if.end: ; preds = %if.else, %if.then + ret i32 %add +} diff --git a/test/CodeGen/Hexagon/cmp-to-genreg.ll b/test/CodeGen/Hexagon/cmp-to-genreg.ll new file mode 100644 index 000000000000..97cf51ce1a2b --- /dev/null +++ b/test/CodeGen/Hexagon/cmp-to-genreg.ll @@ -0,0 +1,34 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we generate compare to general register. + +define i32 @compare1(i32 %a) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}cmp.eq(r{{[0-9]+}},{{ *}}#120) +entry: + %cmp = icmp eq i32 %a, 120 + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +define i32 @compare2(i32 %a) nounwind readnone { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}!cmp.eq(r{{[0-9]+}},{{ *}}#120) +entry: + %cmp = icmp ne i32 %a, 120 + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +define i32 @compare3(i32 %a, i32 %b) nounwind readnone { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}cmp.eq(r{{[0-9]+}},{{ *}}r{{[0-9]+}}) +entry: + %cmp = icmp eq i32 %a, %b + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +define i32 @compare4(i32 %a, i32 %b) nounwind readnone { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}!cmp.eq(r{{[0-9]+}},{{ *}}r{{[0-9]+}}) +entry: + %cmp = icmp ne i32 %a, %b + %conv = zext i1 %cmp to i32 + ret i32 %conv +} diff --git a/test/CodeGen/Hexagon/cmp-to-predreg.ll b/test/CodeGen/Hexagon/cmp-to-predreg.ll new file mode 100644 index 000000000000..d430b901866d --- /dev/null +++ b/test/CodeGen/Hexagon/cmp-to-predreg.ll @@ -0,0 +1,43 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we generate compare to predicate register. + +define i32 @compare1(i32 %a, i32 %b) nounwind { +; CHECK: p{{[0-3]}}{{ *}}={{ *}}!cmp.eq(r{{[0-9]+}},{{ *}}r{{[0-9]+}}) +entry: + %cmp = icmp ne i32 %a, %b + %add = add nsw i32 %a, %b + %sub = sub nsw i32 %a, %b + %add.sub = select i1 %cmp, i32 %add, i32 %sub + ret i32 %add.sub +} + +define i32 @compare2(i32 %a) nounwind { +; CHECK: p{{[0-3]}}{{ *}}={{ *}}!cmp.eq(r{{[0-9]+}},{{ *}}#10) +entry: + %cmp = icmp ne i32 %a, 10 + %add = add nsw i32 %a, 10 + %sub = sub nsw i32 %a, 10 + %add.sub = select i1 %cmp, i32 %add, i32 %sub + ret i32 %add.sub +} + +define i32 @compare3(i32 %a, i32 %b) nounwind { +; CHECK: p{{[0-3]}}{{ *}}={{ *}}cmp.gt(r{{[0-9]+}},{{ *}}r{{[0-9]+}}) +entry: + %cmp = icmp sgt i32 %a, %b + %sub = sub nsw i32 %a, %b + %add = add nsw i32 %a, %b + %sub.add = select i1 %cmp, i32 %sub, i32 %add + ret i32 %sub.add +} + +define i32 @compare4(i32 %a) nounwind { +; CHECK: p{{[0-3]}}{{ *}}={{ *}}cmp.gt(r{{[0-9]+}},{{ *}}#10) +entry: + %cmp = icmp sgt i32 %a, 10 + %sub = sub nsw i32 %a, 10 + %add = add nsw i32 %a, 10 + %sub.add = select i1 %cmp, i32 %sub, i32 %add + ret i32 %sub.add +} + diff --git a/test/CodeGen/Hexagon/cmp_pred.ll b/test/CodeGen/Hexagon/cmp_pred.ll new file mode 100644 index 000000000000..37db3b499f63 --- /dev/null +++ b/test/CodeGen/Hexagon/cmp_pred.ll @@ -0,0 +1,115 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s +; Generate various cmpb instruction followed by if (p0) .. if (!p0)... +target triple = "hexagon" + +define i32 @Func_3Ugt(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ugt i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Uge(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp uge i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Ult(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ult i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Ule(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ule i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Ueq(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp eq i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Une(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ne i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3UneC(i32 %Enum_Par_Val) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ne i32 %Enum_Par_Val, 122 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3gt(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK: mux + %cmp = icmp sgt i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3ge(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp sge i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3lt(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp slt i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3le(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp sle i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3eq(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp eq i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3ne(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ne i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3neC(i32 %Enum_Par_Val) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ne i32 %Enum_Par_Val, 122 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} diff --git a/test/CodeGen/Hexagon/cmp_pred_reg.ll b/test/CodeGen/Hexagon/cmp_pred_reg.ll new file mode 100644 index 000000000000..37db3b499f63 --- /dev/null +++ b/test/CodeGen/Hexagon/cmp_pred_reg.ll @@ -0,0 +1,115 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s +; Generate various cmpb instruction followed by if (p0) .. if (!p0)... +target triple = "hexagon" + +define i32 @Func_3Ugt(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ugt i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Uge(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp uge i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Ult(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ult i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Ule(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ule i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Ueq(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp eq i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3Une(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ne i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3UneC(i32 %Enum_Par_Val) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ne i32 %Enum_Par_Val, 122 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3gt(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK: mux + %cmp = icmp sgt i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3ge(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp sge i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3lt(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp slt i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3le(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp sle i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3eq(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp eq i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3ne(i32 %Enum_Par_Val, i32 %pv2) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ne i32 %Enum_Par_Val, %pv2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3neC(i32 %Enum_Par_Val) nounwind readnone { +entry: +; CHECK-NOT: mux + %cmp = icmp ne i32 %Enum_Par_Val, 122 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} diff --git a/test/CodeGen/Hexagon/cmpb_pred.ll b/test/CodeGen/Hexagon/cmpb_pred.ll new file mode 100644 index 000000000000..1e6144701fee --- /dev/null +++ b/test/CodeGen/Hexagon/cmpb_pred.ll @@ -0,0 +1,92 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s +; Generate various cmpb instruction followed by if (p0) .. if (!p0)... +target triple = "hexagon" + +@Enum_global = external global i8 + +define i32 @Func_3(i32) nounwind readnone { +entry: +; CHECK-NOT: mux + %conv = and i32 %0, 255 + %cmp = icmp eq i32 %conv, 2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3b(i32) nounwind readonly { +entry: +; CHECK-NOT: mux + %1 = load i8* @Enum_global, align 1, !tbaa !0 + %2 = trunc i32 %0 to i8 + %cmp = icmp ne i8 %1, %2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3c(i32) nounwind readnone { +entry: +; CHECK-NOT: mux + %conv = and i32 %0, 255 + %cmp = icmp eq i32 %conv, 2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3d(i32) nounwind readonly { +entry: +; CHECK-NOT: mux + %1 = load i8* @Enum_global, align 1, !tbaa !0 + %2 = trunc i32 %0 to i8 + %cmp = icmp eq i8 %1, %2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3e(i32) nounwind readonly { +entry: +; CHECK-NOT: mux + %1 = load i8* @Enum_global, align 1, !tbaa !0 + %2 = trunc i32 %0 to i8 + %cmp = icmp eq i8 %1, %2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3f(i32) nounwind readnone { +entry: +; CHECK-NOT: mux + %conv = and i32 %0, 255 + %cmp = icmp ugt i32 %conv, 2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3g(i32) nounwind readnone { +entry: +; CHECK: mux + %conv = and i32 %0, 255 + %cmp = icmp ult i32 %conv, 3 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3h(i32) nounwind readnone { +entry: +; CHECK-NOT: mux + %conv = and i32 %0, 254 + %cmp = icmp ult i32 %conv, 2 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +define i32 @Func_3i(i32) nounwind readnone { +entry: +; CHECK-NOT: mux + %conv = and i32 %0, 254 + %cmp = icmp ugt i32 %conv, 1 + %selv = zext i1 %cmp to i32 + ret i32 %selv +} + +!0 = metadata !{metadata !"omnipotent char", metadata !1} +!1 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/Hexagon/combine_ir.ll b/test/CodeGen/Hexagon/combine_ir.ll new file mode 100644 index 000000000000..921ce9928e6d --- /dev/null +++ b/test/CodeGen/Hexagon/combine_ir.ll @@ -0,0 +1,55 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; CHECK: word +; CHECK: combine(#0 + +define void @word(i32* nocapture %a) nounwind { +entry: + %0 = load i32* %a, align 4, !tbaa !0 + %1 = zext i32 %0 to i64 + %add.ptr = getelementptr inbounds i32* %a, i32 1 + %2 = load i32* %add.ptr, align 4, !tbaa !0 + %3 = zext i32 %2 to i64 + %4 = shl nuw i64 %3, 32 + %ins = or i64 %4, %1 + tail call void @bar(i64 %ins) nounwind + ret void +} + +declare void @bar(i64) + +; CHECK: halfword +; CHECK: combine(#0 + +define void @halfword(i16* nocapture %a) nounwind { +entry: + %0 = load i16* %a, align 2, !tbaa !3 + %1 = zext i16 %0 to i64 + %add.ptr = getelementptr inbounds i16* %a, i32 1 + %2 = load i16* %add.ptr, align 2, !tbaa !3 + %3 = zext i16 %2 to i64 + %4 = shl nuw nsw i64 %3, 16 + %ins = or i64 %4, %1 + tail call void @bar(i64 %ins) nounwind + ret void +} + +; CHECK: byte +; CHECK: combine(#0 + +define void @byte(i8* nocapture %a) nounwind { +entry: + %0 = load i8* %a, align 1, !tbaa !1 + %1 = zext i8 %0 to i64 + %add.ptr = getelementptr inbounds i8* %a, i32 1 + %2 = load i8* %add.ptr, align 1, !tbaa !1 + %3 = zext i8 %2 to i64 + %4 = shl nuw nsw i64 %3, 8 + %ins = or i64 %4, %1 + tail call void @bar(i64 %ins) nounwind + ret void +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"short", metadata !1} diff --git a/test/CodeGen/Hexagon/ctlz-cttz-ctpop.ll b/test/CodeGen/Hexagon/ctlz-cttz-ctpop.ll new file mode 100644 index 000000000000..e942f8d0c5dd --- /dev/null +++ b/test/CodeGen/Hexagon/ctlz-cttz-ctpop.ll @@ -0,0 +1,34 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s + +; CHECK: r{{[0-9]+}}:{{[0-9]+}} |= lsr(r{{[0-9]+}}:{{[0-9]+}}, #4) +; CHECK: r{{[0-9]+}}:{{[0-9]+}} &= lsr(r{{[0-9]+}}:{{[0-9]+}}, #2) +; CHECK: r{{[0-9]+}} += lsr(r{{[0-9]+}}, #4) + +define i32 @foo(i64 %a, i32 %b) nounwind { +entry: + %tmp0 = tail call i64 @llvm.ctlz.i64( i64 %a, i1 true ) + %tmp1 = tail call i64 @llvm.cttz.i64( i64 %a, i1 true ) + %tmp2 = tail call i32 @llvm.ctlz.i32( i32 %b, i1 true ) + %tmp3 = tail call i32 @llvm.cttz.i32( i32 %b, i1 true ) + %tmp4 = tail call i64 @llvm.ctpop.i64( i64 %a ) + %tmp5 = tail call i32 @llvm.ctpop.i32( i32 %b ) + + + %tmp6 = trunc i64 %tmp0 to i32 + %tmp7 = trunc i64 %tmp1 to i32 + %tmp8 = trunc i64 %tmp4 to i32 + %tmp9 = add i32 %tmp6, %tmp7 + %tmp10 = add i32 %tmp9, %tmp8 + %tmp11 = add i32 %tmp10, %tmp2 + %tmp12 = add i32 %tmp11, %tmp3 + %tmp13 = add i32 %tmp12, %tmp5 + + ret i32 %tmp13 +} + +declare i64 @llvm.ctlz.i64(i64, i1) nounwind readnone +declare i32 @llvm.ctlz.i32(i32, i1) nounwind readnone +declare i64 @llvm.cttz.i64(i64, i1) nounwind readnone +declare i32 @llvm.cttz.i32(i32, i1) nounwind readnone +declare i64 @llvm.ctpop.i64(i64) nounwind readnone +declare i32 @llvm.ctpop.i32(i32) nounwind readnone diff --git a/test/CodeGen/Hexagon/dualstore.ll b/test/CodeGen/Hexagon/dualstore.ll index 9b27dda52c1d..f7d7e8bbe75d 100644 --- a/test/CodeGen/Hexagon/dualstore.ll +++ b/test/CodeGen/Hexagon/dualstore.ll @@ -1,8 +1,8 @@ -; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; RUN: llc -march=hexagon -mcpu=hexagonv4 -disable-hexagon-misched < %s | FileCheck %s ; Check that we generate dual stores in one packet in V4 -; CHECK: memw(r{{[0-9]+}} + #{{[0-9]+}}) = r{{[0-9]+}} -; CHECK-NEXT: memw(r{{[0-9]+}} + #{{[0-9]+}}) = r{{[0-9]+}} +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#{{[0-9]+}}){{ *}}={{ *}}##500000 +; CHECK-NEXT: memw(r{{[0-9]+}}{{ *}}+{{ *}}#{{[0-9]+}}){{ *}}={{ *}}##100000 ; CHECK-NEXT: } @Reg = global i32 0, align 4 diff --git a/test/CodeGen/Hexagon/gp-plus-offset-load.ll b/test/CodeGen/Hexagon/gp-plus-offset-load.ll new file mode 100644 index 000000000000..a1b80a65f82a --- /dev/null +++ b/test/CodeGen/Hexagon/gp-plus-offset-load.ll @@ -0,0 +1,51 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we generate load instructions with global + offset + +%struct.struc = type { i8, i8, i16, i32 } + +@foo = common global %struct.struc zeroinitializer, align 4 + +define void @loadWord(i32 %val1, i32 %val2, i32* nocapture %ival) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memw(##foo{{ *}}+{{ *}}4) +entry: + %cmp = icmp sgt i32 %val1, %val2 + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + %0 = load i32* getelementptr inbounds (%struct.struc* @foo, i32 0, i32 3), align 4 + store i32 %0, i32* %ival, align 4 + br label %if.end + +if.end: ; preds = %if.then, %entry + ret void +} + +define void @loadByte(i32 %val1, i32 %val2, i8* nocapture %ival) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memb(##foo{{ *}}+{{ *}}1) +entry: + %cmp = icmp sgt i32 %val1, %val2 + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + %0 = load i8* getelementptr inbounds (%struct.struc* @foo, i32 0, i32 1), align 1 + store i8 %0, i8* %ival, align 1 + br label %if.end + +if.end: ; preds = %if.then, %entry + ret void +} + +define void @loadHWord(i32 %val1, i32 %val2, i16* %ival) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memh(##foo{{ *}}+{{ *}}2) +entry: + %cmp = icmp sgt i32 %val1, %val2 + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + %0 = load i16* getelementptr inbounds (%struct.struc* @foo, i32 0, i32 2), align 2 + store i16 %0, i16* %ival, align 2 + br label %if.end + +if.end: ; preds = %if.then, %entry + ret void +} diff --git a/test/CodeGen/Hexagon/gp-plus-offset-store.ll b/test/CodeGen/Hexagon/gp-plus-offset-store.ll new file mode 100644 index 000000000000..c782b30920ea --- /dev/null +++ b/test/CodeGen/Hexagon/gp-plus-offset-store.ll @@ -0,0 +1,35 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we generate store instructions with global + offset + +%struct.struc = type { i8, i8, i16, i32 } + +@foo = common global %struct.struc zeroinitializer, align 4 + +define void @storeByte(i32 %val1, i32 %val2, i8 zeroext %ival) nounwind { +; CHECK: memb(##foo{{ *}}+{{ *}}1){{ *}}={{ *}}r{{[0-9]+}} +entry: + %cmp = icmp sgt i32 %val1, %val2 + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + store i8 %ival, i8* getelementptr inbounds (%struct.struc* @foo, i32 0, i32 1), align 1 + br label %if.end + +if.end: ; preds = %if.then, %entry + ret void +} + +define void @storeHW(i32 %val1, i32 %val2, i16 signext %ival) nounwind { +; CHECK: memh(##foo{{ *}}+{{ *}}2){{ *}}={{ *}}r{{[0-9]+}} +entry: + %cmp = icmp sgt i32 %val1, %val2 + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + store i16 %ival, i16* getelementptr inbounds (%struct.struc* @foo, i32 0, i32 2), align 2 + br label %if.end + +if.end: ; preds = %if.then, %entry + ret void +} + diff --git a/test/CodeGen/Hexagon/gp-rel.ll b/test/CodeGen/Hexagon/gp-rel.ll new file mode 100644 index 000000000000..561869e8ef35 --- /dev/null +++ b/test/CodeGen/Hexagon/gp-rel.ll @@ -0,0 +1,33 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that gp-relative instructions are being generated. + +@a = common global i32 0, align 4 +@b = common global i32 0, align 4 +@c = common global i32 0, align 4 + +define i32 @foo(i32 %p) #0 { +entry: +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memw(#a) +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memw(#b) +; CHECK: if{{ *}}(p{{[0-3]}}) memw(##c){{ *}}={{ *}}r{{[0-9]+}} + %0 = load i32* @a, align 4 + %1 = load i32* @b, align 4 + %add = add nsw i32 %1, %0 + %cmp = icmp eq i32 %0, %1 + br i1 %cmp, label %if.then, label %entry.if.end_crit_edge + +entry.if.end_crit_edge: + %.pre = load i32* @c, align 4 + br label %if.end + +if.then: + %add1 = add nsw i32 %add, %0 + store i32 %add1, i32* @c, align 4 + br label %if.end + +if.end: + %2 = phi i32 [ %.pre, %entry.if.end_crit_edge ], [ %add1, %if.then ] + %cmp2 = icmp eq i32 %add, %2 + %sel1 = select i1 %cmp2, i32 %2, i32 %1 + ret i32 %sel1 +} diff --git a/test/CodeGen/Hexagon/hwloop-cleanup.ll b/test/CodeGen/Hexagon/hwloop-cleanup.ll new file mode 100644 index 000000000000..6456ebff16d3 --- /dev/null +++ b/test/CodeGen/Hexagon/hwloop-cleanup.ll @@ -0,0 +1,86 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we remove the compare and induction variable instructions +; after generating hardware loops. +; Bug 6685. + +; CHECK: loop0 +; CHECK-NOT: r{{[0-9]+}}{{.}}={{.}}add(r{{[0-9]+}},{{.}}#-1) +; CHECK-NOT: cmp.eq +; CHECK: endloop0 + +define i32 @test1(i32* nocapture %b, i32 %n) nounwind readonly { +entry: + %cmp1 = icmp sgt i32 %n, 0 + br i1 %cmp1, label %for.body.preheader, label %for.end + +for.body.preheader: + br label %for.body + +for.body: ; preds = %for.body.preheader, %for.body + %sum.03 = phi i32 [ %add, %for.body ], [ 0, %for.body.preheader ] + %arrayidx.phi = phi i32* [ %arrayidx.inc, %for.body ], [ %b, %for.body.preheader ] + %i.02 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %0 = load i32* %arrayidx.phi, align 4 + %add = add nsw i32 %0, %sum.03 + %inc = add nsw i32 %i.02, 1 + %exitcond = icmp eq i32 %inc, %n + %arrayidx.inc = getelementptr i32* %arrayidx.phi, i32 1 + br i1 %exitcond, label %for.end.loopexit, label %for.body + +for.end.loopexit: + br label %for.end + +for.end: + %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.end.loopexit ] + ret i32 %sum.0.lcssa +} + +; This test checks that that initial loop count value is removed. +; CHECK-NOT: ={{.}}#40 +; CHECK: loop0 +; CHECK-NOT: r{{[0-9]+}}{{.}}={{.}}add(r{{[0-9]+}},{{.}}#-1) +; CHECK-NOT: cmp.eq +; CHECK: endloop0 + +define i32 @test2(i32* nocapture %b) nounwind readonly { +entry: + br label %for.body + +for.body: + %sum.02 = phi i32 [ 0, %entry ], [ %add, %for.body ] + %arrayidx.phi = phi i32* [ %b, %entry ], [ %arrayidx.inc, %for.body ] + %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %0 = load i32* %arrayidx.phi, align 4 + %add = add nsw i32 %0, %sum.02 + %inc = add nsw i32 %i.01, 1 + %exitcond = icmp eq i32 %inc, 40 + %arrayidx.inc = getelementptr i32* %arrayidx.phi, i32 1 + br i1 %exitcond, label %for.end, label %for.body + +for.end: + ret i32 %add +} + +; This test checks that we don't remove the induction variable since it's used. +; CHECK: loop0 +; CHECK: r{{[0-9]+}}{{.}}={{.}}add(r{{[0-9]+}},{{.}}#1) +; CHECK-NOT: cmp.eq +; CHECK: endloop0 +define i32 @test3(i32* nocapture %b) nounwind { +entry: + br label %for.body + +for.body: + %arrayidx.phi = phi i32* [ %b, %entry ], [ %arrayidx.inc, %for.body ] + %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + store i32 %i.01, i32* %arrayidx.phi, align 4 + %inc = add nsw i32 %i.01, 1 + %exitcond = icmp eq i32 %inc, 40 + %arrayidx.inc = getelementptr i32* %arrayidx.phi, i32 1 + br i1 %exitcond, label %for.end, label %for.body + +for.end: + ret i32 0 +} + + diff --git a/test/CodeGen/Hexagon/hwloop-const.ll b/test/CodeGen/Hexagon/hwloop-const.ll new file mode 100644 index 000000000000..a621c58c63ed --- /dev/null +++ b/test/CodeGen/Hexagon/hwloop-const.ll @@ -0,0 +1,31 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 -O2 < %s | FileCheck %s +; ModuleID = 'hwloop-const.c' +target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32" +target triple = "hexagon-unknown-linux-gnu" + +@b = common global [25000 x i32] zeroinitializer, align 8 +@a = common global [25000 x i32] zeroinitializer, align 8 +@c = common global [25000 x i32] zeroinitializer, align 8 + +define i32 @hwloop_bug() nounwind { +entry: + br label %for.body + +; CHECK: endloop +for.body: ; preds = %for.body, %entry + %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds [25000 x i32]* @b, i32 0, i32 %i.02 + store i32 %i.02, i32* %arrayidx, align 4, !tbaa !0 + %arrayidx1 = getelementptr inbounds [25000 x i32]* @a, i32 0, i32 %i.02 + store i32 %i.02, i32* %arrayidx1, align 4, !tbaa !0 + %inc = add nsw i32 %i.02, 1 + %exitcond = icmp eq i32 %inc, 25000 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret i32 0 +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/Hexagon/hwloop-dbg.ll b/test/CodeGen/Hexagon/hwloop-dbg.ll new file mode 100644 index 000000000000..c2e8153b7dff --- /dev/null +++ b/test/CodeGen/Hexagon/hwloop-dbg.ll @@ -0,0 +1,64 @@ +; RUN: llc < %s -march=hexagon -mcpu=hexagonv4 -O2 -disable-lsr | FileCheck %s +; ModuleID = 'hwloop-dbg.o' +target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32" +target triple = "hexagon" + +define void @foo(i32* nocapture %a, i32* nocapture %b) nounwind { +entry: + tail call void @llvm.dbg.value(metadata !{i32* %a}, i64 0, metadata !13), !dbg !17 + tail call void @llvm.dbg.value(metadata !{i32* %b}, i64 0, metadata !14), !dbg !18 + tail call void @llvm.dbg.value(metadata !2, i64 0, metadata !15), !dbg !19 + br label %for.body, !dbg !19 + +for.body: ; preds = %for.body, %entry +; CHECK: loop0( +; CHECK-NOT: add({{r[0-9]*}}, # +; CHECK: endloop0 + %arrayidx.phi = phi i32* [ %a, %entry ], [ %arrayidx.inc, %for.body ] + %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %b.addr.01 = phi i32* [ %b, %entry ], [ %incdec.ptr, %for.body ] + %incdec.ptr = getelementptr inbounds i32* %b.addr.01, i32 1, !dbg !21 + tail call void @llvm.dbg.value(metadata !{i32* %incdec.ptr}, i64 0, metadata !14), !dbg !21 + %0 = load i32* %b.addr.01, align 4, !dbg !21, !tbaa !23 + store i32 %0, i32* %arrayidx.phi, align 4, !dbg !21, !tbaa !23 + %inc = add nsw i32 %i.02, 1, !dbg !26 + tail call void @llvm.dbg.value(metadata !{i32 %inc}, i64 0, metadata !15), !dbg !26 + %exitcond = icmp eq i32 %inc, 10, !dbg !19 + %arrayidx.inc = getelementptr i32* %arrayidx.phi, i32 1 + br i1 %exitcond, label %for.end, label %for.body, !dbg !19 + +for.end: ; preds = %for.body + ret void, !dbg !27 +} + +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone + + +!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"hwloop-dbg.c", metadata !"/usr2/kparzysz/s.hex/t", metadata !"QuIC LLVM Hexagon Clang version 6.1-pre-unknown, (git://git-hexagon-aus.quicinc.com/llvm/clang-mainline.git e9382867661454cdf44addb39430741578e9765c) (llvm/llvm-mainline.git 36412bb1fcf03ed426d4437b41198bae066675ac)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] [/usr2/kparzysz/s.hex/t/hwloop-dbg.c] [DW_LANG_C99] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i32*, i32*)* @foo, null, null, metadata !11, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!6 = metadata !{i32 786473, metadata !"hwloop-dbg.c", metadata !"/usr2/kparzysz/s.hex/t", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{null, metadata !9, metadata !9} +!9 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 32, align 32, offset 0] [from int] +!10 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!11 = metadata !{metadata !12} +!12 = metadata !{metadata !13, metadata !14, metadata !15} +!13 = metadata !{i32 786689, metadata !5, metadata !"a", metadata !6, i32 16777217, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a] [line 1] +!14 = metadata !{i32 786689, metadata !5, metadata !"b", metadata !6, i32 33554433, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 1] +!15 = metadata !{i32 786688, metadata !16, metadata !"i", metadata !6, i32 2, metadata !10, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [i] [line 2] +!16 = metadata !{i32 786443, metadata !5, i32 1, i32 26, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] [/usr2/kparzysz/s.hex/t/hwloop-dbg.c] +!17 = metadata !{i32 1, i32 15, metadata !5, null} +!18 = metadata !{i32 1, i32 23, metadata !5, null} +!19 = metadata !{i32 3, i32 8, metadata !20, null} +!20 = metadata !{i32 786443, metadata !16, i32 3, i32 3, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] [/usr2/kparzysz/s.hex/t/hwloop-dbg.c] +!21 = metadata !{i32 4, i32 5, metadata !22, null} +!22 = metadata !{i32 786443, metadata !20, i32 3, i32 28, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] [/usr2/kparzysz/s.hex/t/hwloop-dbg.c] +!23 = metadata !{metadata !"int", metadata !24} +!24 = metadata !{metadata !"omnipotent char", metadata !25} +!25 = metadata !{metadata !"Simple C/C++ TBAA"} +!26 = metadata !{i32 3, i32 23, metadata !20, null} +!27 = metadata !{i32 6, i32 1, metadata !16, null} diff --git a/test/CodeGen/Hexagon/hwloop-le.ll b/test/CodeGen/Hexagon/hwloop-le.ll new file mode 100644 index 000000000000..9c8cec7c2a1b --- /dev/null +++ b/test/CodeGen/Hexagon/hwloop-le.ll @@ -0,0 +1,438 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 -O3 < %s | FileCheck %s + + +; CHECK: test_pos1_ir_sle +; CHECK: loop0 +; a < b +define void @test_pos1_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 28395, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 28395, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_ir_sle +; CHECK: loop0 +; a < b +define void @test_pos2_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 9073, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 9073, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_ir_sle +; CHECK: loop0 +; a < b +define void @test_pos4_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 21956, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 21956, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_ir_sle +; CHECK: loop0 +; a < b +define void @test_pos8_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 16782, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 16782, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_ir_sle +; CHECK: loop0 +; a < b +define void @test_pos16_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 19097, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 19097, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos1_ri_sle +; CHECK: loop0 +; a < b +define void @test_pos1_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, 14040 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp sle i32 %inc, 14040 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_ri_sle +; CHECK: loop0 +; a < b +define void @test_pos2_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, 13710 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp sle i32 %inc, 13710 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_ri_sle +; CHECK: loop0 +; a < b +define void @test_pos4_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, 9920 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp sle i32 %inc, 9920 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_ri_sle +; CHECK: loop0 +; a < b +define void @test_pos8_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, 18924 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp sle i32 %inc, 18924 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_ri_sle +; CHECK: loop0 +; a < b +define void @test_pos16_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, 11812 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp sle i32 %inc, 11812 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos1_rr_sle +; CHECK: loop0 +; a < b +define void @test_pos1_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_rr_sle +; CHECK: loop0 +; a < b +define void @test_pos2_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_rr_sle +; CHECK: loop0 +; a < b +define void @test_pos4_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_rr_sle +; CHECK: loop0 +; a < b +define void @test_pos8_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_rr_sle +; CHECK: loop0 +; a < b +define void @test_pos16_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp sle i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp sle i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + diff --git a/test/CodeGen/Hexagon/hwloop-lt.ll b/test/CodeGen/Hexagon/hwloop-lt.ll new file mode 100644 index 000000000000..7e43733da2a6 --- /dev/null +++ b/test/CodeGen/Hexagon/hwloop-lt.ll @@ -0,0 +1,438 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 -O3 < %s | FileCheck %s + + +; CHECK: test_pos1_ir_slt +; CHECK: loop0 +; a < b +define void @test_pos1_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 8531, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 8531, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_ir_slt +; CHECK: loop0 +; a < b +define void @test_pos2_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 9152, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 9152, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_ir_slt +; CHECK: loop0 +; a < b +define void @test_pos4_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 18851, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 18851, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_ir_slt +; CHECK: loop0 +; a < b +define void @test_pos8_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 25466, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 25466, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_ir_slt +; CHECK: loop0 +; a < b +define void @test_pos16_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 9295, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 9295, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos1_ri_slt +; CHECK: loop0 +; a < b +define void @test_pos1_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 31236 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp slt i32 %inc, 31236 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_ri_slt +; CHECK: loop0 +; a < b +define void @test_pos2_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 22653 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp slt i32 %inc, 22653 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_ri_slt +; CHECK: loop0 +; a < b +define void @test_pos4_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 1431 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp slt i32 %inc, 1431 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_ri_slt +; CHECK: loop0 +; a < b +define void @test_pos8_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 22403 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp slt i32 %inc, 22403 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_ri_slt +; CHECK: loop0 +; a < b +define void @test_pos16_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 21715 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp slt i32 %inc, 21715 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos1_rr_slt +; CHECK: loop0 +; a < b +define void @test_pos1_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_rr_slt +; CHECK: loop0 +; a < b +define void @test_pos2_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_rr_slt +; CHECK: loop0 +; a < b +define void @test_pos4_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_rr_slt +; CHECK: loop0 +; a < b +define void @test_pos8_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_rr_slt +; CHECK: loop0 +; a < b +define void @test_pos16_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp slt i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + diff --git a/test/CodeGen/Hexagon/hwloop-lt1.ll b/test/CodeGen/Hexagon/hwloop-lt1.ll new file mode 100644 index 000000000000..cf5874011ee0 --- /dev/null +++ b/test/CodeGen/Hexagon/hwloop-lt1.ll @@ -0,0 +1,32 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we generate a hardware loop instruction. +; CHECK: endloop0 + +@A = common global [400 x i8] zeroinitializer, align 8 +@B = common global [400 x i8] zeroinitializer, align 8 +@C = common global [400 x i8] zeroinitializer, align 8 + +define void @run() nounwind { +entry: + br label %polly.loop_body + +polly.loop_after: ; preds = %polly.loop_body + ret void + +polly.loop_body: ; preds = %entry, %polly.loop_body + %polly.loopiv16 = phi i32 [ 0, %entry ], [ %polly.next_loopiv, %polly.loop_body ] + %polly.next_loopiv = add i32 %polly.loopiv16, 4 + %p_vector_iv14 = or i32 %polly.loopiv16, 1 + %p_vector_iv3 = add i32 %p_vector_iv14, 1 + %p_vector_iv415 = or i32 %polly.loopiv16, 3 + %p_arrayidx = getelementptr [400 x i8]* @A, i32 0, i32 %polly.loopiv16 + %p_arrayidx5 = getelementptr [400 x i8]* @A, i32 0, i32 %p_vector_iv14 + %p_arrayidx6 = getelementptr [400 x i8]* @A, i32 0, i32 %p_vector_iv3 + %p_arrayidx7 = getelementptr [400 x i8]* @A, i32 0, i32 %p_vector_iv415 + store i8 123, i8* %p_arrayidx, align 1 + store i8 123, i8* %p_arrayidx5, align 1 + store i8 123, i8* %p_arrayidx6, align 1 + store i8 123, i8* %p_arrayidx7, align 1 + %0 = icmp slt i32 %polly.next_loopiv, 400 + br i1 %0, label %polly.loop_body, label %polly.loop_after +} diff --git a/test/CodeGen/Hexagon/hwloop-ne.ll b/test/CodeGen/Hexagon/hwloop-ne.ll new file mode 100644 index 000000000000..bceef2a16955 --- /dev/null +++ b/test/CodeGen/Hexagon/hwloop-ne.ll @@ -0,0 +1,438 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 -O3 < %s | FileCheck %s + + +; CHECK: test_pos1_ir_ne +; CHECK: loop0 +; a < b +define void @test_pos1_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 32623, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 32623, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_ir_ne +; CHECK: loop0 +; a < b +define void @test_pos2_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 29554, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 29554, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_ir_ne +; CHECK: loop0 +; a < b +define void @test_pos4_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 15692, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 15692, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_ir_ne +; CHECK: loop0 +; a < b +define void @test_pos8_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 10449, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 10449, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_ir_ne +; CHECK: loop0 +; a < b +define void @test_pos16_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 32087, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ 32087, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos1_ri_ne +; CHECK: loop0 +; a < b +define void @test_pos1_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 3472 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp ne i32 %inc, 3472 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_ri_ne +; CHECK: loop0 +; a < b +define void @test_pos2_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 8730 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp ne i32 %inc, 8730 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_ri_ne +; CHECK: loop0 +; a < b +define void @test_pos4_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 1493 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp ne i32 %inc, 1493 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_ri_ne +; CHECK: loop0 +; a < b +define void @test_pos8_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 1706 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp ne i32 %inc, 1706 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_ri_ne +; CHECK: loop0 +; a < b +define void @test_pos16_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, 1886 + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp ne i32 %inc, 1886 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos1_rr_ne +; CHECK: loop0 +; a < b +define void @test_pos1_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 1 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos2_rr_ne +; CHECK: loop0 +; a < b +define void @test_pos2_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 2 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos4_rr_ne +; CHECK: loop0 +; a < b +define void @test_pos4_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 4 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos8_rr_ne +; CHECK: loop0 +; a < b +define void @test_pos8_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 8 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + +; CHECK: test_pos16_rr_ne +; CHECK: loop0 +; a < b +define void @test_pos16_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { +entry: + %cmp3 = icmp slt i32 %a, %b + br i1 %cmp3, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx = getelementptr inbounds i8* %p, i32 %i.04 + %0 = load i8* %arrayidx, align 1 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 1 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %arrayidx, align 1 + %inc = add nsw i32 %i.04, 16 + %cmp = icmp ne i32 %inc, %b + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + ret void +} + + + diff --git a/test/CodeGen/Hexagon/i16_VarArg.ll b/test/CodeGen/Hexagon/i16_VarArg.ll new file mode 100644 index 000000000000..eb44c2905c9d --- /dev/null +++ b/test/CodeGen/Hexagon/i16_VarArg.ll @@ -0,0 +1,40 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s +; CHECK: call __hexagon_{{[A-Z_a-z0-9]+}} + +@a_str = internal constant [8 x i8] c"a = %f\0A\00" +@b_str = internal constant [8 x i8] c"b = %f\0A\00" +@add_str = internal constant [12 x i8] c"a + b = %f\0A\00" +@sub_str = internal constant [12 x i8] c"a - b = %f\0A\00" +@mul_str = internal constant [12 x i8] c"a * b = %f\0A\00" +@div_str = internal constant [12 x i8] c"b / a = %f\0A\00" +@rem_str = internal constant [13 x i8] c"b %% a = %f\0A\00" +@lt_str = internal constant [12 x i8] c"a < b = %d\0A\00" +@le_str = internal constant [13 x i8] c"a <= b = %d\0A\00" +@gt_str = internal constant [12 x i8] c"a > b = %d\0A\00" +@ge_str = internal constant [13 x i8] c"a >= b = %d\0A\00" +@eq_str = internal constant [13 x i8] c"a == b = %d\0A\00" +@ne_str = internal constant [13 x i8] c"a != b = %d\0A\00" +@A = global double 2.000000e+00 +@B = global double 5.000000e+00 + +declare i32 @printf(i8*, ...) + +define i32 @main() { + %a = load double* @A + %b = load double* @B + %lt_r = fcmp olt double %a, %b + %le_r = fcmp ole double %a, %b + %gt_r = fcmp ogt double %a, %b + %ge_r = fcmp oge double %a, %b + %eq_r = fcmp oeq double %a, %b + %ne_r = fcmp une double %a, %b + %val1 = zext i1 %lt_r to i16 + %lt_s = getelementptr [12 x i8]* @lt_str, i64 0, i64 0 + %le_s = getelementptr [13 x i8]* @le_str, i64 0, i64 0 + %gt_s = getelementptr [12 x i8]* @gt_str, i64 0, i64 0 + %ge_s = getelementptr [13 x i8]* @ge_str, i64 0, i64 0 + %eq_s = getelementptr [13 x i8]* @eq_str, i64 0, i64 0 + %ne_s = getelementptr [13 x i8]* @ne_str, i64 0, i64 0 + call i32 (i8*, ...)* @printf( i8* %lt_s, i16 %val1 ) + ret i32 0 +}
\ No newline at end of file diff --git a/test/CodeGen/Hexagon/i1_VarArg.ll b/test/CodeGen/Hexagon/i1_VarArg.ll new file mode 100644 index 000000000000..7dbfb25cd2b7 --- /dev/null +++ b/test/CodeGen/Hexagon/i1_VarArg.ll @@ -0,0 +1,44 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s +; CHECK: call __hexagon_{{[_A-Za-z0-9]+}} + +@a_str = internal constant [8 x i8] c"a = %f\0A\00" +@b_str = internal constant [8 x i8] c"b = %f\0A\00" +@add_str = internal constant [12 x i8] c"a + b = %f\0A\00" +@sub_str = internal constant [12 x i8] c"a - b = %f\0A\00" +@mul_str = internal constant [12 x i8] c"a * b = %f\0A\00" +@div_str = internal constant [12 x i8] c"b / a = %f\0A\00" +@rem_str = internal constant [13 x i8] c"b %% a = %f\0A\00" +@lt_str = internal constant [12 x i8] c"a < b = %d\0A\00" +@le_str = internal constant [13 x i8] c"a <= b = %d\0A\00" +@gt_str = internal constant [12 x i8] c"a > b = %d\0A\00" +@ge_str = internal constant [13 x i8] c"a >= b = %d\0A\00" +@eq_str = internal constant [13 x i8] c"a == b = %d\0A\00" +@ne_str = internal constant [13 x i8] c"a != b = %d\0A\00" +@A = global double 2.000000e+00 +@B = global double 5.000000e+00 + +declare i32 @printf(i8*, ...) + +define i32 @main() { + %a = load double* @A + %b = load double* @B + %lt_r = fcmp olt double %a, %b + %le_r = fcmp ole double %a, %b + %gt_r = fcmp ogt double %a, %b + %ge_r = fcmp oge double %a, %b + %eq_r = fcmp oeq double %a, %b + %ne_r = fcmp une double %a, %b + %lt_s = getelementptr [12 x i8]* @lt_str, i64 0, i64 0 + %le_s = getelementptr [13 x i8]* @le_str, i64 0, i64 0 + %gt_s = getelementptr [12 x i8]* @gt_str, i64 0, i64 0 + %ge_s = getelementptr [13 x i8]* @ge_str, i64 0, i64 0 + %eq_s = getelementptr [13 x i8]* @eq_str, i64 0, i64 0 + %ne_s = getelementptr [13 x i8]* @ne_str, i64 0, i64 0 + call i32 (i8*, ...)* @printf( i8* %lt_s, i1 %lt_r ) + call i32 (i8*, ...)* @printf( i8* %le_s, i1 %le_r ) + call i32 (i8*, ...)* @printf( i8* %gt_s, i1 %gt_r ) + call i32 (i8*, ...)* @printf( i8* %ge_s, i1 %ge_r ) + call i32 (i8*, ...)* @printf( i8* %eq_s, i1 %eq_r ) + call i32 (i8*, ...)* @printf( i8* %ne_s, i1 %ne_r ) + ret i32 0 +}
\ No newline at end of file diff --git a/test/CodeGen/Hexagon/i8_VarArg.ll b/test/CodeGen/Hexagon/i8_VarArg.ll new file mode 100644 index 000000000000..687b178824ce --- /dev/null +++ b/test/CodeGen/Hexagon/i8_VarArg.ll @@ -0,0 +1,40 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s +; CHECK: call __hexagon_{{[A-Z_a-z0-9]+}} + +@a_str = internal constant [8 x i8] c"a = %f\0A\00" +@b_str = internal constant [8 x i8] c"b = %f\0A\00" +@add_str = internal constant [12 x i8] c"a + b = %f\0A\00" +@sub_str = internal constant [12 x i8] c"a - b = %f\0A\00" +@mul_str = internal constant [12 x i8] c"a * b = %f\0A\00" +@div_str = internal constant [12 x i8] c"b / a = %f\0A\00" +@rem_str = internal constant [13 x i8] c"b %% a = %f\0A\00" +@lt_str = internal constant [12 x i8] c"a < b = %d\0A\00" +@le_str = internal constant [13 x i8] c"a <= b = %d\0A\00" +@gt_str = internal constant [12 x i8] c"a > b = %d\0A\00" +@ge_str = internal constant [13 x i8] c"a >= b = %d\0A\00" +@eq_str = internal constant [13 x i8] c"a == b = %d\0A\00" +@ne_str = internal constant [13 x i8] c"a != b = %d\0A\00" +@A = global double 2.000000e+00 +@B = global double 5.000000e+00 + +declare i32 @printf(i8*, ...) + +define i32 @main() { + %a = load double* @A + %b = load double* @B + %lt_r = fcmp olt double %a, %b + %le_r = fcmp ole double %a, %b + %gt_r = fcmp ogt double %a, %b + %ge_r = fcmp oge double %a, %b + %eq_r = fcmp oeq double %a, %b + %ne_r = fcmp une double %a, %b + %val1 = zext i1 %lt_r to i8 + %lt_s = getelementptr [12 x i8]* @lt_str, i64 0, i64 0 + %le_s = getelementptr [13 x i8]* @le_str, i64 0, i64 0 + %gt_s = getelementptr [12 x i8]* @gt_str, i64 0, i64 0 + %ge_s = getelementptr [13 x i8]* @ge_str, i64 0, i64 0 + %eq_s = getelementptr [13 x i8]* @eq_str, i64 0, i64 0 + %ne_s = getelementptr [13 x i8]* @ne_str, i64 0, i64 0 + call i32 (i8*, ...)* @printf( i8* %lt_s, i8 %val1 ) + ret i32 0 +}
\ No newline at end of file diff --git a/test/CodeGen/Hexagon/idxload-with-zero-offset.ll b/test/CodeGen/Hexagon/idxload-with-zero-offset.ll new file mode 100644 index 000000000000..ca6df88a5529 --- /dev/null +++ b/test/CodeGen/Hexagon/idxload-with-zero-offset.ll @@ -0,0 +1,70 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we generate load instruction with (base + register offset << 0) + +; load word + +define i32 @load_w(i32* nocapture %a, i32 %n) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memw(r{{[0-9]+}}+r{{[0-9]+}}<<#0) +entry: + %tmp = shl i32 %n, 4 + %scevgep9 = getelementptr i32* %a, i32 %tmp + %val = load i32* %scevgep9, align 4 + ret i32 %val +} + +; load unsigned half word + +define i16 @load_uh(i16* nocapture %a, i32 %n) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memuh(r{{[0-9]+}}+r{{[0-9]+}}<<#0) +entry: + %tmp = shl i32 %n, 4 + %scevgep9 = getelementptr i16* %a, i32 %tmp + %val = load i16* %scevgep9, align 2 + ret i16 %val +} + +; load signed half word + +define i32 @load_h(i16* nocapture %a, i32 %n) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memh(r{{[0-9]+}}+r{{[0-9]+}}<<#0) +entry: + %tmp = shl i32 %n, 4 + %scevgep9 = getelementptr i16* %a, i32 %tmp + %val = load i16* %scevgep9, align 2 + %conv = sext i16 %val to i32 + ret i32 %conv +} + +; load unsigned byte + +define i8 @load_ub(i8* nocapture %a, i32 %n) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memub(r{{[0-9]+}}+r{{[0-9]+}}<<#0) +entry: + %tmp = shl i32 %n, 4 + %scevgep9 = getelementptr i8* %a, i32 %tmp + %val = load i8* %scevgep9, align 1 + ret i8 %val +} + +; load signed byte + +define i32 @foo_2(i8* nocapture %a, i32 %n) nounwind { +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memb(r{{[0-9]+}}+r{{[0-9]+}}<<#0) +entry: + %tmp = shl i32 %n, 4 + %scevgep9 = getelementptr i8* %a, i32 %tmp + %val = load i8* %scevgep9, align 1 + %conv = sext i8 %val to i32 + ret i32 %conv +} + +; load doubleword + +define i64 @load_d(i64* nocapture %a, i32 %n) nounwind { +; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}={{ *}}memd(r{{[0-9]+}}+r{{[0-9]+}}<<#0) +entry: + %tmp = shl i32 %n, 4 + %scevgep9 = getelementptr i64* %a, i32 %tmp + %val = load i64* %scevgep9, align 8 + ret i64 %val +} diff --git a/test/CodeGen/Hexagon/indirect-br.ll b/test/CodeGen/Hexagon/indirect-br.ll new file mode 100644 index 000000000000..919e50189160 --- /dev/null +++ b/test/CodeGen/Hexagon/indirect-br.ll @@ -0,0 +1,14 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +;CHECK: jumpr r{{[0-9]+}} + +define i32 @check_indirect_br(i8* %target) nounwind { +entry: + indirectbr i8* %target, [label %test_label] + +test_label: + br label %ret + +ret: + ret i32 -1 +}
\ No newline at end of file diff --git a/test/CodeGen/Hexagon/memops.ll b/test/CodeGen/Hexagon/memops.ll new file mode 100644 index 000000000000..5498848d8560 --- /dev/null +++ b/test/CodeGen/Hexagon/memops.ll @@ -0,0 +1,1369 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s +; Generate MemOps for V4 and above. + +define void @memop_unsigned_char_add5(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %0 = load i8* %p, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 5 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_add(i8* nocapture %p, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %conv = zext i8 %x to i32 + %0 = load i8* %p, align 1, !tbaa !0 + %conv1 = zext i8 %0 to i32 + %add = add nsw i32 %conv1, %conv + %conv2 = trunc i32 %add to i8 + store i8 %conv2, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_sub(i8* nocapture %p, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %conv = zext i8 %x to i32 + %0 = load i8* %p, align 1, !tbaa !0 + %conv1 = zext i8 %0 to i32 + %sub = sub nsw i32 %conv1, %conv + %conv2 = trunc i32 %sub to i8 + store i8 %conv2, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_or(i8* nocapture %p, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %0 = load i8* %p, align 1, !tbaa !0 + %or3 = or i8 %0, %x + store i8 %or3, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_and(i8* nocapture %p, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %0 = load i8* %p, align 1, !tbaa !0 + %and3 = and i8 %0, %x + store i8 %and3, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_clrbit(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %0 = load i8* %p, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %and = and i32 %conv, 223 + %conv1 = trunc i32 %and to i8 + store i8 %conv1, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_setbit(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %0 = load i8* %p, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %or = or i32 %conv, 128 + %conv1 = trunc i32 %or to i8 + store i8 %conv1, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_add5_index(i8* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 5 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_add_index(i8* nocapture %p, i32 %i, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %conv = zext i8 %x to i32 + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv1 = zext i8 %0 to i32 + %add = add nsw i32 %conv1, %conv + %conv2 = trunc i32 %add to i8 + store i8 %conv2, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_sub_index(i8* nocapture %p, i32 %i, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %conv = zext i8 %x to i32 + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv1 = zext i8 %0 to i32 + %sub = sub nsw i32 %conv1, %conv + %conv2 = trunc i32 %sub to i8 + store i8 %conv2, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_or_index(i8* nocapture %p, i32 %i, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %or3 = or i8 %0, %x + store i8 %or3, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_and_index(i8* nocapture %p, i32 %i, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %and3 = and i8 %0, %x + store i8 %and3, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_clrbit_index(i8* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %and = and i32 %conv, 223 + %conv1 = trunc i32 %and to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_setbit_index(i8* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %or = or i32 %conv, 128 + %conv1 = trunc i32 %or to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_add5_index5(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %add = add nsw i32 %conv, 5 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_add_index5(i8* nocapture %p, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}+={{ *}}r{{[0-9]+}} + %conv = zext i8 %x to i32 + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv1 = zext i8 %0 to i32 + %add = add nsw i32 %conv1, %conv + %conv2 = trunc i32 %add to i8 + store i8 %conv2, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_sub_index5(i8* nocapture %p, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}-={{ *}}r{{[0-9]+}} + %conv = zext i8 %x to i32 + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv1 = zext i8 %0 to i32 + %sub = sub nsw i32 %conv1, %conv + %conv2 = trunc i32 %sub to i8 + store i8 %conv2, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_or_index5(i8* nocapture %p, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %or3 = or i8 %0, %x + store i8 %or3, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_and_index5(i8* nocapture %p, i8 zeroext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %and3 = and i8 %0, %x + store i8 %and3, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_clrbit_index5(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %and = and i32 %conv, 223 + %conv1 = trunc i32 %and to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_char_setbit_index5(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %or = or i32 %conv, 128 + %conv1 = trunc i32 %or to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_add5(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %0 = load i8* %p, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %add = add nsw i32 %conv2, 5 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_add(i8* nocapture %p, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %conv4 = zext i8 %x to i32 + %0 = load i8* %p, align 1, !tbaa !0 + %conv13 = zext i8 %0 to i32 + %add = add nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %add to i8 + store i8 %conv2, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_sub(i8* nocapture %p, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %conv4 = zext i8 %x to i32 + %0 = load i8* %p, align 1, !tbaa !0 + %conv13 = zext i8 %0 to i32 + %sub = sub nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %sub to i8 + store i8 %conv2, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_or(i8* nocapture %p, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %0 = load i8* %p, align 1, !tbaa !0 + %or3 = or i8 %0, %x + store i8 %or3, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_and(i8* nocapture %p, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %0 = load i8* %p, align 1, !tbaa !0 + %and3 = and i8 %0, %x + store i8 %and3, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_clrbit(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %0 = load i8* %p, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %and = and i32 %conv2, 223 + %conv1 = trunc i32 %and to i8 + store i8 %conv1, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_setbit(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %0 = load i8* %p, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %or = or i32 %conv2, 128 + %conv1 = trunc i32 %or to i8 + store i8 %conv1, i8* %p, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_add5_index(i8* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %add = add nsw i32 %conv2, 5 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_add_index(i8* nocapture %p, i32 %i, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %conv4 = zext i8 %x to i32 + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv13 = zext i8 %0 to i32 + %add = add nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %add to i8 + store i8 %conv2, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_sub_index(i8* nocapture %p, i32 %i, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %conv4 = zext i8 %x to i32 + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv13 = zext i8 %0 to i32 + %sub = sub nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %sub to i8 + store i8 %conv2, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_or_index(i8* nocapture %p, i32 %i, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %or3 = or i8 %0, %x + store i8 %or3, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_and_index(i8* nocapture %p, i32 %i, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %and3 = and i8 %0, %x + store i8 %and3, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_clrbit_index(i8* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %and = and i32 %conv2, 223 + %conv1 = trunc i32 %and to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_setbit_index(i8* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i8* %p, i32 %i + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %or = or i32 %conv2, 128 + %conv1 = trunc i32 %or to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_add5_index5(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %add = add nsw i32 %conv2, 5 + %conv1 = trunc i32 %add to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_add_index5(i8* nocapture %p, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}+={{ *}}r{{[0-9]+}} + %conv4 = zext i8 %x to i32 + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv13 = zext i8 %0 to i32 + %add = add nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %add to i8 + store i8 %conv2, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_sub_index5(i8* nocapture %p, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}-={{ *}}r{{[0-9]+}} + %conv4 = zext i8 %x to i32 + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv13 = zext i8 %0 to i32 + %sub = sub nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %sub to i8 + store i8 %conv2, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_or_index5(i8* nocapture %p, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %or3 = or i8 %0, %x + store i8 %or3, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_and_index5(i8* nocapture %p, i8 signext %x) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %and3 = and i8 %0, %x + store i8 %and3, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_clrbit_index5(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %and = and i32 %conv2, 223 + %conv1 = trunc i32 %and to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_signed_char_setbit_index5(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#5){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i8* %p, i32 5 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv2 = zext i8 %0 to i32 + %or = or i32 %conv2, 128 + %conv1 = trunc i32 %or to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @memop_unsigned_short_add5(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %0 = load i16* %p, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %add = add nsw i32 %conv, 5 + %conv1 = trunc i32 %add to i16 + store i16 %conv1, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_add(i16* nocapture %p, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %conv = zext i16 %x to i32 + %0 = load i16* %p, align 2, !tbaa !2 + %conv1 = zext i16 %0 to i32 + %add = add nsw i32 %conv1, %conv + %conv2 = trunc i32 %add to i16 + store i16 %conv2, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_sub(i16* nocapture %p, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %conv = zext i16 %x to i32 + %0 = load i16* %p, align 2, !tbaa !2 + %conv1 = zext i16 %0 to i32 + %sub = sub nsw i32 %conv1, %conv + %conv2 = trunc i32 %sub to i16 + store i16 %conv2, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_or(i16* nocapture %p, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %0 = load i16* %p, align 2, !tbaa !2 + %or3 = or i16 %0, %x + store i16 %or3, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_and(i16* nocapture %p, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %0 = load i16* %p, align 2, !tbaa !2 + %and3 = and i16 %0, %x + store i16 %and3, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_clrbit(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %0 = load i16* %p, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %and = and i32 %conv, 65503 + %conv1 = trunc i32 %and to i16 + store i16 %conv1, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_setbit(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %0 = load i16* %p, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %or = or i32 %conv, 128 + %conv1 = trunc i32 %or to i16 + store i16 %conv1, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_add5_index(i16* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %add = add nsw i32 %conv, 5 + %conv1 = trunc i32 %add to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_add_index(i16* nocapture %p, i32 %i, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %conv = zext i16 %x to i32 + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv1 = zext i16 %0 to i32 + %add = add nsw i32 %conv1, %conv + %conv2 = trunc i32 %add to i16 + store i16 %conv2, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_sub_index(i16* nocapture %p, i32 %i, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %conv = zext i16 %x to i32 + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv1 = zext i16 %0 to i32 + %sub = sub nsw i32 %conv1, %conv + %conv2 = trunc i32 %sub to i16 + store i16 %conv2, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_or_index(i16* nocapture %p, i32 %i, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %or3 = or i16 %0, %x + store i16 %or3, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_and_index(i16* nocapture %p, i32 %i, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %and3 = and i16 %0, %x + store i16 %and3, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_clrbit_index(i16* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %and = and i32 %conv, 65503 + %conv1 = trunc i32 %and to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_setbit_index(i16* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %or = or i32 %conv, 128 + %conv1 = trunc i32 %or to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_add5_index5(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %add = add nsw i32 %conv, 5 + %conv1 = trunc i32 %add to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_add_index5(i16* nocapture %p, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}+={{ *}}r{{[0-9]+}} + %conv = zext i16 %x to i32 + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv1 = zext i16 %0 to i32 + %add = add nsw i32 %conv1, %conv + %conv2 = trunc i32 %add to i16 + store i16 %conv2, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_sub_index5(i16* nocapture %p, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}-={{ *}}r{{[0-9]+}} + %conv = zext i16 %x to i32 + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv1 = zext i16 %0 to i32 + %sub = sub nsw i32 %conv1, %conv + %conv2 = trunc i32 %sub to i16 + store i16 %conv2, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_or_index5(i16* nocapture %p, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %or3 = or i16 %0, %x + store i16 %or3, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_and_index5(i16* nocapture %p, i16 zeroext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %and3 = and i16 %0, %x + store i16 %and3, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_clrbit_index5(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %and = and i32 %conv, 65503 + %conv1 = trunc i32 %and to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_unsigned_short_setbit_index5(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv = zext i16 %0 to i32 + %or = or i32 %conv, 128 + %conv1 = trunc i32 %or to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_add5(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %0 = load i16* %p, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %add = add nsw i32 %conv2, 5 + %conv1 = trunc i32 %add to i16 + store i16 %conv1, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_add(i16* nocapture %p, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %conv4 = zext i16 %x to i32 + %0 = load i16* %p, align 2, !tbaa !2 + %conv13 = zext i16 %0 to i32 + %add = add nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %add to i16 + store i16 %conv2, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_sub(i16* nocapture %p, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %conv4 = zext i16 %x to i32 + %0 = load i16* %p, align 2, !tbaa !2 + %conv13 = zext i16 %0 to i32 + %sub = sub nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %sub to i16 + store i16 %conv2, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_or(i16* nocapture %p, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %0 = load i16* %p, align 2, !tbaa !2 + %or3 = or i16 %0, %x + store i16 %or3, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_and(i16* nocapture %p, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %0 = load i16* %p, align 2, !tbaa !2 + %and3 = and i16 %0, %x + store i16 %and3, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_clrbit(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %0 = load i16* %p, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %and = and i32 %conv2, 65503 + %conv1 = trunc i32 %and to i16 + store i16 %conv1, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_setbit(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %0 = load i16* %p, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %or = or i32 %conv2, 128 + %conv1 = trunc i32 %or to i16 + store i16 %conv1, i16* %p, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_add5_index(i16* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %add = add nsw i32 %conv2, 5 + %conv1 = trunc i32 %add to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_add_index(i16* nocapture %p, i32 %i, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %conv4 = zext i16 %x to i32 + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv13 = zext i16 %0 to i32 + %add = add nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %add to i16 + store i16 %conv2, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_sub_index(i16* nocapture %p, i32 %i, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %conv4 = zext i16 %x to i32 + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv13 = zext i16 %0 to i32 + %sub = sub nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %sub to i16 + store i16 %conv2, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_or_index(i16* nocapture %p, i32 %i, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %or3 = or i16 %0, %x + store i16 %or3, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_and_index(i16* nocapture %p, i32 %i, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %and3 = and i16 %0, %x + store i16 %and3, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_clrbit_index(i16* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %and = and i32 %conv2, 65503 + %conv1 = trunc i32 %and to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_setbit_index(i16* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i16* %p, i32 %i + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %or = or i32 %conv2, 128 + %conv1 = trunc i32 %or to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_add5_index5(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %add = add nsw i32 %conv2, 5 + %conv1 = trunc i32 %add to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_add_index5(i16* nocapture %p, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}+={{ *}}r{{[0-9]+}} + %conv4 = zext i16 %x to i32 + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv13 = zext i16 %0 to i32 + %add = add nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %add to i16 + store i16 %conv2, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_sub_index5(i16* nocapture %p, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}-={{ *}}r{{[0-9]+}} + %conv4 = zext i16 %x to i32 + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv13 = zext i16 %0 to i32 + %sub = sub nsw i32 %conv13, %conv4 + %conv2 = trunc i32 %sub to i16 + store i16 %conv2, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_or_index5(i16* nocapture %p, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %or3 = or i16 %0, %x + store i16 %or3, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_and_index5(i16* nocapture %p, i16 signext %x) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %and3 = and i16 %0, %x + store i16 %and3, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_clrbit_index5(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %and = and i32 %conv2, 65503 + %conv1 = trunc i32 %and to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_short_setbit_index5(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i16* %p, i32 5 + %0 = load i16* %add.ptr, align 2, !tbaa !2 + %conv2 = zext i16 %0 to i32 + %or = or i32 %conv2, 128 + %conv1 = trunc i32 %or to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !2 + ret void +} + +define void @memop_signed_int_add5(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %0 = load i32* %p, align 4, !tbaa !3 + %add = add i32 %0, 5 + store i32 %add, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_add(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %0 = load i32* %p, align 4, !tbaa !3 + %add = add i32 %0, %x + store i32 %add, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_sub(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %0 = load i32* %p, align 4, !tbaa !3 + %sub = sub i32 %0, %x + store i32 %sub, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_or(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %0 = load i32* %p, align 4, !tbaa !3 + %or = or i32 %0, %x + store i32 %or, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_and(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %0 = load i32* %p, align 4, !tbaa !3 + %and = and i32 %0, %x + store i32 %and, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_clrbit(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %0 = load i32* %p, align 4, !tbaa !3 + %and = and i32 %0, -33 + store i32 %and, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_setbit(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %0 = load i32* %p, align 4, !tbaa !3 + %or = or i32 %0, 128 + store i32 %or, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_add5_index(i32* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %add = add i32 %0, 5 + store i32 %add, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_add_index(i32* nocapture %p, i32 %i, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %add = add i32 %0, %x + store i32 %add, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_sub_index(i32* nocapture %p, i32 %i, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %sub = sub i32 %0, %x + store i32 %sub, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_or_index(i32* nocapture %p, i32 %i, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %or = or i32 %0, %x + store i32 %or, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_and_index(i32* nocapture %p, i32 %i, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %and = and i32 %0, %x + store i32 %and, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_clrbit_index(i32* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %and = and i32 %0, -33 + store i32 %and, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_setbit_index(i32* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %or = or i32 %0, 128 + store i32 %or, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_add5_index5(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %add = add i32 %0, 5 + store i32 %add, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_add_index5(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}+={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %add = add i32 %0, %x + store i32 %add, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_sub_index5(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}-={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %sub = sub i32 %0, %x + store i32 %sub, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_or_index5(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %or = or i32 %0, %x + store i32 %or, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_and_index5(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %and = and i32 %0, %x + store i32 %and, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_clrbit_index5(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %and = and i32 %0, -33 + store i32 %and, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_signed_int_setbit_index5(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %or = or i32 %0, 128 + store i32 %or, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_add5(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %0 = load i32* %p, align 4, !tbaa !3 + %add = add nsw i32 %0, 5 + store i32 %add, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_add(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %0 = load i32* %p, align 4, !tbaa !3 + %add = add nsw i32 %0, %x + store i32 %add, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_sub(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %0 = load i32* %p, align 4, !tbaa !3 + %sub = sub nsw i32 %0, %x + store i32 %sub, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_or(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %0 = load i32* %p, align 4, !tbaa !3 + %or = or i32 %0, %x + store i32 %or, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_and(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %0 = load i32* %p, align 4, !tbaa !3 + %and = and i32 %0, %x + store i32 %and, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_clrbit(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %0 = load i32* %p, align 4, !tbaa !3 + %and = and i32 %0, -33 + store i32 %and, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_setbit(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %0 = load i32* %p, align 4, !tbaa !3 + %or = or i32 %0, 128 + store i32 %or, i32* %p, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_add5_index(i32* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %add = add nsw i32 %0, 5 + store i32 %add, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_add_index(i32* nocapture %p, i32 %i, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}+={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %add = add nsw i32 %0, %x + store i32 %add, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_sub_index(i32* nocapture %p, i32 %i, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}-={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %sub = sub nsw i32 %0, %x + store i32 %sub, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_or_index(i32* nocapture %p, i32 %i, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %or = or i32 %0, %x + store i32 %or, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_and_index(i32* nocapture %p, i32 %i, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %and = and i32 %0, %x + store i32 %and, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_clrbit_index(i32* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %and = and i32 %0, -33 + store i32 %and, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_setbit_index(i32* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#0){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i32* %p, i32 %i + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %or = or i32 %0, 128 + store i32 %or, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_add5_index5(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}+={{ *}}#5 + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %add = add nsw i32 %0, 5 + store i32 %add, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_add_index5(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}+={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %add = add nsw i32 %0, %x + store i32 %add, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_sub_index5(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}-={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %sub = sub nsw i32 %0, %x + store i32 %sub, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_or_index5(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}|={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %or = or i32 %0, %x + store i32 %or, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_and_index5(i32* nocapture %p, i32 %x) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}&={{ *}}r{{[0-9]+}} + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %and = and i32 %0, %x + store i32 %and, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_clrbit_index5(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}={{ *}}clrbit({{ *}}#5{{ *}}) + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %and = and i32 %0, -33 + store i32 %and, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +define void @memop_unsigned_int_setbit_index5(i32* nocapture %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}={{ *}}setbit({{ *}}#7{{ *}}) + %add.ptr = getelementptr inbounds i32* %p, i32 5 + %0 = load i32* %add.ptr, align 4, !tbaa !3 + %or = or i32 %0, 128 + store i32 %or, i32* %add.ptr, align 4, !tbaa !3 + ret void +} + +!0 = metadata !{metadata !"omnipotent char", metadata !1} +!1 = metadata !{metadata !"Simple C/C++ TBAA"} +!2 = metadata !{metadata !"short", metadata !0} +!3 = metadata !{metadata !"int", metadata !0} diff --git a/test/CodeGen/Hexagon/memops1.ll b/test/CodeGen/Hexagon/memops1.ll new file mode 100644 index 000000000000..2babdc848ddc --- /dev/null +++ b/test/CodeGen/Hexagon/memops1.ll @@ -0,0 +1,33 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s +; Generate MemOps for V4 and above. + + +define void @f(i32* %p) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#40){{ *}}-={{ *}}#1 + %p.addr = alloca i32*, align 4 + store i32* %p, i32** %p.addr, align 4 + %0 = load i32** %p.addr, align 4 + %add.ptr = getelementptr inbounds i32* %0, i32 10 + %1 = load i32* %add.ptr, align 4 + %sub = sub nsw i32 %1, 1 + store i32 %sub, i32* %add.ptr, align 4 + ret void +} + +define void @g(i32* %p, i32 %i) nounwind { +entry: +; CHECK: memw(r{{[0-9]+}}{{ *}}+{{ *}}#40){{ *}}-={{ *}}#1 + %p.addr = alloca i32*, align 4 + %i.addr = alloca i32, align 4 + store i32* %p, i32** %p.addr, align 4 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32** %p.addr, align 4 + %1 = load i32* %i.addr, align 4 + %add.ptr = getelementptr inbounds i32* %0, i32 %1 + %add.ptr1 = getelementptr inbounds i32* %add.ptr, i32 10 + %2 = load i32* %add.ptr1, align 4 + %sub = sub nsw i32 %2, 1 + store i32 %sub, i32* %add.ptr1, align 4 + ret void +} diff --git a/test/CodeGen/Hexagon/memops2.ll b/test/CodeGen/Hexagon/memops2.ll new file mode 100644 index 000000000000..b1b25445c029 --- /dev/null +++ b/test/CodeGen/Hexagon/memops2.ll @@ -0,0 +1,32 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s +; Generate MemOps for V4 and above. + + +define void @f(i16* nocapture %p) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}-={{ *}}#1 + %add.ptr = getelementptr inbounds i16* %p, i32 10 + %0 = load i16* %add.ptr, align 2, !tbaa !0 + %conv2 = zext i16 %0 to i32 + %sub = add nsw i32 %conv2, 65535 + %conv1 = trunc i32 %sub to i16 + store i16 %conv1, i16* %add.ptr, align 2, !tbaa !0 + ret void +} + +define void @g(i16* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memh(r{{[0-9]+}}{{ *}}+{{ *}}#20){{ *}}-={{ *}}#1 + %add.ptr.sum = add i32 %i, 10 + %add.ptr1 = getelementptr inbounds i16* %p, i32 %add.ptr.sum + %0 = load i16* %add.ptr1, align 2, !tbaa !0 + %conv3 = zext i16 %0 to i32 + %sub = add nsw i32 %conv3, 65535 + %conv2 = trunc i32 %sub to i16 + store i16 %conv2, i16* %add.ptr1, align 2, !tbaa !0 + ret void +} + +!0 = metadata !{metadata !"short", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/Hexagon/memops3.ll b/test/CodeGen/Hexagon/memops3.ll new file mode 100644 index 000000000000..5b8bd6c87bfb --- /dev/null +++ b/test/CodeGen/Hexagon/memops3.ll @@ -0,0 +1,31 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s +; Generate MemOps for V4 and above. + + +define void @f(i8* nocapture %p) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}-={{ *}}#1 + %add.ptr = getelementptr inbounds i8* %p, i32 10 + %0 = load i8* %add.ptr, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %sub = add nsw i32 %conv, 255 + %conv1 = trunc i32 %sub to i8 + store i8 %conv1, i8* %add.ptr, align 1, !tbaa !0 + ret void +} + +define void @g(i8* nocapture %p, i32 %i) nounwind { +entry: +; CHECK: memb(r{{[0-9]+}}{{ *}}+{{ *}}#10){{ *}}-={{ *}}#1 + %add.ptr.sum = add i32 %i, 10 + %add.ptr1 = getelementptr inbounds i8* %p, i32 %add.ptr.sum + %0 = load i8* %add.ptr1, align 1, !tbaa !0 + %conv = zext i8 %0 to i32 + %sub = add nsw i32 %conv, 255 + %conv2 = trunc i32 %sub to i8 + store i8 %conv2, i8* %add.ptr1, align 1, !tbaa !0 + ret void +} + +!0 = metadata !{metadata !"omnipotent char", metadata !1} +!1 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/Hexagon/misaligned-access.ll b/test/CodeGen/Hexagon/misaligned-access.ll new file mode 100644 index 000000000000..4dafb44cc3ef --- /dev/null +++ b/test/CodeGen/Hexagon/misaligned-access.ll @@ -0,0 +1,16 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s +; Check that the mis-aligned load doesn't cause compiler to assert. + +declare i32 @_hi(i64) #1 +@temp1 = common global i32 0, align 4 + +define i32 @CSDRSEARCH_executeSearchManager() #0 { +entry: + %temp = alloca i32, align 4 + %0 = load i32* @temp1, align 4 + store i32 %0, i32* %temp, align 4 + %1 = bitcast i32* %temp to i64* + %2 = load i64* %1, align 8 + %call = call i32 @_hi(i64 %2) + ret i32 %call +} diff --git a/test/CodeGen/Hexagon/postinc-load.ll b/test/CodeGen/Hexagon/postinc-load.ll new file mode 100644 index 000000000000..855a347d74f5 --- /dev/null +++ b/test/CodeGen/Hexagon/postinc-load.ll @@ -0,0 +1,29 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s + +; Check that post-increment load instructions are being generated. +; CHECK: r{{[0-9]+}}{{ *}}={{ *}}memw(r{{[0-9]+}}{{ *}}++{{ *}}#4{{ *}}) + +define i32 @sum(i32* nocapture %a, i16* nocapture %b, i32 %n) nounwind { +entry: + br label %for.body + +for.body: + %lsr.iv = phi i32 [ %lsr.iv.next, %for.body ], [ 10, %entry ] + %arrayidx.phi = phi i32* [ %a, %entry ], [ %arrayidx.inc, %for.body ] + %arrayidx1.phi = phi i16* [ %b, %entry ], [ %arrayidx1.inc, %for.body ] + %sum.03 = phi i32 [ 0, %entry ], [ %add2, %for.body ] + %0 = load i32* %arrayidx.phi, align 4 + %1 = load i16* %arrayidx1.phi, align 2 + %conv = sext i16 %1 to i32 + %add = add i32 %0, %sum.03 + %add2 = add i32 %add, %conv + %arrayidx.inc = getelementptr i32* %arrayidx.phi, i32 1 + %arrayidx1.inc = getelementptr i16* %arrayidx1.phi, i32 1 + %lsr.iv.next = add i32 %lsr.iv, -1 + %exitcond = icmp eq i32 %lsr.iv.next, 0 + br i1 %exitcond, label %for.end, label %for.body + +for.end: + ret i32 %add2 +} + diff --git a/test/CodeGen/Hexagon/postinc-store.ll b/test/CodeGen/Hexagon/postinc-store.ll new file mode 100644 index 000000000000..99a3a58ad39c --- /dev/null +++ b/test/CodeGen/Hexagon/postinc-store.ll @@ -0,0 +1,29 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s + +; Check that post-increment store instructions are being generated. +; CHECK: memw(r{{[0-9]+}}{{ *}}++{{ *}}#4{{ *}}){{ *}}={{ *}}r{{[0-9]+}} + +define i32 @sum(i32* nocapture %a, i16* nocapture %b, i32 %n) nounwind { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %lsr.iv = phi i32 [ %lsr.iv.next, %for.body ], [ 10, %entry ] + %arrayidx.phi = phi i32* [ %a, %entry ], [ %arrayidx.inc, %for.body ] + %arrayidx1.phi = phi i16* [ %b, %entry ], [ %arrayidx1.inc, %for.body ] + %0 = load i32* %arrayidx.phi, align 4 + %1 = load i16* %arrayidx1.phi, align 2 + %conv = sext i16 %1 to i32 + %factor = mul i32 %0, 2 + %add3 = add i32 %factor, %conv + store i32 %add3, i32* %arrayidx.phi, align 4 + + %arrayidx.inc = getelementptr i32* %arrayidx.phi, i32 1 + %arrayidx1.inc = getelementptr i16* %arrayidx1.phi, i32 1 + %lsr.iv.next = add i32 %lsr.iv, -1 + %exitcond = icmp eq i32 %lsr.iv.next, 0 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret i32 0 +} diff --git a/test/CodeGen/Hexagon/pred-absolute-store.ll b/test/CodeGen/Hexagon/pred-absolute-store.ll new file mode 100644 index 000000000000..b1b09f414a54 --- /dev/null +++ b/test/CodeGen/Hexagon/pred-absolute-store.ll @@ -0,0 +1,19 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s +; Check that we are able to predicate instructions with abosolute +; addressing mode. + +; CHECK: if{{ *}}(p{{[0-3]+}}){{ *}}memw(##gvar){{ *}}={{ *}}r{{[0-9]+}} + +@gvar = external global i32 +define i32 @test2(i32 %a, i32 %b) nounwind { +entry: + %cmp = icmp eq i32 %a, %b + br i1 %cmp, label %if.then, label %if.end + +if.then: + store i32 %a, i32* @gvar, align 4 + br label %if.end + +if.end: + ret i32 %b +} diff --git a/test/CodeGen/Hexagon/predicate-copy.ll b/test/CodeGen/Hexagon/predicate-copy.ll new file mode 100644 index 000000000000..552b68794195 --- /dev/null +++ b/test/CodeGen/Hexagon/predicate-copy.ll @@ -0,0 +1,8 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 -O3 < %s | FileCheck %s + +; CHECK: r{{[0-9]+}} = p{{[0-9]+}} +define i1 @foo() { +entry: + ret i1 false +} + diff --git a/test/CodeGen/Hexagon/struct_args.ll b/test/CodeGen/Hexagon/struct_args.ll index e488f33c3d16..f91300b5067e 100644 --- a/test/CodeGen/Hexagon/struct_args.ll +++ b/test/CodeGen/Hexagon/struct_args.ll @@ -1,5 +1,5 @@ ; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s -; CHECK: r{{[0-9]}}:{{[0-9]}} = combine(r{{[0-9]}}, r{{[0-9]}}) +; CHECK: r{{[0-9]}}:{{[0-9]}} = combine({{r[0-9]|#0}}, r{{[0-9]}}) ; CHECK: r{{[0-9]}}:{{[0-9]}} |= asl(r{{[0-9]}}:{{[0-9]}}, #32) %struct.small = type { i32, i32 } diff --git a/test/CodeGen/Hexagon/sube.ll b/test/CodeGen/Hexagon/sube.ll new file mode 100644 index 000000000000..84172e957d04 --- /dev/null +++ b/test/CodeGen/Hexagon/sube.ll @@ -0,0 +1,29 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +; CHECK: r{{[0-9]+:[0-9]+}} = #0 +; CHECK: r{{[0-9]+:[0-9]+}} = #1 +; CHECK: p{{[0-9]+}} = cmp.gtu(r{{[0-9]+:[0-9]+}}, r{{[0-9]+:[0-9]+}}) +; CHECK: r{{[0-9]+}} = mux(p{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}}) +; CHECK: r{{[0-9]+}} = mux(p{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}}) +; CHECK: r{{[0-9]+:[0-9]+}} = sub(r{{[0-9]+:[0-9]+}}, r{{[0-9]+:[0-9]+}}) +; CHECK: r{{[0-9]+:[0-9]+}} = sub(r{{[0-9]+:[0-9]+}}, r{{[0-9]+:[0-9]+}}) +; CHECK: r{{[0-9]+:[0-9]+}} = combine(r{{[0-9]+}}, r{{[0-9]+}}) + +define void @check_sube_subc(i64 %AL, i64 %AH, i64 %BL, i64 %BH, i64* %RL, i64* %RH) { +entry: + %tmp1 = zext i64 %AL to i128 + %tmp23 = zext i64 %AH to i128 + %tmp4 = shl i128 %tmp23, 64 + %tmp5 = or i128 %tmp4, %tmp1 + %tmp67 = zext i64 %BL to i128 + %tmp89 = zext i64 %BH to i128 + %tmp11 = shl i128 %tmp89, 64 + %tmp12 = or i128 %tmp11, %tmp67 + %tmp15 = sub i128 %tmp5, %tmp12 + %tmp1617 = trunc i128 %tmp15 to i64 + store i64 %tmp1617, i64* %RL + %tmp21 = lshr i128 %tmp15, 64 + %tmp2122 = trunc i128 %tmp21 to i64 + store i64 %tmp2122, i64* %RH + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/Hexagon/validate-offset.ll b/test/CodeGen/Hexagon/validate-offset.ll new file mode 100644 index 000000000000..9e7d0aa07832 --- /dev/null +++ b/test/CodeGen/Hexagon/validate-offset.ll @@ -0,0 +1,36 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s -O0 + +; This is a regression test which makes sure that the offset check +; is available for STRiw_indexed instruction. This is required +; by 'Hexagon Expand Predicate Spill Code' pass. + +define i32 @f(i32 %a, i32 %b) nounwind { +entry: + %retval = alloca i32, align 4 + %a.addr = alloca i32, align 4 + %b.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 %b, i32* %b.addr, align 4 + %0 = load i32* %a.addr, align 4 + %1 = load i32* %b.addr, align 4 + %cmp = icmp sgt i32 %0, %1 + br i1 %cmp, label %if.then, label %if.else + +if.then: + %2 = load i32* %a.addr, align 4 + %3 = load i32* %b.addr, align 4 + %add = add nsw i32 %2, %3 + store i32 %add, i32* %retval + br label %return + +if.else: + %4 = load i32* %a.addr, align 4 + %5 = load i32* %b.addr, align 4 + %sub = sub nsw i32 %4, %5 + store i32 %sub, i32* %retval + br label %return + +return: + %6 = load i32* %retval + ret i32 %6 +} diff --git a/test/CodeGen/Hexagon/zextloadi1.ll b/test/CodeGen/Hexagon/zextloadi1.ll new file mode 100644 index 000000000000..cb6e6fdf84a5 --- /dev/null +++ b/test/CodeGen/Hexagon/zextloadi1.ll @@ -0,0 +1,25 @@ +; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s + +; CHECK: r{{[0-9]+}} = ##i129_l+16 +; CHECK: r{{[0-9]+}} = ##i129_s+16 +; CHECK: memd(##i129_s) = r{{[0-9]+:[0-9]+}} +; CHECK: r{{[0-9]+}} = ##i65_l+8 +; CHECK: r{{[0-9]+}} = ##i65_s+8 +; CHECK: memd(##i65_s) = r{{[0-9]+:[0-9]+}} + +@i65_l = external global i65 +@i65_s = external global i65 +@i129_l = external global i129 +@i129_s = external global i129 + +define void @i129_ls() nounwind { + %tmp = load i129* @i129_l + store i129 %tmp, i129* @i129_s + ret void +} + +define void @i65_ls() nounwind { + %tmp = load i65* @i65_l + store i65 %tmp, i65* @i65_s + ret void +}
\ No newline at end of file diff --git a/test/CodeGen/Inputs/DbgValueOtherTargets.ll b/test/CodeGen/Inputs/DbgValueOtherTargets.ll new file mode 100644 index 000000000000..d5162b964a08 --- /dev/null +++ b/test/CodeGen/Inputs/DbgValueOtherTargets.ll @@ -0,0 +1,28 @@ +; Check that DEBUG_VALUE comments come through on a variety of targets. + +define i32 @main() nounwind ssp { +entry: +; CHECK: DEBUG_VALUE + call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 + ret i32 0, !dbg !10 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone + +!llvm.dbg.cu = !{!2} + +!0 = metadata !{i32 786478, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !12} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 12, metadata !1, metadata !"clang version 2.9 (trunk 120996)", i1 false, metadata !"", i32 0, null, null, metadata !11, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 0} +!7 = metadata !{i32 786688, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!8 = metadata !{i32 786443, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!9 = metadata !{i32 3, i32 11, metadata !8, null} +!10 = metadata !{i32 4, i32 2, metadata !8, null} +!11 = metadata !{metadata !0} +!12 = metadata !{metadata !"/tmp/x.c", metadata !"/Users/manav"} diff --git a/test/CodeGen/MBlaze/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/MBlaze/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index d8970eac9007..000000000000 --- a/test/CodeGen/MBlaze/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=mblaze -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/MBlaze/DbgValueOtherTargets.test b/test/CodeGen/MBlaze/DbgValueOtherTargets.test new file mode 100644 index 000000000000..8b850f51105b --- /dev/null +++ b/test/CodeGen/MBlaze/DbgValueOtherTargets.test @@ -0,0 +1 @@ +RUN: llc -O0 -march=mblaze -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/MBlaze/lit.local.cfg b/test/CodeGen/MBlaze/lit.local.cfg index e236200d7572..ff4928de4b9c 100644 --- a/test/CodeGen/MBlaze/lit.local.cfg +++ b/test/CodeGen/MBlaze/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'MBlaze' in targets: diff --git a/test/CodeGen/MSP430/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/MSP430/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index 9d549da8a93a..000000000000 --- a/test/CodeGen/MSP430/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=msp430 -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/MSP430/DbgValueOtherTargets.test b/test/CodeGen/MSP430/DbgValueOtherTargets.test new file mode 100644 index 000000000000..7adfbcafa35b --- /dev/null +++ b/test/CodeGen/MSP430/DbgValueOtherTargets.test @@ -0,0 +1 @@ +RUN: llc -O0 -march=msp430 -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/MSP430/byval.ll b/test/CodeGen/MSP430/byval.ll new file mode 100644 index 000000000000..9dda0a097b56 --- /dev/null +++ b/test/CodeGen/MSP430/byval.ll @@ -0,0 +1,26 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16" +target triple = "msp430---elf" + +%struct.Foo = type { i16, i16, i16 } +@foo = global %struct.Foo { i16 1, i16 2, i16 3 }, align 2 + +define i16 @callee(%struct.Foo* byval %f) nounwind { +entry: +; CHECK: callee: +; CHECK: mov.w 2(r1), r15 + %0 = getelementptr inbounds %struct.Foo* %f, i32 0, i32 0 + %1 = load i16* %0, align 2 + ret i16 %1 +} + +define void @caller() nounwind { +entry: +; CHECK: caller: +; CHECK: mov.w &foo+4, 4(r1) +; CHECK-NEXT: mov.w &foo+2, 2(r1) +; CHECK-NEXT: mov.w &foo, 0(r1) + %call = call i16 @callee(%struct.Foo* byval @foo) + ret void +} diff --git a/test/CodeGen/MSP430/lit.local.cfg b/test/CodeGen/MSP430/lit.local.cfg index 972732ebad30..0ca9fc9c6912 100644 --- a/test/CodeGen/MSP430/lit.local.cfg +++ b/test/CodeGen/MSP430/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'MSP430' in targets: diff --git a/test/CodeGen/MSP430/vararg.ll b/test/CodeGen/MSP430/vararg.ll new file mode 100644 index 000000000000..603d3ec6b686 --- /dev/null +++ b/test/CodeGen/MSP430/vararg.ll @@ -0,0 +1,50 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16" +target triple = "msp430---elf" + +declare void @llvm.va_start(i8*) nounwind +declare void @llvm.va_end(i8*) nounwind +declare void @llvm.va_copy(i8*, i8*) nounwind + +define void @va_start(i16 %a, ...) nounwind { +entry: +; CHECK: va_start: +; CHECK: sub.w #2, r1 + %vl = alloca i8*, align 2 + %vl1 = bitcast i8** %vl to i8* +; CHECK-NEXT: mov.w r1, [[REG:r[0-9]+]] +; CHECK-NEXT: add.w #6, [[REG]] +; CHECK-NEXT: mov.w [[REG]], 0(r1) + call void @llvm.va_start(i8* %vl1) + call void @llvm.va_end(i8* %vl1) + ret void +} + +define i16 @va_arg(i8* %vl) nounwind { +entry: +; CHECK: va_arg: + %vl.addr = alloca i8*, align 2 +; CHECK: mov.w r15, 0(r1) + store i8* %vl, i8** %vl.addr, align 2 +; CHECK: mov.w r15, [[REG:r[0-9]+]] +; CHECK-NEXT: add.w #2, [[REG]] +; CHECK-NEXT: mov.w [[REG]], 0(r1) + %0 = va_arg i8** %vl.addr, i16 +; CHECK-NEXT: mov.w 0(r15), r15 + ret i16 %0 +} + +define void @va_copy(i8* %vl) nounwind { +entry: +; CHECK: va_copy: + %vl.addr = alloca i8*, align 2 + %vl2 = alloca i8*, align 2 +; CHECK: mov.w r15, 2(r1) + store i8* %vl, i8** %vl.addr, align 2 + %0 = bitcast i8** %vl2 to i8* + %1 = bitcast i8** %vl.addr to i8* +; CHECK-NEXT: mov.w r15, 0(r1) + call void @llvm.va_copy(i8* %0, i8* %1) + ret void +} diff --git a/test/CodeGen/Mips/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/Mips/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index 994e19af4f87..000000000000 --- a/test/CodeGen/Mips/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=mips -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/Mips/2010-07-20-Switch.ll b/test/CodeGen/Mips/2010-07-20-Switch.ll index 261fe9db1732..38d7b7e25592 100644 --- a/test/CodeGen/Mips/2010-07-20-Switch.ll +++ b/test/CodeGen/Mips/2010-07-20-Switch.ll @@ -1,6 +1,11 @@ -; RUN: llc < %s -march=mips -relocation-model=static | FileCheck %s -check-prefix=STATIC-O32 -; RUN: llc < %s -march=mips -relocation-model=pic | FileCheck %s -check-prefix=PIC-O32 -; RUN: llc < %s -march=mips64 -relocation-model=pic -mcpu=mips64 -mattr=n64 | FileCheck %s -check-prefix=PIC-N64 +; RUN: llc < %s -march=mips -relocation-model=static | \ +; RUN: FileCheck %s -check-prefix=STATIC-O32 +; RUN: llc < %s -march=mips -relocation-model=pic | \ +; RUN: FileCheck %s -check-prefix=PIC-O32 +; RUN: llc < %s -march=mips64 -relocation-model=pic -mcpu=mips64 | \ +; RUN: FileCheck %s -check-prefix=N64 +; RUN: llc < %s -march=mips64 -relocation-model=static -mcpu=mips64 | \ +; RUN: FileCheck %s -check-prefix=N64 define i32 @main() nounwind readnone { entry: @@ -17,12 +22,12 @@ entry: ; PIC-O32: lw $[[R4:[0-9]+]], %lo($JTI0_0)($[[R2]]) ; PIC-O32: addu $[[R5:[0-9]+]], $[[R4:[0-9]+]] ; PIC-O32: jr $[[R5]] -; PIC-N64: dsll $[[R0:[0-9]+]], ${{[0-9]+}}, 3 -; PIC-N64: ld $[[R1:[0-9]+]], %got_page($JTI0_0) -; PIC-N64: daddu $[[R2:[0-9]+]], $[[R0:[0-9]+]], $[[R1]] -; PIC-N64: ld $[[R4:[0-9]+]], %got_ofst($JTI0_0)($[[R2]]) -; PIC-N64: daddu $[[R5:[0-9]+]], $[[R4:[0-9]+]] -; PIC-N64: jr $[[R5]] +; N64: dsll $[[R0:[0-9]+]], ${{[0-9]+}}, 3 +; N64: ld $[[R1:[0-9]+]], %got_page($JTI0_0) +; N64: daddu $[[R2:[0-9]+]], $[[R0:[0-9]+]], $[[R1]] +; N64: ld $[[R4:[0-9]+]], %got_ofst($JTI0_0)($[[R2]]) +; N64: daddu $[[R5:[0-9]+]], $[[R4:[0-9]+]] +; N64: jr $[[R5]] switch i32 %0, label %bb4 [ i32 0, label %bb5 i32 1, label %bb1 @@ -58,10 +63,10 @@ bb5: ; preds = %entry ; PIC-O32: .gpword ; PIC-O32: .gpword ; PIC-O32: .gpword -; PIC-N64: .align 3 -; PIC-N64: $JTI0_0: -; PIC-N64: .gpdword -; PIC-N64: .gpdword -; PIC-N64: .gpdword -; PIC-N64: .gpdword +; N64: .align 3 +; N64: $JTI0_0: +; N64: .gpdword +; N64: .gpdword +; N64: .gpdword +; N64: .gpdword diff --git a/test/CodeGen/Mips/2012-12-12-ExpandMemcpy.ll b/test/CodeGen/Mips/2012-12-12-ExpandMemcpy.ll new file mode 100644 index 000000000000..9d4daee696db --- /dev/null +++ b/test/CodeGen/Mips/2012-12-12-ExpandMemcpy.ll @@ -0,0 +1,11 @@ +; RUN: llc -march=mips64el -mcpu=mips64r2 < %s + +@.str = private unnamed_addr constant [7 x i8] c"hello\0A\00", align 1 + +define void @t(i8* %ptr) { +entry: + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %ptr, i8* getelementptr inbounds ([7 x i8]* @.str, i64 0, i64 0), i64 7, i32 1, i1 false) + ret void +} + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind diff --git a/test/CodeGen/Mips/DbgValueOtherTargets.test b/test/CodeGen/Mips/DbgValueOtherTargets.test new file mode 100644 index 000000000000..da20e7ef5224 --- /dev/null +++ b/test/CodeGen/Mips/DbgValueOtherTargets.test @@ -0,0 +1 @@ +RUN: llc -O0 -march=mips -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/Mips/addi.ll b/test/CodeGen/Mips/addi.ll new file mode 100644 index 000000000000..8f70a469c44f --- /dev/null +++ b/test/CodeGen/Mips/addi.ll @@ -0,0 +1,30 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -mips16-hard-float -soft-float -relocation-model=static < %s | FileCheck %s -check-prefix=16 + +@i = global i32 6, align 4 +@j = global i32 12, align 4 +@k = global i32 15, align 4 +@l = global i32 20, align 4 +@.str = private unnamed_addr constant [13 x i8] c"%i %i %i %i\0A\00", align 1 + +define void @foo() nounwind { +entry: + %0 = load i32* @i, align 4 + %add = add nsw i32 %0, 5 + store i32 %add, i32* @i, align 4 + %1 = load i32* @j, align 4 + %sub = sub nsw i32 %1, 5 + store i32 %sub, i32* @j, align 4 + %2 = load i32* @k, align 4 + %add1 = add nsw i32 %2, 10000 + store i32 %add1, i32* @k, align 4 + %3 = load i32* @l, align 4 + %sub2 = sub nsw i32 %3, 10000 + store i32 %sub2, i32* @l, align 4 +; 16: addiu ${{[0-9]+}}, 5 # 16 bit inst +; 16: addiu ${{[0-9]+}}, -5 # 16 bit inst +; 16: addiu ${{[0-9]+}}, 10000 +; 16: addiu ${{[0-9]+}}, -10000 + ret void +} + + diff --git a/test/CodeGen/Mips/addressing-mode.ll b/test/CodeGen/Mips/addressing-mode.ll new file mode 100644 index 000000000000..ea76dde82dc3 --- /dev/null +++ b/test/CodeGen/Mips/addressing-mode.ll @@ -0,0 +1,41 @@ +; RUN: llc -march=mipsel < %s | FileCheck %s + +@g0 = common global i32 0, align 4 +@g1 = common global i32 0, align 4 + +; Check that LSR doesn't choose a solution with a formula "reg + 4*reg". +; +; CHECK: $BB0_2: +; CHECK-NOT: sll ${{[0-9]+}}, ${{[0-9]+}}, 2 + +define i32 @f0(i32 %n, i32 %m, [256 x i32]* nocapture %a, [256 x i32]* nocapture %b) nounwind readonly { +entry: + br label %for.cond1.preheader + +for.cond1.preheader: + %s.022 = phi i32 [ 0, %entry ], [ %add7, %for.inc9 ] + %i.021 = phi i32 [ 0, %entry ], [ %add10, %for.inc9 ] + br label %for.body3 + +for.body3: + %s.120 = phi i32 [ %s.022, %for.cond1.preheader ], [ %add7, %for.body3 ] + %j.019 = phi i32 [ 0, %for.cond1.preheader ], [ %add8, %for.body3 ] + %arrayidx4 = getelementptr inbounds [256 x i32]* %a, i32 %i.021, i32 %j.019 + %0 = load i32* %arrayidx4, align 4 + %arrayidx6 = getelementptr inbounds [256 x i32]* %b, i32 %i.021, i32 %j.019 + %1 = load i32* %arrayidx6, align 4 + %add = add i32 %0, %s.120 + %add7 = add i32 %add, %1 + %add8 = add nsw i32 %j.019, %m + %cmp2 = icmp slt i32 %add8, 64 + br i1 %cmp2, label %for.body3, label %for.inc9 + +for.inc9: + %add10 = add nsw i32 %i.021, %n + %cmp = icmp slt i32 %add10, 64 + br i1 %cmp, label %for.cond1.preheader, label %for.end11 + +for.end11: + ret i32 %add7 +} + diff --git a/test/CodeGen/Mips/align16.ll b/test/CodeGen/Mips/align16.ll new file mode 100644 index 000000000000..99139abbe848 --- /dev/null +++ b/test/CodeGen/Mips/align16.ll @@ -0,0 +1,31 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static < %s | FileCheck %s -check-prefix=16 + +@i = global i32 25, align 4 +@.str = private unnamed_addr constant [5 x i8] c"%i \0A\00", align 1 + +define void @p(i32* %i) nounwind { +entry: + ret void +} + + +define void @foo() nounwind { +entry: + %y = alloca [512 x i32], align 4 + %x = alloca i32, align 8 + %zz = alloca i32, align 4 + %z = alloca i32, align 4 + %0 = load i32* @i, align 4 + %arrayidx = getelementptr inbounds [512 x i32]* %y, i32 0, i32 10 + store i32 %0, i32* %arrayidx, align 4 + %1 = load i32* @i, align 4 + store i32 %1, i32* %x, align 8 + call void @p(i32* %x) + %arrayidx1 = getelementptr inbounds [512 x i32]* %y, i32 0, i32 10 + call void @p(i32* %arrayidx1) + ret void +} +; 16: save $ra, $s0, $s1, 2040 +; 16: addiu $sp, -48 # 16 bit inst +; 16: addiu $sp, 48 # 16 bit inst +; 16: restore $ra, $s0, $s1, 2040
\ No newline at end of file diff --git a/test/CodeGen/Mips/alloca.ll b/test/CodeGen/Mips/alloca.ll index 29f43c8afa18..d79ea9193d28 100644 --- a/test/CodeGen/Mips/alloca.ll +++ b/test/CodeGen/Mips/alloca.ll @@ -3,11 +3,11 @@ define i32 @twoalloca(i32 %size) nounwind { entry: ; CHECK: subu $[[T0:[0-9]+]], $sp, $[[SZ:[0-9]+]] -; CHECK: addu $sp, $zero, $[[T0]] +; CHECK: move $sp, $[[T0]] ; CHECK: subu $[[T2:[0-9]+]], $sp, $[[SZ]] -; CHECK: addu $sp, $zero, $[[T2]] -; CHECK: addu $4, $zero, $[[T0]] -; CHECK: addu $4, $zero, $[[T2]] +; CHECK: move $sp, $[[T2]] +; CHECK: move $4, $[[T0]] +; CHECK: move $4, $[[T2]] %tmp1 = alloca i8, i32 %size, align 4 %add.ptr = getelementptr inbounds i8* %tmp1, i32 5 store i8 97, i8* %add.ptr, align 1 @@ -29,7 +29,7 @@ define i32 @alloca2(i32 %size) nounwind { entry: ; CHECK: alloca2 ; CHECK: subu $[[T0:[0-9]+]], $sp -; CHECK: addu $sp, $zero, $[[T0]] +; CHECK: move $sp, $[[T0]] %tmp1 = alloca i8, i32 %size, align 4 %0 = bitcast i8* %tmp1 to i32* diff --git a/test/CodeGen/Mips/alloca16.ll b/test/CodeGen/Mips/alloca16.ll index 731edae43cbb..5ae9a847917b 100644 --- a/test/CodeGen/Mips/alloca16.ll +++ b/test/CodeGen/Mips/alloca16.ll @@ -68,8 +68,8 @@ entry: %21 = load i32** %ip, align 4 %arrayidx6 = getelementptr inbounds i32* %21, i32 %20 %22 = load i32* %arrayidx6, align 4 -; 16: save 16 +; 16: addiu $sp, -16 call void @temp(i32 %22) -; 16: restore 16 +; 16: addiu $sp, 16 ret void } diff --git a/test/CodeGen/Mips/br-jmp.ll b/test/CodeGen/Mips/br-jmp.ll index 1b5513ab394d..9ca8d159614f 100644 --- a/test/CodeGen/Mips/br-jmp.ll +++ b/test/CodeGen/Mips/br-jmp.ll @@ -1,5 +1,7 @@ ; RUN: llc -march=mipsel -relocation-model=pic < %s | FileCheck %s -check-prefix=CHECK-PIC ; RUN: llc -march=mipsel -relocation-model=static < %s | FileCheck %s -check-prefix=CHECK-STATIC +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=CHECK-PIC16 +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static < %s | FileCheck %s -check-prefix=CHECK-STATIC16 define void @count(i32 %x, i32 %y, i32 %z) noreturn nounwind readnone { entry: @@ -11,3 +13,6 @@ bosco: ; preds = %bosco, %entry ; CHECK-PIC: b $BB0_1 ; CHECK-STATIC: j $BB0_1 +; CHECK-PIC16: b $BB0_1 +; CHECK-STATIC16: b $BB0_1 + diff --git a/test/CodeGen/Mips/brdelayslot.ll b/test/CodeGen/Mips/brdelayslot.ll index 2fdb736dc886..2deb037c9c39 100644 --- a/test/CodeGen/Mips/brdelayslot.ll +++ b/test/CodeGen/Mips/brdelayslot.ll @@ -1,5 +1,12 @@ ; RUN: llc -march=mipsel -O0 < %s | FileCheck %s -check-prefix=None ; RUN: llc -march=mipsel < %s | FileCheck %s -check-prefix=Default +; RUN: llc -march=mipsel -O1 -relocation-model=static < %s | \ +; RUN: FileCheck %s -check-prefix=STATICO1 +; RUN: llc -march=mipsel -disable-mips-df-forward-search=false \ +; RUN: -relocation-model=static < %s | FileCheck %s -check-prefix=FORWARD +; RUN: llc -march=mipsel -disable-mips-df-backward-search \ +; RUN: -disable-mips-df-succbb-search=false < %s | \ +; RUN: FileCheck %s -check-prefix=SUCCBB define void @foo1() nounwind { entry: @@ -35,3 +42,137 @@ entry: declare void @foo4(double) +@g2 = external global i32 +@g1 = external global i32 +@g3 = external global i32 + +; Check that branch delay slot can be filled with an instruction with operand +; $1. +; +; Default: foo5: +; Default-NOT: nop + +define void @foo5(i32 %a) nounwind { +entry: + %0 = load i32* @g2, align 4 + %tobool = icmp eq i32 %a, 0 + br i1 %tobool, label %if.else, label %if.then + +if.then: + %1 = load i32* @g1, align 4 + %add = add nsw i32 %1, %0 + store i32 %add, i32* @g1, align 4 + br label %if.end + +if.else: + %2 = load i32* @g3, align 4 + %sub = sub nsw i32 %2, %0 + store i32 %sub, i32* @g3, align 4 + br label %if.end + +if.end: + ret void +} + +; Check that delay slot filler can place mov.s or mov.d in delay slot. +; +; Default: foo6: +; Default-NOT: nop +; Default: .end foo6 + +define void @foo6(float %a0, double %a1) nounwind { +entry: + tail call void @foo7(double %a1, float %a0) nounwind + ret void +} + +declare void @foo7(double, float) + +; Check that a store can move past other memory instructions. +; +; STATICO1: foo8: +; STATICO1: jalr ${{[0-9]+}} +; STATICO1-NEXT: sw ${{[0-9]+}}, %lo(g1) + +@foo9 = common global void ()* null, align 4 + +define i32 @foo8(i32 %a) nounwind { +entry: + store i32 %a, i32* @g1, align 4 + %0 = load void ()** @foo9, align 4 + tail call void %0() nounwind + %1 = load i32* @g1, align 4 + %add = add nsw i32 %1, %a + ret i32 %add +} + +; Test searchForward. Check that the second jal's slot is filled with another +; instruction in the same block. +; +; FORWARD: foo10: +; FORWARD: jal foo11 +; FORWARD: jal foo11 +; FORWARD-NOT: nop +; FORWARD: end foo10 + +define void @foo10() nounwind { +entry: + tail call void @foo11() nounwind + tail call void @foo11() nounwind + store i32 0, i32* @g1, align 4 + tail call void @foo11() nounwind + store i32 0, i32* @g1, align 4 + ret void +} + +declare void @foo11() + +; Check that delay slots of branches in both the entry block and loop body are +; filled. +; +; SUCCBB: succbbs_loop1: +; SUCCBB: bne ${{[0-9]+}}, $zero, $BB +; SUCCBB-NEXT: addiu +; SUCCBB: bne ${{[0-9]+}}, $zero, $BB +; SUCCBB-NEXT: addiu + +define i32 @succbbs_loop1(i32* nocapture %a, i32 %n) { +entry: + %cmp4 = icmp sgt i32 %n, 0 + br i1 %cmp4, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %s.06 = phi i32 [ %add, %for.body ], [ 0, %entry ] + %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i32* %a, i32 %i.05 + %0 = load i32* %arrayidx, align 4 + %add = add nsw i32 %0, %s.06 + %inc = add nsw i32 %i.05, 1 + %exitcond = icmp eq i32 %inc, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + %s.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ] + ret i32 %s.0.lcssa +} + +; Check that the first branch has its slot filled. +; +; SUCCBB: succbbs_br1: +; SUCCBB: beq ${{[0-9]+}}, $zero, $BB +; SUCCBB-NEXT: lw $25, %call16(foo100) + +define void @succbbs_br1(i32 %a) { +entry: + %tobool = icmp eq i32 %a, 0 + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + tail call void @foo100() #1 + br label %if.end + +if.end: ; preds = %entry, %if.then + ret void +} + +declare void @foo100() diff --git a/test/CodeGen/Mips/cmov.ll b/test/CodeGen/Mips/cmov.ll index 3af899a4e258..81925a4953ce 100755 --- a/test/CodeGen/Mips/cmov.ll +++ b/test/CodeGen/Mips/cmov.ll @@ -59,3 +59,140 @@ entry: ret i64 %cond } +; slti and conditional move. +; +; Check that, pattern +; (select (setgt a, N), t, f) +; turns into +; (movz t, (setlt a, N + 1), f) +; if N + 1 fits in 16-bit. + +; O32: slti0: +; O32: slti $[[R0:[0-9]+]], ${{[0-9]+}}, 32767 +; O32: movz ${{[0-9]+}}, ${{[0-9]+}}, $[[R0]] + +define i32 @slti0(i32 %a) { +entry: + %cmp = icmp sgt i32 %a, 32766 + %cond = select i1 %cmp, i32 3, i32 4 + ret i32 %cond +} + +; O32: slti1: +; O32: slt ${{[0-9]+}} + +define i32 @slti1(i32 %a) { +entry: + %cmp = icmp sgt i32 %a, 32767 + %cond = select i1 %cmp, i32 3, i32 4 + ret i32 %cond +} + +; O32: slti2: +; O32: slti $[[R0:[0-9]+]], ${{[0-9]+}}, -32768 +; O32: movz ${{[0-9]+}}, ${{[0-9]+}}, $[[R0]] + +define i32 @slti2(i32 %a) { +entry: + %cmp = icmp sgt i32 %a, -32769 + %cond = select i1 %cmp, i32 3, i32 4 + ret i32 %cond +} + +; O32: slti3: +; O32: slt ${{[0-9]+}} + +define i32 @slti3(i32 %a) { +entry: + %cmp = icmp sgt i32 %a, -32770 + %cond = select i1 %cmp, i32 3, i32 4 + ret i32 %cond +} + +; 64-bit patterns. + +; N64: slti64_0: +; N64: slti $[[R0:[0-9]+]], ${{[0-9]+}}, 32767 +; N64: movz ${{[0-9]+}}, ${{[0-9]+}}, $[[R0]] + +define i64 @slti64_0(i64 %a) { +entry: + %cmp = icmp sgt i64 %a, 32766 + %conv = select i1 %cmp, i64 3, i64 4 + ret i64 %conv +} + +; N64: slti64_1: +; N64: slt ${{[0-9]+}} + +define i64 @slti64_1(i64 %a) { +entry: + %cmp = icmp sgt i64 %a, 32767 + %conv = select i1 %cmp, i64 3, i64 4 + ret i64 %conv +} + +; N64: slti64_2: +; N64: slti $[[R0:[0-9]+]], ${{[0-9]+}}, -32768 +; N64: movz ${{[0-9]+}}, ${{[0-9]+}}, $[[R0]] + +define i64 @slti64_2(i64 %a) { +entry: + %cmp = icmp sgt i64 %a, -32769 + %conv = select i1 %cmp, i64 3, i64 4 + ret i64 %conv +} + +; N64: slti64_3: +; N64: slt ${{[0-9]+}} + +define i64 @slti64_3(i64 %a) { +entry: + %cmp = icmp sgt i64 %a, -32770 + %conv = select i1 %cmp, i64 3, i64 4 + ret i64 %conv +} + +; sltiu instructions. + +; O32: sltiu0: +; O32: sltiu $[[R0:[0-9]+]], ${{[0-9]+}}, 32767 +; O32: movz ${{[0-9]+}}, ${{[0-9]+}}, $[[R0]] + +define i32 @sltiu0(i32 %a) { +entry: + %cmp = icmp ugt i32 %a, 32766 + %cond = select i1 %cmp, i32 3, i32 4 + ret i32 %cond +} + +; O32: sltiu1: +; O32: sltu ${{[0-9]+}} + +define i32 @sltiu1(i32 %a) { +entry: + %cmp = icmp ugt i32 %a, 32767 + %cond = select i1 %cmp, i32 3, i32 4 + ret i32 %cond +} + +; O32: sltiu2: +; O32: sltiu $[[R0:[0-9]+]], ${{[0-9]+}}, -32768 +; O32: movz ${{[0-9]+}}, ${{[0-9]+}}, $[[R0]] + +define i32 @sltiu2(i32 %a) { +entry: + %cmp = icmp ugt i32 %a, -32769 + %cond = select i1 %cmp, i32 3, i32 4 + ret i32 %cond +} + +; O32: sltiu3: +; O32: sltu ${{[0-9]+}} + +define i32 @sltiu3(i32 %a) { +entry: + %cmp = icmp ugt i32 %a, -32770 + %cond = select i1 %cmp, i32 3, i32 4 + ret i32 %cond +} diff --git a/test/CodeGen/Mips/dsp-patterns.ll b/test/CodeGen/Mips/dsp-patterns.ll new file mode 100644 index 000000000000..0752f69c3e9e --- /dev/null +++ b/test/CodeGen/Mips/dsp-patterns.ll @@ -0,0 +1,31 @@ +; RUN: llc -march=mips -mattr=dsp < %s | FileCheck %s + +; CHECK: test_lbux: +; CHECK: lbux ${{[0-9]+}} + +define zeroext i8 @test_lbux(i8* nocapture %b, i32 %i) { +entry: + %add.ptr = getelementptr inbounds i8* %b, i32 %i + %0 = load i8* %add.ptr, align 1 + ret i8 %0 +} + +; CHECK: test_lhx: +; CHECK: lhx ${{[0-9]+}} + +define signext i16 @test_lhx(i16* nocapture %b, i32 %i) { +entry: + %add.ptr = getelementptr inbounds i16* %b, i32 %i + %0 = load i16* %add.ptr, align 2 + ret i16 %0 +} + +; CHECK: test_lwx: +; CHECK: lwx ${{[0-9]+}} + +define i32 @test_lwx(i32* nocapture %b, i32 %i) { +entry: + %add.ptr = getelementptr inbounds i32* %b, i32 %i + %0 = load i32* %add.ptr, align 4 + ret i32 %0 +} diff --git a/test/CodeGen/Mips/eh-return32.ll b/test/CodeGen/Mips/eh-return32.ll new file mode 100644 index 000000000000..c3003b34b162 --- /dev/null +++ b/test/CodeGen/Mips/eh-return32.ll @@ -0,0 +1,85 @@ +; RUN: llc -march=mipsel -mcpu=mips32 < %s | FileCheck %s + +declare void @llvm.eh.return.i32(i32, i8*) +declare void @foo(...) + +define i8* @f1(i32 %offset, i8* %handler) { +entry: + call void (...)* @foo() + call void @llvm.eh.return.i32(i32 %offset, i8* %handler) + unreachable + +; CHECK: f1 +; CHECK: addiu $sp, $sp, -[[spoffset:[0-9]+]] + +; check that $a0-$a3 are saved on stack. +; CHECK: sw $4, [[offset0:[0-9]+]]($sp) +; CHECK: sw $5, [[offset1:[0-9]+]]($sp) +; CHECK: sw $6, [[offset2:[0-9]+]]($sp) +; CHECK: sw $7, [[offset3:[0-9]+]]($sp) + +; check that .cfi_offset directives are emitted for $a0-$a3. +; CHECK: .cfi_offset 4, +; CHECK: .cfi_offset 5, +; CHECK: .cfi_offset 6, +; CHECK: .cfi_offset 7, + +; check that stack adjustment and handler are put in $v1 and $v0. +; CHECK: move $[[R0:[a-z0-9]+]], $5 +; CHECK: move $[[R1:[a-z0-9]+]], $4 +; CHECK: move $3, $[[R1]] +; CHECK: move $2, $[[R0]] + +; check that $a0-$a3 are restored from stack. +; CHECK: lw $4, [[offset0]]($sp) +; CHECK: lw $5, [[offset1]]($sp) +; CHECK: lw $6, [[offset2]]($sp) +; CHECK: lw $7, [[offset3]]($sp) + +; check that stack is adjusted by $v1 and that code returns to address in $v0 +; also check that $25 contains handler value +; CHECK: addiu $sp, $sp, [[spoffset]] +; CHECK: move $25, $2 +; CHECK: move $ra, $2 +; CHECK: jr $ra +; CHECK: addu $sp, $sp, $3 +} + +define i8* @f2(i32 %offset, i8* %handler) { +entry: + call void @llvm.eh.return.i32(i32 %offset, i8* %handler) + unreachable + +; CHECK: f2 +; CHECK: addiu $sp, $sp, -[[spoffset:[0-9]+]] + +; check that $a0-$a3 are saved on stack. +; CHECK: sw $4, [[offset0:[0-9]+]]($sp) +; CHECK: sw $5, [[offset1:[0-9]+]]($sp) +; CHECK: sw $6, [[offset2:[0-9]+]]($sp) +; CHECK: sw $7, [[offset3:[0-9]+]]($sp) + +; check that .cfi_offset directives are emitted for $a0-$a3. +; CHECK: .cfi_offset 4, +; CHECK: .cfi_offset 5, +; CHECK: .cfi_offset 6, +; CHECK: .cfi_offset 7, + +; check that stack adjustment and handler are put in $v1 and $v0. +; CHECK: move $3, $4 +; CHECK: move $2, $5 + +; check that $a0-$a3 are restored from stack. +; CHECK: lw $4, [[offset0]]($sp) +; CHECK: lw $5, [[offset1]]($sp) +; CHECK: lw $6, [[offset2]]($sp) +; CHECK: lw $7, [[offset3]]($sp) + +; check that stack is adjusted by $v1 and that code returns to address in $v0 +; also check that $25 contains handler value +; CHECK: addiu $sp, $sp, [[spoffset]] +; CHECK: move $25, $2 +; CHECK: move $ra, $2 +; CHECK: jr $ra +; CHECK: addu $sp, $sp, $3 +} diff --git a/test/CodeGen/Mips/eh-return64.ll b/test/CodeGen/Mips/eh-return64.ll new file mode 100644 index 000000000000..373a9a114453 --- /dev/null +++ b/test/CodeGen/Mips/eh-return64.ll @@ -0,0 +1,87 @@ +; RUN: llc -march=mips64el -mcpu=mips64 < %s | FileCheck %s + +declare void @llvm.eh.return.i64(i64, i8*) +declare void @foo(...) + +define void @f1(i64 %offset, i8* %handler) { +entry: + call void (...)* @foo() + call void @llvm.eh.return.i64(i64 %offset, i8* %handler) + unreachable + +; CHECK: f1 +; CHECK: daddiu $sp, $sp, -[[spoffset:[0-9]+]] + +; check that $a0-$a3 are saved on stack. +; CHECK: sd $4, [[offset0:[0-9]+]]($sp) +; CHECK: sd $5, [[offset1:[0-9]+]]($sp) +; CHECK: sd $6, [[offset2:[0-9]+]]($sp) +; CHECK: sd $7, [[offset3:[0-9]+]]($sp) + +; check that .cfi_offset directives are emitted for $a0-$a3. +; CHECK: .cfi_offset 4, +; CHECK: .cfi_offset 5, +; CHECK: .cfi_offset 6, +; CHECK: .cfi_offset 7, + +; check that stack adjustment and handler are put in $v1 and $v0. +; CHECK: move $[[R0:[a-z0-9]+]], $5 +; CHECK: move $[[R1:[a-z0-9]+]], $4 +; CHECK: move $3, $[[R1]] +; CHECK: move $2, $[[R0]] + +; check that $a0-$a3 are restored from stack. +; CHECK: ld $4, [[offset0]]($sp) +; CHECK: ld $5, [[offset1]]($sp) +; CHECK: ld $6, [[offset2]]($sp) +; CHECK: ld $7, [[offset3]]($sp) + +; check that stack is adjusted by $v1 and that code returns to address in $v0 +; also check that $25 contains handler value +; CHECK: daddiu $sp, $sp, [[spoffset]] +; CHECK: move $25, $2 +; CHECK: move $ra, $2 +; CHECK: jr $ra +; CHECK: daddu $sp, $sp, $3 + +} + +define void @f2(i64 %offset, i8* %handler) { +entry: + call void @llvm.eh.return.i64(i64 %offset, i8* %handler) + unreachable + +; CHECK: f2 +; CHECK: daddiu $sp, $sp, -[[spoffset:[0-9]+]] + +; check that $a0-$a3 are saved on stack. +; CHECK: sd $4, [[offset0:[0-9]+]]($sp) +; CHECK: sd $5, [[offset1:[0-9]+]]($sp) +; CHECK: sd $6, [[offset2:[0-9]+]]($sp) +; CHECK: sd $7, [[offset3:[0-9]+]]($sp) + +; check that .cfi_offset directives are emitted for $a0-$a3. +; CHECK: .cfi_offset 4, +; CHECK: .cfi_offset 5, +; CHECK: .cfi_offset 6, +; CHECK: .cfi_offset 7, + +; check that stack adjustment and handler are put in $v1 and $v0. +; CHECK: move $3, $4 +; CHECK: move $2, $5 + +; check that $a0-$a3 are restored from stack. +; CHECK: ld $4, [[offset0]]($sp) +; CHECK: ld $5, [[offset1]]($sp) +; CHECK: ld $6, [[offset2]]($sp) +; CHECK: ld $7, [[offset3]]($sp) + +; check that stack is adjusted by $v1 and that code returns to address in $v0 +; also check that $25 contains handler value +; CHECK: daddiu $sp, $sp, [[spoffset]] +; CHECK: move $25, $2 +; CHECK: move $ra, $2 +; CHECK: jr $ra +; CHECK: daddu $sp, $sp, $3 + +} diff --git a/test/CodeGen/Mips/ex2.ll b/test/CodeGen/Mips/ex2.ll new file mode 100644 index 000000000000..67d19e4b84ca --- /dev/null +++ b/test/CodeGen/Mips/ex2.ll @@ -0,0 +1,29 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16 + +@.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@_ZTIPKc = external constant i8* + +define i32 @main() { +; 16: main: +; 16: .cfi_startproc +; 16: save $ra, $s0, $s1, 32 +; 16: .cfi_offset 17, -8 +; 16: .cfi_offset 16, -12 +; 16: .cfi_offset 31, -4 +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %exception = call i8* @__cxa_allocate_exception(i32 4) nounwind + %0 = bitcast i8* %exception to i8** + store i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), i8** %0 + call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIPKc to i8*), i8* null) noreturn + unreachable + +return: ; No predecessors! + %1 = load i32* %retval + ret i32 %1 +} + +declare i8* @__cxa_allocate_exception(i32) + +declare void @__cxa_throw(i8*, i8*, i8*) diff --git a/test/CodeGen/Mips/fp16static.ll b/test/CodeGen/Mips/fp16static.ll new file mode 100644 index 000000000000..240ec75a36b6 --- /dev/null +++ b/test/CodeGen/Mips/fp16static.ll @@ -0,0 +1,13 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -mips16-hard-float -soft-float -relocation-model=static < %s | FileCheck %s -check-prefix=CHECK-STATIC16 + +@x = common global float 0.000000e+00, align 4 + +define void @foo() nounwind { +entry: + %0 = load float* @x, align 4 + %1 = load float* @x, align 4 + %mul = fmul float %0, %1 + store float %mul, float* @x, align 4 +; CHECK-STATIC16: jal __mips16_mulsf3 + ret void +} diff --git a/test/CodeGen/Mips/frame-address.ll b/test/CodeGen/Mips/frame-address.ll index 9df1808fde53..92946d9ffd68 100644 --- a/test/CodeGen/Mips/frame-address.ll +++ b/test/CodeGen/Mips/frame-address.ll @@ -7,6 +7,6 @@ entry: %0 = call i8* @llvm.frameaddress(i32 0) ret i8* %0 -; CHECK: addu $fp, $sp, $zero -; CHECK: addu $2, $zero, $fp +; CHECK: move $fp, $sp +; CHECK: move $2, $fp } diff --git a/test/CodeGen/Mips/gpreg-lazy-binding.ll b/test/CodeGen/Mips/gpreg-lazy-binding.ll new file mode 100644 index 000000000000..88e596b3bb0d --- /dev/null +++ b/test/CodeGen/Mips/gpreg-lazy-binding.ll @@ -0,0 +1,27 @@ +; RUN: llc -march=mipsel -disable-mips-delay-filler < %s | FileCheck %s + +@g = external global i32 + +; CHECK: move $gp +; CHECK: jalr $25 +; CHECK: nop +; CHECK-NOT: move $gp +; CHECK: jalr $25 + +define void @f0() nounwind { +entry: + tail call void @externalFunc() nounwind + tail call fastcc void @internalFunc() + ret void +} + +declare void @externalFunc() + +define internal fastcc void @internalFunc() nounwind noinline { +entry: + %0 = load i32* @g, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @g, align 4 + ret void +} + diff --git a/test/CodeGen/Mips/helloworld.ll b/test/CodeGen/Mips/helloworld.ll index aee58b650e7a..56ee60785f46 100644 --- a/test/CodeGen/Mips/helloworld.ll +++ b/test/CodeGen/Mips/helloworld.ll @@ -1,9 +1,11 @@ ; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=C1 ; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=C2 ; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=PE +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s | FileCheck %s -check-prefix=ST1 +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s | FileCheck %s -check-prefix=ST2 ; -; re-enable this when mips16's jalr is fixed. -; DISABLED: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=SR +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=SR +; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=SR32 @.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", align 1 @@ -15,7 +17,15 @@ entry: ; SR: .set mips16 # @main -; SR: save $ra, [[FS:[0-9]+]] +; SR32: .set nomips16 +; SR32: .ent main +; SR-NOT: .set noreorder +; SR-NOT: .set nomacro +; SR-NOT: .set noat +; SR32: .set noreorder +; SR32: .set nomacro +; SR32: .set noat +; SR: save $ra, $s0, $s1, [[FS:[0-9]+]] ; PE: li $[[T1:[0-9]+]], %hi(_gp_disp) ; PE: addiu $[[T2:[0-9]+]], $pc, %lo(_gp_disp) ; PE: sll $[[T3:[0-9]+]], $[[T1]], 16 @@ -25,10 +35,23 @@ entry: ; C2: move $25, ${{[0-9]+}} ; C1: move $gp, ${{[0-9]+}} ; C1: jalrc ${{[0-9]+}} -; SR: restore $ra, [[FS]] +; SR: restore $ra, $s0, $s1, [[FS]] ; PE: li $2, 0 ; PE: jrc $ra +; ST1: li ${{[0-9]+}}, %hi($.str) +; ST1: sll ${{[0-9]+}}, ${{[0-9]+}}, 16 +; ST1: addiu ${{[0-9]+}}, %lo($.str) +; ST2: li ${{[0-9]+}}, %hi($.str) +; ST2: jal printf } +; SR-NOT: .set at +; SR-NOT: .set macro +; SR-NOT: .set reorder +; SR32: .set at +; SR32: .set macro +; SR32: .set reorder +; SR: .end main +; SR32: .end main declare i32 @printf(i8*, ...) diff --git a/test/CodeGen/Mips/hf16_1.ll b/test/CodeGen/Mips/hf16_1.ll new file mode 100644 index 000000000000..c7454ee0a8dd --- /dev/null +++ b/test/CodeGen/Mips/hf16_1.ll @@ -0,0 +1,256 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -soft-float -mips16-hard-float -O3 < %s | FileCheck %s -check-prefix=1 +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -soft-float -mips16-hard-float -O3 < %s | FileCheck %s -check-prefix=2 + + +@x = common global float 0.000000e+00, align 4 +@xd = common global double 0.000000e+00, align 8 +@y = common global float 0.000000e+00, align 4 +@yd = common global double 0.000000e+00, align 8 +@xy = common global { float, float } zeroinitializer, align 4 +@xyd = common global { double, double } zeroinitializer, align 8 + +define void @foo() nounwind { +entry: + %0 = load float* @x, align 4 + call void @v_sf(float %0) + %1 = load double* @xd, align 8 + call void @v_df(double %1) + %2 = load float* @x, align 4 + %3 = load float* @y, align 4 + call void @v_sf_sf(float %2, float %3) + %4 = load double* @xd, align 8 + %5 = load float* @x, align 4 + call void @v_df_sf(double %4, float %5) + %6 = load double* @xd, align 8 + %7 = load double* @yd, align 8 + call void @v_df_df(double %6, double %7) + %call = call float @sf_v() + %8 = load float* @x, align 4 + %call1 = call float @sf_sf(float %8) + %9 = load double* @xd, align 8 + %call2 = call float @sf_df(double %9) + %10 = load float* @x, align 4 + %11 = load float* @y, align 4 + %call3 = call float @sf_sf_sf(float %10, float %11) + %12 = load double* @xd, align 8 + %13 = load float* @x, align 4 + %call4 = call float @sf_df_sf(double %12, float %13) + %14 = load double* @xd, align 8 + %15 = load double* @yd, align 8 + %call5 = call float @sf_df_df(double %14, double %15) + %call6 = call double @df_v() + %16 = load float* @x, align 4 + %call7 = call double @df_sf(float %16) + %17 = load double* @xd, align 8 + %call8 = call double @df_df(double %17) + %18 = load float* @x, align 4 + %19 = load float* @y, align 4 + %call9 = call double @df_sf_sf(float %18, float %19) + %20 = load double* @xd, align 8 + %21 = load float* @x, align 4 + %call10 = call double @df_df_sf(double %20, float %21) + %22 = load double* @xd, align 8 + %23 = load double* @yd, align 8 + %call11 = call double @df_df_df(double %22, double %23) + %call12 = call { float, float } @sc_v() + %24 = extractvalue { float, float } %call12, 0 + %25 = extractvalue { float, float } %call12, 1 + %26 = load float* @x, align 4 + %call13 = call { float, float } @sc_sf(float %26) + %27 = extractvalue { float, float } %call13, 0 + %28 = extractvalue { float, float } %call13, 1 + %29 = load double* @xd, align 8 + %call14 = call { float, float } @sc_df(double %29) + %30 = extractvalue { float, float } %call14, 0 + %31 = extractvalue { float, float } %call14, 1 + %32 = load float* @x, align 4 + %33 = load float* @y, align 4 + %call15 = call { float, float } @sc_sf_sf(float %32, float %33) + %34 = extractvalue { float, float } %call15, 0 + %35 = extractvalue { float, float } %call15, 1 + %36 = load double* @xd, align 8 + %37 = load float* @x, align 4 + %call16 = call { float, float } @sc_df_sf(double %36, float %37) + %38 = extractvalue { float, float } %call16, 0 + %39 = extractvalue { float, float } %call16, 1 + %40 = load double* @xd, align 8 + %41 = load double* @yd, align 8 + %call17 = call { float, float } @sc_df_df(double %40, double %41) + %42 = extractvalue { float, float } %call17, 0 + %43 = extractvalue { float, float } %call17, 1 + %call18 = call { double, double } @dc_v() + %44 = extractvalue { double, double } %call18, 0 + %45 = extractvalue { double, double } %call18, 1 + %46 = load float* @x, align 4 + %call19 = call { double, double } @dc_sf(float %46) + %47 = extractvalue { double, double } %call19, 0 + %48 = extractvalue { double, double } %call19, 1 + %49 = load double* @xd, align 8 + %call20 = call { double, double } @dc_df(double %49) + %50 = extractvalue { double, double } %call20, 0 + %51 = extractvalue { double, double } %call20, 1 + %52 = load float* @x, align 4 + %53 = load float* @y, align 4 + %call21 = call { double, double } @dc_sf_sf(float %52, float %53) + %54 = extractvalue { double, double } %call21, 0 + %55 = extractvalue { double, double } %call21, 1 + %56 = load double* @xd, align 8 + %57 = load float* @x, align 4 + %call22 = call { double, double } @dc_df_sf(double %56, float %57) + %58 = extractvalue { double, double } %call22, 0 + %59 = extractvalue { double, double } %call22, 1 + %60 = load double* @xd, align 8 + %61 = load double* @yd, align 8 + %call23 = call { double, double } @dc_df_df(double %60, double %61) + %62 = extractvalue { double, double } %call23, 0 + %63 = extractvalue { double, double } %call23, 1 + ret void +} + +declare void @v_sf(float) + +declare void @v_df(double) + +declare void @v_sf_sf(float, float) + +declare void @v_df_sf(double, float) + +declare void @v_df_df(double, double) + +declare float @sf_v() + +declare float @sf_sf(float) + +declare float @sf_df(double) + +declare float @sf_sf_sf(float, float) + +declare float @sf_df_sf(double, float) + +declare float @sf_df_df(double, double) + +declare double @df_v() + +declare double @df_sf(float) + +declare double @df_df(double) + +declare double @df_sf_sf(float, float) + +declare double @df_df_sf(double, float) + +declare double @df_df_df(double, double) + +declare { float, float } @sc_v() + +declare { float, float } @sc_sf(float) + +declare { float, float } @sc_df(double) + +declare { float, float } @sc_sf_sf(float, float) + +declare { float, float } @sc_df_sf(double, float) + +declare { float, float } @sc_df_df(double, double) + +declare { double, double } @dc_v() + +declare { double, double } @dc_sf(float) + +declare { double, double } @dc_df(double) + +declare { double, double } @dc_sf_sf(float, float) + +declare { double, double } @dc_df_sf(double, float) + +declare { double, double } @dc_df_df(double, double) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_1)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(v_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_2)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(v_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_5)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(v_sf_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_6)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(v_df_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_10)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(v_df_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sf_0)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sf_v)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sf_1)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sf_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sf_2)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sf_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sf_5)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sf_sf_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sf_6)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sf_df_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sf_10)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sf_df_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_df_0)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(df_v)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_df_1)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(df_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_df_2)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(df_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_df_5)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(df_sf_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_df_6)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(df_df_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_df_10)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(df_df_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sc_0)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sc_v)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sc_1)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sc_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sc_2)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sc_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sc_5)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sc_sf_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sc_6)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sc_df_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_sc_10)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(sc_df_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_dc_0)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(dc_v)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_dc_1)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(dc_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_dc_2)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(dc_df)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_dc_5)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(dc_sf_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_dc_6)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(dc_df_sf)(${{[0-9]+}}) + +; 1: lw ${{[0-9]+}}, %got(__mips16_call_stub_dc_10)(${{[0-9]+}}) +; 2: lw ${{[0-9]+}}, %call16(dc_df_df)(${{[0-9]+}}) + + + diff --git a/test/CodeGen/Mips/i64arg.ll b/test/CodeGen/Mips/i64arg.ll index 8b1f71b69f19..704014cba010 100644 --- a/test/CodeGen/Mips/i64arg.ll +++ b/test/CodeGen/Mips/i64arg.ll @@ -2,8 +2,8 @@ define void @f1(i64 %ll1, float %f, i64 %ll, i32 %i, float %f2) nounwind { entry: -; CHECK: addu $[[R1:[0-9]+]], $zero, $5 -; CHECK: addu $[[R0:[0-9]+]], $zero, $4 +; CHECK: move $[[R1:[0-9]+]], $5 +; CHECK: move $[[R0:[0-9]+]], $4 ; CHECK: ori $6, ${{[0-9]+}}, 3855 ; CHECK: ori $7, ${{[0-9]+}}, 22136 ; CHECK: lw $25, %call16(ff1) @@ -12,16 +12,16 @@ entry: ; CHECK: lw $25, %call16(ff2) ; CHECK: lw $[[R2:[0-9]+]], 80($sp) ; CHECK: lw $[[R3:[0-9]+]], 84($sp) -; CHECK: addu $4, $zero, $[[R2]] -; CHECK: addu $5, $zero, $[[R3]] +; CHECK: move $4, $[[R2]] +; CHECK: move $5, $[[R3]] ; CHECK: jalr $25 tail call void @ff2(i64 %ll, double 3.000000e+00) nounwind %sub = add nsw i32 %i, -1 +; CHECK: lw $25, %call16(ff3) ; CHECK: sw $[[R1]], 28($sp) ; CHECK: sw $[[R0]], 24($sp) -; CHECK: lw $25, %call16(ff3) -; CHECK: addu $6, $zero, $[[R2]] -; CHECK: addu $7, $zero, $[[R3]] +; CHECK: move $6, $[[R2]] +; CHECK: move $7, $[[R3]] ; CHECK: jalr $25 tail call void @ff3(i32 %i, i64 %ll, i32 %sub, i64 %ll1) nounwind ret void diff --git a/test/CodeGen/Mips/inlineasm_constraint.ll b/test/CodeGen/Mips/inlineasm_constraint.ll index 5adec3bb29ea..8d30f45d84e3 100644 --- a/test/CodeGen/Mips/inlineasm_constraint.ll +++ b/test/CodeGen/Mips/inlineasm_constraint.ll @@ -51,5 +51,14 @@ entry: ; CHECK: #NO_APP tail call i32 asm sideeffect "addi $0,$1,$2", "=r,r,P"(i32 7, i32 65535) nounwind +; Now R Which takes the address of c + %c = alloca i32, align 4 + store i32 -4469539, i32* %c, align 4 + %8 = call i32 asm sideeffect "lwl $0, 1 + $1\0A\09lwr $0, 2 + $1\0A\09", "=r,*R"(i32* %c) #1 +; CHECK: #APP +; CHECK: lwl ${{[0-9]+}}, 1 + 0(${{[0-9]+}}) +; CHECK: lwr ${{[0-9]+}}, 2 + 0(${{[0-9]+}}) +; CHECK: #NO_APP + ret i32 0 } diff --git a/test/CodeGen/Mips/jtstat.ll b/test/CodeGen/Mips/jtstat.ll new file mode 100644 index 000000000000..01afc080c2ed --- /dev/null +++ b/test/CodeGen/Mips/jtstat.ll @@ -0,0 +1,71 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static < %s | FileCheck %s -check-prefix=CHECK-STATIC16 + +@s = global i8 115, align 1 +@c = common global i8 0, align 1 +@.str = private unnamed_addr constant [5 x i8] c"%c \0A\00", align 1 + +define void @test(i32 %i) nounwind { +entry: + %i.addr = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32* %i.addr, align 4 + switch i32 %0, label %sw.epilog [ + i32 115, label %sw.bb + i32 105, label %sw.bb1 + i32 100, label %sw.bb2 + i32 108, label %sw.bb3 + i32 99, label %sw.bb4 + i32 68, label %sw.bb5 + i32 81, label %sw.bb6 + i32 76, label %sw.bb7 + ] + +sw.bb: ; preds = %entry + store i8 115, i8* @c, align 1 + br label %sw.epilog + +sw.bb1: ; preds = %entry + store i8 105, i8* @c, align 1 + br label %sw.epilog + +sw.bb2: ; preds = %entry + store i8 100, i8* @c, align 1 + br label %sw.epilog + +sw.bb3: ; preds = %entry + store i8 108, i8* @c, align 1 + br label %sw.epilog + +sw.bb4: ; preds = %entry + store i8 99, i8* @c, align 1 + br label %sw.epilog + +sw.bb5: ; preds = %entry + store i8 68, i8* @c, align 1 + br label %sw.epilog + +sw.bb6: ; preds = %entry + store i8 81, i8* @c, align 1 + br label %sw.epilog + +sw.bb7: ; preds = %entry + store i8 76, i8* @c, align 1 + br label %sw.epilog + +sw.epilog: ; preds = %entry, %sw.bb7, %sw.bb6, %sw.bb5, %sw.bb4, %sw.bb3, %sw.bb2, %sw.bb1, %sw.bb + ret void +} + +; CHECK-STATIC16: li ${{[0-9]+}}, %hi($JTI{{[0-9]+}}_{{[0-9]+}}) +; CHECK-STATIC16: lw ${{[0-9]+}}, %lo($JTI{{[0-9]+}}_{{[0-9]+}})(${{[0-9]+}}) +; CHECK-STATIC16: $JTI{{[0-9]+}}_{{[0-9]+}}: +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) +; CHECK-STATIC16: .4byte ($BB0_{{[0-9]+}}) diff --git a/test/CodeGen/Mips/largefr1.ll b/test/CodeGen/Mips/largefr1.ll new file mode 100644 index 000000000000..0fe89f71d9f3 --- /dev/null +++ b/test/CodeGen/Mips/largefr1.ll @@ -0,0 +1,61 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -mips16-hard-float -soft-float -relocation-model=static < %s | FileCheck %s -check-prefix=1 + +@i = common global i32 0, align 4 +@j = common global i32 0, align 4 +@.str = private unnamed_addr constant [8 x i8] c"%i %i \0A\00", align 1 + +define void @foo(i32* %p, i32 %i, i32 %j) nounwind { +entry: + %p.addr = alloca i32*, align 4 + %i.addr = alloca i32, align 4 + %j.addr = alloca i32, align 4 + store i32* %p, i32** %p.addr, align 4 + store i32 %i, i32* %i.addr, align 4 + store i32 %j, i32* %j.addr, align 4 + %0 = load i32* %j.addr, align 4 + %1 = load i32** %p.addr, align 4 + %2 = load i32* %i.addr, align 4 + %add.ptr = getelementptr inbounds i32* %1, i32 %2 + store i32 %0, i32* %add.ptr, align 4 + ret void +} + +define i32 @main() nounwind { +entry: +; 1: main: +; 1: 1: .word -797992 +; 1: li ${{[0-9]+}}, 12 +; 1: sll ${{[0-9]+}}, ${{[0-9]+}}, 16 +; 1: addu ${{[0-9]+}}, ${{[0-9]+}}, ${{[0-9]+}} +; 2: move $sp, ${{[0-9]+}} +; 2: addu ${{[0-9]+}}, ${{[0-9]+}}, ${{[0-9]+}} +; 1: li ${{[0-9]+}}, 6 +; 1: sll ${{[0-9]+}}, ${{[0-9]+}}, 16 +; 1: addu ${{[0-9]+}}, ${{[0-9]+}}, ${{[0-9]+}} +; 2: move $sp, ${{[0-9]+}} +; 2: addu ${{[0-9]+}}, ${{[0-9]+}}, ${{[0-9]+}} +; 1: addiu ${{[0-9]+}}, ${{[0-9]+}}, 6800 +; 1: li ${{[0-9]+}}, 1 +; 1: sll ${{[0-9]+}}, ${{[0-9]+}}, 16 +; 2: li ${{[0-9]+}}, 34463 + %retval = alloca i32, align 4 + %one = alloca [100000 x i32], align 4 + %two = alloca [100000 x i32], align 4 + store i32 0, i32* %retval + %arrayidx = getelementptr inbounds [100000 x i32]* %one, i32 0, i32 0 + call void @foo(i32* %arrayidx, i32 50, i32 9999) + %arrayidx1 = getelementptr inbounds [100000 x i32]* %two, i32 0, i32 0 + call void @foo(i32* %arrayidx1, i32 99999, i32 5555) + %arrayidx2 = getelementptr inbounds [100000 x i32]* %one, i32 0, i32 50 + %0 = load i32* %arrayidx2, align 4 + store i32 %0, i32* @i, align 4 + %arrayidx3 = getelementptr inbounds [100000 x i32]* %two, i32 0, i32 99999 + %1 = load i32* %arrayidx3, align 4 + store i32 %1, i32* @j, align 4 + %2 = load i32* @i, align 4 + %3 = load i32* @j, align 4 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 %2, i32 %3) + ret i32 0 +} + +declare i32 @printf(i8*, ...) diff --git a/test/CodeGen/Mips/lit.local.cfg b/test/CodeGen/Mips/lit.local.cfg index 0587d3243e6b..e157c540b538 100644 --- a/test/CodeGen/Mips/lit.local.cfg +++ b/test/CodeGen/Mips/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'Mips' in targets: diff --git a/test/CodeGen/Mips/madd-msub.ll b/test/CodeGen/Mips/madd-msub.ll index 0aeabb30e289..0dbb2c27b8f9 100644 --- a/test/CodeGen/Mips/madd-msub.ll +++ b/test/CodeGen/Mips/madd-msub.ll @@ -1,6 +1,9 @@ -; RUN: llc -march=mips < %s | FileCheck %s +; RUN: llc -march=mips < %s | FileCheck %s -check-prefix=32 +; RUN: llc -march=mips -mattr=dsp < %s | FileCheck %s -check-prefix=DSP +; RUN: llc -march=mips -mcpu=mips16 < %s -; CHECK: madd +; 32: madd ${{[0-9]+}} +; DSP: madd $ac define i64 @madd1(i32 %a, i32 %b, i32 %c) nounwind readnone { entry: %conv = sext i32 %a to i64 @@ -11,7 +14,8 @@ entry: ret i64 %add } -; CHECK: maddu +; 32: maddu ${{[0-9]+}} +; DSP: maddu $ac define i64 @madd2(i32 %a, i32 %b, i32 %c) nounwind readnone { entry: %conv = zext i32 %a to i64 @@ -22,7 +26,8 @@ entry: ret i64 %add } -; CHECK: madd +; 32: madd ${{[0-9]+}} +; DSP: madd $ac define i64 @madd3(i32 %a, i32 %b, i64 %c) nounwind readnone { entry: %conv = sext i32 %a to i64 @@ -32,7 +37,8 @@ entry: ret i64 %add } -; CHECK: msub +; 32: msub ${{[0-9]+}} +; DSP: msub $ac define i64 @msub1(i32 %a, i32 %b, i32 %c) nounwind readnone { entry: %conv = sext i32 %c to i64 @@ -43,7 +49,8 @@ entry: ret i64 %sub } -; CHECK: msubu +; 32: msubu ${{[0-9]+}} +; DSP: msubu $ac define i64 @msub2(i32 %a, i32 %b, i32 %c) nounwind readnone { entry: %conv = zext i32 %c to i64 @@ -54,7 +61,8 @@ entry: ret i64 %sub } -; CHECK: msub +; 32: msub ${{[0-9]+}} +; DSP: msub $ac define i64 @msub3(i32 %a, i32 %b, i64 %c) nounwind readnone { entry: %conv = sext i32 %a to i64 diff --git a/test/CodeGen/Mips/mips16ex.ll b/test/CodeGen/Mips/mips16ex.ll new file mode 100644 index 000000000000..ecb30b5c63b8 --- /dev/null +++ b/test/CodeGen/Mips/mips16ex.ll @@ -0,0 +1,87 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16 + +;16: $eh_func_begin0=. +@.str = private unnamed_addr constant [7 x i8] c"hello\0A\00", align 1 +@_ZTIi = external constant i8* +@.str1 = private unnamed_addr constant [15 x i8] c"exception %i \0A\00", align 1 + +define i32 @main() { +entry: + %retval = alloca i32, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + %e = alloca i32, align 4 + store i32 0, i32* %retval + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str, i32 0, i32 0)) + %exception = call i8* @__cxa_allocate_exception(i32 4) nounwind + %0 = bitcast i8* %exception to i32* + store i32 20, i32* %0 + invoke void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null) noreturn + to label %unreachable unwind label %lpad + +lpad: ; preds = %entry + %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast (i8** @_ZTIi to i8*) + %2 = extractvalue { i8*, i32 } %1, 0 + store i8* %2, i8** %exn.slot + %3 = extractvalue { i8*, i32 } %1, 1 + store i32 %3, i32* %ehselector.slot + br label %catch.dispatch + +catch.dispatch: ; preds = %lpad + %sel = load i32* %ehselector.slot + %4 = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) nounwind + %matches = icmp eq i32 %sel, %4 + br i1 %matches, label %catch, label %eh.resume + +catch: ; preds = %catch.dispatch + %exn = load i8** %exn.slot + %5 = call i8* @__cxa_begin_catch(i8* %exn) nounwind + %6 = bitcast i8* %5 to i32* + %exn.scalar = load i32* %6 + store i32 %exn.scalar, i32* %e, align 4 + %7 = load i32* %e, align 4 + %call2 = invoke i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str1, i32 0, i32 0), i32 %7) + to label %invoke.cont unwind label %lpad1 + +invoke.cont: ; preds = %catch + call void @__cxa_end_catch() nounwind + br label %try.cont + +try.cont: ; preds = %invoke.cont + ret i32 0 + +lpad1: ; preds = %catch + %8 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup + %9 = extractvalue { i8*, i32 } %8, 0 + store i8* %9, i8** %exn.slot + %10 = extractvalue { i8*, i32 } %8, 1 + store i32 %10, i32* %ehselector.slot + call void @__cxa_end_catch() nounwind + br label %eh.resume + +eh.resume: ; preds = %lpad1, %catch.dispatch + %exn3 = load i8** %exn.slot + %sel4 = load i32* %ehselector.slot + %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn3, 0 + %lpad.val5 = insertvalue { i8*, i32 } %lpad.val, i32 %sel4, 1 + resume { i8*, i32 } %lpad.val5 + +unreachable: ; preds = %entry + unreachable +} + +declare i32 @printf(i8*, ...) + +declare i8* @__cxa_allocate_exception(i32) + +declare i32 @__gxx_personality_v0(...) + +declare void @__cxa_throw(i8*, i8*, i8*) + +declare i32 @llvm.eh.typeid.for(i8*) nounwind readnone + +declare i8* @__cxa_begin_catch(i8*) + +declare void @__cxa_end_catch() diff --git a/test/CodeGen/Mips/mips16fpe.ll b/test/CodeGen/Mips/mips16fpe.ll new file mode 100644 index 000000000000..433543607967 --- /dev/null +++ b/test/CodeGen/Mips/mips16fpe.ll @@ -0,0 +1,381 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 -soft-float -mips16-hard-float < %s | FileCheck %s -check-prefix=16hf + +@x = global float 5.000000e+00, align 4 +@y = global float 1.500000e+01, align 4 +@xd = global double 6.000000e+00, align 8 +@yd = global double 1.800000e+01, align 8 +@two = global i32 2, align 4 +@addsf3_result = common global float 0.000000e+00, align 4 +@adddf3_result = common global double 0.000000e+00, align 8 +@subsf3_result = common global float 0.000000e+00, align 4 +@subdf3_result = common global double 0.000000e+00, align 8 +@mulsf3_result = common global float 0.000000e+00, align 4 +@muldf3_result = common global double 0.000000e+00, align 8 +@divsf3_result = common global float 0.000000e+00, align 4 +@divdf3_result = common global double 0.000000e+00, align 8 +@extendsfdf2_result = common global double 0.000000e+00, align 8 +@xd2 = global double 0x40147E6B74B4CF6A, align 8 +@truncdfsf2_result = common global float 0.000000e+00, align 4 +@fix_truncsfsi_result = common global i32 0, align 4 +@fix_truncdfsi_result = common global i32 0, align 4 +@si = global i32 -9, align 4 +@ui = global i32 9, align 4 +@floatsisf_result = common global float 0.000000e+00, align 4 +@floatsidf_result = common global double 0.000000e+00, align 8 +@floatunsisf_result = common global float 0.000000e+00, align 4 +@floatunsidf_result = common global double 0.000000e+00, align 8 +@xx = global float 5.000000e+00, align 4 +@eqsf2_result = common global i32 0, align 4 +@xxd = global double 6.000000e+00, align 8 +@eqdf2_result = common global i32 0, align 4 +@nesf2_result = common global i32 0, align 4 +@nedf2_result = common global i32 0, align 4 +@gesf2_result = common global i32 0, align 4 +@gedf2_result = common global i32 0, align 4 +@ltsf2_result = common global i32 0, align 4 +@ltdf2_result = common global i32 0, align 4 +@lesf2_result = common global i32 0, align 4 +@ledf2_result = common global i32 0, align 4 +@gtsf2_result = common global i32 0, align 4 +@gtdf2_result = common global i32 0, align 4 + +define void @test_addsf3() nounwind { +entry: +;16hf: test_addsf3: + %0 = load float* @x, align 4 + %1 = load float* @y, align 4 + %add = fadd float %0, %1 + store float %add, float* @addsf3_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_addsf3)(${{[0-9]+}}) + ret void +} + +define void @test_adddf3() nounwind { +entry: +;16hf: test_adddf3: + %0 = load double* @xd, align 8 + %1 = load double* @yd, align 8 + %add = fadd double %0, %1 + store double %add, double* @adddf3_result, align 8 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_adddf3)(${{[0-9]+}}) + ret void +} + +define void @test_subsf3() nounwind { +entry: +;16hf: test_subsf3: + %0 = load float* @x, align 4 + %1 = load float* @y, align 4 + %sub = fsub float %0, %1 + store float %sub, float* @subsf3_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_subsf3)(${{[0-9]+}}) + ret void +} + +define void @test_subdf3() nounwind { +entry: +;16hf: test_subdf3: + %0 = load double* @xd, align 8 + %1 = load double* @yd, align 8 + %sub = fsub double %0, %1 + store double %sub, double* @subdf3_result, align 8 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_subdf3)(${{[0-9]+}}) + ret void +} + +define void @test_mulsf3() nounwind { +entry: +;16hf: test_mulsf3: + %0 = load float* @x, align 4 + %1 = load float* @y, align 4 + %mul = fmul float %0, %1 + store float %mul, float* @mulsf3_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_mulsf3)(${{[0-9]+}}) + ret void +} + +define void @test_muldf3() nounwind { +entry: +;16hf: test_muldf3: + %0 = load double* @xd, align 8 + %1 = load double* @yd, align 8 + %mul = fmul double %0, %1 + store double %mul, double* @muldf3_result, align 8 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_muldf3)(${{[0-9]+}}) + ret void +} + +define void @test_divsf3() nounwind { +entry: +;16hf: test_divsf3: + %0 = load float* @y, align 4 + %1 = load float* @x, align 4 + %div = fdiv float %0, %1 + store float %div, float* @divsf3_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_divsf3)(${{[0-9]+}}) + ret void +} + +define void @test_divdf3() nounwind { +entry: +;16hf: test_divdf3: + %0 = load double* @yd, align 8 + %mul = fmul double %0, 2.000000e+00 + %1 = load double* @xd, align 8 + %div = fdiv double %mul, %1 + store double %div, double* @divdf3_result, align 8 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_divdf3)(${{[0-9]+}}) + ret void +} + +define void @test_extendsfdf2() nounwind { +entry: +;16hf: test_extendsfdf2: + %0 = load float* @x, align 4 + %conv = fpext float %0 to double + store double %conv, double* @extendsfdf2_result, align 8 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_extendsfdf2)(${{[0-9]+}}) + ret void +} + +define void @test_truncdfsf2() nounwind { +entry: +;16hf: test_truncdfsf2: + %0 = load double* @xd2, align 8 + %conv = fptrunc double %0 to float + store float %conv, float* @truncdfsf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_truncdfsf2)(${{[0-9]+}}) + ret void +} + +define void @test_fix_truncsfsi() nounwind { +entry: +;16hf: test_fix_truncsfsi: + %0 = load float* @x, align 4 + %conv = fptosi float %0 to i32 + store i32 %conv, i32* @fix_truncsfsi_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_fix_truncsfsi)(${{[0-9]+}}) + ret void +} + +define void @test_fix_truncdfsi() nounwind { +entry: +;16hf: test_fix_truncdfsi: + %0 = load double* @xd, align 8 + %conv = fptosi double %0 to i32 + store i32 %conv, i32* @fix_truncdfsi_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_fix_truncdfsi)(${{[0-9]+}}) + ret void +} + +define void @test_floatsisf() nounwind { +entry: +;16hf: test_floatsisf: + %0 = load i32* @si, align 4 + %conv = sitofp i32 %0 to float + store float %conv, float* @floatsisf_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_floatsisf)(${{[0-9]+}}) + ret void +} + +define void @test_floatsidf() nounwind { +entry: +;16hf: test_floatsidf: + %0 = load i32* @si, align 4 + %conv = sitofp i32 %0 to double + store double %conv, double* @floatsidf_result, align 8 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_floatsidf)(${{[0-9]+}}) + ret void +} + +define void @test_floatunsisf() nounwind { +entry: +;16hf: test_floatunsisf: + %0 = load i32* @ui, align 4 + %conv = uitofp i32 %0 to float + store float %conv, float* @floatunsisf_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_floatunsisf)(${{[0-9]+}}) + ret void +} + +define void @test_floatunsidf() nounwind { +entry: +;16hf: test_floatunsidf: + %0 = load i32* @ui, align 4 + %conv = uitofp i32 %0 to double + store double %conv, double* @floatunsidf_result, align 8 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_floatunsidf)(${{[0-9]+}}) + ret void +} + +define void @test_eqsf2() nounwind { +entry: +;16hf: test_eqsf2: + %0 = load float* @x, align 4 + %1 = load float* @xx, align 4 + %cmp = fcmp oeq float %0, %1 + %conv = zext i1 %cmp to i32 + store i32 %conv, i32* @eqsf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_eqsf2)(${{[0-9]+}}) + ret void +} + +define void @test_eqdf2() nounwind { +entry: +;16hf: test_eqdf2: + %0 = load double* @xd, align 8 + %1 = load double* @xxd, align 8 + %cmp = fcmp oeq double %0, %1 + %conv = zext i1 %cmp to i32 + store i32 %conv, i32* @eqdf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_eqdf2)(${{[0-9]+}}) + ret void +} + +define void @test_nesf2() nounwind { +entry: +;16hf: test_nesf2: + %0 = load float* @x, align 4 + %1 = load float* @y, align 4 + %cmp = fcmp une float %0, %1 + %conv = zext i1 %cmp to i32 + store i32 %conv, i32* @nesf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_nesf2)(${{[0-9]+}}) + ret void +} + +define void @test_nedf2() nounwind { +entry: +;16hf: test_nedf2: + %0 = load double* @xd, align 8 + %1 = load double* @yd, align 8 + %cmp = fcmp une double %0, %1 + %conv = zext i1 %cmp to i32 + store i32 %conv, i32* @nedf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_nedf2)(${{[0-9]+}}) + ret void +} + +define void @test_gesf2() nounwind { +entry: +;16hf: test_gesf2: + %0 = load float* @x, align 4 + %1 = load float* @xx, align 4 + %cmp = fcmp oge float %0, %1 + %2 = load float* @y, align 4 + %cmp1 = fcmp oge float %2, %0 + %and3 = and i1 %cmp, %cmp1 + %and = zext i1 %and3 to i32 + store i32 %and, i32* @gesf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_gesf2)(${{[0-9]+}}) + ret void +} + +define void @test_gedf2() nounwind { +entry: +;16hf: test_gedf2: + %0 = load double* @xd, align 8 + %1 = load double* @xxd, align 8 + %cmp = fcmp oge double %0, %1 + %2 = load double* @yd, align 8 + %cmp1 = fcmp oge double %2, %0 + %and3 = and i1 %cmp, %cmp1 + %and = zext i1 %and3 to i32 + store i32 %and, i32* @gedf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_gedf2)(${{[0-9]+}}) + ret void +} + +define void @test_ltsf2() nounwind { +entry: +;16hf: test_ltsf2: + %0 = load float* @x, align 4 + %1 = load float* @xx, align 4 + %lnot = fcmp uge float %0, %1 + %2 = load float* @y, align 4 + %cmp1 = fcmp olt float %0, %2 + %and2 = and i1 %lnot, %cmp1 + %and = zext i1 %and2 to i32 + store i32 %and, i32* @ltsf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_unordsf2)(${{[0-9]+}}) +;16hf: lw ${{[0-9]+}}, %call16(__mips16_ltsf2)(${{[0-9]+}}) + ret void +} + +define void @test_ltdf2() nounwind { +entry: +;16hf: test_ltdf2: + %0 = load double* @xd, align 8 + %1 = load double* @xxd, align 8 + %lnot = fcmp uge double %0, %1 + %2 = load double* @yd, align 8 + %cmp1 = fcmp olt double %0, %2 + %and2 = and i1 %lnot, %cmp1 + %and = zext i1 %and2 to i32 + store i32 %and, i32* @ltdf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_unorddf2)(${{[0-9]+}}) +;16hf: lw ${{[0-9]+}}, %call16(__mips16_ltdf2)(${{[0-9]+}}) + ret void +} + +define void @test_lesf2() nounwind { +entry: +;16hf: test_lesf2: + %0 = load float* @x, align 4 + %1 = load float* @xx, align 4 + %cmp = fcmp ole float %0, %1 + %2 = load float* @y, align 4 + %cmp1 = fcmp ole float %0, %2 + %and3 = and i1 %cmp, %cmp1 + %and = zext i1 %and3 to i32 + store i32 %and, i32* @lesf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_lesf2)(${{[0-9]+}}) + ret void +} + +define void @test_ledf2() nounwind { +entry: +;16hf: test_ledf2: + %0 = load double* @xd, align 8 + %1 = load double* @xxd, align 8 + %cmp = fcmp ole double %0, %1 + %2 = load double* @yd, align 8 + %cmp1 = fcmp ole double %0, %2 + %and3 = and i1 %cmp, %cmp1 + %and = zext i1 %and3 to i32 + store i32 %and, i32* @ledf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_ledf2)(${{[0-9]+}}) + ret void +} + +define void @test_gtsf2() nounwind { +entry: +;16hf: test_gtsf2: + %0 = load float* @x, align 4 + %1 = load float* @xx, align 4 + %lnot = fcmp ule float %0, %1 + %2 = load float* @y, align 4 + %cmp1 = fcmp ogt float %2, %0 + %and2 = and i1 %lnot, %cmp1 + %and = zext i1 %and2 to i32 + store i32 %and, i32* @gtsf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_gtsf2)(${{[0-9]+}}) + ret void +} + +define void @test_gtdf2() nounwind { +entry: +;16hf: test_gtdf2: + %0 = load double* @xd, align 8 + %1 = load double* @xxd, align 8 + %lnot = fcmp ule double %0, %1 + %2 = load double* @yd, align 8 + %cmp1 = fcmp ogt double %2, %0 + %and2 = and i1 %lnot, %cmp1 + %and = zext i1 %and2 to i32 + store i32 %and, i32* @gtdf2_result, align 4 +;16hf: lw ${{[0-9]+}}, %call16(__mips16_gtdf2)(${{[0-9]+}}) + ret void +} + + diff --git a/test/CodeGen/Mips/mips64-f128-call.ll b/test/CodeGen/Mips/mips64-f128-call.ll new file mode 100644 index 000000000000..455e540e5df1 --- /dev/null +++ b/test/CodeGen/Mips/mips64-f128-call.ll @@ -0,0 +1,45 @@ +; RUN: llc -march=mips64el -mcpu=mips64r2 < %s | FileCheck %s + +@gld0 = external global fp128 +@gld1 = external global fp128 + +; CHECK: foo0 +; CHECK: sdc1 $f13, 8(${{[0-9]+}}) +; CHECK: sdc1 $f12, 0(${{[0-9]+}}) + +define void @foo0(fp128 %a0) { +entry: + store fp128 %a0, fp128* @gld0, align 16 + ret void +} + +; CHECK: foo1 +; CHECK: ldc1 $f13, 8(${{[0-9]+}}) +; CHECK: ldc1 $f12, 0(${{[0-9]+}}) + +define void @foo1() { +entry: + %0 = load fp128* @gld0, align 16 + tail call void @foo2(fp128 %0) + ret void +} + +declare void @foo2(fp128) + +; CHECK: foo3 +; CHECK: ld $[[R0:[0-9]+]], %got_disp(gld0) +; CHECK: sdc1 $f2, 8($[[R0]]) +; CHECK: sdc1 $f0, 0($[[R0]]) +; CHECK: ld $[[R1:[0-9]+]], %got_disp(gld1) +; CHECK: ldc1 $f0, 0($[[R1]]) +; CHECK: ldc1 $f2, 8($[[R1]]) + +define fp128 @foo3() { +entry: + %call = tail call fp128 @foo4() + store fp128 %call, fp128* @gld0, align 16 + %0 = load fp128* @gld1, align 16 + ret fp128 %0 +} + +declare fp128 @foo4() diff --git a/test/CodeGen/Mips/mips64-f128.ll b/test/CodeGen/Mips/mips64-f128.ll new file mode 100644 index 000000000000..5892cab4f8ea --- /dev/null +++ b/test/CodeGen/Mips/mips64-f128.ll @@ -0,0 +1,646 @@ +; RUN: llc -mtriple=mips64el-unknown-unknown -mcpu=mips64 -soft-float -O1 \ +; RUN: -disable-mips-delay-filler < %s | FileCheck %s + +@gld0 = external global fp128 +@gld1 = external global fp128 +@gld2 = external global fp128 +@gf1 = external global float +@gd1 = external global double + +; CHECK: addLD: +; CHECK: ld $25, %call16(__addtf3) + +define fp128 @addLD() { +entry: + %0 = load fp128* @gld0, align 16 + %1 = load fp128* @gld1, align 16 + %add = fadd fp128 %0, %1 + ret fp128 %add +} + +; CHECK: subLD: +; CHECK: ld $25, %call16(__subtf3) + +define fp128 @subLD() { +entry: + %0 = load fp128* @gld0, align 16 + %1 = load fp128* @gld1, align 16 + %sub = fsub fp128 %0, %1 + ret fp128 %sub +} + +; CHECK: mulLD: +; CHECK: ld $25, %call16(__multf3) + +define fp128 @mulLD() { +entry: + %0 = load fp128* @gld0, align 16 + %1 = load fp128* @gld1, align 16 + %mul = fmul fp128 %0, %1 + ret fp128 %mul +} + +; CHECK: divLD: +; CHECK: ld $25, %call16(__divtf3) + +define fp128 @divLD() { +entry: + %0 = load fp128* @gld0, align 16 + %1 = load fp128* @gld1, align 16 + %div = fdiv fp128 %0, %1 + ret fp128 %div +} + +; CHECK: conv_LD_char: +; CHECK: ld $25, %call16(__floatsitf) + +define fp128 @conv_LD_char(i8 signext %a) { +entry: + %conv = sitofp i8 %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_LD_short: +; CHECK: ld $25, %call16(__floatsitf) + +define fp128 @conv_LD_short(i16 signext %a) { +entry: + %conv = sitofp i16 %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_LD_int: +; CHECK: ld $25, %call16(__floatsitf) + +define fp128 @conv_LD_int(i32 %a) { +entry: + %conv = sitofp i32 %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_LD_LL: +; CHECK: ld $25, %call16(__floatditf) + +define fp128 @conv_LD_LL(i64 %a) { +entry: + %conv = sitofp i64 %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_LD_UChar: +; CHECK: ld $25, %call16(__floatunsitf) + +define fp128 @conv_LD_UChar(i8 zeroext %a) { +entry: + %conv = uitofp i8 %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_LD_UShort: +; CHECK: ld $25, %call16(__floatunsitf) + +define fp128 @conv_LD_UShort(i16 zeroext %a) { +entry: + %conv = uitofp i16 %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_LD_UInt: +; CHECK: ld $25, %call16(__floatunsitf) + +define fp128 @conv_LD_UInt(i32 %a) { +entry: + %conv = uitofp i32 %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_LD_ULL: +; CHECK: ld $25, %call16(__floatunditf) + +define fp128 @conv_LD_ULL(i64 %a) { +entry: + %conv = uitofp i64 %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_char_LD: +; CHECK: ld $25, %call16(__fixtfsi) + +define signext i8 @conv_char_LD(fp128 %a) { +entry: + %conv = fptosi fp128 %a to i8 + ret i8 %conv +} + +; CHECK: conv_short_LD: +; CHECK: ld $25, %call16(__fixtfsi) + +define signext i16 @conv_short_LD(fp128 %a) { +entry: + %conv = fptosi fp128 %a to i16 + ret i16 %conv +} + +; CHECK: conv_int_LD: +; CHECK: ld $25, %call16(__fixtfsi) + +define i32 @conv_int_LD(fp128 %a) { +entry: + %conv = fptosi fp128 %a to i32 + ret i32 %conv +} + +; CHECK: conv_LL_LD: +; CHECK: ld $25, %call16(__fixtfdi) + +define i64 @conv_LL_LD(fp128 %a) { +entry: + %conv = fptosi fp128 %a to i64 + ret i64 %conv +} + +; CHECK: conv_UChar_LD: +; CHECK: ld $25, %call16(__fixtfsi) + +define zeroext i8 @conv_UChar_LD(fp128 %a) { +entry: + %conv = fptoui fp128 %a to i8 + ret i8 %conv +} + +; CHECK: conv_UShort_LD: +; CHECK: ld $25, %call16(__fixtfsi) + +define zeroext i16 @conv_UShort_LD(fp128 %a) { +entry: + %conv = fptoui fp128 %a to i16 + ret i16 %conv +} + +; CHECK: conv_UInt_LD: +; CHECK: ld $25, %call16(__fixunstfsi) + +define i32 @conv_UInt_LD(fp128 %a) { +entry: + %conv = fptoui fp128 %a to i32 + ret i32 %conv +} + +; CHECK: conv_ULL_LD: +; CHECK: ld $25, %call16(__fixunstfdi) + +define i64 @conv_ULL_LD(fp128 %a) { +entry: + %conv = fptoui fp128 %a to i64 + ret i64 %conv +} + +; CHECK: conv_LD_float: +; CHECK: ld $25, %call16(__extendsftf2) + +define fp128 @conv_LD_float(float %a) { +entry: + %conv = fpext float %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_LD_double: +; CHECK: ld $25, %call16(__extenddftf2) + +define fp128 @conv_LD_double(double %a) { +entry: + %conv = fpext double %a to fp128 + ret fp128 %conv +} + +; CHECK: conv_float_LD: +; CHECK: ld $25, %call16(__trunctfsf2) + +define float @conv_float_LD(fp128 %a) { +entry: + %conv = fptrunc fp128 %a to float + ret float %conv +} + +; CHECK: conv_double_LD: +; CHECK: ld $25, %call16(__trunctfdf2) + +define double @conv_double_LD(fp128 %a) { +entry: + %conv = fptrunc fp128 %a to double + ret double %conv +} + +; CHECK: libcall1_fabsl: +; CHECK: ld $[[R0:[0-9]+]], 8($[[R4:[0-9]+]]) +; CHECK: daddiu $[[R1:[0-9]+]], $zero, 1 +; CHECK: dsll $[[R2:[0-9]+]], $[[R1]], 63 +; CHECK: daddiu $[[R3:[0-9]+]], $[[R2]], -1 +; CHECK: and $4, $[[R0]], $[[R3]] +; CHECK: ld $2, 0($[[R4]]) + +define fp128 @libcall1_fabsl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @fabsl(fp128 %0) nounwind readnone + ret fp128 %call +} + +declare fp128 @fabsl(fp128) #1 + +; CHECK: libcall1_ceill: +; CHECK: ld $25, %call16(ceill) + +define fp128 @libcall1_ceill() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @ceill(fp128 %0) nounwind readnone + ret fp128 %call +} + +declare fp128 @ceill(fp128) #1 + +; CHECK: libcall1_sinl: +; CHECK: ld $25, %call16(sinl) + +define fp128 @libcall1_sinl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @sinl(fp128 %0) nounwind + ret fp128 %call +} + +declare fp128 @sinl(fp128) #2 + +; CHECK: libcall1_cosl: +; CHECK: ld $25, %call16(cosl) + +define fp128 @libcall1_cosl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @cosl(fp128 %0) nounwind + ret fp128 %call +} + +declare fp128 @cosl(fp128) #2 + +; CHECK: libcall1_expl: +; CHECK: ld $25, %call16(expl) + +define fp128 @libcall1_expl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @expl(fp128 %0) nounwind + ret fp128 %call +} + +declare fp128 @expl(fp128) #2 + +; CHECK: libcall1_exp2l: +; CHECK: ld $25, %call16(exp2l) + +define fp128 @libcall1_exp2l() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @exp2l(fp128 %0) nounwind + ret fp128 %call +} + +declare fp128 @exp2l(fp128) #2 + +; CHECK: libcall1_logl: +; CHECK: ld $25, %call16(logl) + +define fp128 @libcall1_logl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @logl(fp128 %0) nounwind + ret fp128 %call +} + +declare fp128 @logl(fp128) #2 + +; CHECK: libcall1_log2l: +; CHECK: ld $25, %call16(log2l) + +define fp128 @libcall1_log2l() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @log2l(fp128 %0) nounwind + ret fp128 %call +} + +declare fp128 @log2l(fp128) #2 + +; CHECK: libcall1_log10l: +; CHECK: ld $25, %call16(log10l) + +define fp128 @libcall1_log10l() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @log10l(fp128 %0) nounwind + ret fp128 %call +} + +declare fp128 @log10l(fp128) #2 + +; CHECK: libcall1_nearbyintl: +; CHECK: ld $25, %call16(nearbyintl) + +define fp128 @libcall1_nearbyintl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @nearbyintl(fp128 %0) nounwind readnone + ret fp128 %call +} + +declare fp128 @nearbyintl(fp128) #1 + +; CHECK: libcall1_floorl: +; CHECK: ld $25, %call16(floorl) + +define fp128 @libcall1_floorl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @floorl(fp128 %0) nounwind readnone + ret fp128 %call +} + +declare fp128 @floorl(fp128) #1 + +; CHECK: libcall1_sqrtl: +; CHECK: ld $25, %call16(sqrtl) + +define fp128 @libcall1_sqrtl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @sqrtl(fp128 %0) nounwind + ret fp128 %call +} + +declare fp128 @sqrtl(fp128) #2 + +; CHECK: libcall1_rintl: +; CHECK: ld $25, %call16(rintl) + +define fp128 @libcall1_rintl() { +entry: + %0 = load fp128* @gld0, align 16 + %call = tail call fp128 @rintl(fp128 %0) nounwind readnone + ret fp128 %call +} + +declare fp128 @rintl(fp128) #1 + +; CHECK: libcall_powil: +; CHECK: ld $25, %call16(__powitf2) + +define fp128 @libcall_powil(fp128 %a, i32 %b) { +entry: + %0 = tail call fp128 @llvm.powi.f128(fp128 %a, i32 %b) + ret fp128 %0 +} + +declare fp128 @llvm.powi.f128(fp128, i32) #3 + +; CHECK: libcall2_copysignl: +; CHECK: daddiu $[[R2:[0-9]+]], $zero, 1 +; CHECK: dsll $[[R3:[0-9]+]], $[[R2]], 63 +; CHECK: ld $[[R0:[0-9]+]], %got_disp(gld1) +; CHECK: ld $[[R1:[0-9]+]], 8($[[R0]]) +; CHECK: and $[[R4:[0-9]+]], $[[R1]], $[[R3]] +; CHECK: ld $[[R5:[0-9]+]], %got_disp(gld0) +; CHECK: ld $[[R6:[0-9]+]], 8($[[R5]]) +; CHECK: daddiu $[[R7:[0-9]+]], $[[R3]], -1 +; CHECK: and $[[R8:[0-9]+]], $[[R6]], $[[R7]] +; CHECK: or $4, $[[R8]], $[[R4]] +; CHECK: ld $2, 0($[[R5]]) + +define fp128 @libcall2_copysignl() { +entry: + %0 = load fp128* @gld0, align 16 + %1 = load fp128* @gld1, align 16 + %call = tail call fp128 @copysignl(fp128 %0, fp128 %1) nounwind readnone + ret fp128 %call +} + +declare fp128 @copysignl(fp128, fp128) #1 + +; CHECK: libcall2_powl: +; CHECK: ld $25, %call16(powl) + +define fp128 @libcall2_powl() { +entry: + %0 = load fp128* @gld0, align 16 + %1 = load fp128* @gld1, align 16 + %call = tail call fp128 @powl(fp128 %0, fp128 %1) nounwind + ret fp128 %call +} + +declare fp128 @powl(fp128, fp128) #2 + +; CHECK: libcall2_fmodl: +; CHECK: ld $25, %call16(fmodl) + +define fp128 @libcall2_fmodl() { +entry: + %0 = load fp128* @gld0, align 16 + %1 = load fp128* @gld1, align 16 + %call = tail call fp128 @fmodl(fp128 %0, fp128 %1) nounwind + ret fp128 %call +} + +declare fp128 @fmodl(fp128, fp128) #2 + +; CHECK: libcall3_fmal: +; CHECK: ld $25, %call16(fmal) + +define fp128 @libcall3_fmal() { +entry: + %0 = load fp128* @gld0, align 16 + %1 = load fp128* @gld2, align 16 + %2 = load fp128* @gld1, align 16 + %3 = tail call fp128 @llvm.fma.f128(fp128 %0, fp128 %2, fp128 %1) + ret fp128 %3 +} + +declare fp128 @llvm.fma.f128(fp128, fp128, fp128) #4 + +; CHECK: cmp_lt: +; CHECK: ld $25, %call16(__lttf2) + +define i32 @cmp_lt(fp128 %a, fp128 %b) { +entry: + %cmp = fcmp olt fp128 %a, %b + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +; CHECK: cmp_le: +; CHECK: ld $25, %call16(__letf2) + +define i32 @cmp_le(fp128 %a, fp128 %b) { +entry: + %cmp = fcmp ole fp128 %a, %b + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +; CHECK: cmp_gt: +; CHECK: ld $25, %call16(__gttf2) + +define i32 @cmp_gt(fp128 %a, fp128 %b) { +entry: + %cmp = fcmp ogt fp128 %a, %b + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +; CHECK: cmp_ge: +; CHECK: ld $25, %call16(__getf2) + +define i32 @cmp_ge(fp128 %a, fp128 %b) { +entry: + %cmp = fcmp oge fp128 %a, %b + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +; CHECK: cmp_eq: +; CHECK: ld $25, %call16(__eqtf2) + +define i32 @cmp_eq(fp128 %a, fp128 %b) { +entry: + %cmp = fcmp oeq fp128 %a, %b + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +; CHECK: cmp_ne: +; CHECK: ld $25, %call16(__netf2) + +define i32 @cmp_ne(fp128 %a, fp128 %b) { +entry: + %cmp = fcmp une fp128 %a, %b + %conv = zext i1 %cmp to i32 + ret i32 %conv +} + +; CHECK: load_LD_LD: +; CHECK: ld $[[R0:[0-9]+]], %got_disp(gld1) +; CHECK: ld $2, 0($[[R0]]) +; CHECK: ld $4, 8($[[R0]]) + +define fp128 @load_LD_LD() { +entry: + %0 = load fp128* @gld1, align 16 + ret fp128 %0 +} + +; CHECK: load_LD_float: +; CHECK: ld $[[R0:[0-9]+]], %got_disp(gf1) +; CHECK: lw $4, 0($[[R0]]) +; CHECK: ld $25, %call16(__extendsftf2) +; CHECK: jalr $25 + +define fp128 @load_LD_float() { +entry: + %0 = load float* @gf1, align 4 + %conv = fpext float %0 to fp128 + ret fp128 %conv +} + +; CHECK: load_LD_double: +; CHECK: ld $[[R0:[0-9]+]], %got_disp(gd1) +; CHECK: ld $4, 0($[[R0]]) +; CHECK: ld $25, %call16(__extenddftf2) +; CHECK: jalr $25 + +define fp128 @load_LD_double() { +entry: + %0 = load double* @gd1, align 8 + %conv = fpext double %0 to fp128 + ret fp128 %conv +} + +; CHECK: store_LD_LD: +; CHECK: ld $[[R0:[0-9]+]], %got_disp(gld1) +; CHECK: ld $[[R1:[0-9]+]], 0($[[R0]]) +; CHECK: ld $[[R2:[0-9]+]], 8($[[R0]]) +; CHECK: ld $[[R3:[0-9]+]], %got_disp(gld0) +; CHECK: sd $[[R2]], 8($[[R3]]) +; CHECK: sd $[[R1]], 0($[[R3]]) + +define void @store_LD_LD() { +entry: + %0 = load fp128* @gld1, align 16 + store fp128 %0, fp128* @gld0, align 16 + ret void +} + +; CHECK: store_LD_float: +; CHECK: ld $[[R0:[0-9]+]], %got_disp(gld1) +; CHECK: ld $4, 0($[[R0]]) +; CHECK: ld $5, 8($[[R0]]) +; CHECK: ld $25, %call16(__trunctfsf2) +; CHECK: jalr $25 +; CHECK: ld $[[R1:[0-9]+]], %got_disp(gf1) +; CHECK: sw $2, 0($[[R1]]) + +define void @store_LD_float() { +entry: + %0 = load fp128* @gld1, align 16 + %conv = fptrunc fp128 %0 to float + store float %conv, float* @gf1, align 4 + ret void +} + +; CHECK: store_LD_double: +; CHECK: ld $[[R0:[0-9]+]], %got_disp(gld1) +; CHECK: ld $4, 0($[[R0]]) +; CHECK: ld $5, 8($[[R0]]) +; CHECK: ld $25, %call16(__trunctfdf2) +; CHECK: jalr $25 +; CHECK: ld $[[R1:[0-9]+]], %got_disp(gd1) +; CHECK: sd $2, 0($[[R1]]) + +define void @store_LD_double() { +entry: + %0 = load fp128* @gld1, align 16 + %conv = fptrunc fp128 %0 to double + store double %conv, double* @gd1, align 8 + ret void +} + +; CHECK: select_LD: +; CHECK: movn $8, $6, $4 +; CHECK: movn $9, $7, $4 +; CHECK: move $2, $8 +; CHECK: move $4, $9 + +define fp128 @select_LD(i32 %a, i64, fp128 %b, fp128 %c) { +entry: + %tobool = icmp ne i32 %a, 0 + %cond = select i1 %tobool, fp128 %b, fp128 %c + ret fp128 %cond +} + +; CHECK: selectCC_LD: +; CHECK: move $[[R0:[0-9]+]], $11 +; CHECK: move $[[R1:[0-9]+]], $10 +; CHECK: move $[[R2:[0-9]+]], $9 +; CHECK: move $[[R3:[0-9]+]], $8 +; CHECK: ld $25, %call16(__gttf2)($gp) +; CHECK: jalr $25 +; CHECK: slti $1, $2, 1 +; CHECK: movz $[[R1]], $[[R3]], $1 +; CHECK: movz $[[R0]], $[[R2]], $1 +; CHECK: move $2, $[[R1]] +; CHECK: move $4, $[[R0]] + +define fp128 @selectCC_LD(fp128 %a, fp128 %b, fp128 %c, fp128 %d) { +entry: + %cmp = fcmp ogt fp128 %a, %b + %cond = select i1 %cmp, fp128 %c, fp128 %d + ret fp128 %cond +} diff --git a/test/CodeGen/Mips/mips64-libcall.ll b/test/CodeGen/Mips/mips64-libcall.ll new file mode 100644 index 000000000000..d54598be70d8 --- /dev/null +++ b/test/CodeGen/Mips/mips64-libcall.ll @@ -0,0 +1,29 @@ +; RUN: llc -march=mips64el -mcpu=mips64r2 -O3 < %s |\ +; RUN: FileCheck %s -check-prefix=HARD +; RUN: llc -march=mips64el -mcpu=mips64r2 -soft-float < %s |\ +; RUN: FileCheck %s -check-prefix=SOFT + +; Check that %add is not passed in an integer register. +; +; HARD: callfloor: +; HARD-NOT: dmfc1 $4 + +define double @callfloor(double %d) nounwind readnone { +entry: + %add = fadd double %d, 1.000000e+00 + %call = tail call double @floor(double %add) nounwind readnone + ret double %call +} + +declare double @floor(double) nounwind readnone + +; Check call16. +; +; SOFT: f64add: +; SOFT: ld $25, %call16(__adddf3) + +define double @f64add(double %a, double %b) { +entry: + %add = fadd double %a, %b + ret double %add +} diff --git a/test/CodeGen/Mips/mips64-sret.ll b/test/CodeGen/Mips/mips64-sret.ll index e26b0223b447..e01609f3b1e4 100644 --- a/test/CodeGen/Mips/mips64-sret.ll +++ b/test/CodeGen/Mips/mips64-sret.ll @@ -6,7 +6,7 @@ define void @f(%struct.S* noalias sret %agg.result) nounwind { entry: -; CHECK: daddu $2, $zero, $4 +; CHECK: move $2, $4 %0 = bitcast %struct.S* %agg.result to i8* call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast (%struct.S* @g to i8*), i64 32, i32 4, i1 false) diff --git a/test/CodeGen/Mips/o32_cc_byval.ll b/test/CodeGen/Mips/o32_cc_byval.ll index 5558ba6e10f4..0a8f85f4825d 100644 --- a/test/CodeGen/Mips/o32_cc_byval.ll +++ b/test/CodeGen/Mips/o32_cc_byval.ll @@ -12,20 +12,20 @@ define void @f1() nounwind { entry: ; CHECK: lw $[[R1:[0-9]+]], %got(f1.s1) ; CHECK: addiu $[[R0:[0-9]+]], $[[R1]], %lo(f1.s1) +; CHECK: lw $[[R7:[0-9]+]], 12($[[R0]]) +; CHECK: lw $[[R3:[0-9]+]], 16($[[R0]]) +; CHECK: lw $[[R4:[0-9]+]], 20($[[R0]]) +; CHECK: lw $[[R5:[0-9]+]], 24($[[R0]]) ; CHECK: lw $[[R6:[0-9]+]], 28($[[R0]]) ; CHECK: sw $[[R6]], 36($sp) -; CHECK: lw $[[R5:[0-9]+]], 24($[[R0]]) ; CHECK: sw $[[R5]], 32($sp) -; CHECK: lw $[[R4:[0-9]+]], 20($[[R0]]) ; CHECK: sw $[[R4]], 28($sp) -; CHECK: lw $[[R3:[0-9]+]], 16($[[R0]]) ; CHECK: sw $[[R3]], 24($sp) -; CHECK: lw $[[R7:[0-9]+]], 12($[[R0]]) ; CHECK: sw $[[R7]], 20($sp) ; CHECK: lw $[[R2:[0-9]+]], 8($[[R0]]) ; CHECK: sw $[[R2]], 16($sp) -; CHECK: lw $7, 4($[[R0]]) ; CHECK: lw $6, %lo(f1.s1)($[[R1]]) +; CHECK: lw $7, 4($[[R0]]) %agg.tmp10 = alloca %struct.S3, align 4 call void @callee1(float 2.000000e+01, %struct.S1* byval bitcast (%0* @f1.s1 to %struct.S1*)) nounwind call void @callee2(%struct.S2* byval @f1.s2) nounwind diff --git a/test/CodeGen/Mips/return-vector-float4.ll b/test/CodeGen/Mips/return-vector-float4.ll deleted file mode 100644 index ae10f123e4d2..000000000000 --- a/test/CodeGen/Mips/return-vector-float4.ll +++ /dev/null @@ -1,12 +0,0 @@ -; RUN: llc -march=mipsel -mattr=+android < %s | FileCheck %s - -define <4 x float> @retvec4() nounwind readnone { -entry: -; CHECK: lwc1 $f0 -; CHECK: lwc1 $f2 -; CHECK: lwc1 $f1 -; CHECK: lwc1 $f3 - - ret <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00> -} - diff --git a/test/CodeGen/Mips/return_address.ll b/test/CodeGen/Mips/return_address.ll index e1c9241984ca..34b72baa6d25 100644 --- a/test/CodeGen/Mips/return_address.ll +++ b/test/CodeGen/Mips/return_address.ll @@ -5,7 +5,7 @@ entry: %0 = call i8* @llvm.returnaddress(i32 0) ret i8* %0 -; CHECK: addu $2, $zero, $ra +; CHECK: move $2, $ra } define i8* @f2() nounwind { @@ -14,9 +14,9 @@ entry: %0 = call i8* @llvm.returnaddress(i32 0) ret i8* %0 -; CHECK: addu $[[R0:[0-9]+]], $zero, $ra +; CHECK: move $[[R0:[0-9]+]], $ra ; CHECK: jal -; CHECK: addu $2, $zero, $[[R0]] +; CHECK: move $2, $[[R0]] } declare i8* @llvm.returnaddress(i32) nounwind readnone diff --git a/test/CodeGen/Mips/selTBteqzCmpi.ll b/test/CodeGen/Mips/selTBteqzCmpi.ll new file mode 100644 index 000000000000..9cb8227f9d2b --- /dev/null +++ b/test/CodeGen/Mips/selTBteqzCmpi.ll @@ -0,0 +1,26 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@i = global i32 1, align 4 +@j = global i32 2, align 4 +@a = global i32 5, align 4 +@.str = private unnamed_addr constant [8 x i8] c"%i = 2\0A\00", align 1 +@k = common global i32 0, align 4 + +define void @t() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %cmp = icmp eq i32 %0, 10 + %1 = load i32* @i, align 4 + %2 = load i32* @j, align 4 + %cond = select i1 %cmp, i32 %1, i32 %2 + store i32 %cond, i32* @i, align 4 + ret void +} + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } + + +; 16: cmpi ${{[0-9]+}}, 10 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + + diff --git a/test/CodeGen/Mips/selTBtnezCmpi.ll b/test/CodeGen/Mips/selTBtnezCmpi.ll new file mode 100644 index 000000000000..bd334f59d33b --- /dev/null +++ b/test/CodeGen/Mips/selTBtnezCmpi.ll @@ -0,0 +1,26 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@i = global i32 1, align 4 +@j = global i32 2, align 4 +@a = global i32 5, align 4 +@.str = private unnamed_addr constant [8 x i8] c"%i = 1\0A\00", align 1 +@k = common global i32 0, align 4 + +define void @t() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %cmp = icmp ne i32 %0, 10 + %1 = load i32* @i, align 4 + %2 = load i32* @j, align 4 + %cond = select i1 %cmp, i32 %1, i32 %2 + store i32 %cond, i32* @i, align 4 + ret void +} + +; 16: cmpi ${{[0-9]+}}, 10 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } + + diff --git a/test/CodeGen/Mips/selTBtnezSlti.ll b/test/CodeGen/Mips/selTBtnezSlti.ll new file mode 100644 index 000000000000..593f6f274eb3 --- /dev/null +++ b/test/CodeGen/Mips/selTBtnezSlti.ll @@ -0,0 +1,25 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@i = global i32 1, align 4 +@j = global i32 2, align 4 +@a = global i32 5, align 4 +@.str = private unnamed_addr constant [9 x i8] c"%i = 2 \0A\00", align 1 +@k = common global i32 0, align 4 + +define void @t() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %cmp = icmp slt i32 %0, 10 + %1 = load i32* @j, align 4 + %2 = load i32* @i, align 4 + %cond = select i1 %cmp, i32 %1, i32 %2 + store i32 %cond, i32* @i, align 4 + ret void +} + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } + +; 16: slti ${{[0-9]+}}, 10 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + + diff --git a/test/CodeGen/Mips/seleq.ll b/test/CodeGen/Mips/seleq.ll new file mode 100644 index 000000000000..190baad0b1db --- /dev/null +++ b/test/CodeGen/Mips/seleq.ll @@ -0,0 +1,95 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@t = global i32 10, align 4 +@f = global i32 199, align 4 +@a = global i32 1, align 4 +@b = global i32 10, align 4 +@c = global i32 1, align 4 +@z1 = common global i32 0, align 4 +@z2 = common global i32 0, align 4 +@z3 = common global i32 0, align 4 +@z4 = common global i32 0, align 4 + +define void @calc_seleq() nounwind "target-cpu"="mips32" "target-features"="+o32,+mips32" { +entry: + %0 = load i32* @a, align 4 + %1 = load i32* @b, align 4 + %cmp = icmp eq i32 %0, %1 + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + %2 = load i32* @f, align 4 + br label %cond.end + +cond.false: ; preds = %entry + %3 = load i32* @t, align 4 + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi i32 [ %2, %cond.true ], [ %3, %cond.false ] + store i32 %cond, i32* @z1, align 4 + %4 = load i32* @b, align 4 + %5 = load i32* @a, align 4 + %cmp1 = icmp eq i32 %4, %5 + br i1 %cmp1, label %cond.true2, label %cond.false3 + +cond.true2: ; preds = %cond.end + %6 = load i32* @f, align 4 + br label %cond.end4 + +cond.false3: ; preds = %cond.end + %7 = load i32* @t, align 4 + br label %cond.end4 + +cond.end4: ; preds = %cond.false3, %cond.true2 + %cond5 = phi i32 [ %6, %cond.true2 ], [ %7, %cond.false3 ] + store i32 %cond5, i32* @z2, align 4 + %8 = load i32* @c, align 4 + %9 = load i32* @a, align 4 + %cmp6 = icmp eq i32 %8, %9 + br i1 %cmp6, label %cond.true7, label %cond.false8 + +cond.true7: ; preds = %cond.end4 + %10 = load i32* @t, align 4 + br label %cond.end9 + +cond.false8: ; preds = %cond.end4 + %11 = load i32* @f, align 4 + br label %cond.end9 + +cond.end9: ; preds = %cond.false8, %cond.true7 + %cond10 = phi i32 [ %10, %cond.true7 ], [ %11, %cond.false8 ] + store i32 %cond10, i32* @z3, align 4 + %12 = load i32* @a, align 4 + %13 = load i32* @c, align 4 + %cmp11 = icmp eq i32 %12, %13 + br i1 %cmp11, label %cond.true12, label %cond.false13 + +cond.true12: ; preds = %cond.end9 + %14 = load i32* @t, align 4 + br label %cond.end14 + +cond.false13: ; preds = %cond.end9 + %15 = load i32* @f, align 4 + br label %cond.end14 + +cond.end14: ; preds = %cond.false13, %cond.true12 + %cond15 = phi i32 [ %14, %cond.true12 ], [ %15, %cond.false13 ] + store i32 %cond15, i32* @z4, align 4 + ret void +} + +attributes #0 = { nounwind "target-cpu"="mips32" "target-features"="+o32,+mips32" } + +; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + diff --git a/test/CodeGen/Mips/seleqk.ll b/test/CodeGen/Mips/seleqk.ll new file mode 100644 index 000000000000..3ca622d5d8fe --- /dev/null +++ b/test/CodeGen/Mips/seleqk.ll @@ -0,0 +1,91 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@t = global i32 10, align 4 +@f = global i32 199, align 4 +@a = global i32 1, align 4 +@b = global i32 1000, align 4 +@z1 = common global i32 0, align 4 +@z2 = common global i32 0, align 4 +@z3 = common global i32 0, align 4 +@z4 = common global i32 0, align 4 +@.str = private unnamed_addr constant [5 x i8] c"%i \0A\00", align 1 + +define void @calc_seleqk() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %cmp = icmp eq i32 %0, 1 + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + %1 = load i32* @t, align 4 + br label %cond.end + +cond.false: ; preds = %entry + %2 = load i32* @f, align 4 + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi i32 [ %1, %cond.true ], [ %2, %cond.false ] + store i32 %cond, i32* @z1, align 4 + %3 = load i32* @a, align 4 + %cmp1 = icmp eq i32 %3, 1000 + br i1 %cmp1, label %cond.true2, label %cond.false3 + +cond.true2: ; preds = %cond.end + %4 = load i32* @f, align 4 + br label %cond.end4 + +cond.false3: ; preds = %cond.end + %5 = load i32* @t, align 4 + br label %cond.end4 + +cond.end4: ; preds = %cond.false3, %cond.true2 + %cond5 = phi i32 [ %4, %cond.true2 ], [ %5, %cond.false3 ] + store i32 %cond5, i32* @z2, align 4 + %6 = load i32* @b, align 4 + %cmp6 = icmp eq i32 %6, 3 + br i1 %cmp6, label %cond.true7, label %cond.false8 + +cond.true7: ; preds = %cond.end4 + %7 = load i32* @f, align 4 + br label %cond.end9 + +cond.false8: ; preds = %cond.end4 + %8 = load i32* @t, align 4 + br label %cond.end9 + +cond.end9: ; preds = %cond.false8, %cond.true7 + %cond10 = phi i32 [ %7, %cond.true7 ], [ %8, %cond.false8 ] + store i32 %cond10, i32* @z3, align 4 + %9 = load i32* @b, align 4 + %cmp11 = icmp eq i32 %9, 1000 + br i1 %cmp11, label %cond.true12, label %cond.false13 + +cond.true12: ; preds = %cond.end9 + %10 = load i32* @t, align 4 + br label %cond.end14 + +cond.false13: ; preds = %cond.end9 + %11 = load i32* @f, align 4 + br label %cond.end14 + +cond.end14: ; preds = %cond.false13, %cond.true12 + %cond15 = phi i32 [ %10, %cond.true12 ], [ %11, %cond.false13 ] + store i32 %cond15, i32* @z4, align 4 + ret void +} + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } +attributes #1 = { "target-cpu"="mips16" "target-features"="+mips16,+o32" } + +; 16: cmpi ${{[0-9]+}}, 1 # 16 bit inst +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmpi ${{[0-9]+}}, 1000 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmpi ${{[0-9]+}}, 3 # 16 bit inst +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmpi ${{[0-9]+}}, 1000 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} diff --git a/test/CodeGen/Mips/selgek.ll b/test/CodeGen/Mips/selgek.ll new file mode 100644 index 000000000000..8ab4046e92cb --- /dev/null +++ b/test/CodeGen/Mips/selgek.ll @@ -0,0 +1,94 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@t = global i32 10, align 4 +@f = global i32 199, align 4 +@a = global i32 2, align 4 +@b = global i32 1000, align 4 +@c = global i32 2, align 4 +@z1 = common global i32 0, align 4 +@z2 = common global i32 0, align 4 +@z3 = common global i32 0, align 4 +@z4 = common global i32 0, align 4 +@.str = private unnamed_addr constant [5 x i8] c"%i \0A\00", align 1 + +define void @calc_z() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %cmp = icmp sge i32 %0, 1000 + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + %1 = load i32* @f, align 4 + br label %cond.end + +cond.false: ; preds = %entry + %2 = load i32* @t, align 4 + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi i32 [ %1, %cond.true ], [ %2, %cond.false ] + store i32 %cond, i32* @z1, align 4 + %3 = load i32* @b, align 4 + %cmp1 = icmp sge i32 %3, 1 + br i1 %cmp1, label %cond.true2, label %cond.false3 + +cond.true2: ; preds = %cond.end + %4 = load i32* @t, align 4 + br label %cond.end4 + +cond.false3: ; preds = %cond.end + %5 = load i32* @f, align 4 + br label %cond.end4 + +cond.end4: ; preds = %cond.false3, %cond.true2 + %cond5 = phi i32 [ %4, %cond.true2 ], [ %5, %cond.false3 ] + store i32 %cond5, i32* @z2, align 4 + %6 = load i32* @c, align 4 + %cmp6 = icmp sge i32 %6, 2 + br i1 %cmp6, label %cond.true7, label %cond.false8 + +cond.true7: ; preds = %cond.end4 + %7 = load i32* @t, align 4 + br label %cond.end9 + +cond.false8: ; preds = %cond.end4 + %8 = load i32* @f, align 4 + br label %cond.end9 + +cond.end9: ; preds = %cond.false8, %cond.true7 + %cond10 = phi i32 [ %7, %cond.true7 ], [ %8, %cond.false8 ] + store i32 %cond10, i32* @z3, align 4 + %9 = load i32* @a, align 4 + %cmp11 = icmp sge i32 %9, 2 + br i1 %cmp11, label %cond.true12, label %cond.false13 + +cond.true12: ; preds = %cond.end9 + %10 = load i32* @t, align 4 + br label %cond.end14 + +cond.false13: ; preds = %cond.end9 + %11 = load i32* @f, align 4 + br label %cond.end14 + +cond.end14: ; preds = %cond.false13, %cond.true12 + %cond15 = phi i32 [ %10, %cond.true12 ], [ %11, %cond.false13 ] + store i32 %cond15, i32* @z4, align 4 + ret void +} + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } +attributes #1 = { "target-cpu"="mips16" "target-features"="+mips16,+o32" } + +; 16: slti ${{[0-9]+}}, 1000 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slti ${{[0-9]+}}, 1 # 16 bit inst +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slti ${{[0-9]+}}, 2 # 16 bit inst +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slti ${{[0-9]+}}, 2 # 16 bit inst +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + + diff --git a/test/CodeGen/Mips/selgt.ll b/test/CodeGen/Mips/selgt.ll new file mode 100644 index 000000000000..67b9b498709b --- /dev/null +++ b/test/CodeGen/Mips/selgt.ll @@ -0,0 +1,98 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@t = global i32 10, align 4 +@f = global i32 199, align 4 +@a = global i32 1, align 4 +@b = global i32 10, align 4 +@c = global i32 1, align 4 +@z1 = common global i32 0, align 4 +@z2 = common global i32 0, align 4 +@z3 = common global i32 0, align 4 +@z4 = common global i32 0, align 4 +@.str = private unnamed_addr constant [9 x i8] c"%i = %i\0A\00", align 1 + +define i32 @calc_z() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %retval = alloca i32, align 4 + %0 = load i32* @a, align 4 + %1 = load i32* @b, align 4 + %cmp = icmp sgt i32 %0, %1 + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + %2 = load i32* @f, align 4 + br label %cond.end + +cond.false: ; preds = %entry + %3 = load i32* @t, align 4 + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi i32 [ %2, %cond.true ], [ %3, %cond.false ] + store i32 %cond, i32* @z1, align 4 + %4 = load i32* @b, align 4 + %5 = load i32* @a, align 4 + %cmp1 = icmp sgt i32 %4, %5 + br i1 %cmp1, label %cond.true2, label %cond.false3 + +cond.true2: ; preds = %cond.end + %6 = load i32* @t, align 4 + br label %cond.end4 + +cond.false3: ; preds = %cond.end + %7 = load i32* @f, align 4 + br label %cond.end4 + +cond.end4: ; preds = %cond.false3, %cond.true2 + %cond5 = phi i32 [ %6, %cond.true2 ], [ %7, %cond.false3 ] + store i32 %cond5, i32* @z2, align 4 + %8 = load i32* @c, align 4 + %9 = load i32* @a, align 4 + %cmp6 = icmp sgt i32 %8, %9 + br i1 %cmp6, label %cond.true7, label %cond.false8 + +cond.true7: ; preds = %cond.end4 + %10 = load i32* @f, align 4 + br label %cond.end9 + +cond.false8: ; preds = %cond.end4 + %11 = load i32* @t, align 4 + br label %cond.end9 + +cond.end9: ; preds = %cond.false8, %cond.true7 + %cond10 = phi i32 [ %10, %cond.true7 ], [ %11, %cond.false8 ] + store i32 %cond10, i32* @z3, align 4 + %12 = load i32* @a, align 4 + %13 = load i32* @c, align 4 + %cmp11 = icmp sgt i32 %12, %13 + br i1 %cmp11, label %cond.true12, label %cond.false13 + +cond.true12: ; preds = %cond.end9 + %14 = load i32* @f, align 4 + br label %cond.end14 + +cond.false13: ; preds = %cond.end9 + %15 = load i32* @t, align 4 + br label %cond.end14 + +cond.end14: ; preds = %cond.false13, %cond.true12 + %cond15 = phi i32 [ %14, %cond.true12 ], [ %15, %cond.false13 ] + store i32 %cond15, i32* @z4, align 4 + %16 = load i32* %retval + ret i32 %16 +} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } +attributes #1 = { "target-cpu"="mips16" "target-features"="+mips16,+o32" } diff --git a/test/CodeGen/Mips/selle.ll b/test/CodeGen/Mips/selle.ll new file mode 100644 index 000000000000..b27df45e6739 --- /dev/null +++ b/test/CodeGen/Mips/selle.ll @@ -0,0 +1,96 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@t = global i32 10, align 4 +@f = global i32 199, align 4 +@a = global i32 1, align 4 +@b = global i32 10, align 4 +@c = global i32 1, align 4 +@z1 = common global i32 0, align 4 +@z2 = common global i32 0, align 4 +@z3 = common global i32 0, align 4 +@z4 = common global i32 0, align 4 +@.str = private unnamed_addr constant [5 x i8] c"%i \0A\00", align 1 + +define void @calc_z() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %1 = load i32* @b, align 4 + %cmp = icmp sle i32 %0, %1 + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + %2 = load i32* @t, align 4 + br label %cond.end + +cond.false: ; preds = %entry + %3 = load i32* @f, align 4 + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi i32 [ %2, %cond.true ], [ %3, %cond.false ] + store i32 %cond, i32* @z1, align 4 + %4 = load i32* @b, align 4 + %5 = load i32* @a, align 4 + %cmp1 = icmp sle i32 %4, %5 + br i1 %cmp1, label %cond.true2, label %cond.false3 + +cond.true2: ; preds = %cond.end + %6 = load i32* @f, align 4 + br label %cond.end4 + +cond.false3: ; preds = %cond.end + %7 = load i32* @t, align 4 + br label %cond.end4 + +cond.end4: ; preds = %cond.false3, %cond.true2 + %cond5 = phi i32 [ %6, %cond.true2 ], [ %7, %cond.false3 ] + store i32 %cond5, i32* @z2, align 4 + %8 = load i32* @c, align 4 + %9 = load i32* @a, align 4 + %cmp6 = icmp sle i32 %8, %9 + br i1 %cmp6, label %cond.true7, label %cond.false8 + +cond.true7: ; preds = %cond.end4 + %10 = load i32* @t, align 4 + br label %cond.end9 + +cond.false8: ; preds = %cond.end4 + %11 = load i32* @f, align 4 + br label %cond.end9 + +cond.end9: ; preds = %cond.false8, %cond.true7 + %cond10 = phi i32 [ %10, %cond.true7 ], [ %11, %cond.false8 ] + store i32 %cond10, i32* @z3, align 4 + %12 = load i32* @a, align 4 + %13 = load i32* @c, align 4 + %cmp11 = icmp sle i32 %12, %13 + br i1 %cmp11, label %cond.true12, label %cond.false13 + +cond.true12: ; preds = %cond.end9 + %14 = load i32* @t, align 4 + br label %cond.end14 + +cond.false13: ; preds = %cond.end9 + %15 = load i32* @f, align 4 + br label %cond.end14 + +cond.end14: ; preds = %cond.false13, %cond.true12 + %cond15 = phi i32 [ %14, %cond.true12 ], [ %15, %cond.false13 ] + store i32 %cond15, i32* @z4, align 4 + ret void +} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } +attributes #1 = { "target-cpu"="mips16" "target-features"="+mips16,+o32" } diff --git a/test/CodeGen/Mips/selltk.ll b/test/CodeGen/Mips/selltk.ll new file mode 100644 index 000000000000..1471b892c92a --- /dev/null +++ b/test/CodeGen/Mips/selltk.ll @@ -0,0 +1,93 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@t = global i32 10, align 4 +@f = global i32 199, align 4 +@a = global i32 2, align 4 +@b = global i32 1000, align 4 +@c = global i32 2, align 4 +@z1 = common global i32 0, align 4 +@z2 = common global i32 0, align 4 +@z3 = common global i32 0, align 4 +@z4 = common global i32 0, align 4 +@.str = private unnamed_addr constant [5 x i8] c"%i \0A\00", align 1 + +define void @calc_selltk() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %cmp = icmp slt i32 %0, 1000 + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + %1 = load i32* @t, align 4 + br label %cond.end + +cond.false: ; preds = %entry + %2 = load i32* @f, align 4 + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi i32 [ %1, %cond.true ], [ %2, %cond.false ] + store i32 %cond, i32* @z1, align 4 + %3 = load i32* @b, align 4 + %cmp1 = icmp slt i32 %3, 2 + br i1 %cmp1, label %cond.true2, label %cond.false3 + +cond.true2: ; preds = %cond.end + %4 = load i32* @f, align 4 + br label %cond.end4 + +cond.false3: ; preds = %cond.end + %5 = load i32* @t, align 4 + br label %cond.end4 + +cond.end4: ; preds = %cond.false3, %cond.true2 + %cond5 = phi i32 [ %4, %cond.true2 ], [ %5, %cond.false3 ] + store i32 %cond5, i32* @z2, align 4 + %6 = load i32* @c, align 4 + %cmp6 = icmp sgt i32 %6, 2 + br i1 %cmp6, label %cond.true7, label %cond.false8 + +cond.true7: ; preds = %cond.end4 + %7 = load i32* @f, align 4 + br label %cond.end9 + +cond.false8: ; preds = %cond.end4 + %8 = load i32* @t, align 4 + br label %cond.end9 + +cond.end9: ; preds = %cond.false8, %cond.true7 + %cond10 = phi i32 [ %7, %cond.true7 ], [ %8, %cond.false8 ] + store i32 %cond10, i32* @z3, align 4 + %9 = load i32* @a, align 4 + %cmp11 = icmp sgt i32 %9, 2 + br i1 %cmp11, label %cond.true12, label %cond.false13 + +cond.true12: ; preds = %cond.end9 + %10 = load i32* @f, align 4 + br label %cond.end14 + +cond.false13: ; preds = %cond.end9 + %11 = load i32* @t, align 4 + br label %cond.end14 + +cond.end14: ; preds = %cond.false13, %cond.true12 + %cond15 = phi i32 [ %10, %cond.true12 ], [ %11, %cond.false13 ] + store i32 %cond15, i32* @z4, align 4 + ret void +} + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } +attributes #1 = { "target-cpu"="mips16" "target-features"="+mips16,+o32" } + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slt ${{[0-9]+}}, ${{[0-9]+}} +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slti ${{[0-9]+}}, 3 # 16 bit inst +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + +; 16: slti ${{[0-9]+}}, 3 # 16 bit inst +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} + diff --git a/test/CodeGen/Mips/selne.ll b/test/CodeGen/Mips/selne.ll new file mode 100644 index 000000000000..e3d82b8cf5d0 --- /dev/null +++ b/test/CodeGen/Mips/selne.ll @@ -0,0 +1,97 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@t = global i32 10, align 4 +@f = global i32 199, align 4 +@a = global i32 1, align 4 +@b = global i32 10, align 4 +@c = global i32 1, align 4 +@z1 = common global i32 0, align 4 +@z2 = common global i32 0, align 4 +@z3 = common global i32 0, align 4 +@z4 = common global i32 0, align 4 +@.str = private unnamed_addr constant [5 x i8] c"%i \0A\00", align 1 + +define void @calc_seleq() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %1 = load i32* @b, align 4 + %cmp = icmp ne i32 %0, %1 + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + %2 = load i32* @f, align 4 + br label %cond.end + +cond.false: ; preds = %entry + %3 = load i32* @t, align 4 + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi i32 [ %2, %cond.true ], [ %3, %cond.false ] + store i32 %cond, i32* @z1, align 4 + %4 = load i32* @b, align 4 + %5 = load i32* @a, align 4 + %cmp1 = icmp ne i32 %4, %5 + br i1 %cmp1, label %cond.true2, label %cond.false3 + +cond.true2: ; preds = %cond.end + %6 = load i32* @f, align 4 + br label %cond.end4 + +cond.false3: ; preds = %cond.end + %7 = load i32* @t, align 4 + br label %cond.end4 + +cond.end4: ; preds = %cond.false3, %cond.true2 + %cond5 = phi i32 [ %6, %cond.true2 ], [ %7, %cond.false3 ] + store i32 %cond5, i32* @z2, align 4 + %8 = load i32* @c, align 4 + %9 = load i32* @a, align 4 + %cmp6 = icmp ne i32 %8, %9 + br i1 %cmp6, label %cond.true7, label %cond.false8 + +cond.true7: ; preds = %cond.end4 + %10 = load i32* @t, align 4 + br label %cond.end9 + +cond.false8: ; preds = %cond.end4 + %11 = load i32* @f, align 4 + br label %cond.end9 + +cond.end9: ; preds = %cond.false8, %cond.true7 + %cond10 = phi i32 [ %10, %cond.true7 ], [ %11, %cond.false8 ] + store i32 %cond10, i32* @z3, align 4 + %12 = load i32* @a, align 4 + %13 = load i32* @c, align 4 + %cmp11 = icmp ne i32 %12, %13 + br i1 %cmp11, label %cond.true12, label %cond.false13 + +cond.true12: ; preds = %cond.end9 + %14 = load i32* @t, align 4 + br label %cond.end14 + +cond.false13: ; preds = %cond.end9 + %15 = load i32* @f, align 4 + br label %cond.end14 + +cond.end14: ; preds = %cond.false13, %cond.true12 + %cond15 = phi i32 [ %14, %cond.true12 ], [ %15, %cond.false13 ] + store i32 %cond15, i32* @z4, align 4 + ret void +} + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } +attributes #1 = { "target-cpu"="mips16" "target-features"="+mips16,+o32" } + +; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + diff --git a/test/CodeGen/Mips/selnek.ll b/test/CodeGen/Mips/selnek.ll new file mode 100644 index 000000000000..26015523106d --- /dev/null +++ b/test/CodeGen/Mips/selnek.ll @@ -0,0 +1,107 @@ +; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=16 + +@t = global i32 10, align 4 +@f = global i32 199, align 4 +@a = global i32 1, align 4 +@b = global i32 1000, align 4 +@z1 = common global i32 0, align 4 +@z2 = common global i32 0, align 4 +@z3 = common global i32 0, align 4 +@z4 = common global i32 0, align 4 +@.str = private unnamed_addr constant [5 x i8] c"%i \0A\00", align 1 + +define void @calc_z() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + %0 = load i32* @a, align 4 + %cmp = icmp ne i32 %0, 1 + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: ; preds = %entry + %1 = load i32* @f, align 4 + br label %cond.end + +cond.false: ; preds = %entry + %2 = load i32* @t, align 4 + br label %cond.end + +cond.end: ; preds = %cond.false, %cond.true + %cond = phi i32 [ %1, %cond.true ], [ %2, %cond.false ] + store i32 %cond, i32* @z1, align 4 + %3 = load i32* @a, align 4 + %cmp1 = icmp ne i32 %3, 1000 + br i1 %cmp1, label %cond.true2, label %cond.false3 + +cond.true2: ; preds = %cond.end + %4 = load i32* @t, align 4 + br label %cond.end4 + +cond.false3: ; preds = %cond.end + %5 = load i32* @f, align 4 + br label %cond.end4 + +cond.end4: ; preds = %cond.false3, %cond.true2 + %cond5 = phi i32 [ %4, %cond.true2 ], [ %5, %cond.false3 ] + store i32 %cond5, i32* @z2, align 4 + %6 = load i32* @b, align 4 + %cmp6 = icmp ne i32 %6, 3 + br i1 %cmp6, label %cond.true7, label %cond.false8 + +cond.true7: ; preds = %cond.end4 + %7 = load i32* @t, align 4 + br label %cond.end9 + +cond.false8: ; preds = %cond.end4 + %8 = load i32* @f, align 4 + br label %cond.end9 + +cond.end9: ; preds = %cond.false8, %cond.true7 + %cond10 = phi i32 [ %7, %cond.true7 ], [ %8, %cond.false8 ] + store i32 %cond10, i32* @z3, align 4 + %9 = load i32* @b, align 4 + %cmp11 = icmp ne i32 %9, 1000 + br i1 %cmp11, label %cond.true12, label %cond.false13 + +cond.true12: ; preds = %cond.end9 + %10 = load i32* @f, align 4 + br label %cond.end14 + +cond.false13: ; preds = %cond.end9 + %11 = load i32* @t, align 4 + br label %cond.end14 + +cond.end14: ; preds = %cond.false13, %cond.true12 + %cond15 = phi i32 [ %10, %cond.true12 ], [ %11, %cond.false13 ] + store i32 %cond15, i32* @z4, align 4 + ret void +} + +define i32 @main() nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" { +entry: + call void @calc_z() "target-cpu"="mips16" "target-features"="+mips16,+o32" + %0 = load i32* @z1, align 4 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([5 x i8]* @.str, i32 0, i32 0), i32 %0) "target-cpu"="mips16" "target-features"="+mips16,+o32" + %1 = load i32* @z2, align 4 + %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([5 x i8]* @.str, i32 0, i32 0), i32 %1) "target-cpu"="mips16" "target-features"="+mips16,+o32" + %2 = load i32* @z3, align 4 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([5 x i8]* @.str, i32 0, i32 0), i32 %2) "target-cpu"="mips16" "target-features"="+mips16,+o32" + %3 = load i32* @z4, align 4 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([5 x i8]* @.str, i32 0, i32 0), i32 %3) "target-cpu"="mips16" "target-features"="+mips16,+o32" + ret i32 0 +} + +declare i32 @printf(i8*, ...) "target-cpu"="mips16" "target-features"="+mips16,+o32" + +attributes #0 = { nounwind "target-cpu"="mips16" "target-features"="+mips16,+o32" } +attributes #1 = { "target-cpu"="mips16" "target-features"="+mips16,+o32" } + +; 16: cmpi ${{[0-9]+}}, 1 # 16 bit inst +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmpi ${{[0-9]+}}, 1000 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmpi ${{[0-9]+}}, 3 # 16 bit inst +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} + +; 16: cmpi ${{[0-9]+}}, 1000 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}}
\ No newline at end of file diff --git a/test/CodeGen/Mips/selpat.ll b/test/CodeGen/Mips/selpat.ll index cda0c96ef4be..8eda8de45e08 100644 --- a/test/CodeGen/Mips/selpat.ll +++ b/test/CodeGen/Mips/selpat.ll @@ -20,7 +20,7 @@ entry: %cond = select i1 %cmp, i32 %2, i32 %3 store i32 %cond, i32* @z1, align 4 ; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} -; 16: bteqz .+4 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} store i32 %cond, i32* @z2, align 4 %4 = load i32* @c, align 4 @@ -41,7 +41,7 @@ entry: %cond = select i1 %cmp, i32 %1, i32 %2 store i32 %cond, i32* @z1, align 4 ; 16: cmpi ${{[0-9]+}}, 1 -; 16: bteqz .+4 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp1 = icmp eq i32 %0, 10 %cond5 = select i1 %cmp1, i32 %2, i32 %1 @@ -51,7 +51,7 @@ entry: %cond10 = select i1 %cmp6, i32 %2, i32 %1 store i32 %cond10, i32* @z3, align 4 ; 16: cmpi ${{[0-9]+}}, 10 -; 16: bteqz .+4 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp11 = icmp eq i32 %3, 10 %cond15 = select i1 %cmp11, i32 %1, i32 %2 @@ -67,7 +67,7 @@ entry: %2 = load i32* @f, align 4 %cond = select i1 %cmp, i32 %1, i32 %2 store i32 %cond, i32* @z1, align 4 -; 16: beqz ${{[0-9]+}}, .+4 +; 16: beqz ${{[0-9]+}}, $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %3 = load i32* @b, align 4 %cmp1 = icmp eq i32 %3, 0 @@ -91,7 +91,7 @@ entry: %cond = select i1 %cmp, i32 %2, i32 %3 store i32 %cond, i32* @z1, align 4 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}} -; 16: bteqz .+4 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp1 = icmp sge i32 %1, %0 %cond5 = select i1 %cmp1, i32 %3, i32 %2 @@ -112,7 +112,7 @@ entry: %1 = load i32* @b, align 4 %cmp = icmp sgt i32 %0, %1 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}} -; 16: btnez .+4 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %2 = load i32* @f, align 4 %3 = load i32* @t, align 4 @@ -141,7 +141,7 @@ entry: %cond = select i1 %cmp, i32 %2, i32 %3 store i32 %cond, i32* @z1, align 4 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}} -; 16: bteqz .+4 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp1 = icmp sle i32 %1, %0 %cond5 = select i1 %cmp1, i32 %3, i32 %2 @@ -165,7 +165,7 @@ entry: %cond = select i1 %cmp, i32 %1, i32 %2 store i32 %cond, i32* @z1, align 4 ; 16: slti ${{[0-9]+}}, {{[0-9]+}} -; 16: btnez .+4 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %3 = load i32* @b, align 4 %cmp1 = icmp slt i32 %3, 2 @@ -192,7 +192,7 @@ entry: %cond = select i1 %cmp, i32 %2, i32 %3 store i32 %cond, i32* @z1, align 4 ; 16: cmp ${{[0-9]+}}, ${{[0-9]+}} -; 16: btnez .+4 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} store i32 %cond, i32* @z2, align 4 %4 = load i32* @c, align 4 @@ -212,7 +212,7 @@ entry: %cond = select i1 %cmp, i32 %1, i32 %2 store i32 %cond, i32* @z1, align 4 ; 16: cmpi ${{[0-9]+}}, 1 -; 16: btnez .+4 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp1 = icmp ne i32 %0, 10 %cond5 = select i1 %cmp1, i32 %2, i32 %1 @@ -222,7 +222,7 @@ entry: %cond10 = select i1 %cmp6, i32 %2, i32 %1 store i32 %cond10, i32* @z3, align 4 ; 16: cmpi ${{[0-9]+}}, 10 -; 16: btnez .+4 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp11 = icmp ne i32 %3, 10 %cond15 = select i1 %cmp11, i32 %1, i32 %2 @@ -238,7 +238,7 @@ entry: %2 = load i32* @t, align 4 %cond = select i1 %cmp, i32 %1, i32 %2 store i32 %cond, i32* @z1, align 4 -; 16: bnez ${{[0-9]+}}, .+4 +; 16: bnez ${{[0-9]+}}, $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %3 = load i32* @b, align 4 %cmp1 = icmp ne i32 %3, 0 @@ -260,7 +260,7 @@ entry: %2 = load i32* @t, align 4 %cond = select i1 %tobool, i32 %1, i32 %2 store i32 %cond, i32* @z1, align 4 -; 16: bnez ${{[0-9]+}}, .+4 +; 16: bnez ${{[0-9]+}}, $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %3 = load i32* @b, align 4 %tobool1 = icmp ne i32 %3, 0 @@ -284,7 +284,7 @@ entry: %cond = select i1 %cmp, i32 %2, i32 %3 store i32 %cond, i32* @z1, align 4 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}} -; 16: bteqz .+4 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp1 = icmp uge i32 %1, %0 %cond5 = select i1 %cmp1, i32 %3, i32 %2 @@ -309,7 +309,7 @@ entry: %cond = select i1 %cmp, i32 %2, i32 %3 store i32 %cond, i32* @z1, align 4 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}} -; 16: btnez .+4 +; 16: btnez $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp1 = icmp ugt i32 %1, %0 %cond5 = select i1 %cmp1, i32 %3, i32 %2 @@ -334,7 +334,7 @@ entry: %cond = select i1 %cmp, i32 %2, i32 %3 store i32 %cond, i32* @z1, align 4 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}} -; 16: bteqz .+4 +; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}} ; 16: move ${{[0-9]+}}, ${{[0-9]+}} %cmp1 = icmp ule i32 %1, %0 %cond5 = select i1 %cmp1, i32 %3, i32 %2 diff --git a/test/CodeGen/Mips/seteq.ll b/test/CodeGen/Mips/seteq.ll index da840c83a2b4..5fadf78d57a0 100644 --- a/test/CodeGen/Mips/seteq.ll +++ b/test/CodeGen/Mips/seteq.ll @@ -15,7 +15,7 @@ entry: store i32 %conv, i32* @r1, align 4 ; 16: xor $[[REGISTER:[0-9A-Ba-b_]+]], ${{[0-9]+}} ; 16: sltiu $[[REGISTER:[0-9A-Ba-b_]+]], 1 -; 16: move ${{[0-9]+}}, $t8 +; 16: move ${{[0-9]+}}, $24 ret void } diff --git a/test/CodeGen/Mips/seteqz.ll b/test/CodeGen/Mips/seteqz.ll index d445be6aedb0..80dc3120a6a1 100644 --- a/test/CodeGen/Mips/seteqz.ll +++ b/test/CodeGen/Mips/seteqz.ll @@ -12,13 +12,13 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: sltiu ${{[0-9]+}}, 1 -; 16: move ${{[0-9]+}}, $t8 +; 16: move ${{[0-9]+}}, $24 %1 = load i32* @j, align 4 %cmp1 = icmp eq i32 %1, 99 %conv2 = zext i1 %cmp1 to i32 store i32 %conv2, i32* @r2, align 4 ; 16: xor $[[REGISTER:[0-9A-Ba-b_]+]], ${{[0-9]+}} ; 16: sltiu $[[REGISTER:[0-9A-Ba-b_]+]], 1 -; 16: move ${{[0-9]+}}, $t8 +; 16: move ${{[0-9]+}}, $24 ret void } diff --git a/test/CodeGen/Mips/setge.ll b/test/CodeGen/Mips/setge.ll index 94b499bc31e9..8869eb8fc547 100644 --- a/test/CodeGen/Mips/setge.ll +++ b/test/CodeGen/Mips/setge.ll @@ -17,7 +17,7 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}} -; 16: move $[[REGISTER:[0-9]+]], $t8 +; 16: move $[[REGISTER:[0-9]+]], $24 ; 16: xor $[[REGISTER]], ${{[0-9]+}} %2 = load i32* @m, align 4 %cmp1 = icmp sge i32 %0, %2 diff --git a/test/CodeGen/Mips/setgek.ll b/test/CodeGen/Mips/setgek.ll index b6bae09bcb5b..18a0fcf62130 100644 --- a/test/CodeGen/Mips/setgek.ll +++ b/test/CodeGen/Mips/setgek.ll @@ -12,7 +12,7 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: slti ${{[0-9]+}}, -32768 -; 16: move ${{[0-9]+}}, $t8 +; 16: move ${{[0-9]+}}, $24 ; 16: xor ${{[0-9]+}}, ${{[0-9]+}} ret void } diff --git a/test/CodeGen/Mips/setle.ll b/test/CodeGen/Mips/setle.ll index f36fb4392d76..2df6774c1fad 100644 --- a/test/CodeGen/Mips/setle.ll +++ b/test/CodeGen/Mips/setle.ll @@ -16,7 +16,7 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}} -; 16: move $[[REGISTER:[0-9]+]], $t8 +; 16: move $[[REGISTER:[0-9]+]], $24 ; 16: xor $[[REGISTER]], ${{[0-9]+}} %2 = load i32* @m, align 4 %cmp1 = icmp sle i32 %2, %1 diff --git a/test/CodeGen/Mips/setlt.ll b/test/CodeGen/Mips/setlt.ll index 435be8e2334a..3dac74bf2e01 100644 --- a/test/CodeGen/Mips/setlt.ll +++ b/test/CodeGen/Mips/setlt.ll @@ -16,6 +16,6 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}} -; 16: move ${{[0-9]+}}, $t8 +; 16: move ${{[0-9]+}}, $24 ret void } diff --git a/test/CodeGen/Mips/setltk.ll b/test/CodeGen/Mips/setltk.ll index c0b610e37784..ecebc7e578e1 100644 --- a/test/CodeGen/Mips/setltk.ll +++ b/test/CodeGen/Mips/setltk.ll @@ -15,6 +15,6 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: slti $[[REGISTER:[0-9]+]], 10 -; 16: move $[[REGISTER]], $t8 +; 16: move $[[REGISTER]], $24 ret void } diff --git a/test/CodeGen/Mips/setne.ll b/test/CodeGen/Mips/setne.ll index 6460c83c7b0b..9e66901e32b5 100644 --- a/test/CodeGen/Mips/setne.ll +++ b/test/CodeGen/Mips/setne.ll @@ -15,6 +15,6 @@ entry: store i32 %conv, i32* @r1, align 4 ; 16: xor $[[REGISTER:[0-9]+]], ${{[0-9]+}} ; 16: sltu ${{[0-9]+}}, $[[REGISTER]] -; 16: move ${{[0-9]+}}, $t8 +; 16: move ${{[0-9]+}}, $24 ret void } diff --git a/test/CodeGen/Mips/setuge.ll b/test/CodeGen/Mips/setuge.ll index ac72b66e9fb0..1c9b5bbe8114 100644 --- a/test/CodeGen/Mips/setuge.ll +++ b/test/CodeGen/Mips/setuge.ll @@ -16,7 +16,7 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}} -; 16: move $[[REGISTER:[0-9]+]], $t8 +; 16: move $[[REGISTER:[0-9]+]], $24 ; 16: xor $[[REGISTER]], ${{[0-9]+}} %2 = load i32* @m, align 4 %cmp1 = icmp uge i32 %0, %2 diff --git a/test/CodeGen/Mips/setugt.ll b/test/CodeGen/Mips/setugt.ll index 328f0e3be34a..f10b47ae7178 100644 --- a/test/CodeGen/Mips/setugt.ll +++ b/test/CodeGen/Mips/setugt.ll @@ -16,6 +16,6 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}} -; 16: move ${{[0-9]+}}, $t8 +; 16: move ${{[0-9]+}}, $24 ret void } diff --git a/test/CodeGen/Mips/setule.ll b/test/CodeGen/Mips/setule.ll index 792f2ae0fa29..a6d6bf064052 100644 --- a/test/CodeGen/Mips/setule.ll +++ b/test/CodeGen/Mips/setule.ll @@ -16,7 +16,7 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}} -; 16: move $[[REGISTER:[0-9]+]], $t8 +; 16: move $[[REGISTER:[0-9]+]], $24 ; 16: xor $[[REGISTER]], ${{[0-9]+}} %2 = load i32* @m, align 4 %cmp1 = icmp ule i32 %2, %1 diff --git a/test/CodeGen/Mips/setult.ll b/test/CodeGen/Mips/setult.ll index 56d2e8daa3e0..00ee437a2ffe 100644 --- a/test/CodeGen/Mips/setult.ll +++ b/test/CodeGen/Mips/setult.ll @@ -16,6 +16,6 @@ entry: %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}} -; 16: move ${{[0-9]+}}, $t8 +; 16: move ${{[0-9]+}}, $24 ret void } diff --git a/test/CodeGen/Mips/setultk.ll b/test/CodeGen/Mips/setultk.ll index 75b270ed8428..eb9edbaad7f8 100644 --- a/test/CodeGen/Mips/setultk.ll +++ b/test/CodeGen/Mips/setultk.ll @@ -14,7 +14,7 @@ entry: %cmp = icmp ult i32 %0, 10 %conv = zext i1 %cmp to i32 store i32 %conv, i32* @r1, align 4 -; 16: sltiu $[[REGISTER:[0-9]+]], 10 -; 16: move $[[REGISTER]], $t8 +; 16: sltiu ${{[0-9]+}}, 10 # 16 bit inst +; 16: move ${{[0-9]+}}, $24 ret void } diff --git a/test/CodeGen/Mips/tls.ll b/test/CodeGen/Mips/tls.ll index 72d30dc36912..b86d25e5e5e8 100644 --- a/test/CodeGen/Mips/tls.ll +++ b/test/CodeGen/Mips/tls.ll @@ -21,9 +21,9 @@ entry: ; PIC: jalr $25 ; PIC: lw $2, 0($2) -; STATIC: rdhwr $3, $29 ; STATIC: lui $[[R0:[0-9]+]], %tprel_hi(t1) ; STATIC: addiu $[[R1:[0-9]+]], $[[R0]], %tprel_lo(t1) +; STATIC: rdhwr $3, $29 ; STATIC: addu $[[R2:[0-9]+]], $3, $[[R1]] ; STATIC: lw $2, 0($[[R2]]) } diff --git a/test/CodeGen/Mips/vector-setcc.ll b/test/CodeGen/Mips/vector-setcc.ll new file mode 100644 index 000000000000..aeff4918c8bb --- /dev/null +++ b/test/CodeGen/Mips/vector-setcc.ll @@ -0,0 +1,16 @@ +; RUN: llc -march=mipsel < %s + +@a = common global <4 x i32> zeroinitializer, align 16 +@b = common global <4 x i32> zeroinitializer, align 16 +@g0 = common global <4 x i32> zeroinitializer, align 16 + +define void @foo0() nounwind { +entry: + %0 = load <4 x i32>* @a, align 16 + %1 = load <4 x i32>* @b, align 16 + %cmp = icmp slt <4 x i32> %0, %1 + %sext = sext <4 x i1> %cmp to <4 x i32> + store <4 x i32> %sext, <4 x i32>* @g0, align 16 + ret void +} + diff --git a/test/CodeGen/NVPTX/annotations.ll b/test/CodeGen/NVPTX/annotations.ll index d93f688ef1fd..39d52d382663 100644 --- a/test/CodeGen/NVPTX/annotations.ll +++ b/test/CodeGen/NVPTX/annotations.ll @@ -1,5 +1,3 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s diff --git a/test/CodeGen/NVPTX/arithmetic-fp-sm10.ll b/test/CodeGen/NVPTX/arithmetic-fp-sm10.ll deleted file mode 100644 index 73c77f56bc9c..000000000000 --- a/test/CodeGen/NVPTX/arithmetic-fp-sm10.ll +++ /dev/null @@ -1,72 +0,0 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s - -;; These tests should run for all targets - -;;===-- Basic instruction selection tests ---------------------------------===;; - - -;;; f64 - -define double @fadd_f64(double %a, double %b) { -; CHECK: add.f64 %fl{{[0-9]+}}, %fl{{[0-9]+}}, %fl{{[0-9]+}} -; CHECK: ret - %ret = fadd double %a, %b - ret double %ret -} - -define double @fsub_f64(double %a, double %b) { -; CHECK: sub.f64 %fl{{[0-9]+}}, %fl{{[0-9]+}}, %fl{{[0-9]+}} -; CHECK: ret - %ret = fsub double %a, %b - ret double %ret -} - -define double @fmul_f64(double %a, double %b) { -; CHECK: mul.f64 %fl{{[0-9]+}}, %fl{{[0-9]+}}, %fl{{[0-9]+}} -; CHECK: ret - %ret = fmul double %a, %b - ret double %ret -} - -define double @fdiv_f64(double %a, double %b) { -; CHECK: div.rn.f64 %fl{{[0-9]+}}, %fl{{[0-9]+}}, %fl{{[0-9]+}} -; CHECK: ret - %ret = fdiv double %a, %b - ret double %ret -} - -;; PTX does not have a floating-point rem instruction - - -;;; f32 - -define float @fadd_f32(float %a, float %b) { -; CHECK: add.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}} -; CHECK: ret - %ret = fadd float %a, %b - ret float %ret -} - -define float @fsub_f32(float %a, float %b) { -; CHECK: sub.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}} -; CHECK: ret - %ret = fsub float %a, %b - ret float %ret -} - -define float @fmul_f32(float %a, float %b) { -; CHECK: mul.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}} -; CHECK: ret - %ret = fmul float %a, %b - ret float %ret -} - -define float @fdiv_f32(float %a, float %b) { -; CHECK: div.full.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}} -; CHECK: ret - %ret = fdiv float %a, %b - ret float %ret -} - -;; PTX does not have a floating-point rem instruction diff --git a/test/CodeGen/NVPTX/arithmetic-int.ll b/test/CodeGen/NVPTX/arithmetic-int.ll index 529f84900afd..8d73b7e6c4c6 100644 --- a/test/CodeGen/NVPTX/arithmetic-int.ll +++ b/test/CodeGen/NVPTX/arithmetic-int.ll @@ -1,5 +1,3 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s diff --git a/test/CodeGen/NVPTX/calling-conv.ll b/test/CodeGen/NVPTX/calling-conv.ll index 968203e5f70e..190a1462adbc 100644 --- a/test/CodeGen/NVPTX/calling-conv.ll +++ b/test/CodeGen/NVPTX/calling-conv.ll @@ -1,5 +1,3 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s diff --git a/test/CodeGen/NVPTX/compare-int.ll b/test/CodeGen/NVPTX/compare-int.ll index 12fc7548212c..16af0a336ddc 100644 --- a/test/CodeGen/NVPTX/compare-int.ll +++ b/test/CodeGen/NVPTX/compare-int.ll @@ -1,5 +1,3 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s diff --git a/test/CodeGen/NVPTX/convert-fp.ll b/test/CodeGen/NVPTX/convert-fp.ll index 21c84379b062..1882121fa724 100644 --- a/test/CodeGen/NVPTX/convert-fp.ll +++ b/test/CodeGen/NVPTX/convert-fp.ll @@ -1,5 +1,3 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s diff --git a/test/CodeGen/NVPTX/convert-int-sm10.ll b/test/CodeGen/NVPTX/convert-int-sm10.ll deleted file mode 100644 index 20716f982e3b..000000000000 --- a/test/CodeGen/NVPTX/convert-int-sm10.ll +++ /dev/null @@ -1,55 +0,0 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s - - -; i16 - -define i16 @cvt_i16_i32(i32 %x) { -; CHECK: cvt.u16.u32 %rs{{[0-9]+}}, %r{{[0-9]+}} -; CHECK: ret - %a = trunc i32 %x to i16 - ret i16 %a -} - -define i16 @cvt_i16_i64(i64 %x) { -; CHECK: cvt.u16.u64 %rs{{[0-9]+}}, %rl{{[0-9]+}} -; CHECK: ret - %a = trunc i64 %x to i16 - ret i16 %a -} - - - -; i32 - -define i32 @cvt_i32_i16(i16 %x) { -; CHECK: cvt.u32.u16 %r{{[0-9]+}}, %rs{{[0-9]+}} -; CHECK: ret - %a = zext i16 %x to i32 - ret i32 %a -} - -define i32 @cvt_i32_i64(i64 %x) { -; CHECK: cvt.u32.u64 %r{{[0-9]+}}, %rl{{[0-9]+}} -; CHECK: ret - %a = trunc i64 %x to i32 - ret i32 %a -} - - - -; i64 - -define i64 @cvt_i64_i16(i16 %x) { -; CHECK: cvt.u64.u16 %rl{{[0-9]+}}, %rs{{[0-9]+}} -; CHECK: ret - %a = zext i16 %x to i64 - ret i64 %a -} - -define i64 @cvt_i64_i32(i32 %x) { -; CHECK: cvt.u64.u32 %rl{{[0-9]+}}, %r{{[0-9]+}} -; CHECK: ret - %a = zext i32 %x to i64 - ret i64 %a -} diff --git a/test/CodeGen/NVPTX/intrin-nocapture.ll b/test/CodeGen/NVPTX/intrin-nocapture.ll new file mode 100644 index 000000000000..55781bb15a0b --- /dev/null +++ b/test/CodeGen/NVPTX/intrin-nocapture.ll @@ -0,0 +1,21 @@ +; RUN: opt < %s -O3 -S | FileCheck %s + +; Address space intrinsics were erroneously marked NoCapture, leading to bad +; optimizations (such as the store below being eliminated as dead code). This +; test makes sure we don't regress. + +declare void @foo(i32 addrspace(1)*) + +declare i32 addrspace(1)* @llvm.nvvm.ptr.gen.to.global.p1i32.p0i32(i32*) + +; CHECK: @bar +define void @bar() { + %t1 = alloca i32 +; CHECK: call i32 addrspace(1)* @llvm.nvvm.ptr.gen.to.global.p1i32.p0i32(i32* %t1) +; CHECK-NEXT: store i32 10, i32* %t1 + %t2 = call i32 addrspace(1)* @llvm.nvvm.ptr.gen.to.global.p1i32.p0i32(i32* %t1) + store i32 10, i32* %t1 + call void @foo(i32 addrspace(1)* %t2) + ret void +} + diff --git a/test/CodeGen/NVPTX/intrinsic-old.ll b/test/CodeGen/NVPTX/intrinsic-old.ll index 1c9879c4178b..53a28f333798 100644 --- a/test/CodeGen/NVPTX/intrinsic-old.ll +++ b/test/CodeGen/NVPTX/intrinsic-old.ll @@ -1,5 +1,3 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s diff --git a/test/CodeGen/NVPTX/intrinsics.ll b/test/CodeGen/NVPTX/intrinsics.ll index afab60ca96a8..8b0357be87cb 100644 --- a/test/CodeGen/NVPTX/intrinsics.ll +++ b/test/CodeGen/NVPTX/intrinsics.ll @@ -1,5 +1,3 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s diff --git a/test/CodeGen/NVPTX/ld-addrspace.ll b/test/CodeGen/NVPTX/ld-addrspace.ll index d1f5093df223..3265868d3c52 100644 --- a/test/CodeGen/NVPTX/ld-addrspace.ll +++ b/test/CodeGen/NVPTX/ld-addrspace.ll @@ -1,6 +1,4 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s --check-prefix=PTX32 ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s --check-prefix=PTX32 -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s --check-prefix=PTX64 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s --check-prefix=PTX64 diff --git a/test/CodeGen/NVPTX/nvvm-reflect.ll b/test/CodeGen/NVPTX/nvvm-reflect.ll new file mode 100644 index 000000000000..0d02194651e3 --- /dev/null +++ b/test/CodeGen/NVPTX/nvvm-reflect.ll @@ -0,0 +1,34 @@ +; RUN: opt < %s -S -nvvm-reflect -nvvm-reflect-list USE_MUL=0 -O2 | FileCheck %s --check-prefix=USE_MUL_0 +; RUN: opt < %s -S -nvvm-reflect -nvvm-reflect-list USE_MUL=1 -O2 | FileCheck %s --check-prefix=USE_MUL_1 + +@str = private addrspace(4) unnamed_addr constant [8 x i8] c"USE_MUL\00" + +declare i32 @__nvvm_reflect(i8*) +declare i8* @llvm.nvvm.ptr.constant.to.gen.p0i8.p4i8(i8 addrspace(4)*) + +define float @foo(float %a, float %b) { +; USE_MUL_0: define float @foo +; USE_MUL_0-NOT: call i32 @__nvvm_reflect +; USE_MUL_1: define float @foo +; USE_MUL_1-NOT: call i32 @__nvvm_reflect + %ptr = tail call i8* @llvm.nvvm.ptr.constant.to.gen.p0i8.p4i8(i8 addrspace(4)* getelementptr inbounds ([8 x i8] addrspace(4)* @str, i32 0, i32 0)) + %reflect = tail call i32 @__nvvm_reflect(i8* %ptr) + %cmp = icmp ugt i32 %reflect, 0 + br i1 %cmp, label %use_mul, label %use_add + +use_mul: +; USE_MUL_1: fmul float %a, %b +; USE_MUL_0-NOT: fadd float %a, %b + %ret1 = fmul float %a, %b + br label %exit + +use_add: +; USE_MUL_0: fadd float %a, %b +; USE_MUL_1-NOT: fmul float %a, %b + %ret2 = fadd float %a, %b + br label %exit + +exit: + %ret = phi float [%ret1, %use_mul], [%ret2, %use_add] + ret float %ret +} diff --git a/test/CodeGen/NVPTX/sched1.ll b/test/CodeGen/NVPTX/sched1.ll new file mode 100644 index 000000000000..03ab635e73b9 --- /dev/null +++ b/test/CodeGen/NVPTX/sched1.ll @@ -0,0 +1,31 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s + +; Ensure source scheduling is working + +define void @foo(i32* %a) { +; CHECK: .func foo +; CHECK: ld.u32 +; CHECK-NEXT: ld.u32 +; CHECK-NEXT: ld.u32 +; CHECK-NEXT: ld.u32 +; CHECK-NEXT: add.s32 +; CHECK-NEXT: add.s32 +; CHECK-NEXT: add.s32 + %ptr0 = getelementptr i32* %a, i32 0 + %val0 = load i32* %ptr0 + %ptr1 = getelementptr i32* %a, i32 1 + %val1 = load i32* %ptr1 + %ptr2 = getelementptr i32* %a, i32 2 + %val2 = load i32* %ptr2 + %ptr3 = getelementptr i32* %a, i32 3 + %val3 = load i32* %ptr3 + + %t0 = add i32 %val0, %val1 + %t1 = add i32 %t0, %val2 + %t2 = add i32 %t1, %val3 + + store i32 %t2, i32* %a + + ret void +} + diff --git a/test/CodeGen/NVPTX/sched2.ll b/test/CodeGen/NVPTX/sched2.ll new file mode 100644 index 000000000000..71a9a4963faf --- /dev/null +++ b/test/CodeGen/NVPTX/sched2.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s + +define void @foo(<2 x i32>* %a) { +; CHECK: .func foo +; CHECK: ld.v2.u32 +; CHECK-NEXT: ld.v2.u32 +; CHECK-NEXT: ld.v2.u32 +; CHECK-NEXT: ld.v2.u32 +; CHECK-NEXT: add.s32 +; CHECK-NEXT: add.s32 +; CHECK-NEXT: add.s32 +; CHECK-NEXT: add.s32 +; CHECK-NEXT: add.s32 +; CHECK-NEXT: add.s32 + %ptr0 = getelementptr <2 x i32>* %a, i32 0 + %val0 = load <2 x i32>* %ptr0 + %ptr1 = getelementptr <2 x i32>* %a, i32 1 + %val1 = load <2 x i32>* %ptr1 + %ptr2 = getelementptr <2 x i32>* %a, i32 2 + %val2 = load <2 x i32>* %ptr2 + %ptr3 = getelementptr <2 x i32>* %a, i32 3 + %val3 = load <2 x i32>* %ptr3 + + %t0 = add <2 x i32> %val0, %val1 + %t1 = add <2 x i32> %t0, %val2 + %t2 = add <2 x i32> %t1, %val3 + + store <2 x i32> %t2, <2 x i32>* %a + + ret void +} + diff --git a/test/CodeGen/NVPTX/sm-version-10.ll b/test/CodeGen/NVPTX/sm-version-10.ll deleted file mode 100644 index 9324a3780986..000000000000 --- a/test/CodeGen/NVPTX/sm-version-10.ll +++ /dev/null @@ -1,6 +0,0 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s - - -; CHECK: .target sm_10 - diff --git a/test/CodeGen/NVPTX/sm-version-11.ll b/test/CodeGen/NVPTX/sm-version-11.ll deleted file mode 100644 index 9033a4eba5e4..000000000000 --- a/test/CodeGen/NVPTX/sm-version-11.ll +++ /dev/null @@ -1,6 +0,0 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_11 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_11 | FileCheck %s - - -; CHECK: .target sm_11 - diff --git a/test/CodeGen/NVPTX/sm-version-12.ll b/test/CodeGen/NVPTX/sm-version-12.ll deleted file mode 100644 index d8ee85c9010e..000000000000 --- a/test/CodeGen/NVPTX/sm-version-12.ll +++ /dev/null @@ -1,6 +0,0 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_12 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_12 | FileCheck %s - - -; CHECK: .target sm_12 - diff --git a/test/CodeGen/NVPTX/sm-version-13.ll b/test/CodeGen/NVPTX/sm-version-13.ll deleted file mode 100644 index ad67d642ce30..000000000000 --- a/test/CodeGen/NVPTX/sm-version-13.ll +++ /dev/null @@ -1,6 +0,0 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_13 | FileCheck %s -; RUN: llc < %s -march=nvptx64 -mcpu=sm_13 | FileCheck %s - - -; CHECK: .target sm_13 - diff --git a/test/CodeGen/NVPTX/st-addrspace.ll b/test/CodeGen/NVPTX/st-addrspace.ll index 54e04ae6106d..0b26d802df84 100644 --- a/test/CodeGen/NVPTX/st-addrspace.ll +++ b/test/CodeGen/NVPTX/st-addrspace.ll @@ -1,6 +1,4 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s --check-prefix=PTX32 ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s --check-prefix=PTX32 -; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s --check-prefix=PTX64 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s --check-prefix=PTX64 diff --git a/test/CodeGen/NVPTX/tuple-literal.ll b/test/CodeGen/NVPTX/tuple-literal.ll new file mode 100644 index 000000000000..2b1f2c4b6680 --- /dev/null +++ b/test/CodeGen/NVPTX/tuple-literal.ll @@ -0,0 +1,5 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 + +define ptx_device void @test_function({i8, i8}*) { + ret void +} diff --git a/test/CodeGen/NVPTX/vector-args.ll b/test/CodeGen/NVPTX/vector-args.ll new file mode 100644 index 000000000000..80deae46935a --- /dev/null +++ b/test/CodeGen/NVPTX/vector-args.ll @@ -0,0 +1,27 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s + + +define float @foo(<2 x float> %a) { +; CHECK: .func (.param .b32 func_retval0) foo +; CHECK: .param .align 8 .b8 foo_param_0[8] +; CHECK: ld.param.f32 %f{{[0-9]+}} +; CHECK: ld.param.f32 %f{{[0-9]+}} + %t1 = fmul <2 x float> %a, %a + %t2 = extractelement <2 x float> %t1, i32 0 + %t3 = extractelement <2 x float> %t1, i32 1 + %t4 = fadd float %t2, %t3 + ret float %t4 +} + + +define float @bar(<4 x float> %a) { +; CHECK: .func (.param .b32 func_retval0) bar +; CHECK: .param .align 16 .b8 bar_param_0[16] +; CHECK: ld.param.f32 %f{{[0-9]+}} +; CHECK: ld.param.f32 %f{{[0-9]+}} + %t1 = fmul <4 x float> %a, %a + %t2 = extractelement <4 x float> %t1, i32 0 + %t3 = extractelement <4 x float> %t1, i32 1 + %t4 = fadd float %t2, %t3 + ret float %t4 +} diff --git a/test/CodeGen/NVPTX/vector-compare.ll b/test/CodeGen/NVPTX/vector-compare.ll new file mode 100644 index 000000000000..218049995233 --- /dev/null +++ b/test/CodeGen/NVPTX/vector-compare.ll @@ -0,0 +1,19 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 +; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 + +; This test makes sure that the result of vector compares are properly +; scalarized. If codegen fails, then the type legalizer incorrectly +; tried to promote <2 x i1> to <2 x i8> and instruction selection failed. + +define void @foo(<2 x i32>* %a, <2 x i32>* %b, i32* %r1, i32* %r2) { + %aval = load <2 x i32>* %a + %bval = load <2 x i32>* %b + %res = icmp slt <2 x i32> %aval, %bval + %t1 = extractelement <2 x i1> %res, i32 0 + %t2 = extractelement <2 x i1> %res, i32 1 + %t1a = zext i1 %t1 to i32 + %t2a = zext i1 %t2 to i32 + store i32 %t1a, i32* %r1 + store i32 %t2a, i32* %r2 + ret void +} diff --git a/test/CodeGen/NVPTX/vector-loads.ll b/test/CodeGen/NVPTX/vector-loads.ll new file mode 100644 index 000000000000..58882bf16668 --- /dev/null +++ b/test/CodeGen/NVPTX/vector-loads.ll @@ -0,0 +1,66 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s + +; Even though general vector types are not supported in PTX, we can still +; optimize loads/stores with pseudo-vector instructions of the form: +; +; ld.v2.f32 {%f0, %f1}, [%r0] +; +; which will load two floats at once into scalar registers. + +define void @foo(<2 x float>* %a) { +; CHECK: .func foo +; CHECK: ld.v2.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}} + %t1 = load <2 x float>* %a + %t2 = fmul <2 x float> %t1, %t1 + store <2 x float> %t2, <2 x float>* %a + ret void +} + +define void @foo2(<4 x float>* %a) { +; CHECK: .func foo2 +; CHECK: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}} + %t1 = load <4 x float>* %a + %t2 = fmul <4 x float> %t1, %t1 + store <4 x float> %t2, <4 x float>* %a + ret void +} + +define void @foo3(<8 x float>* %a) { +; CHECK: .func foo3 +; CHECK: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}} +; CHECK-NEXT: ld.v4.f32 {%f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}} + %t1 = load <8 x float>* %a + %t2 = fmul <8 x float> %t1, %t1 + store <8 x float> %t2, <8 x float>* %a + ret void +} + + + +define void @foo4(<2 x i32>* %a) { +; CHECK: .func foo4 +; CHECK: ld.v2.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}} + %t1 = load <2 x i32>* %a + %t2 = mul <2 x i32> %t1, %t1 + store <2 x i32> %t2, <2 x i32>* %a + ret void +} + +define void @foo5(<4 x i32>* %a) { +; CHECK: .func foo5 +; CHECK: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}} + %t1 = load <4 x i32>* %a + %t2 = mul <4 x i32> %t1, %t1 + store <4 x i32> %t2, <4 x i32>* %a + ret void +} + +define void @foo6(<8 x i32>* %a) { +; CHECK: .func foo6 +; CHECK: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}} +; CHECK-NEXT: ld.v4.u32 {%r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}, %r{{[0-9]+}}} + %t1 = load <8 x i32>* %a + %t2 = mul <8 x i32> %t1, %t1 + store <8 x i32> %t2, <8 x i32>* %a + ret void +} diff --git a/test/CodeGen/NVPTX/vector-select.ll b/test/CodeGen/NVPTX/vector-select.ll new file mode 100644 index 000000000000..11893df10329 --- /dev/null +++ b/test/CodeGen/NVPTX/vector-select.ll @@ -0,0 +1,16 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 +; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 + +; This test makes sure that vector selects are scalarized by the type legalizer. +; If not, type legalization will fail. + +define void @foo(<2 x i32> addrspace(1)* %def_a, <2 x i32> addrspace(1)* %def_b, <2 x i32> addrspace(1)* %def_c) { +entry: + %tmp4 = load <2 x i32> addrspace(1)* %def_a + %tmp6 = load <2 x i32> addrspace(1)* %def_c + %tmp8 = load <2 x i32> addrspace(1)* %def_b + %0 = icmp sge <2 x i32> %tmp4, zeroinitializer + %cond = select <2 x i1> %0, <2 x i32> %tmp6, <2 x i32> %tmp8 + store <2 x i32> %cond, <2 x i32> addrspace(1)* %def_c + ret void +} diff --git a/test/CodeGen/PowerPC/2007-09-04-AltivecDST.ll b/test/CodeGen/PowerPC/2007-09-04-AltivecDST.ll index 82ef2b82cbe6..b6feb5abbc3f 100644 --- a/test/CodeGen/PowerPC/2007-09-04-AltivecDST.ll +++ b/test/CodeGen/PowerPC/2007-09-04-AltivecDST.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=ppc64 | grep dst | count 4 +; RUN: llc < %s -march=ppc64 -mattr=+altivec | grep dst | count 4 define hidden void @_Z4borkPc(i8* %image) { entry: diff --git a/test/CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll b/test/CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll index 8802b97d2a6a..00a402e0e487 100644 --- a/test/CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll +++ b/test/CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -march=ppc32 -mcpu=g5 | grep vadduhm ; RUN: llc < %s -march=ppc32 -mcpu=g5 | grep vsubuhm +; XFAIL: * define <4 x i32> @test() nounwind { ret <4 x i32> < i32 4293066722, i32 4293066722, i32 4293066722, i32 4293066722> diff --git a/test/CodeGen/PowerPC/2009-08-17-inline-asm-addr-mode-breakage.ll b/test/CodeGen/PowerPC/2009-08-17-inline-asm-addr-mode-breakage.ll index 84aa40c4b52a..91253daae396 100644 --- a/test/CodeGen/PowerPC/2009-08-17-inline-asm-addr-mode-breakage.ll +++ b/test/CodeGen/PowerPC/2009-08-17-inline-asm-addr-mode-breakage.ll @@ -10,8 +10,8 @@ target triple = "powerpc-apple-darwin10.0" define void @foo(i32 %y) nounwind ssp { entry: ; CHECK: foo -; CHECK: add r3 -; CHECK: 0(r3) +; CHECK: add r2 +; CHECK: 0(r2) %y_addr = alloca i32 ; <i32*> [#uses=2] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] store i32 %y, i32* %y_addr diff --git a/test/CodeGen/PowerPC/2010-02-12-saveCR.ll b/test/CodeGen/PowerPC/2010-02-12-saveCR.ll index 974a99a52cb5..097611a7619c 100644 --- a/test/CodeGen/PowerPC/2010-02-12-saveCR.ll +++ b/test/CodeGen/PowerPC/2010-02-12-saveCR.ll @@ -2,21 +2,21 @@ ; ModuleID = 'hh.c' target datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128-n32" target triple = "powerpc-apple-darwin9.6" -; This formerly used R0 for both the stack address and CR. define void @foo() nounwind { entry: -;CHECK: mfcr r2 -;CHECK: lis r3, 1 -;CHECK: rlwinm r2, r2, 8, 0, 31 -;CHECK: ori r3, r3, 34524 -;CHECK: stwx r2, r1, r3 -; Make sure that the register scavenger returns the same temporary register. -;CHECK: mfcr r2 -;CHECK: lis r3, 1 -;CHECK: rlwinm r2, r2, 12, 0, 31 -;CHECK: ori r3, r3, 34520 -;CHECK: stwx r2, r1, r3 +; Note that part of what is being checked here is proper register reuse. +; CHECK: mfcr [[T1:r[0-9]+]] ; cr2 +; CHECK: lis [[T2:r[0-9]+]], 1 +; CHECK: addi r3, r1, 72 +; CHECK: rlwinm [[T1]], [[T1]], 8, 0, 31 +; CHECK: ori [[T2]], [[T2]], 34540 +; CHECK: stwx [[T1]], r1, [[T2]] +; CHECK: lis [[T3:r[0-9]+]], 1 +; CHECK: mfcr [[T4:r[0-9]+]] ; cr3 +; CHECK: ori [[T3]], [[T3]], 34536 +; CHECK: rlwinm [[T4]], [[T4]], 12, 0, 31 +; CHECK: stwx [[T4]], r1, [[T3]] %x = alloca [100000 x i8] ; <[100000 x i8]*> [#uses=1] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] %x1 = bitcast [100000 x i8]* %x to i8* ; <i8*> [#uses=1] @@ -25,11 +25,16 @@ entry: br label %return return: ; preds = %entry -;CHECK: lis r3, 1 -;CHECK: ori r3, r3, 34524 -;CHECK: lwzx r2, r1, r3 -;CHECK: rlwinm r2, r2, 24, 0, 31 -;CHECK: mtcrf 32, r2 +; CHECK: lis [[T1:r[0-9]+]], 1 +; CHECK: ori [[T1]], [[T1]], 34536 +; CHECK: lwzx [[T1]], r1, [[T1]] +; CHECK: rlwinm [[T1]], [[T1]], 20, 0, 31 +; CHECK: mtcrf 16, [[T1]] +; CHECK: lis [[T1]], 1 +; CHECK: ori [[T1]], [[T1]], 34540 +; CHECK: lwzx [[T1]], r1, [[T1]] +; CHECK: rlwinm [[T1]], [[T1]], 24, 0, 31 +; CHECK: mtcrf 32, [[T1]] ret void } diff --git a/test/CodeGen/PowerPC/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/PowerPC/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index 4a850984a909..000000000000 --- a/test/CodeGen/PowerPC/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=ppc32 -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/PowerPC/2010-05-03-retaddr1.ll b/test/CodeGen/PowerPC/2010-05-03-retaddr1.ll index 72ae9d6c73b3..0dbc2d0180ff 100644 --- a/test/CodeGen/PowerPC/2010-05-03-retaddr1.ll +++ b/test/CodeGen/PowerPC/2010-05-03-retaddr1.ll @@ -18,8 +18,8 @@ entry: ; CHECK: _g: ; CHECK: mflr r0 ; CHECK: stw r0, 8(r1) -; CHECK: lwz r3, 0(r1) -; CHECK: lwz r3, 8(r3) +; CHECK: lwz r2, 0(r1) +; CHECK: lwz r3, 8(r2) %0 = tail call i8* @llvm.returnaddress(i32 1) ; <i8*> [#uses=1] ret i8* %0 } diff --git a/test/CodeGen/PowerPC/2010-12-18-PPCStackRefs.ll b/test/CodeGen/PowerPC/2010-12-18-PPCStackRefs.ll index bf3d577a3677..d1a3c9f46b57 100644 --- a/test/CodeGen/PowerPC/2010-12-18-PPCStackRefs.ll +++ b/test/CodeGen/PowerPC/2010-12-18-PPCStackRefs.ll @@ -7,7 +7,7 @@ define i32 @main() nounwind { entry: ; Make sure we're generating references using the red zone ; CHECK: main: -; CHECK: stw r3, -12(r1) +; CHECK: stw r2, -12(r1) %retval = alloca i32 %0 = alloca i32 %"alloca point" = bitcast i32 0 to i32 diff --git a/test/CodeGen/PowerPC/2012-09-16-TOC-entry-check.ll b/test/CodeGen/PowerPC/2012-09-16-TOC-entry-check.ll index 9d2e390c1c97..5bff58f2bbf5 100644 --- a/test/CodeGen/PowerPC/2012-09-16-TOC-entry-check.ll +++ b/test/CodeGen/PowerPC/2012-09-16-TOC-entry-check.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s | FileCheck %s +; RUN: llc -code-model=small < %s | FileCheck %s target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" target triple = "powerpc64-unknown-linux-gnu" diff --git a/test/CodeGen/PowerPC/2012-11-16-mischedcall.ll b/test/CodeGen/PowerPC/2012-11-16-mischedcall.ll new file mode 100644 index 000000000000..35e3fdd26e72 --- /dev/null +++ b/test/CodeGen/PowerPC/2012-11-16-mischedcall.ll @@ -0,0 +1,33 @@ +; RUN: llc -mtriple=powerpc64-bgq-linux -enable-misched < %s | FileCheck %s +; +; PR14315: misched should not move the physreg copy of %t below the calls. + +@.str89 = external unnamed_addr constant [6 x i8], align 1 + +declare void @init() nounwind + +declare void @clock() nounwind + +; CHECK: %entry +; CHECK: fmr 31, 1 +; CHECK: bl init +define void @s332(double %t) nounwind { +entry: + tail call void @init() + tail call void @clock() nounwind + br label %for.cond2 + +for.cond2: ; preds = %for.body4, %entry + %i.0 = phi i32 [ %inc, %for.body4 ], [ 0, %entry ] + %cmp3 = icmp slt i32 undef, 16000 + br i1 %cmp3, label %for.body4, label %L20 + +for.body4: ; preds = %for.cond2 + %cmp5 = fcmp ogt double undef, %t + %inc = add nsw i32 %i.0, 1 + br i1 %cmp5, label %L20, label %for.cond2 + +L20: ; preds = %for.body4, %for.cond2 + %index.0 = phi i32 [ -2, %for.cond2 ], [ %i.0, %for.body4 ] + unreachable +} diff --git a/test/CodeGen/PowerPC/DbgValueOtherTargets.test b/test/CodeGen/PowerPC/DbgValueOtherTargets.test new file mode 100644 index 000000000000..9702934f7e68 --- /dev/null +++ b/test/CodeGen/PowerPC/DbgValueOtherTargets.test @@ -0,0 +1 @@ +RUN: llc -O0 -march=ppc32 -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/PowerPC/LargeAbsoluteAddr.ll b/test/CodeGen/PowerPC/LargeAbsoluteAddr.ll index 6f985c819fb6..e8765deab05d 100644 --- a/test/CodeGen/PowerPC/LargeAbsoluteAddr.ll +++ b/test/CodeGen/PowerPC/LargeAbsoluteAddr.ll @@ -1,9 +1,9 @@ ; RUN: llc < %s -march=ppc32 -mtriple=powerpc-apple-darwin | \ -; RUN: grep "stw r4, 32751" +; RUN: grep "stw r3, 32751" ; RUN: llc < %s -march=ppc64 -mtriple=powerpc-apple-darwin | \ -; RUN: grep "stw r4, 32751" +; RUN: grep "stw r3, 32751" ; RUN: llc < %s -march=ppc64 -mtriple=powerpc-apple-darwin | \ -; RUN: grep "std r4, 9024" +; RUN: grep "std r3, 9024" define void @test() nounwind { store i32 0, i32* inttoptr (i64 48725999 to i32*) diff --git a/test/CodeGen/PowerPC/a2q-stackalign.ll b/test/CodeGen/PowerPC/a2q-stackalign.ll new file mode 100644 index 000000000000..00c329119376 --- /dev/null +++ b/test/CodeGen/PowerPC/a2q-stackalign.ll @@ -0,0 +1,23 @@ +; RUN: llc < %s -march=ppc64 -mcpu=a2 | FileCheck -check-prefix=CHECK-A2 %s +; RUN: llc < %s -march=ppc64 -mcpu=a2q | FileCheck -check-prefix=CHECK-A2Q %s +; RUN: llc < %s -march=ppc64 -mtriple=powerpc64-bgq-linux -mcpu=a2 | FileCheck -check-prefix=CHECK-BGQ %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +declare i32 @bar(i8* %a) nounwind; +define i32 @foo() nounwind { + %p = alloca i8, i8 115 + store i8 0, i8* %p + %r = call i32 @bar(i8* %p) + ret i32 %r +} + +; Without QPX, the allocated stack frame is 240 bytes, but with QPX +; (because we require 32-byte alignment), it is 256 bytes. +; CHECK-A2: @foo +; CHECK-A2: stdu 1, -240(1) +; CHECK-A2Q: @foo +; CHECK-A2Q: stdu 1, -256(1) +; CHECK-BGQ: @foo +; CHECK-BGQ: stdu 1, -256(1) + diff --git a/test/CodeGen/PowerPC/a2q.ll b/test/CodeGen/PowerPC/a2q.ll new file mode 100644 index 000000000000..b26480f08b39 --- /dev/null +++ b/test/CodeGen/PowerPC/a2q.ll @@ -0,0 +1,10 @@ +; RUN: llc < %s -march=ppc64 -mcpu=a2q | FileCheck %s +; RUN: llc < %s -march=ppc64 -mcpu=a2 -mattr=+qpx | FileCheck %s + +define void @foo() { +entry: + ret void +} + +; CHECK: @foo + diff --git a/test/CodeGen/PowerPC/allocate-r0.ll b/test/CodeGen/PowerPC/allocate-r0.ll new file mode 100644 index 000000000000..1cf4cec07695 --- /dev/null +++ b/test/CodeGen/PowerPC/allocate-r0.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=g5 | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i64 @foo(i64 %a) nounwind { +entry: + call void asm sideeffect "", "~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12}"() nounwind + br label %return + +; CHECK: @foo +; Because r0 is allocatable, we can use it to hold r3 without spilling. +; CHECK: mr 0, 3 +; CHECK: mr 3, 0 + +return: ; preds = %entry + ret i64 %a +} + diff --git a/test/CodeGen/PowerPC/anon_aggr.ll b/test/CodeGen/PowerPC/anon_aggr.ll new file mode 100644 index 000000000000..52587e2c0b87 --- /dev/null +++ b/test/CodeGen/PowerPC/anon_aggr.ll @@ -0,0 +1,99 @@ +; RUN: llc -O0 -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s + +; Test case for PR 14779: anonymous aggregates are not handled correctly. +; The bug is triggered by passing a byval structure after an anonymous +; aggregate. + +%tarray = type { i64, i8* } + +define i8* @func1({ i64, i8* } %array, i8* %ptr) { +entry: + %array_ptr = extractvalue {i64, i8* } %array, 1 + %cond = icmp eq i8* %array_ptr, %ptr + br i1 %cond, label %equal, label %unequal +equal: + ret i8* %array_ptr +unequal: + ret i8* %ptr +} + +; CHECK: func1: +; CHECK: cmpld {{[0-9]+}}, 4, 5 +; CHECK: std 4, -[[OFFSET1:[0-9]+]] +; CHECK: std 5, -[[OFFSET2:[0-9]+]] +; CHECK: ld 3, -[[OFFSET1]](1) +; CHECK: ld 3, -[[OFFSET2]](1) + + +define i8* @func2({ i64, i8* } %array1, %tarray* byval %array2) { +entry: + %array1_ptr = extractvalue {i64, i8* } %array1, 1 + %tmp = getelementptr inbounds %tarray* %array2, i32 0, i32 1 + %array2_ptr = load i8** %tmp + %cond = icmp eq i8* %array1_ptr, %array2_ptr + br i1 %cond, label %equal, label %unequal +equal: + ret i8* %array1_ptr +unequal: + ret i8* %array2_ptr +} + +; CHECK: func2: +; CHECK: addi [[REG1:[0-9]+]], 1, 64 +; CHECK: ld [[REG2:[0-9]+]], 8([[REG1]]) +; CHECK: cmpld {{[0-9]+}}, 4, [[REG2]] +; CHECK: std [[REG2]], -[[OFFSET1:[0-9]+]] +; CHECK: std 4, -[[OFFSET2:[0-9]+]] +; CHECK: ld 3, -[[OFFSET2]](1) +; CHECK: ld 3, -[[OFFSET1]](1) + +define i8* @func3({ i64, i8* }* byval %array1, %tarray* byval %array2) { +entry: + %tmp1 = getelementptr inbounds { i64, i8* }* %array1, i32 0, i32 1 + %array1_ptr = load i8** %tmp1 + %tmp2 = getelementptr inbounds %tarray* %array2, i32 0, i32 1 + %array2_ptr = load i8** %tmp2 + %cond = icmp eq i8* %array1_ptr, %array2_ptr + br i1 %cond, label %equal, label %unequal +equal: + ret i8* %array1_ptr +unequal: + ret i8* %array2_ptr +} + +; CHECK: func3: +; CHECK: addi [[REG1:[0-9]+]], 1, 64 +; CHECK: addi [[REG2:[0-9]+]], 1, 48 +; CHECK: ld [[REG3:[0-9]+]], 8([[REG1]]) +; CHECK: ld [[REG4:[0-9]+]], 8([[REG2]]) +; CHECK: cmpld {{[0-9]+}}, [[REG4]], [[REG3]] +; CHECK: std [[REG3]], -[[OFFSET1:[0-9]+]](1) +; CHECK: std [[REG4]], -[[OFFSET2:[0-9]+]](1) +; CHECK: ld 3, -[[OFFSET2]](1) +; CHECK: ld 3, -[[OFFSET1]](1) + +define i8* @func4(i64 %p1, i64 %p2, i64 %p3, i64 %p4, + i64 %p5, i64 %p6, i64 %p7, i64 %p8, + { i64, i8* } %array1, %tarray* byval %array2) { +entry: + %array1_ptr = extractvalue {i64, i8* } %array1, 1 + %tmp = getelementptr inbounds %tarray* %array2, i32 0, i32 1 + %array2_ptr = load i8** %tmp + %cond = icmp eq i8* %array1_ptr, %array2_ptr + br i1 %cond, label %equal, label %unequal +equal: + ret i8* %array1_ptr +unequal: + ret i8* %array2_ptr +} + +; CHECK: func4: +; CHECK: addi [[REG1:[0-9]+]], 1, 128 +; CHECK: ld [[REG2:[0-9]+]], 120(1) +; CHECK: ld [[REG3:[0-9]+]], 8([[REG1]]) +; CHECK: cmpld {{[0-9]+}}, [[REG2]], [[REG3]] +; CHECK: std [[REG2]], -[[OFFSET1:[0-9]+]](1) +; CHECK: std [[REG3]], -[[OFFSET2:[0-9]+]](1) +; CHECK: ld 3, -[[OFFSET1]](1) +; CHECK: ld 3, -[[OFFSET2]](1) + diff --git a/test/CodeGen/PowerPC/asym-regclass-copy.ll b/test/CodeGen/PowerPC/asym-regclass-copy.ll new file mode 100644 index 000000000000..d04a6c98ee19 --- /dev/null +++ b/test/CodeGen/PowerPC/asym-regclass-copy.ll @@ -0,0 +1,56 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +; This tests that the GPRC/GPRC_NOR0 intersection subclass relationship with +; GPRC is handled correctly. When it was not, this test would assert. + +@gen_random.last = external unnamed_addr global i64, align 8 +@.str = external unnamed_addr constant [4 x i8], align 1 + +declare double @gen_random(double) #0 + +declare void @benchmark_heapsort(i32 signext, double* nocapture) #0 + +define signext i32 @main(i32 signext %argc, i8** nocapture %argv) #0 { +entry: + br i1 undef, label %cond.true, label %cond.end + +cond.true: ; preds = %entry + br label %cond.end + +cond.end: ; preds = %cond.true, %entry + %cond = phi i32 [ 0, %cond.true ], [ 8000000, %entry ] + %add = add i32 %cond, 1 + %conv = sext i32 %add to i64 + %mul = shl nsw i64 %conv, 3 + %call1 = tail call noalias i8* @malloc(i64 %mul) #1 + br i1 undef, label %for.end, label %for.body.lr.ph + +for.body.lr.ph: ; preds = %cond.end + br label %for.body + +for.body: ; preds = %for.body, %for.body.lr.ph + %indvars.iv = phi i64 [ 1, %for.body.lr.ph ], [ %indvars.iv.next, %for.body ] + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %add + br i1 %exitcond, label %for.cond.for.end_crit_edge, label %for.body + +for.cond.for.end_crit_edge: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.cond.for.end_crit_edge, %cond.end + ret i32 0 +} + +declare noalias i8* @malloc(i64) #0 + +declare signext i32 @printf(i8* nocapture, ...) #0 + +declare void @free(i8* nocapture) #0 + +declare i64 @strtol(i8*, i8** nocapture, i32 signext) #0 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind } diff --git a/test/CodeGen/PowerPC/atomic-1.ll b/test/CodeGen/PowerPC/atomic-1.ll index cbfa4094fb4e..838db20ddd1b 100644 --- a/test/CodeGen/PowerPC/atomic-1.ll +++ b/test/CodeGen/PowerPC/atomic-1.ll @@ -1,10 +1,10 @@ -; RUN: llc < %s -march=ppc32 | FileCheck %s +; RUN: llc < %s -mtriple=powerpc-apple-darwin -march=ppc32 | FileCheck %s define i32 @exchange_and_add(i32* %mem, i32 %val) nounwind { ; CHECK: exchange_and_add: -; CHECK: lwarx +; CHECK: lwarx {{r[0-9]+}}, 0, {{r[0-9]+}} %tmp = atomicrmw add i32* %mem, i32 %val monotonic -; CHECK: stwcx. +; CHECK: stwcx. {{r[0-9]+}}, 0, {{r[0-9]+}} ret i32 %tmp } diff --git a/test/CodeGen/PowerPC/atomic-2.ll b/test/CodeGen/PowerPC/atomic-2.ll index a427379a8b6d..40b4a2eea976 100644 --- a/test/CodeGen/PowerPC/atomic-2.ll +++ b/test/CodeGen/PowerPC/atomic-2.ll @@ -24,3 +24,23 @@ define i64 @exchange(i64* %mem, i64 %val) nounwind { ; CHECK: stdcx. ret i64 %tmp } + +define void @atomic_store(i64* %mem, i64 %val) nounwind { +entry: +; CHECK: @atomic_store + store atomic i64 %val, i64* %mem release, align 64 +; CHECK: ldarx +; CHECK: stdcx. + ret void +} + +define i64 @atomic_load(i64* %mem) nounwind { +entry: +; CHECK: @atomic_load + %tmp = load atomic i64* %mem acquire, align 64 +; CHECK: ldarx +; CHECK: stdcx. +; CHECK: stdcx. + ret i64 %tmp +} + diff --git a/test/CodeGen/PowerPC/available-externally.ll b/test/CodeGen/PowerPC/available-externally.ll index fdead7dd8b34..abed0de80b88 100644 --- a/test/CodeGen/PowerPC/available-externally.ll +++ b/test/CodeGen/PowerPC/available-externally.ll @@ -1,6 +1,8 @@ ; RUN: llc < %s -relocation-model=static | FileCheck %s -check-prefix=STATIC ; RUN: llc < %s -relocation-model=pic | FileCheck %s -check-prefix=PIC +; RUN: llc < %s -relocation-model=pic -mtriple=powerpc64-apple-darwin8 | FileCheck %s -check-prefix=PIC64 ; RUN: llc < %s -relocation-model=dynamic-no-pic | FileCheck %s -check-prefix=DYNAMIC +; RUN: llc < %s -relocation-model=dynamic-no-pic -mtriple=powerpc64-apple-darwin8 | FileCheck %s -check-prefix=DYNAMIC64 ; PR4482 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" target triple = "powerpc-apple-darwin8" @@ -16,10 +18,18 @@ entry: ; PIC: bl L_exact_log2$stub ; PIC: blr +; PIC64: _foo: +; PIC64: bl L_exact_log2$stub +; PIC64: blr + ; DYNAMIC: _foo: ; DYNAMIC: bl L_exact_log2$stub ; DYNAMIC: blr +; DYNAMIC64: _foo: +; DYNAMIC64: bl L_exact_log2$stub +; DYNAMIC64: blr + %A = call i32 @exact_log2(i64 %x) nounwind ret i32 %A } @@ -34,13 +44,13 @@ entry: ; PIC: L_exact_log2$stub: ; PIC: .indirect_symbol _exact_log2 ; PIC: mflr r0 -; PIC: bcl 20,31,L_exact_log2$stub$tmp +; PIC: bcl 20, 31, L_exact_log2$stub$tmp ; PIC: L_exact_log2$stub$tmp: ; PIC: mflr r11 -; PIC: addis r11,r11,ha16(L_exact_log2$lazy_ptr-L_exact_log2$stub$tmp) +; PIC: addis r11, r11, ha16(L_exact_log2$lazy_ptr-L_exact_log2$stub$tmp) ; PIC: mtlr r0 -; PIC: lwzu r12,lo16(L_exact_log2$lazy_ptr-L_exact_log2$stub$tmp)(r11) +; PIC: lwzu r12, lo16(L_exact_log2$lazy_ptr-L_exact_log2$stub$tmp)(r11) ; PIC: mtctr r12 ; PIC: bctr @@ -51,12 +61,32 @@ entry: ; PIC: .subsections_via_symbols +; PIC64: .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 +; PIC64: L_exact_log2$stub: +; PIC64: .indirect_symbol _exact_log2 +; PIC64: mflr r0 +; PIC64: bcl 20, 31, L_exact_log2$stub$tmp + +; PIC64: L_exact_log2$stub$tmp: +; PIC64: mflr r11 +; PIC64: addis r11, r11, ha16(L_exact_log2$lazy_ptr-L_exact_log2$stub$tmp) +; PIC64: mtlr r0 +; PIC64: ldu r12, lo16(L_exact_log2$lazy_ptr-L_exact_log2$stub$tmp)(r11) +; PIC64: mtctr r12 +; PIC64: bctr + +; PIC64: .section __DATA,__la_symbol_ptr,lazy_symbol_pointers +; PIC64: L_exact_log2$lazy_ptr: +; PIC64: .indirect_symbol _exact_log2 +; PIC64: .quad dyld_stub_binding_helper + +; PIC64: .subsections_via_symbols ; DYNAMIC: .section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16 ; DYNAMIC: L_exact_log2$stub: ; DYNAMIC: .indirect_symbol _exact_log2 -; DYNAMIC: lis r11,ha16(L_exact_log2$lazy_ptr) -; DYNAMIC: lwzu r12,lo16(L_exact_log2$lazy_ptr)(r11) +; DYNAMIC: lis r11, ha16(L_exact_log2$lazy_ptr) +; DYNAMIC: lwzu r12, lo16(L_exact_log2$lazy_ptr)(r11) ; DYNAMIC: mtctr r12 ; DYNAMIC: bctr @@ -65,7 +95,15 @@ entry: ; DYNAMIC: .indirect_symbol _exact_log2 ; DYNAMIC: .long dyld_stub_binding_helper - - - - +; DYNAMIC64: .section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16 +; DYNAMIC64: L_exact_log2$stub: +; DYNAMIC64: .indirect_symbol _exact_log2 +; DYNAMIC64: lis r11, ha16(L_exact_log2$lazy_ptr) +; DYNAMIC64: ldu r12, lo16(L_exact_log2$lazy_ptr)(r11) +; DYNAMIC64: mtctr r12 +; DYNAMIC64: bctr + +; DYNAMIC64: .section __DATA,__la_symbol_ptr,lazy_symbol_pointers +; DYNAMIC64: L_exact_log2$lazy_ptr: +; DYNAMIC64: .indirect_symbol _exact_log2 +; DYNAMIC64: .quad dyld_stub_binding_helper diff --git a/test/CodeGen/PowerPC/bswap-load-store.ll b/test/CodeGen/PowerPC/bswap-load-store.ll index 4f6bfc729913..53bbc52167c4 100644 --- a/test/CodeGen/PowerPC/bswap-load-store.ll +++ b/test/CodeGen/PowerPC/bswap-load-store.ll @@ -1,5 +1,7 @@ -; RUN: llc < %s -march=ppc32 | FileCheck %s -check-prefix=X32 -; RUN: llc < %s -march=ppc64 | FileCheck %s -check-prefix=X64 +; RUN: llc < %s -march=ppc32 -mcpu=ppc32 | FileCheck %s -check-prefix=X32 +; RUN: llc < %s -march=ppc64 -mcpu=ppc64 | FileCheck %s -check-prefix=X64 +; RUN: llc < %s -march=ppc64 -mcpu=pwr7 | FileCheck %s -check-prefix=PWR7 +; RUN: llc < %s -march=ppc32 -mcpu=pwr7 | FileCheck %s -check-prefix=X32 define void @STWBRX(i32 %i, i8* %ptr, i32 %off) { @@ -34,18 +36,47 @@ define i16 @LHBRX(i8* %ptr, i32 %off) { ret i16 %tmp6 } +define void @STDBRX(i64 %i, i8* %ptr, i64 %off) { + %tmp1 = getelementptr i8* %ptr, i64 %off ; <i8*> [#uses=1] + %tmp1.upgrd.1 = bitcast i8* %tmp1 to i64* ; <i64*> [#uses=1] + %tmp13 = tail call i64 @llvm.bswap.i64( i64 %i ) ; <i64> [#uses=1] + store i64 %tmp13, i64* %tmp1.upgrd.1 + ret void +} + +define i64 @LDBRX(i8* %ptr, i64 %off) { + %tmp1 = getelementptr i8* %ptr, i64 %off ; <i8*> [#uses=1] + %tmp1.upgrd.2 = bitcast i8* %tmp1 to i64* ; <i64*> [#uses=1] + %tmp = load i64* %tmp1.upgrd.2 ; <i64> [#uses=1] + %tmp14 = tail call i64 @llvm.bswap.i64( i64 %tmp ) ; <i64> [#uses=1] + ret i64 %tmp14 +} + declare i32 @llvm.bswap.i32(i32) declare i16 @llvm.bswap.i16(i16) +declare i64 @llvm.bswap.i64(i64) + ; X32: stwbrx ; X32: lwbrx ; X32: sthbrx ; X32: lhbrx +; X32-NOT: ldbrx +; X32-NOT: stdbrx ; X64: stwbrx ; X64: lwbrx ; X64: sthbrx ; X64: lhbrx +; X64-NOT: ldbrx +; X64-NOT: stdbrx + +; PWR7: stwbrx +; PWR7: lwbrx +; PWR7: sthbrx +; PWR7: lhbrx +; PWR7: stdbrx +; PWR7: ldbrx diff --git a/test/CodeGen/PowerPC/buildvec_canonicalize.ll b/test/CodeGen/PowerPC/buildvec_canonicalize.ll index 0454c584bcfe..e155a35c4da0 100644 --- a/test/CodeGen/PowerPC/buildvec_canonicalize.ll +++ b/test/CodeGen/PowerPC/buildvec_canonicalize.ll @@ -1,10 +1,4 @@ -; There should be exactly one vxor here. -; RUN: llc < %s -march=ppc32 -mcpu=g5 --enable-unsafe-fp-math | \ -; RUN: grep vxor | count 1 - -; There should be exactly one vsplti here. -; RUN: llc < %s -march=ppc32 -mcpu=g5 --enable-unsafe-fp-math | \ -; RUN: grep vsplti | count 1 +; RUN: llc < %s -march=ppc32 -mattr=+altivec --enable-unsafe-fp-math | FileCheck %s define void @VXOR(<4 x float>* %P1, <4 x i32>* %P2, <4 x float>* %P3) { %tmp = load <4 x float>* %P3 ; <<4 x float>> [#uses=1] @@ -15,10 +9,16 @@ define void @VXOR(<4 x float>* %P1, <4 x i32>* %P2, <4 x float>* %P3) { store <4 x i32> zeroinitializer, <4 x i32>* %P2 ret void } +; The fmul will spill a vspltisw to create a -0.0 vector used as the addend +; to vmaddfp (so it would IEEE compliant with zero sign propagation). +; CHECK: @VXOR +; CHECK: vsplti +; CHECK: vxor define void @VSPLTI(<4 x i32>* %P2, <8 x i16>* %P3) { store <4 x i32> bitcast (<16 x i8> < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 > to <4 x i32>), <4 x i32>* %P2 store <8 x i16> < i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1 >, <8 x i16>* %P3 ret void } - +; CHECK: @VSPLTI +; CHECK: vsplti diff --git a/test/CodeGen/PowerPC/complex-return.ll b/test/CodeGen/PowerPC/complex-return.ll new file mode 100644 index 000000000000..f12152ff0fca --- /dev/null +++ b/test/CodeGen/PowerPC/complex-return.ll @@ -0,0 +1,55 @@ +; RUN: llc -mcpu=pwr7 -O0 < %s | FileCheck %s + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define { ppc_fp128, ppc_fp128 } @foo() nounwind { +entry: + %retval = alloca { ppc_fp128, ppc_fp128 }, align 16 + %x = alloca { ppc_fp128, ppc_fp128 }, align 16 + %real = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %x, i32 0, i32 0 + %imag = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %x, i32 0, i32 1 + store ppc_fp128 0xM400C0000000000000000000000000000, ppc_fp128* %real + store ppc_fp128 0xMC00547AE147AE1483CA47AE147AE147A, ppc_fp128* %imag + %x.realp = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %x, i32 0, i32 0 + %x.real = load ppc_fp128* %x.realp + %x.imagp = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %x, i32 0, i32 1 + %x.imag = load ppc_fp128* %x.imagp + %real1 = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %retval, i32 0, i32 0 + %imag2 = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %retval, i32 0, i32 1 + store ppc_fp128 %x.real, ppc_fp128* %real1 + store ppc_fp128 %x.imag, ppc_fp128* %imag2 + %0 = load { ppc_fp128, ppc_fp128 }* %retval + ret { ppc_fp128, ppc_fp128 } %0 +} + +; CHECK: foo: +; CHECK: lfd 3 +; CHECK: lfd 4 +; CHECK: lfd 2 +; CHECK: lfd 1 + +define { float, float } @oof() nounwind { +entry: + %retval = alloca { float, float }, align 4 + %x = alloca { float, float }, align 4 + %real = getelementptr inbounds { float, float }* %x, i32 0, i32 0 + %imag = getelementptr inbounds { float, float }* %x, i32 0, i32 1 + store float 3.500000e+00, float* %real + store float 0xC00547AE20000000, float* %imag + %x.realp = getelementptr inbounds { float, float }* %x, i32 0, i32 0 + %x.real = load float* %x.realp + %x.imagp = getelementptr inbounds { float, float }* %x, i32 0, i32 1 + %x.imag = load float* %x.imagp + %real1 = getelementptr inbounds { float, float }* %retval, i32 0, i32 0 + %imag2 = getelementptr inbounds { float, float }* %retval, i32 0, i32 1 + store float %x.real, float* %real1 + store float %x.imag, float* %imag2 + %0 = load { float, float }* %retval + ret { float, float } %0 +} + +; CHECK: oof: +; CHECK: lfs 2 +; CHECK: lfs 1 + diff --git a/test/CodeGen/PowerPC/cr-spills.ll b/test/CodeGen/PowerPC/cr-spills.ll new file mode 100644 index 000000000000..d6df7a237668 --- /dev/null +++ b/test/CodeGen/PowerPC/cr-spills.ll @@ -0,0 +1,409 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +; This test case triggers several functions related to cr spilling, both in +; frame lowering and to handle cr register pressure. When the register kill +; flags were not being set correctly, this would cause the register scavenger to +; assert. + +@SetupFastFullPelSearch.orig_pels = external unnamed_addr global [768 x i16], align 2 +@weight_luma = external global i32 +@offset_luma = external global i32 +@wp_luma_round = external global i32, align 4 +@luma_log_weight_denom = external global i32, align 4 + +define void @SetupFastFullPelSearch() #0 { +entry: + %mul10 = mul nsw i32 undef, undef + br i1 undef, label %land.end, label %land.lhs.true + +land.lhs.true: ; preds = %entry + switch i32 0, label %land.end [ + i32 0, label %land.rhs + i32 3, label %land.rhs + ] + +land.rhs: ; preds = %land.lhs.true, %land.lhs.true + %tobool21 = icmp ne i32 undef, 0 + br label %land.end + +land.end: ; preds = %land.rhs, %land.lhs.true, %entry + %0 = phi i1 [ %tobool21, %land.rhs ], [ false, %land.lhs.true ], [ false, %entry ] + %cond = load i32** undef, align 8 + br i1 undef, label %if.then95, label %for.body.lr.ph + +if.then95: ; preds = %land.end + %cmp.i4.i1427 = icmp slt i32 undef, undef + br label %for.body.lr.ph + +for.body.lr.ph: ; preds = %if.then95, %land.end + br label %for.body + +for.body: ; preds = %for.body, %for.body.lr.ph + br i1 undef, label %for.body, label %for.body252 + +for.body252: ; preds = %for.inc997, %for.body + %shl263 = add i32 undef, 80 + br i1 %0, label %for.cond286.preheader, label %for.cond713.preheader + +for.cond286.preheader: ; preds = %for.body252 + br label %for.cond290.preheader + +for.cond290.preheader: ; preds = %for.end520, %for.cond286.preheader + %srcptr.31595 = phi i16* [ getelementptr inbounds ([768 x i16]* @SetupFastFullPelSearch.orig_pels, i64 0, i64 0), %for.cond286.preheader ], [ null, %for.end520 ] + %1 = load i32* undef, align 4, !tbaa !0 + %2 = load i32* @weight_luma, align 4, !tbaa !0 + %3 = load i32* @wp_luma_round, align 4, !tbaa !0 + %4 = load i32* @luma_log_weight_denom, align 4, !tbaa !0 + %5 = load i32* @offset_luma, align 4, !tbaa !0 + %incdec.ptr502.sum = add i64 undef, 16 + br label %for.body293 + +for.body293: ; preds = %for.body293, %for.cond290.preheader + %srcptr.41591 = phi i16* [ %srcptr.31595, %for.cond290.preheader ], [ undef, %for.body293 ] + %refptr.11590 = phi i16* [ undef, %for.cond290.preheader ], [ %add.ptr517, %for.body293 ] + %LineSadBlk0.01588 = phi i32 [ 0, %for.cond290.preheader ], [ %add346, %for.body293 ] + %LineSadBlk1.01587 = phi i32 [ 0, %for.cond290.preheader ], [ %add402, %for.body293 ] + %LineSadBlk3.01586 = phi i32 [ 0, %for.cond290.preheader ], [ %add514, %for.body293 ] + %LineSadBlk2.01585 = phi i32 [ 0, %for.cond290.preheader ], [ %add458, %for.body293 ] + %6 = load i16* %refptr.11590, align 2, !tbaa !3 + %conv294 = zext i16 %6 to i32 + %mul295 = mul nsw i32 %conv294, %2 + %add296 = add nsw i32 %mul295, %3 + %shr = ashr i32 %add296, %4 + %add297 = add nsw i32 %shr, %5 + %cmp.i.i1513 = icmp sgt i32 %add297, 0 + %cond.i.i1514 = select i1 %cmp.i.i1513, i32 %add297, i32 0 + %cmp.i4.i1515 = icmp slt i32 %cond.i.i1514, %1 + %cond.i5.i1516 = select i1 %cmp.i4.i1515, i32 %cond.i.i1514, i32 %1 + %7 = load i16* %srcptr.41591, align 2, !tbaa !3 + %conv300 = zext i16 %7 to i32 + %sub301 = sub nsw i32 %cond.i5.i1516, %conv300 + %idxprom302 = sext i32 %sub301 to i64 + %arrayidx303 = getelementptr inbounds i32* %cond, i64 %idxprom302 + %8 = load i32* %arrayidx303, align 4, !tbaa !0 + %add304 = add nsw i32 %8, %LineSadBlk0.01588 + %9 = load i32* undef, align 4, !tbaa !0 + %add318 = add nsw i32 %add304, %9 + %10 = load i16* undef, align 2, !tbaa !3 + %conv321 = zext i16 %10 to i32 + %mul322 = mul nsw i32 %conv321, %2 + %add323 = add nsw i32 %mul322, %3 + %shr324 = ashr i32 %add323, %4 + %add325 = add nsw i32 %shr324, %5 + %cmp.i.i1505 = icmp sgt i32 %add325, 0 + %cond.i.i1506 = select i1 %cmp.i.i1505, i32 %add325, i32 0 + %cmp.i4.i1507 = icmp slt i32 %cond.i.i1506, %1 + %cond.i5.i1508 = select i1 %cmp.i4.i1507, i32 %cond.i.i1506, i32 %1 + %sub329 = sub nsw i32 %cond.i5.i1508, 0 + %idxprom330 = sext i32 %sub329 to i64 + %arrayidx331 = getelementptr inbounds i32* %cond, i64 %idxprom330 + %11 = load i32* %arrayidx331, align 4, !tbaa !0 + %add332 = add nsw i32 %add318, %11 + %cmp.i.i1501 = icmp sgt i32 undef, 0 + %cond.i.i1502 = select i1 %cmp.i.i1501, i32 undef, i32 0 + %cmp.i4.i1503 = icmp slt i32 %cond.i.i1502, %1 + %cond.i5.i1504 = select i1 %cmp.i4.i1503, i32 %cond.i.i1502, i32 %1 + %incdec.ptr341 = getelementptr inbounds i16* %srcptr.41591, i64 4 + %12 = load i16* null, align 2, !tbaa !3 + %conv342 = zext i16 %12 to i32 + %sub343 = sub nsw i32 %cond.i5.i1504, %conv342 + %idxprom344 = sext i32 %sub343 to i64 + %arrayidx345 = getelementptr inbounds i32* %cond, i64 %idxprom344 + %13 = load i32* %arrayidx345, align 4, !tbaa !0 + %add346 = add nsw i32 %add332, %13 + %incdec.ptr348 = getelementptr inbounds i16* %refptr.11590, i64 5 + %14 = load i16* null, align 2, !tbaa !3 + %conv349 = zext i16 %14 to i32 + %mul350 = mul nsw i32 %conv349, %2 + %add351 = add nsw i32 %mul350, %3 + %shr352 = ashr i32 %add351, %4 + %add353 = add nsw i32 %shr352, %5 + %cmp.i.i1497 = icmp sgt i32 %add353, 0 + %cond.i.i1498 = select i1 %cmp.i.i1497, i32 %add353, i32 0 + %cmp.i4.i1499 = icmp slt i32 %cond.i.i1498, %1 + %cond.i5.i1500 = select i1 %cmp.i4.i1499, i32 %cond.i.i1498, i32 %1 + %incdec.ptr355 = getelementptr inbounds i16* %srcptr.41591, i64 5 + %15 = load i16* %incdec.ptr341, align 2, !tbaa !3 + %conv356 = zext i16 %15 to i32 + %sub357 = sub nsw i32 %cond.i5.i1500, %conv356 + %idxprom358 = sext i32 %sub357 to i64 + %arrayidx359 = getelementptr inbounds i32* %cond, i64 %idxprom358 + %16 = load i32* %arrayidx359, align 4, !tbaa !0 + %add360 = add nsw i32 %16, %LineSadBlk1.01587 + %incdec.ptr362 = getelementptr inbounds i16* %refptr.11590, i64 6 + %17 = load i16* %incdec.ptr348, align 2, !tbaa !3 + %conv363 = zext i16 %17 to i32 + %mul364 = mul nsw i32 %conv363, %2 + %add365 = add nsw i32 %mul364, %3 + %shr366 = ashr i32 %add365, %4 + %add367 = add nsw i32 %shr366, %5 + %cmp.i.i1493 = icmp sgt i32 %add367, 0 + %cond.i.i1494 = select i1 %cmp.i.i1493, i32 %add367, i32 0 + %cmp.i4.i1495 = icmp slt i32 %cond.i.i1494, %1 + %cond.i5.i1496 = select i1 %cmp.i4.i1495, i32 %cond.i.i1494, i32 %1 + %incdec.ptr369 = getelementptr inbounds i16* %srcptr.41591, i64 6 + %18 = load i16* %incdec.ptr355, align 2, !tbaa !3 + %conv370 = zext i16 %18 to i32 + %sub371 = sub nsw i32 %cond.i5.i1496, %conv370 + %idxprom372 = sext i32 %sub371 to i64 + %arrayidx373 = getelementptr inbounds i32* %cond, i64 %idxprom372 + %19 = load i32* %arrayidx373, align 4, !tbaa !0 + %add374 = add nsw i32 %add360, %19 + %incdec.ptr376 = getelementptr inbounds i16* %refptr.11590, i64 7 + %20 = load i16* %incdec.ptr362, align 2, !tbaa !3 + %conv377 = zext i16 %20 to i32 + %mul378 = mul nsw i32 %conv377, %2 + %add379 = add nsw i32 %mul378, %3 + %shr380 = ashr i32 %add379, %4 + %add381 = add nsw i32 %shr380, %5 + %cmp.i.i1489 = icmp sgt i32 %add381, 0 + %cond.i.i1490 = select i1 %cmp.i.i1489, i32 %add381, i32 0 + %cmp.i4.i1491 = icmp slt i32 %cond.i.i1490, %1 + %cond.i5.i1492 = select i1 %cmp.i4.i1491, i32 %cond.i.i1490, i32 %1 + %incdec.ptr383 = getelementptr inbounds i16* %srcptr.41591, i64 7 + %21 = load i16* %incdec.ptr369, align 2, !tbaa !3 + %conv384 = zext i16 %21 to i32 + %sub385 = sub nsw i32 %cond.i5.i1492, %conv384 + %idxprom386 = sext i32 %sub385 to i64 + %arrayidx387 = getelementptr inbounds i32* %cond, i64 %idxprom386 + %22 = load i32* %arrayidx387, align 4, !tbaa !0 + %add388 = add nsw i32 %add374, %22 + %23 = load i16* %incdec.ptr376, align 2, !tbaa !3 + %conv391 = zext i16 %23 to i32 + %mul392 = mul nsw i32 %conv391, %2 + %add395 = add nsw i32 0, %5 + %cmp.i.i1485 = icmp sgt i32 %add395, 0 + %cond.i.i1486 = select i1 %cmp.i.i1485, i32 %add395, i32 0 + %cmp.i4.i1487 = icmp slt i32 %cond.i.i1486, %1 + %cond.i5.i1488 = select i1 %cmp.i4.i1487, i32 %cond.i.i1486, i32 %1 + %incdec.ptr397 = getelementptr inbounds i16* %srcptr.41591, i64 8 + %24 = load i16* %incdec.ptr383, align 2, !tbaa !3 + %conv398 = zext i16 %24 to i32 + %sub399 = sub nsw i32 %cond.i5.i1488, %conv398 + %idxprom400 = sext i32 %sub399 to i64 + %arrayidx401 = getelementptr inbounds i32* %cond, i64 %idxprom400 + %25 = load i32* %arrayidx401, align 4, !tbaa !0 + %add402 = add nsw i32 %add388, %25 + %incdec.ptr404 = getelementptr inbounds i16* %refptr.11590, i64 9 + %cmp.i4.i1483 = icmp slt i32 undef, %1 + %cond.i5.i1484 = select i1 %cmp.i4.i1483, i32 undef, i32 %1 + %26 = load i16* %incdec.ptr397, align 2, !tbaa !3 + %conv412 = zext i16 %26 to i32 + %sub413 = sub nsw i32 %cond.i5.i1484, %conv412 + %idxprom414 = sext i32 %sub413 to i64 + %arrayidx415 = getelementptr inbounds i32* %cond, i64 %idxprom414 + %27 = load i32* %arrayidx415, align 4, !tbaa !0 + %add416 = add nsw i32 %27, %LineSadBlk2.01585 + %incdec.ptr418 = getelementptr inbounds i16* %refptr.11590, i64 10 + %28 = load i16* %incdec.ptr404, align 2, !tbaa !3 + %conv419 = zext i16 %28 to i32 + %mul420 = mul nsw i32 %conv419, %2 + %add421 = add nsw i32 %mul420, %3 + %shr422 = ashr i32 %add421, %4 + %add423 = add nsw i32 %shr422, %5 + %cmp.i.i1477 = icmp sgt i32 %add423, 0 + %cond.i.i1478 = select i1 %cmp.i.i1477, i32 %add423, i32 0 + %cmp.i4.i1479 = icmp slt i32 %cond.i.i1478, %1 + %cond.i5.i1480 = select i1 %cmp.i4.i1479, i32 %cond.i.i1478, i32 %1 + %incdec.ptr425 = getelementptr inbounds i16* %srcptr.41591, i64 10 + %sub427 = sub nsw i32 %cond.i5.i1480, 0 + %idxprom428 = sext i32 %sub427 to i64 + %arrayidx429 = getelementptr inbounds i32* %cond, i64 %idxprom428 + %29 = load i32* %arrayidx429, align 4, !tbaa !0 + %add430 = add nsw i32 %add416, %29 + %incdec.ptr432 = getelementptr inbounds i16* %refptr.11590, i64 11 + %30 = load i16* %incdec.ptr418, align 2, !tbaa !3 + %conv433 = zext i16 %30 to i32 + %mul434 = mul nsw i32 %conv433, %2 + %add435 = add nsw i32 %mul434, %3 + %shr436 = ashr i32 %add435, %4 + %add437 = add nsw i32 %shr436, %5 + %cmp.i.i1473 = icmp sgt i32 %add437, 0 + %cond.i.i1474 = select i1 %cmp.i.i1473, i32 %add437, i32 0 + %cmp.i4.i1475 = icmp slt i32 %cond.i.i1474, %1 + %cond.i5.i1476 = select i1 %cmp.i4.i1475, i32 %cond.i.i1474, i32 %1 + %31 = load i16* %incdec.ptr425, align 2, !tbaa !3 + %conv440 = zext i16 %31 to i32 + %sub441 = sub nsw i32 %cond.i5.i1476, %conv440 + %idxprom442 = sext i32 %sub441 to i64 + %arrayidx443 = getelementptr inbounds i32* %cond, i64 %idxprom442 + %32 = load i32* %arrayidx443, align 4, !tbaa !0 + %add444 = add nsw i32 %add430, %32 + %incdec.ptr446 = getelementptr inbounds i16* %refptr.11590, i64 12 + %33 = load i16* %incdec.ptr432, align 2, !tbaa !3 + %conv447 = zext i16 %33 to i32 + %mul448 = mul nsw i32 %conv447, %2 + %add449 = add nsw i32 %mul448, %3 + %shr450 = ashr i32 %add449, %4 + %add451 = add nsw i32 %shr450, %5 + %cmp.i.i1469 = icmp sgt i32 %add451, 0 + %cond.i.i1470 = select i1 %cmp.i.i1469, i32 %add451, i32 0 + %cmp.i4.i1471 = icmp slt i32 %cond.i.i1470, %1 + %cond.i5.i1472 = select i1 %cmp.i4.i1471, i32 %cond.i.i1470, i32 %1 + %incdec.ptr453 = getelementptr inbounds i16* %srcptr.41591, i64 12 + %34 = load i16* undef, align 2, !tbaa !3 + %conv454 = zext i16 %34 to i32 + %sub455 = sub nsw i32 %cond.i5.i1472, %conv454 + %idxprom456 = sext i32 %sub455 to i64 + %arrayidx457 = getelementptr inbounds i32* %cond, i64 %idxprom456 + %35 = load i32* %arrayidx457, align 4, !tbaa !0 + %add458 = add nsw i32 %add444, %35 + %incdec.ptr460 = getelementptr inbounds i16* %refptr.11590, i64 13 + %36 = load i16* %incdec.ptr446, align 2, !tbaa !3 + %conv461 = zext i16 %36 to i32 + %mul462 = mul nsw i32 %conv461, %2 + %add463 = add nsw i32 %mul462, %3 + %shr464 = ashr i32 %add463, %4 + %add465 = add nsw i32 %shr464, %5 + %cmp.i.i1465 = icmp sgt i32 %add465, 0 + %cond.i.i1466 = select i1 %cmp.i.i1465, i32 %add465, i32 0 + %cmp.i4.i1467 = icmp slt i32 %cond.i.i1466, %1 + %cond.i5.i1468 = select i1 %cmp.i4.i1467, i32 %cond.i.i1466, i32 %1 + %incdec.ptr467 = getelementptr inbounds i16* %srcptr.41591, i64 13 + %37 = load i16* %incdec.ptr453, align 2, !tbaa !3 + %conv468 = zext i16 %37 to i32 + %sub469 = sub nsw i32 %cond.i5.i1468, %conv468 + %idxprom470 = sext i32 %sub469 to i64 + %arrayidx471 = getelementptr inbounds i32* %cond, i64 %idxprom470 + %38 = load i32* %arrayidx471, align 4, !tbaa !0 + %add472 = add nsw i32 %38, %LineSadBlk3.01586 + %incdec.ptr474 = getelementptr inbounds i16* %refptr.11590, i64 14 + %add477 = add nsw i32 0, %3 + %shr478 = ashr i32 %add477, %4 + %add479 = add nsw i32 %shr478, %5 + %cmp.i.i1461 = icmp sgt i32 %add479, 0 + %cond.i.i1462 = select i1 %cmp.i.i1461, i32 %add479, i32 0 + %cmp.i4.i1463 = icmp slt i32 %cond.i.i1462, %1 + %cond.i5.i1464 = select i1 %cmp.i4.i1463, i32 %cond.i.i1462, i32 %1 + %incdec.ptr481 = getelementptr inbounds i16* %srcptr.41591, i64 14 + %39 = load i16* %incdec.ptr467, align 2, !tbaa !3 + %conv482 = zext i16 %39 to i32 + %sub483 = sub nsw i32 %cond.i5.i1464, %conv482 + %idxprom484 = sext i32 %sub483 to i64 + %arrayidx485 = getelementptr inbounds i32* %cond, i64 %idxprom484 + %40 = load i32* %arrayidx485, align 4, !tbaa !0 + %add486 = add nsw i32 %add472, %40 + %incdec.ptr488 = getelementptr inbounds i16* %refptr.11590, i64 15 + %41 = load i16* %incdec.ptr474, align 2, !tbaa !3 + %conv489 = zext i16 %41 to i32 + %mul490 = mul nsw i32 %conv489, %2 + %add491 = add nsw i32 %mul490, %3 + %shr492 = ashr i32 %add491, %4 + %add493 = add nsw i32 %shr492, %5 + %cmp.i.i1457 = icmp sgt i32 %add493, 0 + %cond.i.i1458 = select i1 %cmp.i.i1457, i32 %add493, i32 0 + %cmp.i4.i1459 = icmp slt i32 %cond.i.i1458, %1 + %cond.i5.i1460 = select i1 %cmp.i4.i1459, i32 %cond.i.i1458, i32 %1 + %incdec.ptr495 = getelementptr inbounds i16* %srcptr.41591, i64 15 + %42 = load i16* %incdec.ptr481, align 2, !tbaa !3 + %conv496 = zext i16 %42 to i32 + %sub497 = sub nsw i32 %cond.i5.i1460, %conv496 + %idxprom498 = sext i32 %sub497 to i64 + %arrayidx499 = getelementptr inbounds i32* %cond, i64 %idxprom498 + %43 = load i32* %arrayidx499, align 4, !tbaa !0 + %add500 = add nsw i32 %add486, %43 + %44 = load i16* %incdec.ptr488, align 2, !tbaa !3 + %conv503 = zext i16 %44 to i32 + %mul504 = mul nsw i32 %conv503, %2 + %add505 = add nsw i32 %mul504, %3 + %shr506 = ashr i32 %add505, %4 + %add507 = add nsw i32 %shr506, %5 + %cmp.i.i1453 = icmp sgt i32 %add507, 0 + %cond.i.i1454 = select i1 %cmp.i.i1453, i32 %add507, i32 0 + %cmp.i4.i1455 = icmp slt i32 %cond.i.i1454, %1 + %cond.i5.i1456 = select i1 %cmp.i4.i1455, i32 %cond.i.i1454, i32 %1 + %45 = load i16* %incdec.ptr495, align 2, !tbaa !3 + %conv510 = zext i16 %45 to i32 + %sub511 = sub nsw i32 %cond.i5.i1456, %conv510 + %idxprom512 = sext i32 %sub511 to i64 + %arrayidx513 = getelementptr inbounds i32* %cond, i64 %idxprom512 + %46 = load i32* %arrayidx513, align 4, !tbaa !0 + %add514 = add nsw i32 %add500, %46 + %add.ptr517 = getelementptr inbounds i16* %refptr.11590, i64 %incdec.ptr502.sum + %exitcond1692 = icmp eq i32 undef, 4 + br i1 %exitcond1692, label %for.end520, label %for.body293 + +for.end520: ; preds = %for.body293 + store i32 %add346, i32* undef, align 4, !tbaa !0 + store i32 %add402, i32* undef, align 4, !tbaa !0 + store i32 %add458, i32* undef, align 4, !tbaa !0 + store i32 %add514, i32* null, align 4, !tbaa !0 + br i1 undef, label %for.end543, label %for.cond290.preheader + +for.end543: ; preds = %for.end520 + br i1 undef, label %for.inc997, label %for.body549 + +for.body549: ; preds = %for.inc701, %for.end543 + %call554 = call i16* null(i16**** null, i32 signext undef, i32 signext %shl263) #1 + br label %for.cond559.preheader + +for.cond559.preheader: ; preds = %for.cond559.preheader, %for.body549 + br i1 undef, label %for.inc701, label %for.cond559.preheader + +for.inc701: ; preds = %for.cond559.preheader + br i1 undef, label %for.inc997, label %for.body549 + +for.cond713.preheader: ; preds = %for.end850, %for.body252 + br label %for.body716 + +for.body716: ; preds = %for.body716, %for.cond713.preheader + br i1 undef, label %for.end850, label %for.body716 + +for.end850: ; preds = %for.body716 + br i1 undef, label %for.end873, label %for.cond713.preheader + +for.end873: ; preds = %for.end850 + br i1 undef, label %for.inc997, label %for.body879 + +for.body879: ; preds = %for.inc992, %for.end873 + br label %for.cond889.preheader + +for.cond889.preheader: ; preds = %for.end964, %for.body879 + br i1 undef, label %for.cond894.preheader.lr.ph, label %for.end964 + +for.cond894.preheader.lr.ph: ; preds = %for.cond889.preheader + br label %for.body898.lr.ph.us + +for.end957.us: ; preds = %for.body946.us + br i1 undef, label %for.body898.lr.ph.us, label %for.end964 + +for.body946.us: ; preds = %for.body930.us, %for.body946.us + br i1 false, label %for.body946.us, label %for.end957.us + +for.body930.us: ; preds = %for.body914.us, %for.body930.us + br i1 undef, label %for.body930.us, label %for.body946.us + +for.body914.us: ; preds = %for.body898.us, %for.body914.us + br i1 undef, label %for.body914.us, label %for.body930.us + +for.body898.us: ; preds = %for.body898.lr.ph.us, %for.body898.us + br i1 undef, label %for.body898.us, label %for.body914.us + +for.body898.lr.ph.us: ; preds = %for.end957.us, %for.cond894.preheader.lr.ph + br label %for.body898.us + +for.end964: ; preds = %for.end957.us, %for.cond889.preheader + %inc990 = add nsw i32 undef, 1 + br i1 false, label %for.inc992, label %for.cond889.preheader + +for.inc992: ; preds = %for.end964 + br i1 false, label %for.inc997, label %for.body879 + +for.inc997: ; preds = %for.inc992, %for.end873, %for.inc701, %for.end543 + %cmp250 = icmp slt i32 undef, %mul10 + br i1 %cmp250, label %for.body252, label %for.end999 + +for.end999: ; preds = %for.inc997 + ret void +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind } + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"short", metadata !1} diff --git a/test/CodeGen/PowerPC/ctr-cleanup.ll b/test/CodeGen/PowerPC/ctr-cleanup.ll new file mode 100644 index 000000000000..04e4ffb0d48d --- /dev/null +++ b/test/CodeGen/PowerPC/ctr-cleanup.ll @@ -0,0 +1,25 @@ +; RUN: llc < %s -mcpu=a2 | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define void @main() #0 { +entry: + br i1 undef, label %for.end, label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 1, %entry ] + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 5 + br i1 %exitcond, label %for.end, label %for.body + +; CHECK: @main +; CHECK: li {{[0-9]+}}, 4 +; CHECK-NOT: li {{[0-9]+}}, 4 +; CHECK: bdnz + +for.end: ; preds = %for.body, %entry + ret void +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } diff --git a/test/CodeGen/PowerPC/cttz.ll b/test/CodeGen/PowerPC/cttz.ll index 1d365d47a877..3757fa3e2f29 100644 --- a/test/CodeGen/PowerPC/cttz.ll +++ b/test/CodeGen/PowerPC/cttz.ll @@ -1,10 +1,12 @@ ; Make sure this testcase does not use ctpop -; RUN: llc < %s -march=ppc32 | grep -i cntlzw +; RUN: llc < %s -march=ppc32 -mcpu=g5 | FileCheck %s declare i32 @llvm.cttz.i32(i32, i1) define i32 @bar(i32 %x) { entry: +; CHECK: @bar +; CHECK: cntlzw %tmp.1 = call i32 @llvm.cttz.i32( i32 %x, i1 true ) ; <i32> [#uses=1] ret i32 %tmp.1 } diff --git a/test/CodeGen/PowerPC/dbg.ll b/test/CodeGen/PowerPC/dbg.ll index e161cb05686f..21e36618c5c1 100644 --- a/test/CodeGen/PowerPC/dbg.ll +++ b/test/CodeGen/PowerPC/dbg.ll @@ -16,12 +16,10 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"dbg.c", metadata !"/src", metadata !"clang version 3.1", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i8**)* @main, null, null, metadata !13} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 720913, i32 12, metadata !6, metadata !"clang version 3.1", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 720942, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i8**)* @main, null, null, metadata !13} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 720937, metadata !"dbg.c", metadata !"/src", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9, metadata !9, metadata !10} diff --git a/test/CodeGen/PowerPC/dcbt-sched.ll b/test/CodeGen/PowerPC/dcbt-sched.ll new file mode 100644 index 000000000000..dfa1b75bd7db --- /dev/null +++ b/test/CodeGen/PowerPC/dcbt-sched.ll @@ -0,0 +1,22 @@ +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" +; RUN: llc -mcpu=a2 -enable-misched -enable-aa-sched-mi < %s | FileCheck %s + +define i8 @test1(i8* noalias %a, i8* noalias %b, i8* noalias %c) nounwind { +entry: + %q = load i8* %b + call void @llvm.prefetch(i8* %a, i32 0, i32 3, i32 1) + %r = load i8* %c + %s = add i8 %q, %r + ret i8 %s +} + +declare void @llvm.prefetch(i8*, i32, i32, i32) + +; Test that we've moved the second load to before the dcbt to better +; hide its latency. +; CHECK: @test1 +; CHECK: lbz +; CHECK: lbz +; CHECK: dcbt + diff --git a/test/CodeGen/PowerPC/float-asmprint.ll b/test/CodeGen/PowerPC/float-asmprint.ll new file mode 100644 index 000000000000..c9dc02862aac --- /dev/null +++ b/test/CodeGen/PowerPC/float-asmprint.ll @@ -0,0 +1,34 @@ +; RUN: llc -mtriple=powerpc64-none-linux < %s | FileCheck %s + +; Check that all current floating-point types are correctly emitted to assembly +; on a big-endian target. x86_fp80 can't actually print for unrelated reasons, +; but that's not really a problem. + +@var128 = global fp128 0xL00000000000000008000000000000000, align 16 +@varppc128 = global ppc_fp128 0xM80000000000000000000000000000000, align 16 +@var64 = global double -0.0, align 8 +@var32 = global float -0.0, align 4 +@var16 = global half -0.0, align 2 + +; CHECK: var128: +; CHECK-NEXT: .quad -9223372036854775808 # fp128 -0 +; CHECK-NEXT: .quad 0 +; CHECK-NEXT: .size + +; CHECK: varppc128: +; CHECK-NEXT: .quad -9223372036854775808 # ppc_fp128 -0 +; CHECK-NEXT: .quad 0 +; CHECK-NEXT: .size + +; CHECK: var64: +; CHECK-NEXT: .quad -9223372036854775808 # double -0 +; CHECK-NEXT: .size + +; CHECK: var32: +; CHECK-NEXT: .long 2147483648 # float -0 +; CHECK-NEXT: .size + +; CHECK: var16: +; CHECK-NEXT: .short 32768 # half -0 +; CHECK-NEXT: .size + diff --git a/test/CodeGen/PowerPC/float-to-int.ll b/test/CodeGen/PowerPC/float-to-int.ll new file mode 100644 index 000000000000..39cd4f929f8d --- /dev/null +++ b/test/CodeGen/PowerPC/float-to-int.ll @@ -0,0 +1,93 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=g5 +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i64 @foo(float %a) nounwind { + %x = fptosi float %a to i64 + ret i64 %x + +; CHECK: @foo +; CHECK: fctidz [[REG:[0-9]+]], 1 +; CHECK: stfd [[REG]], +; CHECK: ld 3, +; CHECK: blr +} + +define i64 @foo2(double %a) nounwind { + %x = fptosi double %a to i64 + ret i64 %x + +; CHECK: @foo2 +; CHECK: fctidz [[REG:[0-9]+]], 1 +; CHECK: stfd [[REG]], +; CHECK: ld 3, +; CHECK: blr +} + +define i64 @foo3(float %a) nounwind { + %x = fptoui float %a to i64 + ret i64 %x + +; CHECK: @foo3 +; CHECK: fctiduz [[REG:[0-9]+]], 1 +; CHECK: stfd [[REG]], +; CHECK: ld 3, +; CHECK: blr +} + +define i64 @foo4(double %a) nounwind { + %x = fptoui double %a to i64 + ret i64 %x + +; CHECK: @foo4 +; CHECK: fctiduz [[REG:[0-9]+]], 1 +; CHECK: stfd [[REG]], +; CHECK: ld 3, +; CHECK: blr +} + +define i32 @goo(float %a) nounwind { + %x = fptosi float %a to i32 + ret i32 %x + +; CHECK: @goo +; CHECK: fctiwz [[REG:[0-9]+]], 1 +; CHECK: stfiwx [[REG]], +; CHECK: lwz 3, +; CHECK: blr +} + +define i32 @goo2(double %a) nounwind { + %x = fptosi double %a to i32 + ret i32 %x + +; CHECK: @goo2 +; CHECK: fctiwz [[REG:[0-9]+]], 1 +; CHECK: stfiwx [[REG]], +; CHECK: lwz 3, +; CHECK: blr +} + +define i32 @goo3(float %a) nounwind { + %x = fptoui float %a to i32 + ret i32 %x + +; CHECK: @goo3 +; CHECK: fctiwuz [[REG:[0-9]+]], 1 +; CHECK: stfiwx [[REG]], +; CHECK: lwz 3, +; CHECK: blr +} + +define i32 @goo4(double %a) nounwind { + %x = fptoui double %a to i32 + ret i32 %x + +; CHECK: @goo4 +; CHECK: fctiwuz [[REG:[0-9]+]], 1 +; CHECK: stfiwx [[REG]], +; CHECK: lwz 3, +; CHECK: blr +} + diff --git a/test/CodeGen/PowerPC/frame-size.ll b/test/CodeGen/PowerPC/frame-size.ll new file mode 100644 index 000000000000..0e569a4602c3 --- /dev/null +++ b/test/CodeGen/PowerPC/frame-size.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 | FileCheck %s +target datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128-n32" + +define i64 @foo() nounwind { +entry: + %x = alloca [32568 x i8] + %"alloca point" = bitcast i32 0 to i32 + %x1 = bitcast [32568 x i8]* %x to i8* + +; Check that the RS spill slot has been allocated (because the estimate +; will fail the small-frame-size check and the function has spills). +; CHECK: @foo +; CHECK: stdu 1, -32768(1) + + %s1 = call i64 @bar(i8* %x1) nounwind + %s2 = call i64 @bar(i8* %x1) nounwind + %s3 = call i64 @bar(i8* %x1) nounwind + %s4 = call i64 @bar(i8* %x1) nounwind + %s5 = call i64 @bar(i8* %x1) nounwind + %s6 = call i64 @bar(i8* %x1) nounwind + %s7 = call i64 @bar(i8* %x1) nounwind + %s8 = call i64 @bar(i8* %x1) nounwind + %r = call i64 @can(i64 %s1, i64 %s2, i64 %s3, i64 %s4, i64 %s5, i64 %s6, i64 %s7, i64 %s8) nounwind + br label %return + +return: + ret i64 %r +} + +declare i64 @bar(i8*) +declare i64 @can(i64, i64, i64, i64, i64, i64, i64, i64) + diff --git a/test/CodeGen/PowerPC/frameaddr.ll b/test/CodeGen/PowerPC/frameaddr.ll new file mode 100644 index 000000000000..eabd4a68aa83 --- /dev/null +++ b/test/CodeGen/PowerPC/frameaddr.ll @@ -0,0 +1,47 @@ +; RUN: llc < %s -mcpu=pwr7 | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +declare void @llvm.eh.sjlj.longjmp(i8*) #1 + +define i8* @main() #0 { +entry: + %0 = call i8* @llvm.frameaddress(i32 0) + ret i8* %0 + +; CHECK: @main +; CHECK: mr 3, 1 +} + +define i8* @foo() #3 { ; naked +entry: + %0 = call i8* @llvm.frameaddress(i32 0) + ret i8* %0 + +; CHECK: @foo +; CHECK: mr 3, 1 +} + +define i8* @bar() #0 { +entry: + %x = alloca [100000 x i8] ; <[100000 x i8]*> [#uses=1] + %x1 = bitcast [100000 x i8]* %x to i8* ; <i8*> [#uses=1] + call void @use(i8* %x1) nounwind + %0 = call i8* @llvm.frameaddress(i32 0) + ret i8* %0 + +; Note that if we start eliminating non-leaf frame pointers by default, this +; will need to be updated. +; CHECK: @bar +; CHECK: mr 3, 31 +} + +declare void @use(i8*) + +declare i8* @llvm.frameaddress(i32) #2 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { noreturn nounwind } +attributes #2 = { nounwind readnone } +attributes #3 = { nounwind naked "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } + diff --git a/test/CodeGen/PowerPC/i32-to-float.ll b/test/CodeGen/PowerPC/i32-to-float.ll new file mode 100644 index 000000000000..2707d0352de1 --- /dev/null +++ b/test/CodeGen/PowerPC/i32-to-float.ll @@ -0,0 +1,82 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=g5 | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr6 | FileCheck -check-prefix=CHECK-PWR6 %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 | FileCheck -check-prefix=CHECK-A2 %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define float @foo(i32 %a) nounwind { +entry: + %x = sitofp i32 %a to float + ret float %x + +; CHECK: @foo +; CHECK: extsw [[REG:[0-9]+]], 3 +; CHECK: std [[REG]], +; CHECK: lfd [[REG2:[0-9]+]], +; CHECK: fcfid [[REG3:[0-9]+]], [[REG2]] +; CHECK: frsp 1, [[REG3]] +; CHECK: blr + +; CHECK-PWR6: @foo +; CHECK-PWR6: stw 3, +; CHECK-PWR6: lfiwax [[REG:[0-9]+]], +; CHECK-PWR6: fcfid [[REG2:[0-9]+]], [[REG]] +; CHECK-PWR6: frsp 1, [[REG2]] +; CHECK-PWR6: blr + +; CHECK-A2: @foo +; CHECK-A2: stw 3, +; CHECK-A2: lfiwax [[REG:[0-9]+]], +; CHECK-A2: fcfids 1, [[REG]] +; CHECK-A2: blr +} + +define double @goo(i32 %a) nounwind { +entry: + %x = sitofp i32 %a to double + ret double %x + +; CHECK: @goo +; CHECK: extsw [[REG:[0-9]+]], 3 +; CHECK: std [[REG]], +; CHECK: lfd [[REG2:[0-9]+]], +; CHECK: fcfid 1, [[REG2]] +; CHECK: blr + +; CHECK-PWR6: @goo +; CHECK-PWR6: stw 3, +; CHECK-PWR6: lfiwax [[REG:[0-9]+]], +; CHECK-PWR6: fcfid 1, [[REG]] +; CHECK-PWR6: blr + +; CHECK-A2: @goo +; CHECK-A2: stw 3, +; CHECK-A2: lfiwax [[REG:[0-9]+]], +; CHECK-A2: fcfid 1, [[REG]] +; CHECK-A2: blr +} + +define float @foou(i32 %a) nounwind { +entry: + %x = uitofp i32 %a to float + ret float %x + +; CHECK-A2: @foou +; CHECK-A2: stw 3, +; CHECK-A2: lfiwzx [[REG:[0-9]+]], +; CHECK-A2: fcfidus 1, [[REG]] +; CHECK-A2: blr +} + +define double @goou(i32 %a) nounwind { +entry: + %x = uitofp i32 %a to double + ret double %x + +; CHECK-A2: @goou +; CHECK-A2: stw 3, +; CHECK-A2: lfiwzx [[REG:[0-9]+]], +; CHECK-A2: fcfidu 1, [[REG]] +; CHECK-A2: blr +} + diff --git a/test/CodeGen/PowerPC/i64-to-float.ll b/test/CodeGen/PowerPC/i64-to-float.ll new file mode 100644 index 000000000000..b81d109e7f45 --- /dev/null +++ b/test/CodeGen/PowerPC/i64-to-float.ll @@ -0,0 +1,52 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define float @foo(i64 %a) nounwind { +entry: + %x = sitofp i64 %a to float + ret float %x + +; CHECK: @foo +; CHECK: std 3, +; CHECK: lfd [[REG:[0-9]+]], +; CHECK: fcfids 1, [[REG]] +; CHECK: blr +} + +define double @goo(i64 %a) nounwind { +entry: + %x = sitofp i64 %a to double + ret double %x + +; CHECK: @goo +; CHECK: std 3, +; CHECK: lfd [[REG:[0-9]+]], +; CHECK: fcfid 1, [[REG]] +; CHECK: blr +} + +define float @foou(i64 %a) nounwind { +entry: + %x = uitofp i64 %a to float + ret float %x + +; CHECK: @foou +; CHECK: std 3, +; CHECK: lfd [[REG:[0-9]+]], +; CHECK: fcfidus 1, [[REG]] +; CHECK: blr +} + +define double @goou(i64 %a) nounwind { +entry: + %x = uitofp i64 %a to double + ret double %x + +; CHECK: @goou +; CHECK: std 3, +; CHECK: lfd [[REG:[0-9]+]], +; CHECK: fcfidu 1, [[REG]] +; CHECK: blr +} + diff --git a/test/CodeGen/PowerPC/i64_fp_round.ll b/test/CodeGen/PowerPC/i64_fp_round.ll index 5a0c072c9c52..d2a3239ab865 100644 --- a/test/CodeGen/PowerPC/i64_fp_round.ll +++ b/test/CodeGen/PowerPC/i64_fp_round.ll @@ -1,4 +1,4 @@ -; RUN: llc -mcpu=pwr7 < %s | FileCheck %s +; RUN: llc -mcpu=pwr7 -mattr=-fpcvt < %s | FileCheck %s target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" target triple = "powerpc64-unknown-linux-gnu" @@ -12,16 +12,16 @@ entry: ; Note that only parts of the sequence are checked for here, to allow ; for minor code generation differences. -; CHECK: sradi [[REGISTER:[0-9]+]], 3, 53 -; CHECK: addi [[REGISTER:[0-9]+]], [[REGISTER]], 1 -; CHECK: cmpldi 0, [[REGISTER]], 1 -; CHECK: isel [[REGISTER:[0-9]+]], {{[0-9]+}}, 3, 1 -; CHECK: std [[REGISTER]], -{{[0-9]+}}(1) +; CHECK: sradi [[REG1:[0-9]+]], 3, 53 +; CHECK: addi [[REG2:[0-9]+]], [[REG1]], 1 +; CHECK: cmpldi 0, [[REG2]], 1 +; CHECK: isel [[REG3:[0-9]+]], {{[0-9]+}}, 3, 1 +; CHECK: std [[REG3]], -{{[0-9]+}}(1) ; Also check that with -enable-unsafe-fp-math we do not get that extra ; code sequence. Simply verify that there is no "isel" present. -; RUN: llc -mcpu=pwr7 -enable-unsafe-fp-math < %s | FileCheck %s -check-prefix=UNSAFE +; RUN: llc -mcpu=pwr7 -mattr=-fpcvt -enable-unsafe-fp-math < %s | FileCheck %s -check-prefix=UNSAFE ; CHECK-UNSAFE-NOT: isel diff --git a/test/CodeGen/PowerPC/iabs.ll b/test/CodeGen/PowerPC/iabs.ll index 7d089bbd653c..f683238de268 100644 --- a/test/CodeGen/PowerPC/iabs.ll +++ b/test/CodeGen/PowerPC/iabs.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=ppc32 -stats 2>&1 | \ ; RUN: grep "4 .*Number of machine instrs printed" diff --git a/test/CodeGen/PowerPC/in-asm-f64-reg.ll b/test/CodeGen/PowerPC/in-asm-f64-reg.ll new file mode 100644 index 000000000000..1321dfce2027 --- /dev/null +++ b/test/CodeGen/PowerPC/in-asm-f64-reg.ll @@ -0,0 +1,11 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s + +define void @f() { +; CHECK: @f + +entry: + %0 = tail call double* asm sideeffect "qvstfdux $2,$0,$1", "=b,{r7},{f11},0,~{memory}"(i32 64, double undef, double* undef) + ret void + +; CHECK: qvstfdux 11,{{[0-9]+}},7 +} diff --git a/test/CodeGen/PowerPC/jaggedstructs.ll b/test/CodeGen/PowerPC/jaggedstructs.ll index 62aa7cf929f8..a10c5ddb36fb 100644 --- a/test/CodeGen/PowerPC/jaggedstructs.ll +++ b/test/CodeGen/PowerPC/jaggedstructs.ll @@ -23,22 +23,22 @@ entry: ; CHECK: std 4, 200(1) ; CHECK: std 3, 192(1) ; CHECK: lbz {{[0-9]+}}, 199(1) -; CHECK: stb {{[0-9]+}}, 55(1) ; CHECK: lhz {{[0-9]+}}, 197(1) +; CHECK: stb {{[0-9]+}}, 55(1) ; CHECK: sth {{[0-9]+}}, 53(1) ; CHECK: lbz {{[0-9]+}}, 207(1) -; CHECK: stb {{[0-9]+}}, 63(1) ; CHECK: lwz {{[0-9]+}}, 203(1) +; CHECK: stb {{[0-9]+}}, 63(1) ; CHECK: stw {{[0-9]+}}, 59(1) ; CHECK: lhz {{[0-9]+}}, 214(1) -; CHECK: sth {{[0-9]+}}, 70(1) ; CHECK: lwz {{[0-9]+}}, 210(1) +; CHECK: sth {{[0-9]+}}, 70(1) ; CHECK: stw {{[0-9]+}}, 66(1) ; CHECK: lbz {{[0-9]+}}, 223(1) -; CHECK: stb {{[0-9]+}}, 79(1) ; CHECK: lhz {{[0-9]+}}, 221(1) -; CHECK: sth {{[0-9]+}}, 77(1) ; CHECK: lwz {{[0-9]+}}, 217(1) +; CHECK: stb {{[0-9]+}}, 79(1) +; CHECK: sth {{[0-9]+}}, 77(1) ; CHECK: stw {{[0-9]+}}, 73(1) ; CHECK: ld 6, 72(1) ; CHECK: ld 5, 64(1) diff --git a/test/CodeGen/PowerPC/lbzux.ll b/test/CodeGen/PowerPC/lbzux.ll index 12f1d1f130d8..98951306fd8e 100644 --- a/test/CodeGen/PowerPC/lbzux.ll +++ b/test/CodeGen/PowerPC/lbzux.ll @@ -1,6 +1,6 @@ target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" target triple = "powerpc64-unknown-linux-gnu" -; RUN: llc < %s | FileCheck %s +; RUN: llc -disable-ppc-unaligned < %s | FileCheck %s define fastcc void @allocateSpace(i1 %cond1, i1 %cond2) nounwind { entry: diff --git a/test/CodeGen/PowerPC/lit.local.cfg b/test/CodeGen/PowerPC/lit.local.cfg index 4019eca0bb88..aaa31d93d5f2 100644 --- a/test/CodeGen/PowerPC/lit.local.cfg +++ b/test/CodeGen/PowerPC/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'PowerPC' in targets: diff --git a/test/CodeGen/PowerPC/load-shift-combine.ll b/test/CodeGen/PowerPC/load-shift-combine.ll new file mode 100644 index 000000000000..a5d1224864a6 --- /dev/null +++ b/test/CodeGen/PowerPC/load-shift-combine.ll @@ -0,0 +1,34 @@ +; RUN: llc < %s + +; This used to cause a crash. A standard load is converted to a pre-increment +; load. Later the pre-increment load is combined with a subsequent SRL to +; produce a smaller load. This transform invalidly created a standard load +; and propagated the produced value into uses of both produced values of the +; pre-increment load. The result was a crash when attempting to process an +; add with a token-chain operand. + +%struct.Info = type { i32, i32, i8*, i8*, i8*, [32 x i8*], i64, [32 x i64], i64, i64, i64, [32 x i64] } +%struct.S1847 = type { [12 x i8], [4 x i8], [8 x i8], [4 x i8], [8 x i8], [2 x i8], i8, [4 x i64], i8, [3 x i8], [4 x i8], i8, i16, [4 x %struct.anon.76], i16, i8, i8* } +%struct.anon.76 = type { i32 } +@info = common global %struct.Info zeroinitializer, align 8 +@fails = common global i32 0, align 4 +@a1847 = external global [5 x %struct.S1847] +define void @test1847() nounwind { +entry: + %j = alloca i32, align 4 + %0 = load i64* getelementptr inbounds (%struct.Info* @info, i32 0, i32 8), align 8 + %1 = load i32* @fails, align 4 + %bf.load1 = load i96* bitcast (%struct.S1847* getelementptr inbounds ([5 x %struct.S1847]* @a1847, i32 0, i64 2) to i96*), align 8 + %bf.clear2 = and i96 %bf.load1, 302231454903657293676543 + %bf.set3 = or i96 %bf.clear2, -38383394772764476296921088 + store i96 %bf.set3, i96* bitcast (%struct.S1847* getelementptr inbounds ([5 x %struct.S1847]* @a1847, i32 0, i64 2) to i96*), align 8 + %2 = load i32* %j, align 4 + %3 = load i32* %j, align 4 + %inc11 = add nsw i32 %3, 1 + store i32 %inc11, i32* %j, align 4 + %bf.load15 = load i96* bitcast (%struct.S1847* getelementptr inbounds ([5 x %struct.S1847]* @a1847, i32 0, i64 2) to i96*), align 8 + %bf.clear16 = and i96 %bf.load15, -18446744069414584321 + %bf.set17 = or i96 %bf.clear16, 18446743532543672320 + store i96 %bf.set17, i96* bitcast (%struct.S1847* getelementptr inbounds ([5 x %struct.S1847]* @a1847, i32 0, i64 2) to i96*), align 8 + ret void +} diff --git a/test/CodeGen/PowerPC/mcm-1.ll b/test/CodeGen/PowerPC/mcm-1.ll new file mode 100644 index 000000000000..a57fb9dd98d0 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-1.ll @@ -0,0 +1,27 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium <%s | FileCheck %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large <%s | FileCheck %s + +; Test correct code generation for medium and large code model +; for loading and storing an external variable. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@ei = external global i32 + +define signext i32 @test_external() nounwind { +entry: + %0 = load i32* @ei, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @ei, align 4 + ret i32 %0 +} + +; CHECK: test_external: +; CHECK: addis [[REG1:[0-9]+]], 2, .LC[[TOCNUM:[0-9]+]]@toc@ha +; CHECK: ld [[REG2:[0-9]+]], .LC[[TOCNUM]]@toc@l([[REG1]]) +; CHECK: lwz {{[0-9]+}}, 0([[REG2]]) +; CHECK: stw {{[0-9]+}}, 0([[REG2]]) +; CHECK: .section .toc +; CHECK: .LC[[TOCNUM]]: +; CHECK: .tc {{[a-z0-9A-Z_.]+}}[TC],{{[a-z0-9A-Z_.]+}} diff --git a/test/CodeGen/PowerPC/mcm-10.ll b/test/CodeGen/PowerPC/mcm-10.ll new file mode 100644 index 000000000000..4bec3e16fa04 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-10.ll @@ -0,0 +1,25 @@ +; RUN: llc -mcpu=pwr7 -O1 -code-model=medium <%s | FileCheck %s + +; Test peephole optimization for medium code model (32-bit TOC offsets) +; for loading and storing a static variable scoped to a function. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@test_fn_static.si = internal global i32 0, align 4 + +define signext i32 @test_fn_static() nounwind { +entry: + %0 = load i32* @test_fn_static.si, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @test_fn_static.si, align 4 + ret i32 %0 +} + +; CHECK: test_fn_static: +; CHECK: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha +; CHECK: lwz {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) +; CHECK: stw {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) +; CHECK: .type [[VAR]],@object +; CHECK: .local [[VAR]] +; CHECK: .comm [[VAR]],4,4 diff --git a/test/CodeGen/PowerPC/mcm-11.ll b/test/CodeGen/PowerPC/mcm-11.ll new file mode 100644 index 000000000000..f2bc4c9cb72c --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-11.ll @@ -0,0 +1,27 @@ +; RUN: llc -mcpu=pwr7 -O1 -code-model=medium <%s | FileCheck %s + +; Test peephole optimization for medium code model (32-bit TOC offsets) +; for loading and storing a file-scope static variable. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@gi = global i32 5, align 4 + +define signext i32 @test_file_static() nounwind { +entry: + %0 = load i32* @gi, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @gi, align 4 + ret i32 %0 +} + +; CHECK: test_file_static: +; CHECK: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha +; CHECK: lwz {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) +; CHECK: stw {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) +; CHECK: .type [[VAR]],@object +; CHECK: .data +; CHECK: .globl [[VAR]] +; CHECK: [[VAR]]: +; CHECK: .long 5 diff --git a/test/CodeGen/PowerPC/mcm-12.ll b/test/CodeGen/PowerPC/mcm-12.ll new file mode 100644 index 000000000000..911305d4355f --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-12.ll @@ -0,0 +1,18 @@ +; RUN: llc -mcpu=pwr7 -O1 -code-model=medium <%s | FileCheck %s + +; Test peephole optimization for medium code model (32-bit TOC offsets) +; for loading a value from the constant pool (TOC-relative). + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define double @test_double_const() nounwind { +entry: + ret double 0x3F4FD4920B498CF0 +} + +; CHECK: [[VAR:[a-z0-9A-Z_.]+]]: +; CHECK: .quad 4562098671269285104 +; CHECK: test_double_const: +; CHECK: addis [[REG1:[0-9]+]], 2, [[VAR]]@toc@ha +; CHECK: lfd {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) diff --git a/test/CodeGen/PowerPC/mcm-2.ll b/test/CodeGen/PowerPC/mcm-2.ll new file mode 100644 index 000000000000..f0dff4c5a39c --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-2.ll @@ -0,0 +1,37 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium <%s | FileCheck -check-prefix=MEDIUM %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large <%s | FileCheck -check-prefix=LARGE %s + +; Test correct code generation for medium and large code model +; for loading and storing a static variable scoped to a function. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@test_fn_static.si = internal global i32 0, align 4 + +define signext i32 @test_fn_static() nounwind { +entry: + %0 = load i32* @test_fn_static.si, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @test_fn_static.si, align 4 + ret i32 %0 +} + +; MEDIUM: test_fn_static: +; MEDIUM: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha +; MEDIUM: addi [[REG2:[0-9]+]], [[REG1]], [[VAR]]@toc@l +; MEDIUM: lwz {{[0-9]+}}, 0([[REG2]]) +; MEDIUM: stw {{[0-9]+}}, 0([[REG2]]) +; MEDIUM: .type [[VAR]],@object +; MEDIUM: .local [[VAR]] +; MEDIUM: .comm [[VAR]],4,4 + +; LARGE: test_fn_static: +; LARGE: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha +; LARGE: ld [[REG2:[0-9]+]], [[VAR]]@toc@l([[REG1]]) +; LARGE: lwz {{[0-9]+}}, 0([[REG2]]) +; LARGE: stw {{[0-9]+}}, 0([[REG2]]) +; LARGE: .type [[VAR]],@object +; LARGE: .local [[VAR]] +; LARGE: .comm [[VAR]],4,4 + diff --git a/test/CodeGen/PowerPC/mcm-3.ll b/test/CodeGen/PowerPC/mcm-3.ll new file mode 100644 index 000000000000..b7905503f458 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-3.ll @@ -0,0 +1,41 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium <%s | FileCheck -check-prefix=MEDIUM %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large <%s | FileCheck -check-prefix=LARGE %s + +; Test correct code generation for medium and large code model +; for loading and storing a file-scope static variable. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@gi = global i32 5, align 4 + +define signext i32 @test_file_static() nounwind { +entry: + %0 = load i32* @gi, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @gi, align 4 + ret i32 %0 +} + +; MEDIUM: test_file_static: +; MEDIUM: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha +; MEDIUM: addi [[REG2:[0-9]+]], [[REG1]], [[VAR]]@toc@l +; MEDIUM: lwz {{[0-9]+}}, 0([[REG2]]) +; MEDIUM: stw {{[0-9]+}}, 0([[REG2]]) +; MEDIUM: .type [[VAR]],@object +; MEDIUM: .data +; MEDIUM: .globl [[VAR]] +; MEDIUM: [[VAR]]: +; MEDIUM: .long 5 + +; LARGE: test_file_static: +; LARGE: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha +; LARGE: ld [[REG2:[0-9]+]], [[VAR]]@toc@l([[REG1]]) +; LARGE: lwz {{[0-9]+}}, 0([[REG2]]) +; LARGE: stw {{[0-9]+}}, 0([[REG2]]) +; LARGE: .type [[VAR]],@object +; LARGE: .data +; LARGE: .globl [[VAR]] +; LARGE: [[VAR]]: +; LARGE: .long 5 + diff --git a/test/CodeGen/PowerPC/mcm-4.ll b/test/CodeGen/PowerPC/mcm-4.ll new file mode 100644 index 000000000000..47c60c936038 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-4.ll @@ -0,0 +1,27 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium <%s | FileCheck -check-prefix=MEDIUM %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large <%s | FileCheck -check-prefix=LARGE %s + +; Test correct code generation for medium and large code model +; for loading a value from the constant pool (TOC-relative). + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define double @test_double_const() nounwind { +entry: + ret double 0x3F4FD4920B498CF0 +} + +; MEDIUM: [[VAR:[a-z0-9A-Z_.]+]]: +; MEDIUM: .quad 4562098671269285104 +; MEDIUM: test_double_const: +; MEDIUM: addis [[REG1:[0-9]+]], 2, [[VAR]]@toc@ha +; MEDIUM: addi [[REG2:[0-9]+]], [[REG1]], [[VAR]]@toc@l +; MEDIUM: lfd {{[0-9]+}}, 0([[REG2]]) + +; LARGE: [[VAR:[a-z0-9A-Z_.]+]]: +; LARGE: .quad 4562098671269285104 +; LARGE: test_double_const: +; LARGE: addis [[REG1:[0-9]+]], 2, [[VAR]]@toc@ha +; LARGE: ld [[REG2:[0-9]+]], [[VAR]]@toc@l([[REG1]]) +; LARGE: lfd {{[0-9]+}}, 0([[REG2]]) diff --git a/test/CodeGen/PowerPC/mcm-5.ll b/test/CodeGen/PowerPC/mcm-5.ll new file mode 100644 index 000000000000..1be27b7e8cc0 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-5.ll @@ -0,0 +1,60 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium <%s | FileCheck %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large <%s | FileCheck %s + +; Test correct code generation for medium and large code model +; for loading the address of a jump table from the TOC. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define signext i32 @test_jump_table(i32 signext %i) nounwind { +entry: + %i.addr = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32* %i.addr, align 4 + switch i32 %0, label %sw.default [ + i32 3, label %sw.bb + i32 4, label %sw.bb1 + i32 5, label %sw.bb2 + i32 6, label %sw.bb3 + ] + +sw.default: ; preds = %entry + br label %sw.epilog + +sw.bb: ; preds = %entry + %1 = load i32* %i.addr, align 4 + %mul = mul nsw i32 %1, 7 + store i32 %mul, i32* %i.addr, align 4 + br label %sw.bb1 + +sw.bb1: ; preds = %entry, %sw.bb + %2 = load i32* %i.addr, align 4 + %dec = add nsw i32 %2, -1 + store i32 %dec, i32* %i.addr, align 4 + br label %sw.bb2 + +sw.bb2: ; preds = %entry, %sw.bb1 + %3 = load i32* %i.addr, align 4 + %add = add nsw i32 %3, 3 + store i32 %add, i32* %i.addr, align 4 + br label %sw.bb3 + +sw.bb3: ; preds = %entry, %sw.bb2 + %4 = load i32* %i.addr, align 4 + %shl = shl i32 %4, 1 + store i32 %shl, i32* %i.addr, align 4 + br label %sw.epilog + +sw.epilog: ; preds = %sw.bb3, %sw.default + %5 = load i32* %i.addr, align 4 + ret i32 %5 +} + +; CHECK: test_jump_table: +; CHECK: addis [[REG1:[0-9]+]], 2, .LC[[TOCNUM:[0-9]+]]@toc@ha +; CHECK: ld [[REG2:[0-9]+]], .LC[[TOCNUM]]@toc@l([[REG1]]) +; CHECK: ldx {{[0-9]+}}, {{[0-9]+}}, [[REG2]] +; CHECK: .section .toc +; CHECK: .LC[[TOCNUM]]: +; CHECK: .tc {{[a-z0-9A-Z_.]+}}[TC],{{[a-z0-9A-Z_.]+}} diff --git a/test/CodeGen/PowerPC/mcm-6.ll b/test/CodeGen/PowerPC/mcm-6.ll new file mode 100644 index 000000000000..35efaaa5628f --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-6.ll @@ -0,0 +1,28 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium < %s | FileCheck %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large < %s | FileCheck %s + +; Test correct code generation for medium and large code model +; for loading and storing a tentatively defined variable. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@ti = common global i32 0, align 4 + +define signext i32 @test_tentative() nounwind { +entry: + %0 = load i32* @ti, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @ti, align 4 + ret i32 %0 +} + +; CHECK: test_tentative: +; CHECK: addis [[REG1:[0-9]+]], 2, .LC[[TOCNUM:[0-9]+]]@toc@ha +; CHECK: ld [[REG2:[0-9]+]], .LC[[TOCNUM]]@toc@l([[REG1]]) +; CHECK: lwz {{[0-9]+}}, 0([[REG2]]) +; CHECK: stw {{[0-9]+}}, 0([[REG2]]) +; CHECK: .section .toc +; CHECK: .LC[[TOCNUM]]: +; CHECK: .tc [[VAR:[a-z0-9A-Z_.]+]][TC],{{[a-z0-9A-Z_.]+}} +; CHECK: .comm [[VAR]],4,4 diff --git a/test/CodeGen/PowerPC/mcm-7.ll b/test/CodeGen/PowerPC/mcm-7.ll new file mode 100644 index 000000000000..0dd39ee4109d --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-7.ll @@ -0,0 +1,26 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium < %s | FileCheck %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large < %s | FileCheck %s + +; Test correct code generation for medium and large code model +; for loading a function address. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i8* @test_fnaddr() nounwind { +entry: + %func = alloca i32 (i32)*, align 8 + store i32 (i32)* @foo, i32 (i32)** %func, align 8 + %0 = load i32 (i32)** %func, align 8 + %1 = bitcast i32 (i32)* %0 to i8* + ret i8* %1 +} + +declare signext i32 @foo(i32 signext) + +; CHECK: test_fnaddr: +; CHECK: addis [[REG1:[0-9]+]], 2, .LC[[TOCNUM:[0-9]+]]@toc@ha +; CHECK: ld [[REG2:[0-9]+]], .LC[[TOCNUM]]@toc@l([[REG1]]) +; CHECK: .section .toc +; CHECK: .LC[[TOCNUM]]: +; CHECK: .tc {{[a-z0-9A-Z_.]+}}[TC],{{[a-z0-9A-Z_.]+}} diff --git a/test/CodeGen/PowerPC/mcm-8.ll b/test/CodeGen/PowerPC/mcm-8.ll new file mode 100644 index 000000000000..3ece786d6447 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-8.ll @@ -0,0 +1,25 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium < %s | FileCheck %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large < %s | FileCheck %s + +; Test correct code generation for medium and large code model +; for loading a variable with available-externally linkage. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@x = available_externally constant [13 x i8] c"St9bad_alloc\00" + +define signext i8 @test_avext() nounwind { +entry: + %0 = getelementptr inbounds [13 x i8]* @x, i32 0, i32 0 + %1 = load i8* %0, align 1 + ret i8 %1 +} + +; CHECK: test_avext: +; CHECK: addis [[REG1:[0-9]+]], 2, .LC[[TOCNUM:[0-9]+]]@toc@ha +; CHECK: ld [[REG2:[0-9]+]], .LC[[TOCNUM]]@toc@l([[REG1]]) +; CHECK: lbz {{[0-9]+}}, 0([[REG2]]) +; CHECK: .section .toc +; CHECK: .LC[[TOCNUM]]: +; CHECK: .tc {{[a-z0-9A-Z_.]+}}[TC],{{[a-z0-9A-Z_.]+}} diff --git a/test/CodeGen/PowerPC/mcm-9.ll b/test/CodeGen/PowerPC/mcm-9.ll new file mode 100644 index 000000000000..f366f45cc863 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-9.ll @@ -0,0 +1,28 @@ +; RUN: llc -mcpu=pwr7 -O0 -code-model=medium <%s | FileCheck %s +; RUN: llc -mcpu=pwr7 -O0 -code-model=large <%s | FileCheck %s + +; Test correct code generation for medium and large code model +; for loading and storing an aliased external variable. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@ei = external global i32 +@a = alias i32* @ei + +define signext i32 @test_external() nounwind { +entry: + %0 = load i32* @a, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @a, align 4 + ret i32 %0 +} + +; CHECK: test_external: +; CHECK: addis [[REG1:[0-9]+]], 2, .LC[[TOCNUM:[0-9]+]]@toc@ha +; CHECK: ld [[REG2:[0-9]+]], .LC[[TOCNUM]]@toc@l([[REG1]]) +; CHECK: lwz {{[0-9]+}}, 0([[REG2]]) +; CHECK: stw {{[0-9]+}}, 0([[REG2]]) +; CHECK: .section .toc +; CHECK: .LC[[TOCNUM]]: +; CHECK: .tc {{[a-z0-9A-Z_.]+}}[TC],{{[a-z0-9A-Z_.]+}} diff --git a/test/CodeGen/PowerPC/mcm-default.ll b/test/CodeGen/PowerPC/mcm-default.ll new file mode 100644 index 000000000000..19de2536aec3 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-default.ll @@ -0,0 +1,26 @@ +; RUN: llc -mcpu=pwr7 -O0 <%s | FileCheck %s + +; Test that we generate code for the medium model as the default. +; Use an external variable reference as an example. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@ei = external global i32 + +define signext i32 @test_external() nounwind { +entry: + %0 = load i32* @ei, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @ei, align 4 + ret i32 %0 +} + +; CHECK: test_external: +; CHECK: addis [[REG1:[0-9]+]], 2, .LC[[TOCNUM:[0-9]+]]@toc@ha +; CHECK: ld [[REG2:[0-9]+]], .LC[[TOCNUM]]@toc@l([[REG1]]) +; CHECK: lwz {{[0-9]+}}, 0([[REG2]]) +; CHECK: stw {{[0-9]+}}, 0([[REG2]]) +; CHECK: .section .toc +; CHECK: .LC[[TOCNUM]]: +; CHECK: .tc {{[a-z0-9A-Z_.]+}}[TC],{{[a-z0-9A-Z_.]+}} diff --git a/test/CodeGen/PowerPC/mcm-obj-2.ll b/test/CodeGen/PowerPC/mcm-obj-2.ll new file mode 100644 index 000000000000..2dd1718ba75a --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-obj-2.ll @@ -0,0 +1,77 @@ +; RUN: llc -O1 -mcpu=pwr7 -code-model=medium -filetype=obj %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck %s + +; FIXME: When asm-parse is available, could make this an assembly test. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@test_fn_static.si = internal global i32 0, align 4 + +define signext i32 @test_fn_static() nounwind { +entry: + %0 = load i32* @test_fn_static.si, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @test_fn_static.si, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for +; accessing function-scoped variable si. +; +; CHECK: Relocation 0 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM2:[0-9]+]] +; CHECK-NEXT: 'r_type', 0x00000032 +; CHECK: Relocation 1 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM2]] +; CHECK-NEXT: 'r_type', 0x00000030 +; CHECK: Relocation 2 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM2]] +; CHECK-NEXT: 'r_type', 0x00000030 + +@gi = global i32 5, align 4 + +define signext i32 @test_file_static() nounwind { +entry: + %0 = load i32* @gi, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @gi, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for +; accessing file-scope variable gi. +; +; CHECK: Relocation 3 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM3:[0-9]+]] +; CHECK-NEXT: 'r_type', 0x00000032 +; CHECK: Relocation 4 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM3]] +; CHECK-NEXT: 'r_type', 0x00000030 +; CHECK: Relocation 5 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM3]] +; CHECK-NEXT: 'r_type', 0x00000030 + +define double @test_double_const() nounwind { +entry: + ret double 0x3F4FD4920B498CF0 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for +; accessing a constant. +; +; CHECK: Relocation 6 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM4:[0-9]+]] +; CHECK-NEXT: 'r_type', 0x00000032 +; CHECK: Relocation 7 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM4]] +; CHECK-NEXT: 'r_type', 0x00000030 + diff --git a/test/CodeGen/PowerPC/mcm-obj.ll b/test/CodeGen/PowerPC/mcm-obj.ll new file mode 100644 index 000000000000..117c3b334346 --- /dev/null +++ b/test/CodeGen/PowerPC/mcm-obj.ll @@ -0,0 +1,268 @@ +; RUN: llc -O0 -mcpu=pwr7 -code-model=medium -filetype=obj %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck -check-prefix=MEDIUM %s +; RUN: llc -O0 -mcpu=pwr7 -code-model=large -filetype=obj %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck -check-prefix=LARGE %s + +; FIXME: When asm-parse is available, could make this an assembly test. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@ei = external global i32 + +define signext i32 @test_external() nounwind { +entry: + %0 = load i32* @ei, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @ei, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for +; accessing external variable ei. +; +; MEDIUM: '.rela.text' +; MEDIUM: Relocation 0 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM1:[0-9]+]] +; MEDIUM-NEXT: 'r_type', 0x00000032 +; MEDIUM: Relocation 1 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM1]] +; MEDIUM-NEXT: 'r_type', 0x00000040 +; +; LARGE: '.rela.text' +; LARGE: Relocation 0 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM1:[0-9]+]] +; LARGE-NEXT: 'r_type', 0x00000032 +; LARGE: Relocation 1 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM1]] +; LARGE-NEXT: 'r_type', 0x00000040 + +@test_fn_static.si = internal global i32 0, align 4 + +define signext i32 @test_fn_static() nounwind { +entry: + %0 = load i32* @test_fn_static.si, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @test_fn_static.si, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for +; accessing function-scoped variable si. +; +; MEDIUM: Relocation 2 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM2:[0-9]+]] +; MEDIUM-NEXT: 'r_type', 0x00000032 +; MEDIUM: Relocation 3 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM2]] +; MEDIUM-NEXT: 'r_type', 0x00000030 +; +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for +; accessing function-scoped variable si. +; +; LARGE: Relocation 2 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM2:[0-9]+]] +; LARGE-NEXT: 'r_type', 0x00000032 +; LARGE: Relocation 3 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM2]] +; LARGE-NEXT: 'r_type', 0x00000040 + +@gi = global i32 5, align 4 + +define signext i32 @test_file_static() nounwind { +entry: + %0 = load i32* @gi, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @gi, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for +; accessing file-scope variable gi. +; +; MEDIUM: Relocation 4 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM3:[0-9]+]] +; MEDIUM-NEXT: 'r_type', 0x00000032 +; MEDIUM: Relocation 5 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM3]] +; MEDIUM-NEXT: 'r_type', 0x00000030 +; +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for +; accessing file-scope variable gi. +; +; LARGE: Relocation 4 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM3:[0-9]+]] +; LARGE-NEXT: 'r_type', 0x00000032 +; LARGE: Relocation 5 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM3]] +; LARGE-NEXT: 'r_type', 0x00000040 + +define double @test_double_const() nounwind { +entry: + ret double 0x3F4FD4920B498CF0 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for +; accessing a constant. +; +; MEDIUM: Relocation 6 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM4:[0-9]+]] +; MEDIUM-NEXT: 'r_type', 0x00000032 +; MEDIUM: Relocation 7 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM4]] +; MEDIUM-NEXT: 'r_type', 0x00000030 +; +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for +; accessing a constant. +; +; LARGE: Relocation 6 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM4:[0-9]+]] +; LARGE-NEXT: 'r_type', 0x00000032 +; LARGE: Relocation 7 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM4]] +; LARGE-NEXT: 'r_type', 0x00000040 + +define signext i32 @test_jump_table(i32 signext %i) nounwind { +entry: + %i.addr = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32* %i.addr, align 4 + switch i32 %0, label %sw.default [ + i32 3, label %sw.bb + i32 4, label %sw.bb1 + i32 5, label %sw.bb2 + i32 6, label %sw.bb3 + ] + +sw.default: ; preds = %entry + br label %sw.epilog + +sw.bb: ; preds = %entry + %1 = load i32* %i.addr, align 4 + %mul = mul nsw i32 %1, 7 + store i32 %mul, i32* %i.addr, align 4 + br label %sw.bb1 + +sw.bb1: ; preds = %entry, %sw.bb + %2 = load i32* %i.addr, align 4 + %dec = add nsw i32 %2, -1 + store i32 %dec, i32* %i.addr, align 4 + br label %sw.bb2 + +sw.bb2: ; preds = %entry, %sw.bb1 + %3 = load i32* %i.addr, align 4 + %add = add nsw i32 %3, 3 + store i32 %add, i32* %i.addr, align 4 + br label %sw.bb3 + +sw.bb3: ; preds = %entry, %sw.bb2 + %4 = load i32* %i.addr, align 4 + %shl = shl i32 %4, 1 + store i32 %shl, i32* %i.addr, align 4 + br label %sw.epilog + +sw.epilog: ; preds = %sw.bb3, %sw.default + %5 = load i32* %i.addr, align 4 + ret i32 %5 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for +; accessing a jump table address. +; +; MEDIUM: Relocation 8 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM5:[0-9]+]] +; MEDIUM-NEXT: 'r_type', 0x00000032 +; MEDIUM: Relocation 9 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM5]] +; MEDIUM-NEXT: 'r_type', 0x00000040 +; +; LARGE: Relocation 8 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM5:[0-9]+]] +; LARGE-NEXT: 'r_type', 0x00000032 +; LARGE: Relocation 9 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM5]] +; LARGE-NEXT: 'r_type', 0x00000040 + +@ti = common global i32 0, align 4 + +define signext i32 @test_tentative() nounwind { +entry: + %0 = load i32* @ti, align 4 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* @ti, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for +; accessing tentatively declared variable ti. +; +; MEDIUM: Relocation 10 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM6:[0-9]+]] +; MEDIUM-NEXT: 'r_type', 0x00000032 +; MEDIUM: Relocation 11 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM6]] +; MEDIUM-NEXT: 'r_type', 0x00000040 +; +; LARGE: Relocation 10 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM6:[0-9]+]] +; LARGE-NEXT: 'r_type', 0x00000032 +; LARGE: Relocation 11 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM6]] +; LARGE-NEXT: 'r_type', 0x00000040 + +define i8* @test_fnaddr() nounwind { +entry: + %func = alloca i32 (i32)*, align 8 + store i32 (i32)* @foo, i32 (i32)** %func, align 8 + %0 = load i32 (i32)** %func, align 8 + %1 = bitcast i32 (i32)* %0 to i8* + ret i8* %1 +} + +declare signext i32 @foo(i32 signext) + +; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for +; accessing function address foo. +; +; MEDIUM: Relocation 12 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM7:[0-9]+]] +; MEDIUM-NEXT: 'r_type', 0x00000032 +; MEDIUM: Relocation 13 +; MEDIUM-NEXT: 'r_offset' +; MEDIUM-NEXT: 'r_sym', 0x[[SYM7]] +; MEDIUM-NEXT: 'r_type', 0x00000040 +; +; LARGE: Relocation 12 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM7:[0-9]+]] +; LARGE-NEXT: 'r_type', 0x00000032 +; LARGE: Relocation 13 +; LARGE-NEXT: 'r_offset' +; LARGE-NEXT: 'r_sym', 0x[[SYM7]] +; LARGE-NEXT: 'r_type', 0x00000040 + diff --git a/test/CodeGen/PowerPC/mem_update.ll b/test/CodeGen/PowerPC/mem_update.ll index 39af11a3d54c..fcf53da67fc2 100644 --- a/test/CodeGen/PowerPC/mem_update.ll +++ b/test/CodeGen/PowerPC/mem_update.ll @@ -1,6 +1,6 @@ ; RUN: llc < %s -march=ppc32 | \ ; RUN: not grep addi -; RUN: llc < %s -march=ppc64 | \ +; RUN: llc -code-model=small < %s -march=ppc64 | \ ; RUN: not grep addi @Glob = global i64 4 diff --git a/test/CodeGen/PowerPC/misched-inorder-latency.ll b/test/CodeGen/PowerPC/misched-inorder-latency.ll new file mode 100644 index 000000000000..8fae7ad4d1df --- /dev/null +++ b/test/CodeGen/PowerPC/misched-inorder-latency.ll @@ -0,0 +1,55 @@ +; RUN: llc < %s -enable-misched -pre-RA-sched=source -scheditins=false \ +; RUN: -disable-ifcvt-triangle-false -disable-post-ra | FileCheck %s +; +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-bgq-linux" + +; %val1 is a load live out of %entry. It should be hoisted +; above the add. +; CHECK: testload: +; CHECK: %entry +; CHECK: lwz +; CHECK: addi +; CHECK: bne +; CHECK: %true +define i32 @testload(i32 *%ptr, i32 %sumin) { +entry: + %sum1 = add i32 %sumin, 1 + %val1 = load i32* %ptr + %p = icmp eq i32 %sumin, 0 + br i1 %p, label %true, label %end +true: + %sum2 = add i32 %sum1, 1 + %ptr2 = getelementptr i32* %ptr, i32 1 + %val = load i32* %ptr2 + %val2 = add i32 %val1, %val + br label %end +end: + %valmerge = phi i32 [ %val1, %entry], [ %val2, %true ] + %summerge = phi i32 [ %sum1, %entry], [ %sum2, %true ] + %sumout = add i32 %valmerge, %summerge + ret i32 %sumout +} + +; The prefetch gets a default latency of 3 cycles and should be hoisted +; above the add. +; +; CHECK: testprefetch: +; CHECK: %entry +; CHECK: dcbt +; CHECK: addi +; CHECK: blr +define i32 @testprefetch(i8 *%ptr, i32 %i) { +entry: + %val1 = add i32 %i, 1 + tail call void @llvm.prefetch( i8* %ptr, i32 0, i32 3, i32 1 ) + %p = icmp eq i32 %i, 0 + br i1 %p, label %true, label %end +true: + %val2 = add i32 %val1, 1 + br label %end +end: + %valmerge = phi i32 [ %val1, %entry], [ %val2, %true ] + ret i32 %valmerge +} +declare void @llvm.prefetch(i8*, i32, i32, i32) nounwind diff --git a/test/CodeGen/PowerPC/negctr.ll b/test/CodeGen/PowerPC/negctr.ll new file mode 100644 index 000000000000..2f6995c65dd8 --- /dev/null +++ b/test/CodeGen/PowerPC/negctr.ll @@ -0,0 +1,83 @@ +; RUN: llc < %s -mcpu=a2 | FileCheck %s +; RUN: llc < %s -mcpu=a2 -disable-lsr | FileCheck -check-prefix=NOLSR %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define void @main() #0 { +entry: + br i1 undef, label %for.end, label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 1, %entry ] + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 0 + br i1 %exitcond, label %for.end, label %for.body + +; FIXME: We currently can't form the 32-bit unsigned trip count necessary here! +; CHECK: @main +; CHECK-NOT: bdnz + +for.end: ; preds = %for.body, %entry + ret void +} + +define void @main1() #0 { +entry: + br i1 undef, label %for.end, label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 1, %entry ] + %indvars.iv.next = add i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, 0 + br i1 %exitcond, label %for.end, label %for.body + +; CHECK: @main1 +; CHECK: li [[REG:[0-9]+]], -1 +; CHECK: mtctr [[REG]] +; CHECK: bdnz + +for.end: ; preds = %for.body, %entry + ret void +} + +define void @main2() #0 { +entry: + br i1 undef, label %for.end, label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 1, %entry ] + %indvars.iv.next = add i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, -100000 + br i1 %exitcond, label %for.end, label %for.body + +; CHECK: @main2 +; CHECK: lis [[REG:[0-9]+]], -2 +; CHECK: ori [[REG2:[0-9]+]], [[REG]], 31071 +; CHECK: mtctr [[REG2]] +; CHECK: bdnz + +for.end: ; preds = %for.body, %entry + ret void +} + +define void @main3() #0 { +entry: + br i1 undef, label %for.end, label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 127984, %entry ] + %indvars.iv.next = add i64 %indvars.iv, -16 + %exitcond = icmp eq i64 %indvars.iv.next, -16 + br i1 %exitcond, label %for.end, label %for.body + +; NOLSR: @main3 +; NOLSR: li [[REG:[0-9]+]], 8000 +; NOLSR: mtctr [[REG]] +; NOLSR: bdnz + +for.end: ; preds = %for.body, %entry + ret void +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } diff --git a/test/CodeGen/PowerPC/popcnt.ll b/test/CodeGen/PowerPC/popcnt.ll new file mode 100644 index 000000000000..b304d72aede2 --- /dev/null +++ b/test/CodeGen/PowerPC/popcnt.ll @@ -0,0 +1,40 @@ +; RUN: llc -march=ppc64 -mattr=+popcntd < %s | FileCheck %s + +define i8 @cnt8(i8 %x) nounwind readnone { + %cnt = tail call i8 @llvm.ctpop.i8(i8 %x) + ret i8 %cnt +; CHECK: @cnt8 +; CHECK: rlwinm +; CHECK: popcntw +; CHECK: blr +} + +define i16 @cnt16(i16 %x) nounwind readnone { + %cnt = tail call i16 @llvm.ctpop.i16(i16 %x) + ret i16 %cnt +; CHECK: @cnt16 +; CHECK: rlwinm +; CHECK: popcntw +; CHECK: blr +} + +define i32 @cnt32(i32 %x) nounwind readnone { + %cnt = tail call i32 @llvm.ctpop.i32(i32 %x) + ret i32 %cnt +; CHECK: @cnt32 +; CHECK: popcntw +; CHECK: blr +} + +define i64 @cnt64(i64 %x) nounwind readnone { + %cnt = tail call i64 @llvm.ctpop.i64(i64 %x) + ret i64 %cnt +; CHECK: @cnt64 +; CHECK: popcntd +; CHECK: blr +} + +declare i8 @llvm.ctpop.i8(i8) nounwind readnone +declare i16 @llvm.ctpop.i16(i16) nounwind readnone +declare i32 @llvm.ctpop.i32(i32) nounwind readnone +declare i64 @llvm.ctpop.i64(i64) nounwind readnone diff --git a/test/CodeGen/PowerPC/ppc64-toc.ll b/test/CodeGen/PowerPC/ppc64-toc.ll index a29bdcb25031..7f30ef883e9a 100644 --- a/test/CodeGen/PowerPC/ppc64-toc.ll +++ b/test/CodeGen/PowerPC/ppc64-toc.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s | FileCheck %s +; RUN: llc -code-model=small < %s | FileCheck %s target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" target triple = "powerpc64-unknown-linux-gnu" diff --git a/test/CodeGen/PowerPC/pr15031.ll b/test/CodeGen/PowerPC/pr15031.ll new file mode 100644 index 000000000000..5ccf941a1f16 --- /dev/null +++ b/test/CodeGen/PowerPC/pr15031.ll @@ -0,0 +1,370 @@ +; RUN: llc -mcpu=pwr7 -O3 < %s | FileCheck %s + +; Test case derived from bug report 15031. The code in the post-RA +; scheduler to break critical anti-dependencies was failing to check +; whether an instruction had more than one definition, and ensuring +; that any additional definitions interfered with the choice of a new +; register. As a result, this test originally caused this to be +; generated: +; +; lbzu 3, 1(3) +; +; which is illegal, since it requires register 3 to both receive the +; loaded value and receive the updated address. With the fix to bug +; 15031, a different register is chosen to receive the loaded value. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +%"class.llvm::MachineMemOperand" = type { %"struct.llvm::MachinePointerInfo", i64, i32, %"class.llvm::MDNode"*, %"class.llvm::MDNode"* } +%"struct.llvm::MachinePointerInfo" = type { %"class.llvm::Value"*, i64 } +%"class.llvm::Value" = type { i32 (...)**, i8, i8, i16, %"class.llvm::Type"*, %"class.llvm::Use"*, %"class.llvm::StringMapEntry"* } +%"class.llvm::Type" = type { %"class.llvm::LLVMContext"*, i32, i32, %"class.llvm::Type"** } +%"class.llvm::LLVMContext" = type { %"class.llvm::LLVMContextImpl"* } +%"class.llvm::LLVMContextImpl" = type opaque +%"class.llvm::Use" = type { %"class.llvm::Value"*, %"class.llvm::Use"*, %"class.llvm::PointerIntPair" } +%"class.llvm::PointerIntPair" = type { i64 } +%"class.llvm::StringMapEntry" = type opaque +%"class.llvm::MDNode" = type { %"class.llvm::Value", %"class.llvm::FoldingSetImpl::Node", i32, i32 } +%"class.llvm::FoldingSetImpl::Node" = type { i8* } +%"class.llvm::MachineInstr" = type { %"class.llvm::ilist_node", %"class.llvm::MCInstrDesc"*, %"class.llvm::MachineBasicBlock"*, %"class.llvm::MachineOperand"*, i32, %"class.llvm::ArrayRecycler<llvm::MachineOperand, 8>::Capacity", i8, i8, i8, %"class.llvm::MachineMemOperand"**, %"class.llvm::DebugLoc" } +%"class.llvm::ilist_node" = type { %"class.llvm::ilist_half_node", %"class.llvm::MachineInstr"* } +%"class.llvm::ilist_half_node" = type { %"class.llvm::MachineInstr"* } +%"class.llvm::MCInstrDesc" = type { i16, i16, i16, i16, i16, i32, i64, i16*, i16*, %"class.llvm::MCOperandInfo"* } +%"class.llvm::MCOperandInfo" = type { i16, i8, i8, i32 } +%"class.llvm::MachineBasicBlock" = type { %"class.llvm::ilist_node.0", %"struct.llvm::ilist", %"class.llvm::BasicBlock"*, i32, %"class.llvm::MachineFunction"*, %"class.std::vector.163", %"class.std::vector.163", %"class.std::vector.123", %"class.std::vector.123", i32, i8, i8 } +%"class.llvm::ilist_node.0" = type { %"class.llvm::ilist_half_node.1", %"class.llvm::MachineBasicBlock"* } +%"class.llvm::ilist_half_node.1" = type { %"class.llvm::MachineBasicBlock"* } +%"struct.llvm::ilist" = type { %"class.llvm::iplist" } +%"class.llvm::iplist" = type { %"struct.llvm::ilist_traits", %"class.llvm::MachineInstr"* } +%"struct.llvm::ilist_traits" = type { %"class.llvm::ilist_half_node", %"class.llvm::MachineBasicBlock"* } +%"class.llvm::BasicBlock" = type { %"class.llvm::Value", %"class.llvm::ilist_node.2", %"class.llvm::iplist.4", %"class.llvm::Function"* } +%"class.llvm::ilist_node.2" = type { %"class.llvm::ilist_half_node.3", %"class.llvm::BasicBlock"* } +%"class.llvm::ilist_half_node.3" = type { %"class.llvm::BasicBlock"* } +%"class.llvm::iplist.4" = type { %"struct.llvm::ilist_traits.5", %"class.llvm::Instruction"* } +%"struct.llvm::ilist_traits.5" = type { %"class.llvm::ilist_half_node.10" } +%"class.llvm::ilist_half_node.10" = type { %"class.llvm::Instruction"* } +%"class.llvm::Instruction" = type { %"class.llvm::User", %"class.llvm::ilist_node.193", %"class.llvm::BasicBlock"*, %"class.llvm::DebugLoc" } +%"class.llvm::User" = type { %"class.llvm::Value", %"class.llvm::Use"*, i32 } +%"class.llvm::ilist_node.193" = type { %"class.llvm::ilist_half_node.10", %"class.llvm::Instruction"* } +%"class.llvm::DebugLoc" = type { i32, i32 } +%"class.llvm::Function" = type { %"class.llvm::GlobalValue", %"class.llvm::ilist_node.27", %"class.llvm::iplist.47", %"class.llvm::iplist.54", %"class.llvm::ValueSymbolTable"*, %"class.llvm::AttributeSet" } +%"class.llvm::GlobalValue" = type { [52 x i8], [4 x i8], %"class.llvm::Module"*, %"class.std::basic_string" } +%"class.llvm::Module" = type { %"class.llvm::LLVMContext"*, %"class.llvm::iplist.11", %"class.llvm::iplist.20", %"class.llvm::iplist.29", %"struct.llvm::ilist.38", %"class.std::basic_string", %"class.llvm::ValueSymbolTable"*, %"class.llvm::OwningPtr", %"class.std::basic_string", %"class.std::basic_string", %"class.std::basic_string", i8* } +%"class.llvm::iplist.11" = type { %"struct.llvm::ilist_traits.12", %"class.llvm::GlobalVariable"* } +%"struct.llvm::ilist_traits.12" = type { %"class.llvm::ilist_node.18" } +%"class.llvm::ilist_node.18" = type { %"class.llvm::ilist_half_node.19", %"class.llvm::GlobalVariable"* } +%"class.llvm::ilist_half_node.19" = type { %"class.llvm::GlobalVariable"* } +%"class.llvm::GlobalVariable" = type { %"class.llvm::GlobalValue", %"class.llvm::ilist_node.18", i8 } +%"class.llvm::iplist.20" = type { %"struct.llvm::ilist_traits.21", %"class.llvm::Function"* } +%"struct.llvm::ilist_traits.21" = type { %"class.llvm::ilist_node.27" } +%"class.llvm::ilist_node.27" = type { %"class.llvm::ilist_half_node.28", %"class.llvm::Function"* } +%"class.llvm::ilist_half_node.28" = type { %"class.llvm::Function"* } +%"class.llvm::iplist.29" = type { %"struct.llvm::ilist_traits.30", %"class.llvm::GlobalAlias"* } +%"struct.llvm::ilist_traits.30" = type { %"class.llvm::ilist_node.36" } +%"class.llvm::ilist_node.36" = type { %"class.llvm::ilist_half_node.37", %"class.llvm::GlobalAlias"* } +%"class.llvm::ilist_half_node.37" = type { %"class.llvm::GlobalAlias"* } +%"class.llvm::GlobalAlias" = type { %"class.llvm::GlobalValue", %"class.llvm::ilist_node.36" } +%"struct.llvm::ilist.38" = type { %"class.llvm::iplist.39" } +%"class.llvm::iplist.39" = type { %"struct.llvm::ilist_traits.40", %"class.llvm::NamedMDNode"* } +%"struct.llvm::ilist_traits.40" = type { %"class.llvm::ilist_node.45" } +%"class.llvm::ilist_node.45" = type { %"class.llvm::ilist_half_node.46", %"class.llvm::NamedMDNode"* } +%"class.llvm::ilist_half_node.46" = type { %"class.llvm::NamedMDNode"* } +%"class.llvm::NamedMDNode" = type { %"class.llvm::ilist_node.45", %"class.std::basic_string", %"class.llvm::Module"*, i8* } +%"class.std::basic_string" = type { %"struct.std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider" } +%"struct.std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider" = type { i8* } +%"class.llvm::ValueSymbolTable" = type opaque +%"class.llvm::OwningPtr" = type { %"class.llvm::GVMaterializer"* } +%"class.llvm::GVMaterializer" = type opaque +%"class.llvm::iplist.47" = type { %"struct.llvm::ilist_traits.48", %"class.llvm::BasicBlock"* } +%"struct.llvm::ilist_traits.48" = type { %"class.llvm::ilist_half_node.3" } +%"class.llvm::iplist.54" = type { %"struct.llvm::ilist_traits.55", %"class.llvm::Argument"* } +%"struct.llvm::ilist_traits.55" = type { %"class.llvm::ilist_half_node.61" } +%"class.llvm::ilist_half_node.61" = type { %"class.llvm::Argument"* } +%"class.llvm::Argument" = type { %"class.llvm::Value", %"class.llvm::ilist_node.192", %"class.llvm::Function"* } +%"class.llvm::ilist_node.192" = type { %"class.llvm::ilist_half_node.61", %"class.llvm::Argument"* } +%"class.llvm::AttributeSet" = type { %"class.llvm::AttributeSetImpl"* } +%"class.llvm::AttributeSetImpl" = type opaque +%"class.llvm::MachineFunction" = type { %"class.llvm::Function"*, %"class.llvm::TargetMachine"*, %"class.llvm::MCContext"*, %"class.llvm::MachineModuleInfo"*, %"class.llvm::GCModuleInfo"*, %"class.llvm::MachineRegisterInfo"*, %"struct.llvm::MachineFunctionInfo"*, %"class.llvm::MachineFrameInfo"*, %"class.llvm::MachineConstantPool"*, %"class.llvm::MachineJumpTableInfo"*, %"class.std::vector.163", %"class.llvm::BumpPtrAllocator", %"class.llvm::Recycler", %"class.llvm::ArrayRecycler", %"class.llvm::Recycler.180", %"struct.llvm::ilist.181", i32, i32, i8 } +%"class.llvm::TargetMachine" = type { i32 (...)**, %"class.llvm::Target"*, %"class.std::basic_string", %"class.std::basic_string", %"class.std::basic_string", %"class.llvm::MCCodeGenInfo"*, %"class.llvm::MCAsmInfo"*, i8, %"class.llvm::TargetOptions" } +%"class.llvm::Target" = type opaque +%"class.llvm::MCCodeGenInfo" = type opaque +%"class.llvm::MCAsmInfo" = type opaque +%"class.llvm::TargetOptions" = type { [2 x i8], i32, i8, i32, i8, %"class.std::basic_string", i32, i32 } +%"class.llvm::MCContext" = type { %"class.llvm::SourceMgr"*, %"class.llvm::MCAsmInfo"*, %"class.llvm::MCRegisterInfo"*, %"class.llvm::MCObjectFileInfo"*, %"class.llvm::BumpPtrAllocator", %"class.llvm::StringMap", %"class.llvm::StringMap.62", i32, %"class.llvm::DenseMap.63", i8*, %"class.llvm::raw_ostream"*, i8, %"class.std::basic_string", %"class.std::basic_string", %"class.std::vector", %"class.std::vector.70", %"class.llvm::MCDwarfLoc", i8, i8, i32, %"class.llvm::MCSection"*, %"class.llvm::MCSymbol"*, %"class.llvm::MCSymbol"*, %"class.std::vector.75", %"class.llvm::StringRef", %"class.llvm::StringRef", i8, %"class.llvm::DenseMap.80", %"class.std::vector.84", i8*, i8*, i8*, i8 } +%"class.llvm::SourceMgr" = type opaque +%"class.llvm::MCRegisterInfo" = type { %"struct.llvm::MCRegisterDesc"*, i32, i32, i32, %"class.llvm::MCRegisterClass"*, i32, i32, [2 x i16]*, i16*, i8*, i16*, i32, i16*, i32, i32, i32, i32, %"struct.llvm::MCRegisterInfo::DwarfLLVMRegPair"*, %"struct.llvm::MCRegisterInfo::DwarfLLVMRegPair"*, %"struct.llvm::MCRegisterInfo::DwarfLLVMRegPair"*, %"struct.llvm::MCRegisterInfo::DwarfLLVMRegPair"*, %"class.llvm::DenseMap" } +%"struct.llvm::MCRegisterDesc" = type { i32, i32, i32, i32, i32, i32 } +%"class.llvm::MCRegisterClass" = type { i8*, i16*, i8*, i16, i16, i16, i16, i16, i8, i8 } +%"struct.llvm::MCRegisterInfo::DwarfLLVMRegPair" = type { i32, i32 } +%"class.llvm::DenseMap" = type { %"struct.std::pair"*, i32, i32, i32 } +%"struct.std::pair" = type { i32, i32 } +%"class.llvm::MCObjectFileInfo" = type opaque +%"class.llvm::BumpPtrAllocator" = type { i64, i64, %"class.llvm::SlabAllocator"*, %"class.llvm::MemSlab"*, i8*, i8*, i64 } +%"class.llvm::SlabAllocator" = type { i32 (...)** } +%"class.llvm::MemSlab" = type { i64, %"class.llvm::MemSlab"* } +%"class.llvm::StringMap" = type { %"class.llvm::StringMapImpl", %"class.llvm::BumpPtrAllocator"* } +%"class.llvm::StringMapImpl" = type { %"class.llvm::StringMapEntryBase"**, i32, i32, i32, i32 } +%"class.llvm::StringMapEntryBase" = type { i32 } +%"class.llvm::StringMap.62" = type { %"class.llvm::StringMapImpl", %"class.llvm::BumpPtrAllocator"* } +%"class.llvm::DenseMap.63" = type { %"struct.std::pair.66"*, i32, i32, i32 } +%"struct.std::pair.66" = type opaque +%"class.llvm::raw_ostream" = type { i32 (...)**, i8*, i8*, i8*, i32 } +%"class.std::vector" = type { %"struct.std::_Vector_base" } +%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<llvm::MCDwarfFile *, std::allocator<llvm::MCDwarfFile *> >::_Vector_impl" } +%"struct.std::_Vector_base<llvm::MCDwarfFile *, std::allocator<llvm::MCDwarfFile *> >::_Vector_impl" = type { %"class.llvm::MCDwarfFile"**, %"class.llvm::MCDwarfFile"**, %"class.llvm::MCDwarfFile"** } +%"class.llvm::MCDwarfFile" = type { %"class.llvm::StringRef", i32 } +%"class.llvm::StringRef" = type { i8*, i64 } +%"class.std::vector.70" = type { %"struct.std::_Vector_base.71" } +%"struct.std::_Vector_base.71" = type { %"struct.std::_Vector_base<llvm::StringRef, std::allocator<llvm::StringRef> >::_Vector_impl" } +%"struct.std::_Vector_base<llvm::StringRef, std::allocator<llvm::StringRef> >::_Vector_impl" = type { %"class.llvm::StringRef"*, %"class.llvm::StringRef"*, %"class.llvm::StringRef"* } +%"class.llvm::MCDwarfLoc" = type { i32, i32, i32, i32, i32, i32 } +%"class.llvm::MCSection" = type opaque +%"class.llvm::MCSymbol" = type { %"class.llvm::StringRef", %"class.llvm::MCSection"*, %"class.llvm::MCExpr"*, i8 } +%"class.llvm::MCExpr" = type opaque +%"class.std::vector.75" = type { %"struct.std::_Vector_base.76" } +%"struct.std::_Vector_base.76" = type { %"struct.std::_Vector_base<const llvm::MCGenDwarfLabelEntry *, std::allocator<const llvm::MCGenDwarfLabelEntry *> >::_Vector_impl" } +%"struct.std::_Vector_base<const llvm::MCGenDwarfLabelEntry *, std::allocator<const llvm::MCGenDwarfLabelEntry *> >::_Vector_impl" = type { %"class.llvm::MCGenDwarfLabelEntry"**, %"class.llvm::MCGenDwarfLabelEntry"**, %"class.llvm::MCGenDwarfLabelEntry"** } +%"class.llvm::MCGenDwarfLabelEntry" = type { %"class.llvm::StringRef", i32, i32, %"class.llvm::MCSymbol"* } +%"class.llvm::DenseMap.80" = type { %"struct.std::pair.83"*, i32, i32, i32 } +%"struct.std::pair.83" = type { %"class.llvm::MCSection"*, %"class.llvm::MCLineSection"* } +%"class.llvm::MCLineSection" = type { %"class.std::vector.215" } +%"class.std::vector.215" = type { %"struct.std::_Vector_base.216" } +%"struct.std::_Vector_base.216" = type { %"struct.std::_Vector_base<llvm::MCLineEntry, std::allocator<llvm::MCLineEntry> >::_Vector_impl" } +%"struct.std::_Vector_base<llvm::MCLineEntry, std::allocator<llvm::MCLineEntry> >::_Vector_impl" = type { %"class.llvm::MCLineEntry"*, %"class.llvm::MCLineEntry"*, %"class.llvm::MCLineEntry"* } +%"class.llvm::MCLineEntry" = type { %"class.llvm::MCDwarfLoc", %"class.llvm::MCSymbol"* } +%"class.std::vector.84" = type { %"struct.std::_Vector_base.85" } +%"struct.std::_Vector_base.85" = type { %"struct.std::_Vector_base<const llvm::MCSection *, std::allocator<const llvm::MCSection *> >::_Vector_impl" } +%"struct.std::_Vector_base<const llvm::MCSection *, std::allocator<const llvm::MCSection *> >::_Vector_impl" = type { %"class.llvm::MCSection"**, %"class.llvm::MCSection"**, %"class.llvm::MCSection"** } +%"class.llvm::MachineModuleInfo" = type { %"class.llvm::ImmutablePass", %"class.llvm::MCContext", %"class.llvm::Module"*, %"class.llvm::MachineModuleInfoImpl"*, %"class.std::vector.95", i32, %"class.std::vector.100", %"class.llvm::DenseMap.110", %"class.llvm::DenseMap.114", i32, %"class.std::vector.118", %"class.std::vector.123", %"class.std::vector.123", %"class.std::vector.128", %"class.llvm::SmallPtrSet", %"class.llvm::MMIAddrLabelMap"*, i8, i8, i8, i8, %"class.llvm::SmallVector.133" } +%"class.llvm::ImmutablePass" = type { %"class.llvm::ModulePass" } +%"class.llvm::ModulePass" = type { %"class.llvm::Pass" } +%"class.llvm::Pass" = type { i32 (...)**, %"class.llvm::AnalysisResolver"*, i8*, i32 } +%"class.llvm::AnalysisResolver" = type { %"class.std::vector.89", %"class.llvm::PMDataManager"* } +%"class.std::vector.89" = type { %"struct.std::_Vector_base.90" } +%"struct.std::_Vector_base.90" = type { %"struct.std::_Vector_base<std::pair<const void *, llvm::Pass *>, std::allocator<std::pair<const void *, llvm::Pass *> > >::_Vector_impl" } +%"struct.std::_Vector_base<std::pair<const void *, llvm::Pass *>, std::allocator<std::pair<const void *, llvm::Pass *> > >::_Vector_impl" = type { %"struct.std::pair.94"*, %"struct.std::pair.94"*, %"struct.std::pair.94"* } +%"struct.std::pair.94" = type { i8*, %"class.llvm::Pass"* } +%"class.llvm::PMDataManager" = type opaque +%"class.llvm::MachineModuleInfoImpl" = type { i32 (...)** } +%"class.std::vector.95" = type { %"struct.std::_Vector_base.96" } +%"struct.std::_Vector_base.96" = type { %"struct.std::_Vector_base<llvm::MachineMove, std::allocator<llvm::MachineMove> >::_Vector_impl" } +%"struct.std::_Vector_base<llvm::MachineMove, std::allocator<llvm::MachineMove> >::_Vector_impl" = type { %"class.llvm::MachineMove"*, %"class.llvm::MachineMove"*, %"class.llvm::MachineMove"* } +%"class.llvm::MachineMove" = type { %"class.llvm::MCSymbol"*, %"class.llvm::MachineLocation", %"class.llvm::MachineLocation" } +%"class.llvm::MachineLocation" = type { i8, i32, i32 } +%"class.std::vector.100" = type { %"struct.std::_Vector_base.101" } +%"struct.std::_Vector_base.101" = type { %"struct.std::_Vector_base<llvm::LandingPadInfo, std::allocator<llvm::LandingPadInfo> >::_Vector_impl" } +%"struct.std::_Vector_base<llvm::LandingPadInfo, std::allocator<llvm::LandingPadInfo> >::_Vector_impl" = type { %"struct.llvm::LandingPadInfo"*, %"struct.llvm::LandingPadInfo"*, %"struct.llvm::LandingPadInfo"* } +%"struct.llvm::LandingPadInfo" = type { %"class.llvm::MachineBasicBlock"*, %"class.llvm::SmallVector", %"class.llvm::SmallVector", %"class.llvm::MCSymbol"*, %"class.llvm::Function"*, %"class.std::vector.105" } +%"class.llvm::SmallVector" = type { %"class.llvm::SmallVectorImpl", %"struct.llvm::SmallVectorStorage" } +%"class.llvm::SmallVectorImpl" = type { %"class.llvm::SmallVectorTemplateBase" } +%"class.llvm::SmallVectorTemplateBase" = type { %"class.llvm::SmallVectorTemplateCommon" } +%"class.llvm::SmallVectorTemplateCommon" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion" } +%"class.llvm::SmallVectorBase" = type { i8*, i8*, i8* } +%"struct.llvm::AlignedCharArrayUnion" = type { %"struct.llvm::AlignedCharArray" } +%"struct.llvm::AlignedCharArray" = type { [8 x i8] } +%"struct.llvm::SmallVectorStorage" = type { i8 } +%"class.std::vector.105" = type { %"struct.std::_Vector_base.106" } +%"struct.std::_Vector_base.106" = type { %"struct.std::_Vector_base<int, std::allocator<int> >::_Vector_impl" } +%"struct.std::_Vector_base<int, std::allocator<int> >::_Vector_impl" = type { i32*, i32*, i32* } +%"class.llvm::DenseMap.110" = type { %"struct.std::pair.113"*, i32, i32, i32 } +%"struct.std::pair.113" = type { %"class.llvm::MCSymbol"*, %"class.llvm::SmallVector.206" } +%"class.llvm::SmallVector.206" = type { [28 x i8], %"struct.llvm::SmallVectorStorage.207" } +%"struct.llvm::SmallVectorStorage.207" = type { [3 x %"struct.llvm::AlignedCharArrayUnion.198"] } +%"struct.llvm::AlignedCharArrayUnion.198" = type { %"struct.llvm::AlignedCharArray.199" } +%"struct.llvm::AlignedCharArray.199" = type { [4 x i8] } +%"class.llvm::DenseMap.114" = type { %"struct.std::pair.117"*, i32, i32, i32 } +%"struct.std::pair.117" = type { %"class.llvm::MCSymbol"*, i32 } +%"class.std::vector.118" = type { %"struct.std::_Vector_base.119" } +%"struct.std::_Vector_base.119" = type { %"struct.std::_Vector_base<const llvm::GlobalVariable *, std::allocator<const llvm::GlobalVariable *> >::_Vector_impl" } +%"struct.std::_Vector_base<const llvm::GlobalVariable *, std::allocator<const llvm::GlobalVariable *> >::_Vector_impl" = type { %"class.llvm::GlobalVariable"**, %"class.llvm::GlobalVariable"**, %"class.llvm::GlobalVariable"** } +%"class.std::vector.123" = type { %"struct.std::_Vector_base.124" } +%"struct.std::_Vector_base.124" = type { %"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int> >::_Vector_impl" } +%"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int> >::_Vector_impl" = type { i32*, i32*, i32* } +%"class.std::vector.128" = type { %"struct.std::_Vector_base.129" } +%"struct.std::_Vector_base.129" = type { %"struct.std::_Vector_base<const llvm::Function *, std::allocator<const llvm::Function *> >::_Vector_impl" } +%"struct.std::_Vector_base<const llvm::Function *, std::allocator<const llvm::Function *> >::_Vector_impl" = type { %"class.llvm::Function"**, %"class.llvm::Function"**, %"class.llvm::Function"** } +%"class.llvm::SmallPtrSet" = type { %"class.llvm::SmallPtrSetImpl", [33 x i8*] } +%"class.llvm::SmallPtrSetImpl" = type { i8**, i8**, i32, i32, i32 } +%"class.llvm::MMIAddrLabelMap" = type opaque +%"class.llvm::SmallVector.133" = type { %"class.llvm::SmallVectorImpl.134", %"struct.llvm::SmallVectorStorage.139" } +%"class.llvm::SmallVectorImpl.134" = type { %"class.llvm::SmallVectorTemplateBase.135" } +%"class.llvm::SmallVectorTemplateBase.135" = type { %"class.llvm::SmallVectorTemplateCommon.136" } +%"class.llvm::SmallVectorTemplateCommon.136" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.137" } +%"struct.llvm::AlignedCharArrayUnion.137" = type { %"struct.llvm::AlignedCharArray.138" } +%"struct.llvm::AlignedCharArray.138" = type { [40 x i8] } +%"struct.llvm::SmallVectorStorage.139" = type { [3 x %"struct.llvm::AlignedCharArrayUnion.137"] } +%"class.llvm::GCModuleInfo" = type opaque +%"class.llvm::MachineRegisterInfo" = type { %"class.llvm::TargetRegisterInfo"*, i8, i8, %"class.llvm::IndexedMap", %"class.llvm::IndexedMap.146", %"class.llvm::MachineOperand"**, %"class.llvm::BitVector", %"class.llvm::BitVector", %"class.llvm::BitVector", %"class.std::vector.147", %"class.std::vector.123" } +%"class.llvm::TargetRegisterInfo" = type { i32 (...)**, %"class.llvm::MCRegisterInfo", %"struct.llvm::TargetRegisterInfoDesc"*, i8**, i32*, %"class.llvm::TargetRegisterClass"**, %"class.llvm::TargetRegisterClass"** } +%"struct.llvm::TargetRegisterInfoDesc" = type { i32, i8 } +%"class.llvm::TargetRegisterClass" = type { %"class.llvm::MCRegisterClass"*, i32*, i32*, i16*, %"class.llvm::TargetRegisterClass"**, void (%"class.llvm::ArrayRef"*, %"class.llvm::MachineFunction"*)* } +%"class.llvm::ArrayRef" = type { i16*, i64 } +%"class.llvm::IndexedMap" = type { %"class.std::vector.140", %"struct.std::pair.145", %"struct.llvm::VirtReg2IndexFunctor" } +%"class.std::vector.140" = type { %"struct.std::_Vector_base.141" } +%"struct.std::_Vector_base.141" = type { %"struct.std::_Vector_base<std::pair<const llvm::TargetRegisterClass *, llvm::MachineOperand *>, std::allocator<std::pair<const llvm::TargetRegisterClass *, llvm::MachineOperand *> > >::_Vector_impl" } +%"struct.std::_Vector_base<std::pair<const llvm::TargetRegisterClass *, llvm::MachineOperand *>, std::allocator<std::pair<const llvm::TargetRegisterClass *, llvm::MachineOperand *> > >::_Vector_impl" = type { %"struct.std::pair.145"*, %"struct.std::pair.145"*, %"struct.std::pair.145"* } +%"struct.std::pair.145" = type { %"class.llvm::TargetRegisterClass"*, %"class.llvm::MachineOperand"* } +%"class.llvm::MachineOperand" = type { i8, [3 x i8], %union.anon, %"class.llvm::MachineInstr"*, %union.anon.188 } +%union.anon = type { i32 } +%union.anon.188 = type { %struct.anon } +%struct.anon = type { %"class.llvm::MachineOperand"*, %"class.llvm::MachineOperand"* } +%"struct.llvm::VirtReg2IndexFunctor" = type { i8 } +%"class.llvm::IndexedMap.146" = type { %"class.std::vector.147", %"struct.std::pair.152", %"struct.llvm::VirtReg2IndexFunctor" } +%"class.std::vector.147" = type { %"struct.std::_Vector_base.148" } +%"struct.std::_Vector_base.148" = type { %"struct.std::_Vector_base<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > >::_Vector_impl" } +%"struct.std::_Vector_base<std::pair<unsigned int, unsigned int>, std::allocator<std::pair<unsigned int, unsigned int> > >::_Vector_impl" = type { %"struct.std::pair.152"*, %"struct.std::pair.152"*, %"struct.std::pair.152"* } +%"struct.std::pair.152" = type { i32, i32 } +%"class.llvm::BitVector" = type { i64*, i32, i32 } +%"struct.llvm::MachineFunctionInfo" = type { i32 (...)** } +%"class.llvm::MachineFrameInfo" = type opaque +%"class.llvm::MachineConstantPool" = type { %"class.llvm::DataLayout"*, i32, %"class.std::vector.153", %"class.llvm::DenseSet" } +%"class.llvm::DataLayout" = type opaque +%"class.std::vector.153" = type { %"struct.std::_Vector_base.154" } +%"struct.std::_Vector_base.154" = type { %"struct.std::_Vector_base<llvm::MachineConstantPoolEntry, std::allocator<llvm::MachineConstantPoolEntry> >::_Vector_impl" } +%"struct.std::_Vector_base<llvm::MachineConstantPoolEntry, std::allocator<llvm::MachineConstantPoolEntry> >::_Vector_impl" = type { %"class.llvm::MachineConstantPoolEntry"*, %"class.llvm::MachineConstantPoolEntry"*, %"class.llvm::MachineConstantPoolEntry"* } +%"class.llvm::MachineConstantPoolEntry" = type { %union.anon.158, i32 } +%union.anon.158 = type { %"class.llvm::Constant"* } +%"class.llvm::Constant" = type { %"class.llvm::User" } +%"class.llvm::DenseSet" = type { %"class.llvm::DenseMap.159" } +%"class.llvm::DenseMap.159" = type { %"struct.std::pair.162"*, i32, i32, i32 } +%"struct.std::pair.162" = type { %"class.llvm::MachineConstantPoolValue"*, i8 } +%"class.llvm::MachineConstantPoolValue" = type { i32 (...)**, %"class.llvm::Type"* } +%"class.llvm::MachineJumpTableInfo" = type opaque +%"class.std::vector.163" = type { %"struct.std::_Vector_base.164" } +%"struct.std::_Vector_base.164" = type { %"struct.std::_Vector_base<llvm::MachineBasicBlock *, std::allocator<llvm::MachineBasicBlock *> >::_Vector_impl" } +%"struct.std::_Vector_base<llvm::MachineBasicBlock *, std::allocator<llvm::MachineBasicBlock *> >::_Vector_impl" = type { %"class.llvm::MachineBasicBlock"**, %"class.llvm::MachineBasicBlock"**, %"class.llvm::MachineBasicBlock"** } +%"class.llvm::Recycler" = type { %"class.llvm::iplist.168" } +%"class.llvm::iplist.168" = type { %"struct.llvm::ilist_traits.169", %"struct.llvm::RecyclerStruct"* } +%"struct.llvm::ilist_traits.169" = type { %"struct.llvm::RecyclerStruct" } +%"struct.llvm::RecyclerStruct" = type { %"struct.llvm::RecyclerStruct"*, %"struct.llvm::RecyclerStruct"* } +%"class.llvm::ArrayRecycler" = type { %"class.llvm::SmallVector.174" } +%"class.llvm::SmallVector.174" = type { %"class.llvm::SmallVectorImpl.175", %"struct.llvm::SmallVectorStorage.179" } +%"class.llvm::SmallVectorImpl.175" = type { %"class.llvm::SmallVectorTemplateBase.176" } +%"class.llvm::SmallVectorTemplateBase.176" = type { %"class.llvm::SmallVectorTemplateCommon.177" } +%"class.llvm::SmallVectorTemplateCommon.177" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.178" } +%"struct.llvm::AlignedCharArrayUnion.178" = type { %"struct.llvm::AlignedCharArray" } +%"struct.llvm::SmallVectorStorage.179" = type { [7 x %"struct.llvm::AlignedCharArrayUnion.178"] } +%"class.llvm::Recycler.180" = type { %"class.llvm::iplist.168" } +%"struct.llvm::ilist.181" = type { %"class.llvm::iplist.182" } +%"class.llvm::iplist.182" = type { %"struct.llvm::ilist_traits.183", %"class.llvm::MachineBasicBlock"* } +%"struct.llvm::ilist_traits.183" = type { %"class.llvm::ilist_half_node.1" } +%"class.llvm::ArrayRecycler<llvm::MachineOperand, 8>::Capacity" = type { i8 } +%"class.llvm::ConstantInt" = type { %"class.llvm::Constant", %"class.llvm::APInt" } +%"class.llvm::APInt" = type { i32, %union.anon.189 } +%union.anon.189 = type { i64 } +%"class.llvm::ConstantFP" = type { %"class.llvm::Constant", %"class.llvm::APFloat" } +%"class.llvm::APFloat" = type { %"struct.llvm::fltSemantics"*, %"union.llvm::APFloat::Significand", i16, i8 } +%"struct.llvm::fltSemantics" = type opaque +%"union.llvm::APFloat::Significand" = type { i64 } +%"class.llvm::BlockAddress" = type { %"class.llvm::Constant" } +%"class.llvm::hash_code" = type { i64 } +%"struct.llvm::hashing::detail::hash_combine_recursive_helper" = type { [64 x i8], %"struct.llvm::hashing::detail::hash_state", i64 } +%"struct.llvm::hashing::detail::hash_state" = type { i64, i64, i64, i64, i64, i64, i64, i64 } +%"class.llvm::PrintReg" = type { %"class.llvm::TargetRegisterInfo"*, i32, i32 } +%"class.llvm::PseudoSourceValue" = type { %"class.llvm::Value" } +%"class.llvm::FoldingSetNodeID" = type { %"class.llvm::SmallVector.194" } +%"class.llvm::SmallVector.194" = type { [28 x i8], %"struct.llvm::SmallVectorStorage.200" } +%"struct.llvm::SmallVectorStorage.200" = type { [31 x %"struct.llvm::AlignedCharArrayUnion.198"] } +%"struct.llvm::ArrayRecycler<llvm::MachineOperand, 8>::FreeList" = type { %"struct.llvm::ArrayRecycler<llvm::MachineOperand, 8>::FreeList"* } +%"class.llvm::ilist_iterator.202" = type { %"class.llvm::MachineInstr"* } +%"class.llvm::TargetInstrInfo" = type { i32 (...)**, [28 x i8], i32, i32 } +%"struct.std::pair.203" = type { i8, i8 } +%"class.llvm::SmallVectorImpl.195" = type { %"class.llvm::SmallVectorTemplateBase.196" } +%"class.llvm::SmallVectorTemplateBase.196" = type { %"class.llvm::SmallVectorTemplateCommon.197" } +%"class.llvm::SmallVectorTemplateCommon.197" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.198" } +%"class.llvm::AliasAnalysis" = type { i32 (...)**, %"class.llvm::DataLayout"*, %"class.llvm::TargetLibraryInfo"*, %"class.llvm::AliasAnalysis"* } +%"class.llvm::TargetLibraryInfo" = type opaque +%"struct.llvm::AliasAnalysis::Location" = type { %"class.llvm::Value"*, i64, %"class.llvm::MDNode"* } +%"class.llvm::DIVariable" = type { %"class.llvm::DIDescriptor" } +%"class.llvm::DIDescriptor" = type { %"class.llvm::MDNode"* } +%"class.llvm::DIScope" = type { %"class.llvm::DIDescriptor" } +%"class.llvm::ArrayRef.208" = type { i32*, i64 } +%"class.llvm::SmallVector.209" = type { %"class.llvm::SmallVectorImpl.210", %"struct.llvm::SmallVectorStorage.214" } +%"class.llvm::SmallVectorImpl.210" = type { %"class.llvm::SmallVectorTemplateBase.211" } +%"class.llvm::SmallVectorTemplateBase.211" = type { %"class.llvm::SmallVectorTemplateCommon.212" } +%"class.llvm::SmallVectorTemplateCommon.212" = type { %"class.llvm::SmallVectorBase", %"struct.llvm::AlignedCharArrayUnion.213" } +%"struct.llvm::AlignedCharArrayUnion.213" = type { %"struct.llvm::AlignedCharArray" } +%"struct.llvm::SmallVectorStorage.214" = type { [7 x %"struct.llvm::AlignedCharArrayUnion.213"] } +%"class.llvm::Twine" = type { %"union.llvm::Twine::Child", %"union.llvm::Twine::Child", i8, i8 } +%"union.llvm::Twine::Child" = type { %"class.llvm::Twine"* } +%"struct.std::random_access_iterator_tag" = type { i8 } + +declare void @_ZN4llvm19MachineRegisterInfo27removeRegOperandFromUseListEPNS_14MachineOperandE(%"class.llvm::MachineRegisterInfo"*, %"class.llvm::MachineOperand"*) + +declare void @_ZN4llvm19MachineRegisterInfo22addRegOperandToUseListEPNS_14MachineOperandE(%"class.llvm::MachineRegisterInfo"*, %"class.llvm::MachineOperand"*) + +declare zeroext i32 @_ZNK4llvm14MCRegisterInfo9getSubRegEjj(%"class.llvm::MCRegisterInfo"*, i32 zeroext, i32 zeroext) + +define void @_ZN4llvm14MachineOperand12substPhysRegEjRKNS_18TargetRegisterInfoE(%"class.llvm::MachineOperand"* %this, i32 zeroext %Reg, %"class.llvm::TargetRegisterInfo"* %TRI) align 2 { +entry: + %SubReg_TargetFlags.i = getelementptr inbounds %"class.llvm::MachineOperand"* %this, i64 0, i32 1 + %0 = bitcast [3 x i8]* %SubReg_TargetFlags.i to i24* + %bf.load.i = load i24* %0, align 1 + %bf.lshr.i = lshr i24 %bf.load.i, 12 + %tobool = icmp eq i24 %bf.lshr.i, 0 + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + %bf.cast.i = zext i24 %bf.lshr.i to i32 + %add.ptr = getelementptr inbounds %"class.llvm::TargetRegisterInfo"* %TRI, i64 0, i32 1 + %call3 = tail call zeroext i32 @_ZNK4llvm14MCRegisterInfo9getSubRegEjj(%"class.llvm::MCRegisterInfo"* %add.ptr, i32 zeroext %Reg, i32 zeroext %bf.cast.i) + %bf.load.i10 = load i24* %0, align 1 + %bf.clear.i = and i24 %bf.load.i10, 4095 + store i24 %bf.clear.i, i24* %0, align 1 + br label %if.end + +if.end: ; preds = %entry, %if.then + %Reg.addr.0 = phi i32 [ %call3, %if.then ], [ %Reg, %entry ] + %RegNo.i.i = getelementptr inbounds %"class.llvm::MachineOperand"* %this, i64 0, i32 2, i32 0 + %1 = load i32* %RegNo.i.i, align 4, !tbaa !0 + %cmp.i = icmp eq i32 %1, %Reg.addr.0 + br i1 %cmp.i, label %_ZN4llvm14MachineOperand6setRegEj.exit, label %if.end.i + +if.end.i: ; preds = %if.end + %ParentMI.i.i = getelementptr inbounds %"class.llvm::MachineOperand"* %this, i64 0, i32 3 + %2 = load %"class.llvm::MachineInstr"** %ParentMI.i.i, align 8, !tbaa !3 + %tobool.i = icmp eq %"class.llvm::MachineInstr"* %2, null + br i1 %tobool.i, label %if.end13.i, label %if.then3.i + +if.then3.i: ; preds = %if.end.i + %Parent.i.i = getelementptr inbounds %"class.llvm::MachineInstr"* %2, i64 0, i32 2 + %3 = load %"class.llvm::MachineBasicBlock"** %Parent.i.i, align 8, !tbaa !3 + %tobool5.i = icmp eq %"class.llvm::MachineBasicBlock"* %3, null + br i1 %tobool5.i, label %if.end13.i, label %if.then6.i + +if.then6.i: ; preds = %if.then3.i + %xParent.i.i = getelementptr inbounds %"class.llvm::MachineBasicBlock"* %3, i64 0, i32 4 + %4 = load %"class.llvm::MachineFunction"** %xParent.i.i, align 8, !tbaa !3 + %tobool8.i = icmp eq %"class.llvm::MachineFunction"* %4, null + br i1 %tobool8.i, label %if.end13.i, label %if.then9.i + +if.then9.i: ; preds = %if.then6.i + %RegInfo.i.i = getelementptr inbounds %"class.llvm::MachineFunction"* %4, i64 0, i32 5 + %5 = load %"class.llvm::MachineRegisterInfo"** %RegInfo.i.i, align 8, !tbaa !3 + tail call void @_ZN4llvm19MachineRegisterInfo27removeRegOperandFromUseListEPNS_14MachineOperandE(%"class.llvm::MachineRegisterInfo"* %5, %"class.llvm::MachineOperand"* %this) + store i32 %Reg.addr.0, i32* %RegNo.i.i, align 4, !tbaa !0 + tail call void @_ZN4llvm19MachineRegisterInfo22addRegOperandToUseListEPNS_14MachineOperandE(%"class.llvm::MachineRegisterInfo"* %5, %"class.llvm::MachineOperand"* %this) + br label %_ZN4llvm14MachineOperand6setRegEj.exit + +if.end13.i: ; preds = %if.then6.i, %if.then3.i, %if.end.i + store i32 %Reg.addr.0, i32* %RegNo.i.i, align 4, !tbaa !0 + br label %_ZN4llvm14MachineOperand6setRegEj.exit + +_ZN4llvm14MachineOperand6setRegEj.exit: ; preds = %if.end, %if.then9.i, %if.end13.i + ret void +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"any pointer", metadata !1} +!4 = metadata !{metadata !"vtable pointer", metadata !2} +!5 = metadata !{metadata !"long", metadata !1} +!6 = metadata !{i64 0, i64 8, metadata !3, i64 8, i64 8, metadata !5} +!7 = metadata !{metadata !"short", metadata !1} +!8 = metadata !{i64 0, i64 1, metadata !1, i64 1, i64 4, metadata !0, i64 2, i64 1, metadata !1, i64 3, i64 1, metadata !9, i64 3, i64 1, metadata !9, i64 3, i64 1, metadata !9, i64 3, i64 1, metadata !9, i64 3, i64 1, metadata !9, i64 3, i64 1, metadata !9, i64 3, i64 1, metadata !9, i64 3, i64 1, metadata !9, i64 4, i64 4, metadata !0, i64 4, i64 4, metadata !0, i64 8, i64 8, metadata !3, i64 16, i64 8, metadata !3, i64 16, i64 8, metadata !3, i64 16, i64 8, metadata !3, i64 16, i64 8, metadata !5, i64 16, i64 8, metadata !3, i64 16, i64 8, metadata !3, i64 16, i64 8, metadata !3, i64 16, i64 8, metadata !3, i64 24, i64 8, metadata !3, i64 16, i64 4, metadata !0, i64 16, i64 8, metadata !3, i64 16, i64 8, metadata !3, i64 16, i64 8, metadata !3, i64 24, i64 4, metadata !0} +!9 = metadata !{metadata !"bool", metadata !1} +!10 = metadata !{i8 0, i8 2} + +; CHECK-NOT: lbzu 3, 1(3) diff --git a/test/CodeGen/PowerPC/pr15359.ll b/test/CodeGen/PowerPC/pr15359.ll new file mode 100644 index 000000000000..12fa3e5ffbdd --- /dev/null +++ b/test/CodeGen/PowerPC/pr15359.ll @@ -0,0 +1,20 @@ +; RUN: llc -O0 -mcpu=pwr7 -filetype=obj %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck %s + +target datalayout = "E-p:64:64:64-S0-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@nextIdx = external thread_local global i32 + +define fastcc void @func() nounwind { +entry: + store i32 42, i32* @nextIdx + ret void +} + +; Verify that nextIdx has symbol type TLS. +; +; CHECK: '.symtab' +; CHECK: 'nextIdx' +; CHECK: 'st_type', 0x6 + diff --git a/test/CodeGen/PowerPC/pr15630.ll b/test/CodeGen/PowerPC/pr15630.ll new file mode 100644 index 000000000000..c5ba8a4d4f04 --- /dev/null +++ b/test/CodeGen/PowerPC/pr15630.ll @@ -0,0 +1,16 @@ +; RUN: llc -mcpu=pwr7 -O0 < %s | FileCheck %s + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define weak_odr void @_D4core6atomic49__T11atomicStoreVE4core6atomic11MemoryOrder3ThThZ11atomicStoreFNaNbKOhhZv(i8* %val_arg, i8 zeroext %newval_arg) { +entry: + %newval = alloca i8 + %ordering = alloca i32, align 4 + store i8 %newval_arg, i8* %newval + %tmp = load i8* %newval + store atomic volatile i8 %tmp, i8* %val_arg seq_cst, align 1 + ret void +} + +; CHECK: stwcx. diff --git a/test/CodeGen/PowerPC/pr15632.ll b/test/CodeGen/PowerPC/pr15632.ll new file mode 100644 index 000000000000..3ea83468b6d7 --- /dev/null +++ b/test/CodeGen/PowerPC/pr15632.ll @@ -0,0 +1,15 @@ +; RUN: llc -mcpu=pwr7 -O0 < %s | FileCheck %s + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +declare void @other(ppc_fp128 %tmp70) + +define void @bug() { +entry: + %tmp70 = frem ppc_fp128 0xM00000000000000000000000000000000, undef + call void @other(ppc_fp128 %tmp70) + unreachable +} + +; CHECK: bl fmodl diff --git a/test/CodeGen/PowerPC/pwr3-6x.ll b/test/CodeGen/PowerPC/pwr3-6x.ll new file mode 100644 index 000000000000..a9cfe412fd84 --- /dev/null +++ b/test/CodeGen/PowerPC/pwr3-6x.ll @@ -0,0 +1,14 @@ +; Test basic support for some older processors. + +;RUN: llc < %s -march=ppc64 -mcpu=pwr3 | FileCheck %s +;RUN: llc < %s -march=ppc64 -mcpu=pwr4 | FileCheck %s +;RUN: llc < %s -march=ppc64 -mcpu=pwr5 | FileCheck %s +;RUN: llc < %s -march=ppc64 -mcpu=pwr5x | FileCheck %s +;RUN: llc < %s -march=ppc64 -mcpu=pwr6x | FileCheck %s + +define void @foo() { +entry: + ret void +} + +; CHECK: @foo diff --git a/test/CodeGen/PowerPC/quadint-return.ll b/test/CodeGen/PowerPC/quadint-return.ll new file mode 100644 index 000000000000..03499915e78e --- /dev/null +++ b/test/CodeGen/PowerPC/quadint-return.ll @@ -0,0 +1,19 @@ +; REQUIRES: asserts +; RUN: llc -O0 -debug -o - < %s 2>&1 | FileCheck %s + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i128 @foo() nounwind { +entry: + %x = alloca i128, align 16 + store i128 27, i128* %x, align 16 + %0 = load i128* %x, align 16 + ret i128 %0 +} + +; CHECK: ********** Function: foo +; CHECK: ********** FAST REGISTER ALLOCATION ********** +; CHECK: %X3<def> = COPY %vreg +; CHECK-NEXT: %X4<def> = COPY %vreg +; CHECK-NEXT: BLR diff --git a/test/CodeGen/PowerPC/r31.ll b/test/CodeGen/PowerPC/r31.ll new file mode 100644 index 000000000000..7ce12f600b41 --- /dev/null +++ b/test/CodeGen/PowerPC/r31.ll @@ -0,0 +1,15 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=g4 | FileCheck %s +target datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128-n32" + +define i64 @foo(i64 %a) nounwind { +entry: + call void asm sideeffect "", "~{r0},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r14},~{r15},~{r16},~{r17},~{r18},~{r19},~{r20},~{r21},~{r22},~{r23},~{r24},~{r25},~{r26},~{r27},~{r28},~{r29},~{r30}"() nounwind + br label %return + +; CHECK: @foo +; CHECK: mr 31, 3 + +return: ; preds = %entry + ret i64 %a +} + diff --git a/test/CodeGen/PowerPC/recipest.ll b/test/CodeGen/PowerPC/recipest.ll new file mode 100644 index 000000000000..89705faa46e9 --- /dev/null +++ b/test/CodeGen/PowerPC/recipest.ll @@ -0,0 +1,226 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-unsafe-fp-math | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck -check-prefix=CHECK-SAFE %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +declare double @llvm.sqrt.f64(double) +declare float @llvm.sqrt.f32(float) +declare <4 x float> @llvm.sqrt.v4f32(<4 x float>) + +define double @foo(double %a, double %b) nounwind { +entry: + %x = call double @llvm.sqrt.f64(double %b) + %r = fdiv double %a, %x + ret double %r + +; CHECK: @foo +; CHECK: frsqrte +; CHECK: fnmsub +; CHECK: fmul +; CHECK: fmadd +; CHECK: fmul +; CHECK: fmul +; CHECK: fmadd +; CHECK: fmul +; CHECK: fmul +; CHECK: blr + +; CHECK-SAFE: @foo +; CHECK-SAFE: fsqrt +; CHECK-SAFE: fdiv +; CHECK-SAFE: blr +} + +define double @foof(double %a, float %b) nounwind { +entry: + %x = call float @llvm.sqrt.f32(float %b) + %y = fpext float %x to double + %r = fdiv double %a, %y + ret double %r + +; CHECK: @foof +; CHECK: frsqrtes +; CHECK: fnmsubs +; CHECK: fmuls +; CHECK: fmadds +; CHECK: fmuls +; CHECK: fmul +; CHECK: blr + +; CHECK-SAFE: @foof +; CHECK-SAFE: fsqrts +; CHECK-SAFE: fdiv +; CHECK-SAFE: blr +} + +define float @food(float %a, double %b) nounwind { +entry: + %x = call double @llvm.sqrt.f64(double %b) + %y = fptrunc double %x to float + %r = fdiv float %a, %y + ret float %r + +; CHECK: @foo +; CHECK: frsqrte +; CHECK: fnmsub +; CHECK: fmul +; CHECK: fmadd +; CHECK: fmul +; CHECK: fmul +; CHECK: fmadd +; CHECK: fmul +; CHECK: frsp +; CHECK: fmuls +; CHECK: blr + +; CHECK-SAFE: @foo +; CHECK-SAFE: fsqrt +; CHECK-SAFE: fdivs +; CHECK-SAFE: blr +} + +define float @goo(float %a, float %b) nounwind { +entry: + %x = call float @llvm.sqrt.f32(float %b) + %r = fdiv float %a, %x + ret float %r + +; CHECK: @goo +; CHECK: frsqrtes +; CHECK: fnmsubs +; CHECK: fmuls +; CHECK: fmadds +; CHECK: fmuls +; CHECK: fmuls +; CHECK: blr + +; CHECK-SAFE: @goo +; CHECK-SAFE: fsqrts +; CHECK-SAFE: fdivs +; CHECK-SAFE: blr +} + +define <4 x float> @hoo(<4 x float> %a, <4 x float> %b) nounwind { +entry: + %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b) + %r = fdiv <4 x float> %a, %x + ret <4 x float> %r + +; CHECK: @hoo +; CHECK: vrsqrtefp + +; CHECK-SAFE: @hoo +; CHECK-SAFE-NOT: vrsqrtefp +; CHECK-SAFE: blr +} + +define double @foo2(double %a, double %b) nounwind { +entry: + %r = fdiv double %a, %b + ret double %r + +; CHECK: @foo2 +; CHECK: fre +; CHECK: fnmsub +; CHECK: fmadd +; CHECK: fnmsub +; CHECK: fmadd +; CHECK: fmul +; CHECK: blr + +; CHECK-SAFE: @foo2 +; CHECK-SAFE: fdiv +; CHECK-SAFE: blr +} + +define float @goo2(float %a, float %b) nounwind { +entry: + %r = fdiv float %a, %b + ret float %r + +; CHECK: @goo2 +; CHECK: fres +; CHECK: fnmsubs +; CHECK: fmadds +; CHECK: fmuls +; CHECK: blr + +; CHECK-SAFE: @goo2 +; CHECK-SAFE: fdivs +; CHECK-SAFE: blr +} + +define <4 x float> @hoo2(<4 x float> %a, <4 x float> %b) nounwind { +entry: + %r = fdiv <4 x float> %a, %b + ret <4 x float> %r + +; CHECK: @hoo2 +; CHECK: vrefp + +; CHECK-SAFE: @hoo2 +; CHECK-SAFE-NOT: vrefp +; CHECK-SAFE: blr +} + +define double @foo3(double %a) nounwind { +entry: + %r = call double @llvm.sqrt.f64(double %a) + ret double %r + +; CHECK: @foo3 +; CHECK: frsqrte +; CHECK: fnmsub +; CHECK: fmul +; CHECK: fmadd +; CHECK: fmul +; CHECK: fmul +; CHECK: fmadd +; CHECK: fmul +; CHECK: fre +; CHECK: fnmsub +; CHECK: fmadd +; CHECK: fnmsub +; CHECK: fmadd +; CHECK: blr + +; CHECK-SAFE: @foo3 +; CHECK-SAFE: fsqrt +; CHECK-SAFE: blr +} + +define float @goo3(float %a) nounwind { +entry: + %r = call float @llvm.sqrt.f32(float %a) + ret float %r + +; CHECK: @goo3 +; CHECK: frsqrtes +; CHECK: fnmsubs +; CHECK: fmuls +; CHECK: fmadds +; CHECK: fmuls +; CHECK: fres +; CHECK: fnmsubs +; CHECK: fmadds +; CHECK: blr + +; CHECK-SAFE: @goo3 +; CHECK-SAFE: fsqrts +; CHECK-SAFE: blr +} + +define <4 x float> @hoo3(<4 x float> %a) nounwind { +entry: + %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) + ret <4 x float> %r + +; CHECK: @hoo3 +; CHECK: vrsqrtefp +; CHECK: vrefp + +; CHECK-SAFE: @hoo3 +; CHECK-SAFE-NOT: vrsqrtefp +; CHECK-SAFE: blr +} + diff --git a/test/CodeGen/PowerPC/rlwimi3.ll b/test/CodeGen/PowerPC/rlwimi3.ll index 7efdbe9634fe..31b6d4aa03bc 100644 --- a/test/CodeGen/PowerPC/rlwimi3.ll +++ b/test/CodeGen/PowerPC/rlwimi3.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=ppc32 -stats 2>&1 | \ ; RUN: grep "Number of machine instrs printed" | grep 12 diff --git a/test/CodeGen/PowerPC/rounding-ops.ll b/test/CodeGen/PowerPC/rounding-ops.ll new file mode 100644 index 000000000000..b210a6bda8bf --- /dev/null +++ b/test/CodeGen/PowerPC/rounding-ops.ll @@ -0,0 +1,145 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-unsafe-fp-math | FileCheck -check-prefix=CHECK-FM %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define float @test1(float %x) nounwind { + %call = tail call float @floorf(float %x) nounwind readnone + ret float %call + +; CHECK: test1: +; CHECK: frim 1, 1 + +; CHECK-FM: test1: +; CHECK-FM: frim 1, 1 +} + +declare float @floorf(float) nounwind readnone + +define double @test2(double %x) nounwind { + %call = tail call double @floor(double %x) nounwind readnone + ret double %call + +; CHECK: test2: +; CHECK: frim 1, 1 + +; CHECK-FM: test2: +; CHECK-FM: frim 1, 1 +} + +declare double @floor(double) nounwind readnone + +define float @test3(float %x) nounwind { + %call = tail call float @nearbyintf(float %x) nounwind readnone + ret float %call + +; CHECK: test3: +; CHECK-NOT: frin + +; CHECK-FM: test3: +; CHECK-FM: frin 1, 1 +} + +declare float @nearbyintf(float) nounwind readnone + +define double @test4(double %x) nounwind { + %call = tail call double @nearbyint(double %x) nounwind readnone + ret double %call + +; CHECK: test4: +; CHECK-NOT: frin + +; CHECK-FM: test4: +; CHECK-FM: frin 1, 1 +} + +declare double @nearbyint(double) nounwind readnone + +define float @test5(float %x) nounwind { + %call = tail call float @ceilf(float %x) nounwind readnone + ret float %call + +; CHECK: test5: +; CHECK: frip 1, 1 + +; CHECK-FM: test5: +; CHECK-FM: frip 1, 1 +} + +declare float @ceilf(float) nounwind readnone + +define double @test6(double %x) nounwind { + %call = tail call double @ceil(double %x) nounwind readnone + ret double %call + +; CHECK: test6: +; CHECK: frip 1, 1 + +; CHECK-FM: test6: +; CHECK-FM: frip 1, 1 +} + +declare double @ceil(double) nounwind readnone + +define float @test9(float %x) nounwind { + %call = tail call float @truncf(float %x) nounwind readnone + ret float %call + +; CHECK: test9: +; CHECK: friz 1, 1 + +; CHECK-FM: test9: +; CHECK-FM: friz 1, 1 +} + +declare float @truncf(float) nounwind readnone + +define double @test10(double %x) nounwind { + %call = tail call double @trunc(double %x) nounwind readnone + ret double %call + +; CHECK: test10: +; CHECK: friz 1, 1 + +; CHECK-FM: test10: +; CHECK-FM: friz 1, 1 +} + +declare double @trunc(double) nounwind readnone + +define float @test11(float %x) nounwind { + %call = tail call float @rintf(float %x) nounwind readnone + ret float %call + +; CHECK: test11: +; CHECK-NOT: frin + +; CHECK-FM: test11: +; CHECK-FM: frin [[R2:[0-9]+]], [[R1:[0-9]+]] +; CHECK-FM: fcmpu [[CR:[0-9]+]], [[R2]], [[R1]] +; CHECK-FM: beq [[CR]], .LBB[[BB:[0-9]+]]_2 +; CHECK-FM: mtfsb1 6 +; CHECK-FM: .LBB[[BB]]_2: +; CHECK-FM: blr +} + +declare float @rintf(float) nounwind readnone + +define double @test12(double %x) nounwind { + %call = tail call double @rint(double %x) nounwind readnone + ret double %call + +; CHECK: test12: +; CHECK-NOT: frin + +; CHECK-FM: test12: +; CHECK-FM: frin [[R2:[0-9]+]], [[R1:[0-9]+]] +; CHECK-FM: fcmpu [[CR:[0-9]+]], [[R2]], [[R1]] +; CHECK-FM: beq [[CR]], .LBB[[BB:[0-9]+]]_2 +; CHECK-FM: mtfsb1 6 +; CHECK-FM: .LBB[[BB]]_2: +; CHECK-FM: blr +} + +declare double @rint(double) nounwind readnone + diff --git a/test/CodeGen/PowerPC/s000-alias-misched.ll b/test/CodeGen/PowerPC/s000-alias-misched.ll new file mode 100644 index 000000000000..d03ee8738eea --- /dev/null +++ b/test/CodeGen/PowerPC/s000-alias-misched.ll @@ -0,0 +1,101 @@ +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-bgq-linux" +; RUN: llc < %s -enable-misched -march=ppc64 -mcpu=a2 | FileCheck %s +; RUN: llc < %s -enable-misched -enable-aa-sched-mi -march=ppc64 -mcpu=a2 | FileCheck %s + +@aa = external global [256 x [256 x double]], align 32 +@bb = external global [256 x [256 x double]], align 32 +@cc = external global [256 x [256 x double]], align 32 +@.str1 = external hidden unnamed_addr constant [6 x i8], align 1 +@X = external global [16000 x double], align 32 +@Y = external global [16000 x double], align 32 +@Z = external global [16000 x double], align 32 +@U = external global [16000 x double], align 32 +@V = external global [16000 x double], align 32 +@.str137 = external hidden unnamed_addr constant [14 x i8], align 1 + +declare void @check(i32 signext) nounwind + +declare signext i32 @printf(i8* nocapture, ...) nounwind + +declare signext i32 @init(i8*) nounwind + +define signext i32 @s000() nounwind { +entry: + %call = tail call signext i32 @init(i8* getelementptr inbounds ([6 x i8]* @.str1, i64 0, i64 0)) + %call1 = tail call i64 @clock() nounwind + br label %for.cond2.preheader + +; CHECK: @s000 + +for.cond2.preheader: ; preds = %for.end, %entry + %nl.018 = phi i32 [ 0, %entry ], [ %inc9, %for.end ] + br label %for.body4 + +for.body4: ; preds = %for.body4, %for.cond2.preheader + %indvars.iv = phi i64 [ 0, %for.cond2.preheader ], [ %indvars.iv.next.15, %for.body4 ] + %arrayidx = getelementptr inbounds [16000 x double]* @Y, i64 0, i64 %indvars.iv + %arrayidx6 = getelementptr inbounds [16000 x double]* @X, i64 0, i64 %indvars.iv + %0 = bitcast double* %arrayidx to <1 x double>* + %1 = load <1 x double>* %0, align 32, !tbaa !0 + %add = fadd <1 x double> %1, <double 1.000000e+00> + %2 = bitcast double* %arrayidx6 to <1 x double>* + store <1 x double> %add, <1 x double>* %2, align 32, !tbaa !0 + %indvars.iv.next.322 = or i64 %indvars.iv, 4 + %arrayidx.4 = getelementptr inbounds [16000 x double]* @Y, i64 0, i64 %indvars.iv.next.322 + %arrayidx6.4 = getelementptr inbounds [16000 x double]* @X, i64 0, i64 %indvars.iv.next.322 + %3 = bitcast double* %arrayidx.4 to <1 x double>* + %4 = load <1 x double>* %3, align 32, !tbaa !0 + %add.4 = fadd <1 x double> %4, <double 1.000000e+00> + %5 = bitcast double* %arrayidx6.4 to <1 x double>* + store <1 x double> %add.4, <1 x double>* %5, align 32, !tbaa !0 + %indvars.iv.next.726 = or i64 %indvars.iv, 8 + %arrayidx.8 = getelementptr inbounds [16000 x double]* @Y, i64 0, i64 %indvars.iv.next.726 + %arrayidx6.8 = getelementptr inbounds [16000 x double]* @X, i64 0, i64 %indvars.iv.next.726 + %6 = bitcast double* %arrayidx.8 to <1 x double>* + %7 = load <1 x double>* %6, align 32, !tbaa !0 + %add.8 = fadd <1 x double> %7, <double 1.000000e+00> + %8 = bitcast double* %arrayidx6.8 to <1 x double>* + store <1 x double> %add.8, <1 x double>* %8, align 32, !tbaa !0 + %indvars.iv.next.1130 = or i64 %indvars.iv, 12 + %arrayidx.12 = getelementptr inbounds [16000 x double]* @Y, i64 0, i64 %indvars.iv.next.1130 + %arrayidx6.12 = getelementptr inbounds [16000 x double]* @X, i64 0, i64 %indvars.iv.next.1130 + %9 = bitcast double* %arrayidx.12 to <1 x double>* + %10 = load <1 x double>* %9, align 32, !tbaa !0 + %add.12 = fadd <1 x double> %10, <double 1.000000e+00> + %11 = bitcast double* %arrayidx6.12 to <1 x double>* + store <1 x double> %add.12, <1 x double>* %11, align 32, !tbaa !0 + %indvars.iv.next.15 = add i64 %indvars.iv, 16 + %lftr.wideiv.15 = trunc i64 %indvars.iv.next.15 to i32 + %exitcond.15 = icmp eq i32 %lftr.wideiv.15, 16000 + br i1 %exitcond.15, label %for.end, label %for.body4 + +; All of the loads should come before all of the stores. +; CHECK: mtctr +; CHECK: stfd +; CHECK-NOT: lfd +; CHECK: bdnz + +for.end: ; preds = %for.body4 + %call7 = tail call signext i32 @dummy(double* getelementptr inbounds ([16000 x double]* @X, i64 0, i64 0), double* getelementptr inbounds ([16000 x double]* @Y, i64 0, i64 0), double* getelementptr inbounds ([16000 x double]* @Z, i64 0, i64 0), double* getelementptr inbounds ([16000 x double]* @U, i64 0, i64 0), double* getelementptr inbounds ([16000 x double]* @V, i64 0, i64 0), [256 x double]* getelementptr inbounds ([256 x [256 x double]]* @aa, i64 0, i64 0), [256 x double]* getelementptr inbounds ([256 x [256 x double]]* @bb, i64 0, i64 0), [256 x double]* getelementptr inbounds ([256 x [256 x double]]* @cc, i64 0, i64 0), double 0.000000e+00) nounwind + %inc9 = add nsw i32 %nl.018, 1 + %exitcond = icmp eq i32 %inc9, 400000 + br i1 %exitcond, label %for.end10, label %for.cond2.preheader + +for.end10: ; preds = %for.end + %call11 = tail call i64 @clock() nounwind + %sub = sub nsw i64 %call11, %call1 + %conv = sitofp i64 %sub to double + %div = fdiv double %conv, 1.000000e+06 + %call12 = tail call signext i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str137, i64 0, i64 0), double %div) nounwind + tail call void @check(i32 signext 1) + ret i32 0 +} + +declare i64 @clock() nounwind + +declare signext i32 @dummy(double*, double*, double*, double*, double*, [256 x double]*, [256 x double]*, [256 x double]*, double) + +!0 = metadata !{metadata !"double", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/PowerPC/sdag-ppcf128.ll b/test/CodeGen/PowerPC/sdag-ppcf128.ll new file mode 100644 index 000000000000..535ece6d3dfe --- /dev/null +++ b/test/CodeGen/PowerPC/sdag-ppcf128.ll @@ -0,0 +1,15 @@ +; RUN: llc -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s +; +; PR14751: Unsupported type in SelectionDAG::getConstantFP() + +define fastcc void @_D3std4math4sqrtFNaNbNfcZc() { +entry: + br i1 undef, label %if, label %else +; CHECK: cmplwi 0, 3, 0 +if: ; preds = %entry + store { ppc_fp128, ppc_fp128 } zeroinitializer, { ppc_fp128, ppc_fp128 }* undef + ret void + +else: ; preds = %entry + unreachable +} diff --git a/test/CodeGen/PowerPC/sjlj.ll b/test/CodeGen/PowerPC/sjlj.ll new file mode 100644 index 000000000000..7ea35dafc3fa --- /dev/null +++ b/test/CodeGen/PowerPC/sjlj.ll @@ -0,0 +1,112 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 | FileCheck -check-prefix=CHECK-NOAV %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +%struct.__jmp_buf_tag = type { [64 x i64], i32, %struct.__sigset_t, [8 x i8] } +%struct.__sigset_t = type { [16 x i64] } + +@env_sigill = internal global [1 x %struct.__jmp_buf_tag] zeroinitializer, align 16 + +define void @foo() #0 { +entry: + call void @llvm.eh.sjlj.longjmp(i8* bitcast ([1 x %struct.__jmp_buf_tag]* @env_sigill to i8*)) + unreachable + +; CHECK: @foo +; CHECK: addis [[REG:[0-9]+]], 2, env_sigill@toc@ha +; CHECK: addi [[REG]], [[REG]], env_sigill@toc@l +; CHECK: ld 31, 0([[REG]]) +; CHECK: ld [[REG2:[0-9]+]], 8([[REG]]) +; CHECK: ld 1, 16([[REG]]) +; CHECK: mtctr [[REG2]] +; CHECK: ld 2, 24([[REG]]) +; CHECK: bctr + +return: ; No predecessors! + ret void +} + +declare void @llvm.eh.sjlj.longjmp(i8*) #1 + +define signext i32 @main() #0 { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = call i8* @llvm.frameaddress(i32 0) + store i8* %0, i8** bitcast ([1 x %struct.__jmp_buf_tag]* @env_sigill to i8**) + %1 = call i8* @llvm.stacksave() + store i8* %1, i8** getelementptr (i8** bitcast ([1 x %struct.__jmp_buf_tag]* @env_sigill to i8**), i32 2) + %2 = call i32 @llvm.eh.sjlj.setjmp(i8* bitcast ([1 x %struct.__jmp_buf_tag]* @env_sigill to i8*)) + %tobool = icmp ne i32 %2, 0 + br i1 %tobool, label %if.then, label %if.else + +if.then: ; preds = %entry + store i32 1, i32* %retval + br label %return + +if.else: ; preds = %entry + call void @foo() + br label %if.end + +if.end: ; preds = %if.else + store i32 0, i32* %retval + br label %return + +return: ; preds = %if.end, %if.then + %3 = load i32* %retval + ret i32 %3 + +; FIXME: We should be saving VRSAVE on Darwin, but we're not! + +; CHECK: @main +; CHECK: std +; Make sure that we're not saving VRSAVE on non-Darwin: +; CHECK-NOT: mfspr +; CHECK: stfd +; CHECK: stvx + +; CHECK: addis [[REG:[0-9]+]], 2, env_sigill@toc@ha +; CHECK: std 31, env_sigill@toc@l([[REG]]) +; CHECK: addi [[REG]], [[REG]], env_sigill@toc@l +; CHECK: std [[REG]], [[OFF:[0-9]+]](31) # 8-byte Folded Spill +; CHECK: std 1, 16([[REG]]) +; CHECK: std 2, 24([[REG]]) +; CHECK: bcl 20, 31, .LBB1_1 +; CHECK: li 3, 1 +; CHECK: #EH_SjLj_Setup .LBB1_1 +; CHECK: b .LBB1_2 + +; CHECK: .LBB1_1: +; CHECK: mflr [[REGL:[0-9]+]] +; CHECK: ld [[REG2:[0-9]+]], [[OFF]](31) # 8-byte Folded Reload +; CHECK: std [[REGL]], 8([[REG2]]) +; CHECK: li 3, 0 + +; CHECK: .LBB1_2: + +; CHECK: lfd +; CHECK: lvx +; CHECK: ld +; CHECK: blr + +; CHECK-NOAV: @main +; CHECK-NOAV-NOT: stvx +; CHECK-NOAV: bcl +; CHECK-NOAV: mflr +; CHECK-NOAV: bl foo +; CHECK-NOAV-NOT: lvx +; CHECK-NOAV: blr +} + +declare i8* @llvm.frameaddress(i32) #2 + +declare i8* @llvm.stacksave() #3 + +declare i32 @llvm.eh.sjlj.setjmp(i8*) #3 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { noreturn nounwind } +attributes #2 = { nounwind readnone } +attributes #3 = { nounwind } + diff --git a/test/CodeGen/PowerPC/stdux-constuse.ll b/test/CodeGen/PowerPC/stdux-constuse.ll new file mode 100644 index 000000000000..e62d438014ee --- /dev/null +++ b/test/CodeGen/PowerPC/stdux-constuse.ll @@ -0,0 +1,47 @@ +; RUN: llc -mcpu=a2 -disable-lsr < %s | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i32 @test1(i64 %add, i64* %ptr) nounwind { +entry: + %p1 = getelementptr i64* %ptr, i64 144115188075855 + br label %for.cond2.preheader + +for.cond2.preheader: + %nl.018 = phi i32 [ 0, %entry ], [ %inc9, %for.end ] + br label %for.body4 + +for.body4: + %lsr.iv = phi i32 [ %lsr.iv.next, %for.body4 ], [ 16000, %for.cond2.preheader ] + %i0 = phi i64* [ %p1, %for.cond2.preheader ], [ %i6, %for.body4 ] + %i6 = getelementptr i64* %i0, i64 400000 + %i7 = getelementptr i64* %i6, i64 300000 + %i8 = getelementptr i64* %i6, i64 200000 + %i9 = getelementptr i64* %i6, i64 100000 + store i64 %add, i64* %i6, align 32 + store i64 %add, i64* %i7, align 32 + store i64 %add, i64* %i8, align 32 + store i64 %add, i64* %i9, align 32 + %lsr.iv.next = add i32 %lsr.iv, -16 + %exitcond.15 = icmp eq i32 %lsr.iv.next, 0 + br i1 %exitcond.15, label %for.end, label %for.body4 + +; Make sure that we generate the most compact form of this loop with no +; unnecessary moves +; CHECK: @test1 +; CHECK: mtctr +; CHECK: stdux +; CHECK-NEXT: stdx +; CHECK-NEXT: stdx +; CHECK-NEXT: stdx +; CHECK-NEXT: bdnz + +for.end: + %inc9 = add nsw i32 %nl.018, 1 + %exitcond = icmp eq i32 %inc9, 400000 + br i1 %exitcond, label %for.end10, label %for.cond2.preheader + +for.end10: + ret i32 0 +} + diff --git a/test/CodeGen/PowerPC/stfiwx-2.ll b/test/CodeGen/PowerPC/stfiwx-2.ll index c49b25cc2303..7786fc17eacb 100644 --- a/test/CodeGen/PowerPC/stfiwx-2.ll +++ b/test/CodeGen/PowerPC/stfiwx-2.ll @@ -1,11 +1,14 @@ -; This cannot be a stfiwx -; RUN: llc < %s -march=ppc32 -mcpu=g5 | grep stb -; RUN: llc < %s -march=ppc32 -mcpu=g5 | not grep stfiwx +; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -mcpu=g5 | FileCheck %s define void @test(float %F, i8* %P) { %I = fptosi float %F to i32 %X = trunc i32 %I to i8 store i8 %X, i8* %P ret void +; CHECK: fctiwz 0, 1 +; CHECK: stfiwx 0, 0, 4 +; CHECK: lwz 4, 12(1) +; CHECK: stb 4, 0(3) +; CHECK: blr } diff --git a/test/CodeGen/PowerPC/store-update.ll b/test/CodeGen/PowerPC/store-update.ll new file mode 100644 index 000000000000..538ed24fbc46 --- /dev/null +++ b/test/CodeGen/PowerPC/store-update.ll @@ -0,0 +1,170 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define i8* @stbu(i8* %base, i8 zeroext %val) nounwind { +entry: + %arrayidx = getelementptr inbounds i8* %base, i64 16 + store i8 %val, i8* %arrayidx, align 1 + ret i8* %arrayidx +} +; CHECK: @stbu +; CHECK: %entry +; CHECK-NEXT: stbu +; CHECK-NEXT: blr + +define i8* @stbux(i8* %base, i8 zeroext %val, i64 %offset) nounwind { +entry: + %arrayidx = getelementptr inbounds i8* %base, i64 %offset + store i8 %val, i8* %arrayidx, align 1 + ret i8* %arrayidx +} +; CHECK: @stbux +; CHECK: %entry +; CHECK-NEXT: stbux +; CHECK-NEXT: blr + +define i16* @sthu(i16* %base, i16 zeroext %val) nounwind { +entry: + %arrayidx = getelementptr inbounds i16* %base, i64 16 + store i16 %val, i16* %arrayidx, align 2 + ret i16* %arrayidx +} +; CHECK: @sthu +; CHECK: %entry +; CHECK-NEXT: sthu +; CHECK-NEXT: blr + +define i16* @sthux(i16* %base, i16 zeroext %val, i64 %offset) nounwind { +entry: + %arrayidx = getelementptr inbounds i16* %base, i64 %offset + store i16 %val, i16* %arrayidx, align 2 + ret i16* %arrayidx +} +; CHECK: @sthux +; CHECK: %entry +; CHECK-NEXT: sldi +; CHECK-NEXT: sthux +; CHECK-NEXT: blr + +define i32* @stwu(i32* %base, i32 zeroext %val) nounwind { +entry: + %arrayidx = getelementptr inbounds i32* %base, i64 16 + store i32 %val, i32* %arrayidx, align 4 + ret i32* %arrayidx +} +; CHECK: @stwu +; CHECK: %entry +; CHECK-NEXT: stwu +; CHECK-NEXT: blr + +define i32* @stwux(i32* %base, i32 zeroext %val, i64 %offset) nounwind { +entry: + %arrayidx = getelementptr inbounds i32* %base, i64 %offset + store i32 %val, i32* %arrayidx, align 4 + ret i32* %arrayidx +} +; CHECK: @stwux +; CHECK: %entry +; CHECK-NEXT: sldi +; CHECK-NEXT: stwux +; CHECK-NEXT: blr + +define i8* @stbu8(i8* %base, i64 %val) nounwind { +entry: + %conv = trunc i64 %val to i8 + %arrayidx = getelementptr inbounds i8* %base, i64 16 + store i8 %conv, i8* %arrayidx, align 1 + ret i8* %arrayidx +} +; CHECK: @stbu +; CHECK: %entry +; CHECK-NEXT: stbu +; CHECK-NEXT: blr + +define i8* @stbux8(i8* %base, i64 %val, i64 %offset) nounwind { +entry: + %conv = trunc i64 %val to i8 + %arrayidx = getelementptr inbounds i8* %base, i64 %offset + store i8 %conv, i8* %arrayidx, align 1 + ret i8* %arrayidx +} +; CHECK: @stbux +; CHECK: %entry +; CHECK-NEXT: stbux +; CHECK-NEXT: blr + +define i16* @sthu8(i16* %base, i64 %val) nounwind { +entry: + %conv = trunc i64 %val to i16 + %arrayidx = getelementptr inbounds i16* %base, i64 16 + store i16 %conv, i16* %arrayidx, align 2 + ret i16* %arrayidx +} +; CHECK: @sthu +; CHECK: %entry +; CHECK-NEXT: sthu +; CHECK-NEXT: blr + +define i16* @sthux8(i16* %base, i64 %val, i64 %offset) nounwind { +entry: + %conv = trunc i64 %val to i16 + %arrayidx = getelementptr inbounds i16* %base, i64 %offset + store i16 %conv, i16* %arrayidx, align 2 + ret i16* %arrayidx +} +; CHECK: @sthux +; CHECK: %entry +; CHECK-NEXT: sldi +; CHECK-NEXT: sthux +; CHECK-NEXT: blr + +define i32* @stwu8(i32* %base, i64 %val) nounwind { +entry: + %conv = trunc i64 %val to i32 + %arrayidx = getelementptr inbounds i32* %base, i64 16 + store i32 %conv, i32* %arrayidx, align 4 + ret i32* %arrayidx +} +; CHECK: @stwu +; CHECK: %entry +; CHECK-NEXT: stwu +; CHECK-NEXT: blr + +define i32* @stwux8(i32* %base, i64 %val, i64 %offset) nounwind { +entry: + %conv = trunc i64 %val to i32 + %arrayidx = getelementptr inbounds i32* %base, i64 %offset + store i32 %conv, i32* %arrayidx, align 4 + ret i32* %arrayidx +} +; CHECK: @stwux +; CHECK: %entry +; CHECK-NEXT: sldi +; CHECK-NEXT: stwux +; CHECK-NEXT: blr + +define i64* @stdu(i64* %base, i64 %val) nounwind { +entry: + %arrayidx = getelementptr inbounds i64* %base, i64 16 + store i64 %val, i64* %arrayidx, align 8 + ret i64* %arrayidx +} +; CHECK: @stdu +; CHECK: %entry +; CHECK-NEXT: stdu +; CHECK-NEXT: blr + +define i64* @stdux(i64* %base, i64 %val, i64 %offset) nounwind { +entry: + %arrayidx = getelementptr inbounds i64* %base, i64 %offset + store i64 %val, i64* %arrayidx, align 8 + ret i64* %arrayidx +} +; CHECK: @stdux +; CHECK: %entry +; CHECK-NEXT: sldi +; CHECK-NEXT: stdux +; CHECK-NEXT: blr + diff --git a/test/CodeGen/PowerPC/structsinmem.ll b/test/CodeGen/PowerPC/structsinmem.ll index 884d3a89d15a..2a17e740ea01 100644 --- a/test/CodeGen/PowerPC/structsinmem.ll +++ b/test/CodeGen/PowerPC/structsinmem.ll @@ -1,9 +1,5 @@ ; RUN: llc -mcpu=pwr7 -O0 -disable-fp-elim < %s | FileCheck %s -; FIXME: The code generation for packed structs is very poor because the -; PowerPC target wrongly rejects all unaligned loads. This test case will -; need to be revised when that is fixed. - target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" target triple = "powerpc64-unknown-linux-gnu" @@ -118,8 +114,8 @@ entry: ret i32 %add13 ; CHECK: lha {{[0-9]+}}, 126(1) -; CHECK: lbz {{[0-9]+}}, 119(1) ; CHECK: lha {{[0-9]+}}, 132(1) +; CHECK: lbz {{[0-9]+}}, 119(1) ; CHECK: lwz {{[0-9]+}}, 140(1) ; CHECK: lwz {{[0-9]+}}, 144(1) ; CHECK: lwz {{[0-9]+}}, 152(1) @@ -209,19 +205,11 @@ entry: %add13 = add nsw i32 %add11, %6 ret i32 %add13 -; CHECK: lbz {{[0-9]+}}, 149(1) -; CHECK: lbz {{[0-9]+}}, 150(1) -; CHECK: lbz {{[0-9]+}}, 147(1) -; CHECK: lbz {{[0-9]+}}, 148(1) -; CHECK: lbz {{[0-9]+}}, 133(1) -; CHECK: lbz {{[0-9]+}}, 134(1) ; CHECK: lha {{[0-9]+}}, 126(1) +; CHECK: lha {{[0-9]+}}, 133(1) ; CHECK: lbz {{[0-9]+}}, 119(1) ; CHECK: lwz {{[0-9]+}}, 140(1) -; CHECK: lhz {{[0-9]+}}, 154(1) -; CHECK: lhz {{[0-9]+}}, 156(1) -; CHECK: lbz {{[0-9]+}}, 163(1) -; CHECK: lbz {{[0-9]+}}, 164(1) -; CHECK: lbz {{[0-9]+}}, 161(1) -; CHECK: lbz {{[0-9]+}}, 162(1) +; CHECK: lwz {{[0-9]+}}, 147(1) +; CHECK: lwz {{[0-9]+}}, 154(1) +; CHECK: lwz {{[0-9]+}}, 161(1) } diff --git a/test/CodeGen/PowerPC/structsinregs.ll b/test/CodeGen/PowerPC/structsinregs.ll index ef706af95d65..54de6060d0f0 100644 --- a/test/CodeGen/PowerPC/structsinregs.ll +++ b/test/CodeGen/PowerPC/structsinregs.ll @@ -1,9 +1,5 @@ ; RUN: llc -mcpu=pwr7 -O0 -disable-fp-elim < %s | FileCheck %s -; FIXME: The code generation for packed structs is very poor because the -; PowerPC target wrongly rejects all unaligned loads. This test case will -; need to be revised when that is fixed. - target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" target triple = "powerpc64-unknown-linux-gnu" @@ -63,13 +59,13 @@ entry: %call = call i32 @callee1(%struct.s1* byval %p1, %struct.s2* byval %p2, %struct.s3* byval %p3, %struct.s4* byval %p4, %struct.s5* byval %p5, %struct.s6* byval %p6, %struct.s7* byval %p7) ret i32 %call -; CHECK: ld 9, 128(31) -; CHECK: ld 8, 136(31) -; CHECK: ld 7, 144(31) -; CHECK: lwz 6, 152(31) -; CHECK: lwz 5, 160(31) -; CHECK: lhz 4, 168(31) -; CHECK: lbz 3, 176(31) +; CHECK: ld 9, 112(31) +; CHECK: ld 8, 120(31) +; CHECK: ld 7, 128(31) +; CHECK: lwz 6, 136(31) +; CHECK: lwz 5, 144(31) +; CHECK: lhz 4, 152(31) +; CHECK: lbz 3, 160(31) } declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind @@ -109,8 +105,8 @@ entry: ; CHECK: sth 4, 62(1) ; CHECK: stb 3, 55(1) ; CHECK: lha {{[0-9]+}}, 62(1) -; CHECK: lbz {{[0-9]+}}, 55(1) ; CHECK: lha {{[0-9]+}}, 68(1) +; CHECK: lbz {{[0-9]+}}, 55(1) ; CHECK: lwz {{[0-9]+}}, 76(1) ; CHECK: lwz {{[0-9]+}}, 80(1) ; CHECK: lwz {{[0-9]+}}, 88(1) @@ -155,10 +151,10 @@ entry: ; CHECK: ld 9, 96(1) ; CHECK: ld 8, 88(1) ; CHECK: ld 7, 80(1) -; CHECK: lwz 6, 152(31) +; CHECK: lwz 6, 136(31) ; CHECK: ld 5, 64(1) -; CHECK: lhz 4, 168(31) -; CHECK: lbz 3, 176(31) +; CHECK: lhz 4, 152(31) +; CHECK: lbz 3, 160(31) } define internal i32 @callee2(%struct.t1* byval %v1, %struct.t2* byval %v2, %struct.t3* byval %v3, %struct.t4* byval %v4, %struct.t5* byval %v5, %struct.t6* byval %v6, %struct.t7* byval %v7) nounwind { @@ -195,19 +191,11 @@ entry: ; CHECK: std 5, 64(1) ; CHECK: sth 4, 62(1) ; CHECK: stb 3, 55(1) -; CHECK: lbz {{[0-9]+}}, 85(1) -; CHECK: lbz {{[0-9]+}}, 86(1) -; CHECK: lbz {{[0-9]+}}, 83(1) -; CHECK: lbz {{[0-9]+}}, 84(1) -; CHECK: lbz {{[0-9]+}}, 69(1) -; CHECK: lbz {{[0-9]+}}, 70(1) ; CHECK: lha {{[0-9]+}}, 62(1) +; CHECK: lha {{[0-9]+}}, 69(1) ; CHECK: lbz {{[0-9]+}}, 55(1) ; CHECK: lwz {{[0-9]+}}, 76(1) -; CHECK: lhz {{[0-9]+}}, 90(1) -; CHECK: lhz {{[0-9]+}}, 92(1) -; CHECK: lbz {{[0-9]+}}, 99(1) -; CHECK: lbz {{[0-9]+}}, 100(1) -; CHECK: lbz {{[0-9]+}}, 97(1) -; CHECK: lbz {{[0-9]+}}, 98(1) +; CHECK: lwz {{[0-9]+}}, 83(1) +; CHECK: lwz {{[0-9]+}}, 90(1) +; CHECK: lwz {{[0-9]+}}, 97(1) } diff --git a/test/CodeGen/PowerPC/stubs.ll b/test/CodeGen/PowerPC/stubs.ll index 4889263b4c4e..cfcc50b7a876 100644 --- a/test/CodeGen/PowerPC/stubs.ll +++ b/test/CodeGen/PowerPC/stubs.ll @@ -10,8 +10,8 @@ entry: ; CHECK: .section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16 ; CHECK: ___floatditf$stub: ; CHECK: .indirect_symbol ___floatditf -; CHECK: lis r11,ha16(___floatditf$lazy_ptr) -; CHECK: lwzu r12,lo16(___floatditf$lazy_ptr)(r11) +; CHECK: lis r11, ha16(___floatditf$lazy_ptr) +; CHECK: lwzu r12, lo16(___floatditf$lazy_ptr)(r11) ; CHECK: mtctr r12 ; CHECK: bctr ; CHECK: .section __DATA,__la_symbol_ptr,lazy_symbol_pointers diff --git a/test/CodeGen/PowerPC/stwu8.ll b/test/CodeGen/PowerPC/stwu8.ll index 897bfc6d6caa..e0bd04345439 100644 --- a/test/CodeGen/PowerPC/stwu8.ll +++ b/test/CodeGen/PowerPC/stwu8.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s | FileCheck %s +; RUN: llc -disable-ppc-unaligned < %s | FileCheck %s target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" target triple = "powerpc64-unknown-linux-gnu" diff --git a/test/CodeGen/PowerPC/svr4-redzone.ll b/test/CodeGen/PowerPC/svr4-redzone.ll new file mode 100644 index 000000000000..91ff5797389b --- /dev/null +++ b/test/CodeGen/PowerPC/svr4-redzone.ll @@ -0,0 +1,39 @@ +; RUN: llc -mtriple="powerpc-unknown-linux-gnu" < %s | FileCheck %s --check-prefix=PPC32 +; RUN: llc -mtriple="powerpc64-unknown-linux-gnu" < %s | FileCheck %s --check-prefix=PPC64 +; PR15332 + +define void @regalloc() nounwind { +entry: + %0 = add i32 1, 2 + ret void +} +; PPC32: regalloc: +; PPC32-NOT: stwu 1, -{{[0-9]+}}(1) +; PPC32: blr + +; PPC64: regalloc: +; PPC64-NOT: stdu 1, -{{[0-9]+}}(1) +; PPC64: blr + +define void @smallstack() nounwind { +entry: + %0 = alloca i8, i32 4 + ret void +} +; PPC32: smallstack: +; PPC32: stwu 1, -16(1) + +; PPC64: smallstack: +; PPC64-NOT: stdu 1, -{{[0-9]+}}(1) +; PPC64: blr + +define void @bigstack() nounwind { +entry: + %0 = alloca i8, i32 230 + ret void +} +; PPC32: bigstack: +; PPC32: stwu 1, -240(1) + +; PPC64: bigstack: +; PPC64: stdu 1, -352(1) diff --git a/test/CodeGen/PowerPC/tls-2.ll b/test/CodeGen/PowerPC/tls-2.ll new file mode 100644 index 000000000000..20d8fe46ea17 --- /dev/null +++ b/test/CodeGen/PowerPC/tls-2.ll @@ -0,0 +1,15 @@ +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" +target triple = "powerpc64-unknown-freebsd10.0" +; RUN: llc -O1 < %s -march=ppc64 | FileCheck %s + +@a = thread_local global i32 0, align 4 + +;CHECK: localexec: +define i32 @localexec() nounwind { +entry: +;CHECK: addis [[REG1:[0-9]+]], 13, a@tprel@ha +;CHECK-NEXT: li [[REG2:[0-9]+]], 42 +;CHECK-NEXT: stw [[REG2]], a@tprel@l([[REG1]]) + store i32 42, i32* @a, align 4 + ret i32 0 +} diff --git a/test/CodeGen/PowerPC/tls-gd-obj.ll b/test/CodeGen/PowerPC/tls-gd-obj.ll new file mode 100644 index 000000000000..00b537d5325b --- /dev/null +++ b/test/CodeGen/PowerPC/tls-gd-obj.ll @@ -0,0 +1,41 @@ +; RUN: llc -mcpu=pwr7 -O0 -filetype=obj -relocation-model=pic %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck %s + +; Test correct relocation generation for thread-local storage using +; the general dynamic model and integrated assembly. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@a = thread_local global i32 0, align 4 + +define signext i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @a, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_GOT_TLSGD16_HA, R_PPC64_GOT_TLSGD16_LO, +; and R_PPC64_TLSGD for accessing external variable a, and R_PPC64_REL24 +; for the call to __tls_get_addr. +; +; CHECK: '.rela.text' +; CHECK: Relocation 0 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1:[0-9a-f]+]] +; CHECK-NEXT: 'r_type', 0x00000052 +; CHECK: Relocation 1 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1]] +; CHECK-NEXT: 'r_type', 0x00000050 +; CHECK: Relocation 2 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1]] +; CHECK-NEXT: 'r_type', 0x0000006b +; CHECK: Relocation 3 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x{{[0-9a-f]+}} +; CHECK-NEXT: 'r_type', 0x0000000a + diff --git a/test/CodeGen/PowerPC/tls-gd.ll b/test/CodeGen/PowerPC/tls-gd.ll new file mode 100644 index 000000000000..5f0ef9a050da --- /dev/null +++ b/test/CodeGen/PowerPC/tls-gd.ll @@ -0,0 +1,23 @@ +; RUN: llc -mcpu=pwr7 -O0 -relocation-model=pic < %s | FileCheck %s + +; Test correct assembly code generation for thread-local storage using +; the general dynamic model. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@a = thread_local global i32 0, align 4 + +define signext i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @a, align 4 + ret i32 %0 +} + +; CHECK: addis [[REG:[0-9]+]], 2, a@got@tlsgd@ha +; CHECK-NEXT: addi 3, [[REG]], a@got@tlsgd@l +; CHECK: bl __tls_get_addr(a@tlsgd) +; CHECK-NEXT: nop + diff --git a/test/CodeGen/PowerPC/tls-ie-obj.ll b/test/CodeGen/PowerPC/tls-ie-obj.ll new file mode 100644 index 000000000000..3600cc52ba54 --- /dev/null +++ b/test/CodeGen/PowerPC/tls-ie-obj.ll @@ -0,0 +1,36 @@ +; RUN: llc -mcpu=pwr7 -O0 -filetype=obj %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck %s + +; Test correct relocation generation for thread-local storage +; using the initial-exec model and integrated assembly. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@a = external thread_local global i32 + +define signext i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @a, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_GOT_TPREL16_DS and R_PPC64_TLS for +; accessing external variable a. +; +; CHECK: '.rela.text' +; CHECK: Relocation 0 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1:[0-9a-f]+]] +; CHECK-NEXT: 'r_type', 0x0000005a +; CHECK: Relocation 1 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1]] +; CHECK-NEXT: 'r_type', 0x00000058 +; CHECK: Relocation 2 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1]] +; CHECK-NEXT: 'r_type', 0x00000043 + diff --git a/test/CodeGen/PowerPC/tls-ie.ll b/test/CodeGen/PowerPC/tls-ie.ll new file mode 100644 index 000000000000..c5cfba7b3f7a --- /dev/null +++ b/test/CodeGen/PowerPC/tls-ie.ll @@ -0,0 +1,22 @@ +; RUN: llc -mcpu=pwr7 -O0 <%s | FileCheck %s + +; Test correct assembly code generation for thread-local storage +; using the initial-exec model. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@a = external thread_local global i32 + +define signext i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @a, align 4 + ret i32 %0 +} + +; CHECK: addis [[REG1:[0-9]+]], 2, a@got@tprel@ha +; CHECK: ld [[REG2:[0-9]+]], a@got@tprel@l([[REG1]]) +; CHECK: add {{[0-9]+}}, [[REG2]], a@tls + diff --git a/test/CodeGen/PowerPC/tls-ld-2.ll b/test/CodeGen/PowerPC/tls-ld-2.ll new file mode 100644 index 000000000000..4399b330ea47 --- /dev/null +++ b/test/CodeGen/PowerPC/tls-ld-2.ll @@ -0,0 +1,24 @@ +; RUN: llc -mcpu=pwr7 -O1 -relocation-model=pic < %s | FileCheck %s + +; Test peephole optimization for thread-local storage using the +; local dynamic model. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@a = hidden thread_local global i32 0, align 4 + +define signext i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @a, align 4 + ret i32 %0 +} + +; CHECK: addis [[REG:[0-9]+]], 2, a@got@tlsld@ha +; CHECK-NEXT: addi 3, [[REG]], a@got@tlsld@l +; CHECK: bl __tls_get_addr(a@tlsld) +; CHECK-NEXT: nop +; CHECK: addis [[REG2:[0-9]+]], 3, a@dtprel@ha +; CHECK-NEXT: lwa {{[0-9]+}}, a@dtprel@l([[REG2]]) diff --git a/test/CodeGen/PowerPC/tls-ld-obj.ll b/test/CodeGen/PowerPC/tls-ld-obj.ll new file mode 100644 index 000000000000..c521ae405f46 --- /dev/null +++ b/test/CodeGen/PowerPC/tls-ld-obj.ll @@ -0,0 +1,50 @@ +; RUN: llc -mcpu=pwr7 -O0 -filetype=obj -relocation-model=pic %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck %s + +; Test correct relocation generation for thread-local storage using +; the local dynamic model. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@a = hidden thread_local global i32 0, align 4 + +define signext i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @a, align 4 + ret i32 %0 +} + +; Verify generation of R_PPC64_GOT_TLSLD16_HA, R_PPC64_GOT_TLSLD16_LO, +; R_PPC64_TLSLD, R_PPC64_DTPREL16_HA, and R_PPC64_DTPREL16_LO for +; accessing external variable a, and R_PPC64_REL24 for the call to +; __tls_get_addr. +; +; CHECK: '.rela.text' +; CHECK: Relocation 0 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1:[0-9a-f]+]] +; CHECK-NEXT: 'r_type', 0x00000056 +; CHECK: Relocation 1 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1]] +; CHECK-NEXT: 'r_type', 0x00000054 +; CHECK: Relocation 2 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1]] +; CHECK-NEXT: 'r_type', 0x0000006c +; CHECK: Relocation 3 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x{{[0-9a-f]+}} +; CHECK-NEXT: 'r_type', 0x0000000a +; CHECK: Relocation 4 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1]] +; CHECK-NEXT: 'r_type', 0x0000004d +; CHECK: Relocation 5 +; CHECK-NEXT: 'r_offset' +; CHECK-NEXT: 'r_sym', 0x[[SYM1]] +; CHECK-NEXT: 'r_type', 0x0000004b + diff --git a/test/CodeGen/PowerPC/tls-ld.ll b/test/CodeGen/PowerPC/tls-ld.ll new file mode 100644 index 000000000000..db02a56f6a22 --- /dev/null +++ b/test/CodeGen/PowerPC/tls-ld.ll @@ -0,0 +1,24 @@ +; RUN: llc -mcpu=pwr7 -O0 -relocation-model=pic < %s | FileCheck %s + +; Test correct assembly code generation for thread-local storage using +; the local dynamic model. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +@a = hidden thread_local global i32 0, align 4 + +define signext i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @a, align 4 + ret i32 %0 +} + +; CHECK: addis [[REG:[0-9]+]], 2, a@got@tlsld@ha +; CHECK-NEXT: addi 3, [[REG]], a@got@tlsld@l +; CHECK: bl __tls_get_addr(a@tlsld) +; CHECK-NEXT: nop +; CHECK: addis [[REG2:[0-9]+]], 3, a@dtprel@ha +; CHECK-NEXT: addi {{[0-9]+}}, [[REG2]], a@dtprel@l diff --git a/test/CodeGen/PowerPC/tls.ll b/test/CodeGen/PowerPC/tls.ll index 713893bf5862..2daa60ab37f2 100644 --- a/test/CodeGen/PowerPC/tls.ll +++ b/test/CodeGen/PowerPC/tls.ll @@ -1,16 +1,21 @@ target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" target triple = "powerpc64-unknown-freebsd10.0" -; RUN: llc < %s -march=ppc64 | FileCheck %s +; RUN: llc -O0 < %s -march=ppc64 | FileCheck -check-prefix=OPT0 %s +; RUN: llc -O1 < %s -march=ppc64 | FileCheck -check-prefix=OPT1 %s @a = thread_local global i32 0, align 4 -;CHECK: localexec: +;OPT0: localexec: +;OPT1: localexec: define i32 @localexec() nounwind { entry: -;CHECK: addis [[REG1:[0-9]+]], 13, a@tprel@ha -;CHECK-NEXT: li [[REG2:[0-9]+]], 42 -;CHECK-NEXT: addi [[REG1]], [[REG1]], a@tprel@l -;CHECK-NEXT: stw [[REG2]], 0([[REG1]]) +;OPT0: addis [[REG1:[0-9]+]], 13, a@tprel@ha +;OPT0-NEXT: li [[REG2:[0-9]+]], 42 +;OPT0-NEXT: addi [[REG1]], [[REG1]], a@tprel@l +;OPT0: stw [[REG2]], 0([[REG1]]) +;OPT1: addis [[REG1:[0-9]+]], 13, a@tprel@ha +;OPT1-NEXT: li [[REG2:[0-9]+]], 42 +;OPT1-NEXT: stw [[REG2]], a@tprel@l([[REG1]]) store i32 42, i32* @a, align 4 ret i32 0 } diff --git a/test/CodeGen/PowerPC/unal4-std.ll b/test/CodeGen/PowerPC/unal4-std.ll new file mode 100644 index 000000000000..169bd787c0c1 --- /dev/null +++ b/test/CodeGen/PowerPC/unal4-std.ll @@ -0,0 +1,27 @@ +; RUN: llc < %s -mcpu=pwr7 | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +define fastcc void @copy_to_conceal() #0 { +entry: + br i1 undef, label %if.then, label %if.end210 + +if.then: ; preds = %entry + br label %vector.body.i + +vector.body.i: ; preds = %vector.body.i, %if.then + %index.i = phi i64 [ 0, %vector.body.i ], [ 0, %if.then ] + store <8 x i16> zeroinitializer, <8 x i16>* undef, align 2 + br label %vector.body.i + +if.end210: ; preds = %entry + ret void + +; This will generate two align-1 i64 stores. Make sure that they are +; indexed stores and not in r+i form (which require the offset to be +; a multiple of 4). +; CHECK: @copy_to_conceal +; CHECK: stdx {{[0-9]+}}, 0, +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } diff --git a/test/CodeGen/PowerPC/unaligned.ll b/test/CodeGen/PowerPC/unaligned.ll new file mode 100644 index 000000000000..d05080338f33 --- /dev/null +++ b/test/CodeGen/PowerPC/unaligned.ll @@ -0,0 +1,73 @@ +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s +target datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128-n32" + +define void @foo1(i16* %p, i16* %r) nounwind { +entry: + %v = load i16* %p, align 1 + store i16 %v, i16* %r, align 1 + ret void + +; CHECK: @foo1 +; CHECK: lhz +; CHECK: sth +} + +define void @foo2(i32* %p, i32* %r) nounwind { +entry: + %v = load i32* %p, align 1 + store i32 %v, i32* %r, align 1 + ret void + +; CHECK: @foo2 +; CHECK: lwz +; CHECK: stw +} + +define void @foo3(i64* %p, i64* %r) nounwind { +entry: + %v = load i64* %p, align 1 + store i64 %v, i64* %r, align 1 + ret void + +; CHECK: @foo3 +; CHECK: ld +; CHECK: std +} + +define void @foo4(float* %p, float* %r) nounwind { +entry: + %v = load float* %p, align 1 + store float %v, float* %r, align 1 + ret void + +; CHECK: @foo4 +; CHECK: lfs +; CHECK: stfs +} + +define void @foo5(double* %p, double* %r) nounwind { +entry: + %v = load double* %p, align 1 + store double %v, double* %r, align 1 + ret void + +; CHECK: @foo5 +; CHECK: lfd +; CHECK: stfd +} + +define void @foo6(<4 x float>* %p, <4 x float>* %r) nounwind { +entry: + %v = load <4 x float>* %p, align 1 + store <4 x float> %v, <4 x float>* %r, align 1 + ret void + +; These loads and stores are legalized into aligned loads and stores +; using aligned stack slots. +; CHECK: @foo6 +; CHECK: ld +; CHECK: ld +; CHECK: std +; CHECK: std +} + diff --git a/test/CodeGen/PowerPC/vaddsplat.ll b/test/CodeGen/PowerPC/vaddsplat.ll new file mode 100644 index 000000000000..e65148aff03a --- /dev/null +++ b/test/CodeGen/PowerPC/vaddsplat.ll @@ -0,0 +1,149 @@ +; RUN: llc -O0 -mcpu=pwr7 <%s | FileCheck %s + +; Test optimizations of build_vector for 6-bit immediates. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +%v4i32 = type <4 x i32> +%v8i16 = type <8 x i16> +%v16i8 = type <16 x i8> + +define void @test_v4i32_pos_even(%v4i32* %P, %v4i32* %S) { + %p = load %v4i32* %P + %r = add %v4i32 %p, < i32 18, i32 18, i32 18, i32 18 > + store %v4i32 %r, %v4i32* %S + ret void +} + +; CHECK: test_v4i32_pos_even: +; CHECK: vspltisw [[REG1:[0-9]+]], 9 +; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG1]] + +define void @test_v4i32_neg_even(%v4i32* %P, %v4i32* %S) { + %p = load %v4i32* %P + %r = add %v4i32 %p, < i32 -28, i32 -28, i32 -28, i32 -28 > + store %v4i32 %r, %v4i32* %S + ret void +} + +; CHECK: test_v4i32_neg_even: +; CHECK: vspltisw [[REG1:[0-9]+]], -14 +; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG1]] + +define void @test_v8i16_pos_even(%v8i16* %P, %v8i16* %S) { + %p = load %v8i16* %P + %r = add %v8i16 %p, < i16 30, i16 30, i16 30, i16 30, i16 30, i16 30, i16 30, i16 30 > + store %v8i16 %r, %v8i16* %S + ret void +} + +; CHECK: test_v8i16_pos_even: +; CHECK: vspltish [[REG1:[0-9]+]], 15 +; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG1]] + +define void @test_v8i16_neg_even(%v8i16* %P, %v8i16* %S) { + %p = load %v8i16* %P + %r = add %v8i16 %p, < i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32 > + store %v8i16 %r, %v8i16* %S + ret void +} + +; CHECK: test_v8i16_neg_even: +; CHECK: vspltish [[REG1:[0-9]+]], -16 +; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG1]] + +define void @test_v16i8_pos_even(%v16i8* %P, %v16i8* %S) { + %p = load %v16i8* %P + %r = add %v16i8 %p, < i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16 > + store %v16i8 %r, %v16i8* %S + ret void +} + +; CHECK: test_v16i8_pos_even: +; CHECK: vspltisb [[REG1:[0-9]+]], 8 +; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG1]] + +define void @test_v16i8_neg_even(%v16i8* %P, %v16i8* %S) { + %p = load %v16i8* %P + %r = add %v16i8 %p, < i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18 > + store %v16i8 %r, %v16i8* %S + ret void +} + +; CHECK: test_v16i8_neg_even: +; CHECK: vspltisb [[REG1:[0-9]+]], -9 +; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG1]] + +define void @test_v4i32_pos_odd(%v4i32* %P, %v4i32* %S) { + %p = load %v4i32* %P + %r = add %v4i32 %p, < i32 27, i32 27, i32 27, i32 27 > + store %v4i32 %r, %v4i32* %S + ret void +} + +; CHECK: test_v4i32_pos_odd: +; CHECK: vspltisw [[REG2:[0-9]+]], -16 +; CHECK: vspltisw [[REG1:[0-9]+]], 11 +; CHECK: vsubuwm {{[0-9]+}}, [[REG1]], [[REG2]] + +define void @test_v4i32_neg_odd(%v4i32* %P, %v4i32* %S) { + %p = load %v4i32* %P + %r = add %v4i32 %p, < i32 -27, i32 -27, i32 -27, i32 -27 > + store %v4i32 %r, %v4i32* %S + ret void +} + +; CHECK: test_v4i32_neg_odd: +; CHECK: vspltisw [[REG2:[0-9]+]], -16 +; CHECK: vspltisw [[REG1:[0-9]+]], -11 +; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG2]] + +define void @test_v8i16_pos_odd(%v8i16* %P, %v8i16* %S) { + %p = load %v8i16* %P + %r = add %v8i16 %p, < i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31 > + store %v8i16 %r, %v8i16* %S + ret void +} + +; CHECK: test_v8i16_pos_odd: +; CHECK: vspltish [[REG2:[0-9]+]], -16 +; CHECK: vspltish [[REG1:[0-9]+]], 15 +; CHECK: vsubuhm {{[0-9]+}}, [[REG1]], [[REG2]] + +define void @test_v8i16_neg_odd(%v8i16* %P, %v8i16* %S) { + %p = load %v8i16* %P + %r = add %v8i16 %p, < i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31 > + store %v8i16 %r, %v8i16* %S + ret void +} + +; CHECK: test_v8i16_neg_odd: +; CHECK: vspltish [[REG2:[0-9]+]], -16 +; CHECK: vspltish [[REG1:[0-9]+]], -15 +; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG2]] + +define void @test_v16i8_pos_odd(%v16i8* %P, %v16i8* %S) { + %p = load %v16i8* %P + %r = add %v16i8 %p, < i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17 > + store %v16i8 %r, %v16i8* %S + ret void +} + +; CHECK: test_v16i8_pos_odd: +; CHECK: vspltisb [[REG2:[0-9]+]], -16 +; CHECK: vspltisb [[REG1:[0-9]+]], 1 +; CHECK: vsububm {{[0-9]+}}, [[REG1]], [[REG2]] + +define void @test_v16i8_neg_odd(%v16i8* %P, %v16i8* %S) { + %p = load %v16i8* %P + %r = add %v16i8 %p, < i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17 > + store %v16i8 %r, %v16i8* %S + ret void +} + +; CHECK: test_v16i8_neg_odd: +; CHECK: vspltisb [[REG2:[0-9]+]], -16 +; CHECK: vspltisb [[REG1:[0-9]+]], -1 +; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG2]] + diff --git a/test/CodeGen/PowerPC/varargs.ll b/test/CodeGen/PowerPC/varargs.ll index 1769be957ac4..90f0480d6ad2 100644 --- a/test/CodeGen/PowerPC/varargs.ll +++ b/test/CodeGen/PowerPC/varargs.ll @@ -8,15 +8,16 @@ define i8* @test1(i8** %foo) nounwind { } ; P32: test1: -; P32: lwz r4, 0(r3) -; P32: addi r5, r4, 4 -; P32: stw r5, 0(r3) -; P32: lwz r3, 0(r4) -; P32: blr +; P32: lwz r2, 0(r3) +; P32: addi r4, r2, 4 +; P32: stw r4, 0(r3) +; P32: lwz r3, 0(r2) +; P32: blr ; P64: test1: -; P64: ld r4, 0(r3) -; P64: addi r5, r4, 8 -; P64: std r5, 0(r3) -; P64: ld r3, 0(r4) -; P64: blr +; P64: ld r2, 0(r3) +; P64: addi r4, r2, 8 +; P64: std r4, 0(r3) +; P64: ld r3, 0(r2) +; P64: blr + diff --git a/test/CodeGen/PowerPC/vec_cmp.ll b/test/CodeGen/PowerPC/vec_cmp.ll index 3180f464d125..eb41667610cd 100644 --- a/test/CodeGen/PowerPC/vec_cmp.ll +++ b/test/CodeGen/PowerPC/vec_cmp.ll @@ -54,7 +54,7 @@ entry: } ; CHECK: v16si8_cmp_ne: ; CHECK: vcmpequb [[RET:[0-9]+]], 2, 3 -; CHECK-NOR: vnor 2, [[RET]], [[RET]] +; CHECK-NEXT: vnor 2, [[RET]], [[RET]] define <16 x i8> @v16si8_cmp_le(<16 x i8> %x, <16 x i8> %y) nounwind readnone { entry: diff --git a/test/CodeGen/PowerPC/vec_constants.ll b/test/CodeGen/PowerPC/vec_constants.ll index 399f19f8d2e2..e4799e50e6ad 100644 --- a/test/CodeGen/PowerPC/vec_constants.ll +++ b/test/CodeGen/PowerPC/vec_constants.ll @@ -1,4 +1,7 @@ -; RUN: llc < %s -march=ppc32 -mcpu=g5 | not grep CPI +; RUN: llc -O0 -mcpu=pwr7 < %s | FileCheck %s + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" define void @test1(<4 x i32>* %P1, <4 x i32>* %P2, <4 x float>* %P3) nounwind { %tmp = load <4 x i32>* %P1 ; <<4 x i32>> [#uses=1] @@ -13,32 +16,71 @@ define void @test1(<4 x i32>* %P1, <4 x i32>* %P2, <4 x float>* %P3) nounwind { %tmp13 = bitcast <4 x i32> %tmp12 to <4 x float> ; <<4 x float>> [#uses=1] store <4 x float> %tmp13, <4 x float>* %P3 ret void + +; CHECK: test1: +; CHECK-NOT: CPI } define <4 x i32> @test_30() nounwind { ret <4 x i32> < i32 30, i32 30, i32 30, i32 30 > + +; CHECK: test_30: +; CHECK: vspltisw +; CHECK-NEXT: vadduwm +; CHECK-NEXT: blr } define <4 x i32> @test_29() nounwind { ret <4 x i32> < i32 29, i32 29, i32 29, i32 29 > + +; CHECK: test_29: +; CHECK: vspltisw +; CHECK-NEXT: vspltisw +; CHECK-NEXT: vsubuwm +; CHECK-NEXT: blr } define <8 x i16> @test_n30() nounwind { ret <8 x i16> < i16 -30, i16 -30, i16 -30, i16 -30, i16 -30, i16 -30, i16 -30, i16 -30 > + +; CHECK: test_n30: +; CHECK: vspltish +; CHECK-NEXT: vadduhm +; CHECK-NEXT: blr } define <16 x i8> @test_n104() nounwind { ret <16 x i8> < i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104, i8 -104 > + +; CHECK: test_n104: +; CHECK: vspltisb +; CHECK-NEXT: vslb +; CHECK-NEXT: blr } define <4 x i32> @test_vsldoi() nounwind { ret <4 x i32> < i32 512, i32 512, i32 512, i32 512 > + +; CHECK: test_vsldoi: +; CHECK: vspltisw +; CHECK-NEXT: vsldoi +; CHECK-NEXT: blr } define <8 x i16> @test_vsldoi_65023() nounwind { ret <8 x i16> < i16 65023, i16 65023,i16 65023,i16 65023,i16 65023,i16 65023,i16 65023,i16 65023 > + +; CHECK: test_vsldoi_65023: +; CHECK: vspltish +; CHECK-NEXT: vsldoi +; CHECK-NEXT: blr } define <4 x i32> @test_rol() nounwind { ret <4 x i32> < i32 -11534337, i32 -11534337, i32 -11534337, i32 -11534337 > + +; CHECK: test_rol: +; CHECK: vspltisw +; CHECK-NEXT: vrlw +; CHECK-NEXT: blr } diff --git a/test/CodeGen/PowerPC/vec_extload.ll b/test/CodeGen/PowerPC/vec_extload.ll index 201c15b9c735..998645d90da6 100644 --- a/test/CodeGen/PowerPC/vec_extload.ll +++ b/test/CodeGen/PowerPC/vec_extload.ll @@ -1,4 +1,4 @@ -; RUN: llc -mcpu=pwr6 -mattr=+altivec < %s | FileCheck %s +; RUN: llc -mcpu=pwr6 -mattr=+altivec -code-model=small < %s | FileCheck %s ; Check vector extend load expansion with altivec enabled. @@ -15,55 +15,9 @@ define <16 x i8> @v16si8_sext_in_reg(<16 x i8> %a) { ret <16 x i8> %c } ; CHECK: v16si8_sext_in_reg: -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lbz -; CHECK: stb -; CHECK: lvx 2, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vslb +; CHECK: vsrab +; CHECK: blr ; The zero extend uses a more clever logic: a vector splat ; and a logic and to set higher bits to 0. @@ -83,31 +37,9 @@ define <8 x i16> @v8si16_sext_in_reg(<8 x i16> %a) { ret <8 x i16> %c } ; CHECK: v8si16_sext_in_reg: -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lhz -; CHECK: sth -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lhz -; CHECK: sth -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lhz -; CHECK: sth -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lhz -; CHECK: sth -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lhz -; CHECK: sth -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lhz -; CHECK: sth -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lhz -; CHECK: sth -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lhz -; CHECK: sth -; CHECK: lvx 2, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vslh +; CHECK: vsrah +; CHECK: blr ; Same as v8si16_sext_in_reg, but instead of creating the mask ; with a splat, loads it from memory. @@ -129,19 +61,9 @@ define <4 x i32> @v4si32_sext_in_reg(<4 x i32> %a) { ret <4 x i32> %c } ; CHECK: v4si32_sext_in_reg: -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lha -; CHECK: stw -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lha -; CHECK: stw -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lha -; CHECK: stw -; CHECK: stvx 2, {{[0-9]+}}, {{[0-9]+}} -; CHECK: lha -; CHECK: stw -; CHECK: lvx 2, {{[0-9]+}}, {{[0-9]+}} +; CHECK: vslw +; CHECK: vsraw +; CHECK: blr ; Same as v8si16_sext_in_reg. define <4 x i32> @v4si32_zext_in_reg(<4 x i32> %a) { diff --git a/test/CodeGen/PowerPC/vec_mul.ll b/test/CodeGen/PowerPC/vec_mul.ll index 80f4de4a1728..53bc75dd1078 100644 --- a/test/CodeGen/PowerPC/vec_mul.ll +++ b/test/CodeGen/PowerPC/vec_mul.ll @@ -1,5 +1,4 @@ -; RUN: llc < %s -march=ppc32 -mcpu=g5 | not grep mullw -; RUN: llc < %s -march=ppc32 -mcpu=g5 | grep vmsumuhm +; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -march=ppc32 -mattr=+altivec | FileCheck %s define <4 x i32> @test_v4i32(<4 x i32>* %X, <4 x i32>* %Y) { %tmp = load <4 x i32>* %X ; <<4 x i32>> [#uses=1] @@ -7,6 +6,9 @@ define <4 x i32> @test_v4i32(<4 x i32>* %X, <4 x i32>* %Y) { %tmp3 = mul <4 x i32> %tmp, %tmp2 ; <<4 x i32>> [#uses=1] ret <4 x i32> %tmp3 } +; CHECK: test_v4i32: +; CHECK: vmsumuhm +; CHECK-NOT: mullw define <8 x i16> @test_v8i16(<8 x i16>* %X, <8 x i16>* %Y) { %tmp = load <8 x i16>* %X ; <<8 x i16>> [#uses=1] @@ -14,6 +16,9 @@ define <8 x i16> @test_v8i16(<8 x i16>* %X, <8 x i16>* %Y) { %tmp3 = mul <8 x i16> %tmp, %tmp2 ; <<8 x i16>> [#uses=1] ret <8 x i16> %tmp3 } +; CHECK: test_v8i16: +; CHECK: vmladduhm +; CHECK-NOT: mullw define <16 x i8> @test_v16i8(<16 x i8>* %X, <16 x i8>* %Y) { %tmp = load <16 x i8>* %X ; <<16 x i8>> [#uses=1] @@ -21,3 +26,21 @@ define <16 x i8> @test_v16i8(<16 x i8>* %X, <16 x i8>* %Y) { %tmp3 = mul <16 x i8> %tmp, %tmp2 ; <<16 x i8>> [#uses=1] ret <16 x i8> %tmp3 } +; CHECK: test_v16i8: +; CHECK: vmuloub +; CHECK: vmuleub +; CHECK-NOT: mullw + +define <4 x float> @test_float(<4 x float>* %X, <4 x float>* %Y) { + %tmp = load <4 x float>* %X + %tmp2 = load <4 x float>* %Y + %tmp3 = fmul <4 x float> %tmp, %tmp2 + ret <4 x float> %tmp3 +} +; Check the creation of a negative zero float vector by creating a vector of +; all bits set and shifting it 31 bits to left, resulting a an vector of +; 4 x 0x80000000 (-0.0 as float). +; CHECK: test_float: +; CHECK: vspltisw [[ZNEG:[0-9]+]], -1 +; CHECK: vslw {{[0-9]+}}, [[ZNEG]], [[ZNEG]] +; CHECK: vmaddfp diff --git a/test/CodeGen/PowerPC/vec_rounding.ll b/test/CodeGen/PowerPC/vec_rounding.ll new file mode 100644 index 000000000000..7c55638620a9 --- /dev/null +++ b/test/CodeGen/PowerPC/vec_rounding.ll @@ -0,0 +1,172 @@ +; RUN: llc -mcpu=pwr6 -mattr=+altivec < %s | FileCheck %s + +; Check vector round to single-precision toward -infinity (vrfim) +; instruction generation using Altivec. + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +declare <2 x double> @llvm.floor.v2f64(<2 x double> %p) +define <2 x double> @floor_v2f64(<2 x double> %p) +{ + %t = call <2 x double> @llvm.floor.v2f64(<2 x double> %p) + ret <2 x double> %t +} +; CHECK: floor_v2f64: +; CHECK: frim +; CHECK: frim + +declare <4 x double> @llvm.floor.v4f64(<4 x double> %p) +define <4 x double> @floor_v4f64(<4 x double> %p) +{ + %t = call <4 x double> @llvm.floor.v4f64(<4 x double> %p) + ret <4 x double> %t +} +; CHECK: floor_v4f64: +; CHECK: frim +; CHECK: frim +; CHECK: frim +; CHECK: frim + +declare <2 x double> @llvm.ceil.v2f64(<2 x double> %p) +define <2 x double> @ceil_v2f64(<2 x double> %p) +{ + %t = call <2 x double> @llvm.ceil.v2f64(<2 x double> %p) + ret <2 x double> %t +} +; CHECK: ceil_v2f64: +; CHECK: frip +; CHECK: frip + +declare <4 x double> @llvm.ceil.v4f64(<4 x double> %p) +define <4 x double> @ceil_v4f64(<4 x double> %p) +{ + %t = call <4 x double> @llvm.ceil.v4f64(<4 x double> %p) + ret <4 x double> %t +} +; CHECK: ceil_v4f64: +; CHECK: frip +; CHECK: frip +; CHECK: frip +; CHECK: frip + +declare <2 x double> @llvm.trunc.v2f64(<2 x double> %p) +define <2 x double> @trunc_v2f64(<2 x double> %p) +{ + %t = call <2 x double> @llvm.trunc.v2f64(<2 x double> %p) + ret <2 x double> %t +} +; CHECK: trunc_v2f64: +; CHECK: friz +; CHECK: friz + +declare <4 x double> @llvm.trunc.v4f64(<4 x double> %p) +define <4 x double> @trunc_v4f64(<4 x double> %p) +{ + %t = call <4 x double> @llvm.trunc.v4f64(<4 x double> %p) + ret <4 x double> %t +} +; CHECK: trunc_v4f64: +; CHECK: friz +; CHECK: friz +; CHECK: friz +; CHECK: friz + +declare <2 x double> @llvm.nearbyint.v2f64(<2 x double> %p) +define <2 x double> @nearbyint_v2f64(<2 x double> %p) +{ + %t = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %p) + ret <2 x double> %t +} +; CHECK: nearbyint_v2f64: +; CHECK: bl nearbyint +; CHECK: bl nearbyint + +declare <4 x double> @llvm.nearbyint.v4f64(<4 x double> %p) +define <4 x double> @nearbyint_v4f64(<4 x double> %p) +{ + %t = call <4 x double> @llvm.nearbyint.v4f64(<4 x double> %p) + ret <4 x double> %t +} +; CHECK: nearbyint_v4f64: +; CHECK: bl nearbyint +; CHECK: bl nearbyint +; CHECK: bl nearbyint +; CHECK: bl nearbyint + + +declare <4 x float> @llvm.floor.v4f32(<4 x float> %p) +define <4 x float> @floor_v4f32(<4 x float> %p) +{ + %t = call <4 x float> @llvm.floor.v4f32(<4 x float> %p) + ret <4 x float> %t +} +; CHECK: floor_v4f32: +; CHECK: vrfim + +declare <8 x float> @llvm.floor.v8f32(<8 x float> %p) +define <8 x float> @floor_v8f32(<8 x float> %p) +{ + %t = call <8 x float> @llvm.floor.v8f32(<8 x float> %p) + ret <8 x float> %t +} +; CHECK: floor_v8f32: +; CHECK: vrfim +; CHECK: vrfim + +declare <4 x float> @llvm.ceil.v4f32(<4 x float> %p) +define <4 x float> @ceil_v4f32(<4 x float> %p) +{ + %t = call <4 x float> @llvm.ceil.v4f32(<4 x float> %p) + ret <4 x float> %t +} +; CHECK: ceil_v4f32: +; CHECK: vrfip + +declare <8 x float> @llvm.ceil.v8f32(<8 x float> %p) +define <8 x float> @ceil_v8f32(<8 x float> %p) +{ + %t = call <8 x float> @llvm.ceil.v8f32(<8 x float> %p) + ret <8 x float> %t +} +; CHECK: ceil_v8f32: +; CHECK: vrfip +; CHECK: vrfip + +declare <4 x float> @llvm.trunc.v4f32(<4 x float> %p) +define <4 x float> @trunc_v4f32(<4 x float> %p) +{ + %t = call <4 x float> @llvm.trunc.v4f32(<4 x float> %p) + ret <4 x float> %t +} +; CHECK: trunc_v4f32: +; CHECK: vrfiz + +declare <8 x float> @llvm.trunc.v8f32(<8 x float> %p) +define <8 x float> @trunc_v8f32(<8 x float> %p) +{ + %t = call <8 x float> @llvm.trunc.v8f32(<8 x float> %p) + ret <8 x float> %t +} +; CHECK: trunc_v8f32: +; CHECK: vrfiz +; CHECK: vrfiz + +declare <4 x float> @llvm.nearbyint.v4f32(<4 x float> %p) +define <4 x float> @nearbyint_v4f32(<4 x float> %p) +{ + %t = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %p) + ret <4 x float> %t +} +; CHECK: nearbyint_v4f32: +; CHECK: vrfin + +declare <8 x float> @llvm.nearbyint.v8f32(<8 x float> %p) +define <8 x float> @nearbyint_v8f32(<8 x float> %p) +{ + %t = call <8 x float> @llvm.nearbyint.v8f32(<8 x float> %p) + ret <8 x float> %t +} +; CHECK: nearbyint_v8f32: +; CHECK: vrfin +; CHECK: vrfin diff --git a/test/CodeGen/PowerPC/vec_select.ll b/test/CodeGen/PowerPC/vec_select.ll new file mode 100644 index 000000000000..4ad0acca0067 --- /dev/null +++ b/test/CodeGen/PowerPC/vec_select.ll @@ -0,0 +1,7 @@ +; RUN: llc < %s -mtriple=powerpc64-linux-gnu -mattr=+altivec | FileCheck %s + +; CHECK: vsel_float +define <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) { + %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x float> %v1, <4 x float> %v2 + ret <4 x float> %vsel +} diff --git a/test/CodeGen/PowerPC/vrsave-spill.ll b/test/CodeGen/PowerPC/vrsave-spill.ll new file mode 100644 index 000000000000..c73206d8fc86 --- /dev/null +++ b/test/CodeGen/PowerPC/vrsave-spill.ll @@ -0,0 +1,19 @@ +; RUN: llc < %s -mtriple=powerpc64-apple-darwin -mcpu=g5 | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-apple-darwin" + +define <4 x float> @foo(<4 x float> %a, <4 x float> %b) nounwind { +entry: + %c = fadd <4 x float> %a, %b + %d = fmul <4 x float> %c, %a + call void asm sideeffect "", "~{VRsave}"() nounwind + br label %return + +; CHECK: @foo +; CHECK: mfspr r{{[0-9]+}}, 256 +; CHECK: mtspr 256, r{{[0-9]+}} + +return: ; preds = %entry + ret <4 x float> %d +} + diff --git a/test/CodeGen/PowerPC/vrspill.ll b/test/CodeGen/PowerPC/vrspill.ll index 7641017c434e..9fb3d03477c9 100644 --- a/test/CodeGen/PowerPC/vrspill.ll +++ b/test/CodeGen/PowerPC/vrspill.ll @@ -13,7 +13,7 @@ entry: ret void } -; CHECK: stvx 2, 0, 0 -; CHECK: lvx 2, 0, 0 +; CHECK: stvx 2, 1, +; CHECK: lvx 2, 1, declare void @foo(i32*) diff --git a/test/CodeGen/R600/128bit-kernel-args.ll b/test/CodeGen/R600/128bit-kernel-args.ll new file mode 100644 index 000000000000..114f9e74474f --- /dev/null +++ b/test/CodeGen/R600/128bit-kernel-args.ll @@ -0,0 +1,18 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: @v4i32_kernel_arg +; CHECK: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 40 + +define void @v4i32_kernel_arg(<4 x i32> addrspace(1)* %out, <4 x i32> %in) { +entry: + store <4 x i32> %in, <4 x i32> addrspace(1)* %out + ret void +} + +; CHECK: @v4f32_kernel_arg +; CHECK: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 40 +define void @v4f32_kernel_args(<4 x float> addrspace(1)* %out, <4 x float> %in) { +entry: + store <4 x float> %in, <4 x float> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/add.v4i32.ll b/test/CodeGen/R600/add.v4i32.ll new file mode 100644 index 000000000000..ac4a87417bde --- /dev/null +++ b/test/CodeGen/R600/add.v4i32.ll @@ -0,0 +1,15 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: ADD_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1 + %a = load <4 x i32> addrspace(1) * %in + %b = load <4 x i32> addrspace(1) * %b_ptr + %result = add <4 x i32> %a, %b + store <4 x i32> %result, <4 x i32> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/alu-split.ll b/test/CodeGen/R600/alu-split.ll new file mode 100644 index 000000000000..afefcd9f78b0 --- /dev/null +++ b/test/CodeGen/R600/alu-split.ll @@ -0,0 +1,850 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: ALU +;CHECK: ALU +;CHECK: ALU +;CHECK-NOT: ALU + +define void @main() #0 { +main_body: + %0 = call float @llvm.R600.load.input(i32 4) + %1 = call float @llvm.R600.load.input(i32 5) + %2 = call float @llvm.R600.load.input(i32 6) + %3 = call float @llvm.R600.load.input(i32 7) + %4 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 16) + %5 = extractelement <4 x float> %4, i32 0 + %6 = fcmp une float 0x4016F2B020000000, %5 + %7 = select i1 %6, float 1.000000e+00, float 0.000000e+00 + %8 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 16) + %9 = extractelement <4 x float> %8, i32 1 + %10 = fcmp une float 0x401FDCC640000000, %9 + %11 = select i1 %10, float 1.000000e+00, float 0.000000e+00 + %12 = fsub float -0.000000e+00, %7 + %13 = fptosi float %12 to i32 + %14 = fsub float -0.000000e+00, %11 + %15 = fptosi float %14 to i32 + %16 = bitcast i32 %13 to float + %17 = bitcast i32 %15 to float + %18 = bitcast float %16 to i32 + %19 = bitcast float %17 to i32 + %20 = or i32 %18, %19 + %21 = bitcast i32 %20 to float + %22 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 17) + %23 = extractelement <4 x float> %22, i32 0 + %24 = fcmp une float 0xC00574BC60000000, %23 + %25 = select i1 %24, float 1.000000e+00, float 0.000000e+00 + %26 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 17) + %27 = extractelement <4 x float> %26, i32 1 + %28 = fcmp une float 0x40210068E0000000, %27 + %29 = select i1 %28, float 1.000000e+00, float 0.000000e+00 + %30 = fsub float -0.000000e+00, %25 + %31 = fptosi float %30 to i32 + %32 = fsub float -0.000000e+00, %29 + %33 = fptosi float %32 to i32 + %34 = bitcast i32 %31 to float + %35 = bitcast i32 %33 to float + %36 = bitcast float %34 to i32 + %37 = bitcast float %35 to i32 + %38 = or i32 %36, %37 + %39 = bitcast i32 %38 to float + %40 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 18) + %41 = extractelement <4 x float> %40, i32 0 + %42 = fcmp une float 0xBFC9A6B500000000, %41 + %43 = select i1 %42, float 1.000000e+00, float 0.000000e+00 + %44 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 18) + %45 = extractelement <4 x float> %44, i32 1 + %46 = fcmp une float 0xC0119BDA60000000, %45 + %47 = select i1 %46, float 1.000000e+00, float 0.000000e+00 + %48 = fsub float -0.000000e+00, %43 + %49 = fptosi float %48 to i32 + %50 = fsub float -0.000000e+00, %47 + %51 = fptosi float %50 to i32 + %52 = bitcast i32 %49 to float + %53 = bitcast i32 %51 to float + %54 = bitcast float %52 to i32 + %55 = bitcast float %53 to i32 + %56 = or i32 %54, %55 + %57 = bitcast i32 %56 to float + %58 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 19) + %59 = extractelement <4 x float> %58, i32 0 + %60 = fcmp une float 0xC02085D640000000, %59 + %61 = select i1 %60, float 1.000000e+00, float 0.000000e+00 + %62 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 19) + %63 = extractelement <4 x float> %62, i32 1 + %64 = fcmp une float 0xBFD7C1BDA0000000, %63 + %65 = select i1 %64, float 1.000000e+00, float 0.000000e+00 + %66 = fsub float -0.000000e+00, %61 + %67 = fptosi float %66 to i32 + %68 = fsub float -0.000000e+00, %65 + %69 = fptosi float %68 to i32 + %70 = bitcast i32 %67 to float + %71 = bitcast i32 %69 to float + %72 = bitcast float %70 to i32 + %73 = bitcast float %71 to i32 + %74 = or i32 %72, %73 + %75 = bitcast i32 %74 to float + %76 = insertelement <4 x float> undef, float %21, i32 0 + %77 = insertelement <4 x float> %76, float %39, i32 1 + %78 = insertelement <4 x float> %77, float %57, i32 2 + %79 = insertelement <4 x float> %78, float %75, i32 3 + %80 = insertelement <4 x float> undef, float %21, i32 0 + %81 = insertelement <4 x float> %80, float %39, i32 1 + %82 = insertelement <4 x float> %81, float %57, i32 2 + %83 = insertelement <4 x float> %82, float %75, i32 3 + %84 = call float @llvm.AMDGPU.dp4(<4 x float> %79, <4 x float> %83) + %85 = bitcast float %84 to i32 + %86 = icmp ne i32 %85, 0 + %87 = sext i1 %86 to i32 + %88 = bitcast i32 %87 to float + %89 = bitcast float %88 to i32 + %90 = xor i32 %89, -1 + %91 = bitcast i32 %90 to float + %92 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 20) + %93 = extractelement <4 x float> %92, i32 0 + %94 = fcmp une float 0x401FDCC640000000, %93 + %95 = select i1 %94, float 1.000000e+00, float 0.000000e+00 + %96 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 20) + %97 = extractelement <4 x float> %96, i32 1 + %98 = fcmp une float 0xC00574BC60000000, %97 + %99 = select i1 %98, float 1.000000e+00, float 0.000000e+00 + %100 = fsub float -0.000000e+00, %95 + %101 = fptosi float %100 to i32 + %102 = fsub float -0.000000e+00, %99 + %103 = fptosi float %102 to i32 + %104 = bitcast i32 %101 to float + %105 = bitcast i32 %103 to float + %106 = bitcast float %104 to i32 + %107 = bitcast float %105 to i32 + %108 = or i32 %106, %107 + %109 = bitcast i32 %108 to float + %110 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 21) + %111 = extractelement <4 x float> %110, i32 0 + %112 = fcmp une float 0x40210068E0000000, %111 + %113 = select i1 %112, float 1.000000e+00, float 0.000000e+00 + %114 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 21) + %115 = extractelement <4 x float> %114, i32 1 + %116 = fcmp une float 0xBFC9A6B500000000, %115 + %117 = select i1 %116, float 1.000000e+00, float 0.000000e+00 + %118 = fsub float -0.000000e+00, %113 + %119 = fptosi float %118 to i32 + %120 = fsub float -0.000000e+00, %117 + %121 = fptosi float %120 to i32 + %122 = bitcast i32 %119 to float + %123 = bitcast i32 %121 to float + %124 = bitcast float %122 to i32 + %125 = bitcast float %123 to i32 + %126 = or i32 %124, %125 + %127 = bitcast i32 %126 to float + %128 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 22) + %129 = extractelement <4 x float> %128, i32 0 + %130 = fcmp une float 0xC0119BDA60000000, %129 + %131 = select i1 %130, float 1.000000e+00, float 0.000000e+00 + %132 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 22) + %133 = extractelement <4 x float> %132, i32 1 + %134 = fcmp une float 0xC02085D640000000, %133 + %135 = select i1 %134, float 1.000000e+00, float 0.000000e+00 + %136 = fsub float -0.000000e+00, %131 + %137 = fptosi float %136 to i32 + %138 = fsub float -0.000000e+00, %135 + %139 = fptosi float %138 to i32 + %140 = bitcast i32 %137 to float + %141 = bitcast i32 %139 to float + %142 = bitcast float %140 to i32 + %143 = bitcast float %141 to i32 + %144 = or i32 %142, %143 + %145 = bitcast i32 %144 to float + %146 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 23) + %147 = extractelement <4 x float> %146, i32 0 + %148 = fcmp une float 0xBFD7C1BDA0000000, %147 + %149 = select i1 %148, float 1.000000e+00, float 0.000000e+00 + %150 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 23) + %151 = extractelement <4 x float> %150, i32 1 + %152 = fcmp une float 0x401E1D7DC0000000, %151 + %153 = select i1 %152, float 1.000000e+00, float 0.000000e+00 + %154 = fsub float -0.000000e+00, %149 + %155 = fptosi float %154 to i32 + %156 = fsub float -0.000000e+00, %153 + %157 = fptosi float %156 to i32 + %158 = bitcast i32 %155 to float + %159 = bitcast i32 %157 to float + %160 = bitcast float %158 to i32 + %161 = bitcast float %159 to i32 + %162 = or i32 %160, %161 + %163 = bitcast i32 %162 to float + %164 = insertelement <4 x float> undef, float %109, i32 0 + %165 = insertelement <4 x float> %164, float %127, i32 1 + %166 = insertelement <4 x float> %165, float %145, i32 2 + %167 = insertelement <4 x float> %166, float %163, i32 3 + %168 = insertelement <4 x float> undef, float %109, i32 0 + %169 = insertelement <4 x float> %168, float %127, i32 1 + %170 = insertelement <4 x float> %169, float %145, i32 2 + %171 = insertelement <4 x float> %170, float %163, i32 3 + %172 = call float @llvm.AMDGPU.dp4(<4 x float> %167, <4 x float> %171) + %173 = bitcast float %172 to i32 + %174 = icmp ne i32 %173, 0 + %175 = sext i1 %174 to i32 + %176 = bitcast i32 %175 to float + %177 = bitcast float %176 to i32 + %178 = xor i32 %177, -1 + %179 = bitcast i32 %178 to float + %180 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 8) + %181 = extractelement <4 x float> %180, i32 0 + %182 = fcmp une float 0x401FDCC640000000, %181 + %183 = select i1 %182, float 1.000000e+00, float 0.000000e+00 + %184 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 8) + %185 = extractelement <4 x float> %184, i32 1 + %186 = fcmp une float 0xC00574BC60000000, %185 + %187 = select i1 %186, float 1.000000e+00, float 0.000000e+00 + %188 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 8) + %189 = extractelement <4 x float> %188, i32 2 + %190 = fcmp une float 0x40210068E0000000, %189 + %191 = select i1 %190, float 1.000000e+00, float 0.000000e+00 + %192 = fsub float -0.000000e+00, %183 + %193 = fptosi float %192 to i32 + %194 = fsub float -0.000000e+00, %187 + %195 = fptosi float %194 to i32 + %196 = fsub float -0.000000e+00, %191 + %197 = fptosi float %196 to i32 + %198 = bitcast i32 %193 to float + %199 = bitcast i32 %195 to float + %200 = bitcast i32 %197 to float + %201 = bitcast float %199 to i32 + %202 = bitcast float %200 to i32 + %203 = or i32 %201, %202 + %204 = bitcast i32 %203 to float + %205 = bitcast float %198 to i32 + %206 = bitcast float %204 to i32 + %207 = or i32 %205, %206 + %208 = bitcast i32 %207 to float + %209 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) + %210 = extractelement <4 x float> %209, i32 0 + %211 = fcmp une float 0xBFC9A6B500000000, %210 + %212 = select i1 %211, float 1.000000e+00, float 0.000000e+00 + %213 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) + %214 = extractelement <4 x float> %213, i32 1 + %215 = fcmp une float 0xC0119BDA60000000, %214 + %216 = select i1 %215, float 1.000000e+00, float 0.000000e+00 + %217 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) + %218 = extractelement <4 x float> %217, i32 2 + %219 = fcmp une float 0xC02085D640000000, %218 + %220 = select i1 %219, float 1.000000e+00, float 0.000000e+00 + %221 = fsub float -0.000000e+00, %212 + %222 = fptosi float %221 to i32 + %223 = fsub float -0.000000e+00, %216 + %224 = fptosi float %223 to i32 + %225 = fsub float -0.000000e+00, %220 + %226 = fptosi float %225 to i32 + %227 = bitcast i32 %222 to float + %228 = bitcast i32 %224 to float + %229 = bitcast i32 %226 to float + %230 = bitcast float %228 to i32 + %231 = bitcast float %229 to i32 + %232 = or i32 %230, %231 + %233 = bitcast i32 %232 to float + %234 = bitcast float %227 to i32 + %235 = bitcast float %233 to i32 + %236 = or i32 %234, %235 + %237 = bitcast i32 %236 to float + %238 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 10) + %239 = extractelement <4 x float> %238, i32 0 + %240 = fcmp une float 0xBFD7C1BDA0000000, %239 + %241 = select i1 %240, float 1.000000e+00, float 0.000000e+00 + %242 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 10) + %243 = extractelement <4 x float> %242, i32 1 + %244 = fcmp une float 0x401E1D7DC0000000, %243 + %245 = select i1 %244, float 1.000000e+00, float 0.000000e+00 + %246 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 10) + %247 = extractelement <4 x float> %246, i32 2 + %248 = fcmp une float 0xC019893740000000, %247 + %249 = select i1 %248, float 1.000000e+00, float 0.000000e+00 + %250 = fsub float -0.000000e+00, %241 + %251 = fptosi float %250 to i32 + %252 = fsub float -0.000000e+00, %245 + %253 = fptosi float %252 to i32 + %254 = fsub float -0.000000e+00, %249 + %255 = fptosi float %254 to i32 + %256 = bitcast i32 %251 to float + %257 = bitcast i32 %253 to float + %258 = bitcast i32 %255 to float + %259 = bitcast float %257 to i32 + %260 = bitcast float %258 to i32 + %261 = or i32 %259, %260 + %262 = bitcast i32 %261 to float + %263 = bitcast float %256 to i32 + %264 = bitcast float %262 to i32 + %265 = or i32 %263, %264 + %266 = bitcast i32 %265 to float + %267 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 11) + %268 = extractelement <4 x float> %267, i32 0 + %269 = fcmp une float 0x40220F0D80000000, %268 + %270 = select i1 %269, float 1.000000e+00, float 0.000000e+00 + %271 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 11) + %272 = extractelement <4 x float> %271, i32 1 + %273 = fcmp une float 0xC018E2EB20000000, %272 + %274 = select i1 %273, float 1.000000e+00, float 0.000000e+00 + %275 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 11) + %276 = extractelement <4 x float> %275, i32 2 + %277 = fcmp une float 0xBFEA8DB8C0000000, %276 + %278 = select i1 %277, float 1.000000e+00, float 0.000000e+00 + %279 = fsub float -0.000000e+00, %270 + %280 = fptosi float %279 to i32 + %281 = fsub float -0.000000e+00, %274 + %282 = fptosi float %281 to i32 + %283 = fsub float -0.000000e+00, %278 + %284 = fptosi float %283 to i32 + %285 = bitcast i32 %280 to float + %286 = bitcast i32 %282 to float + %287 = bitcast i32 %284 to float + %288 = bitcast float %286 to i32 + %289 = bitcast float %287 to i32 + %290 = or i32 %288, %289 + %291 = bitcast i32 %290 to float + %292 = bitcast float %285 to i32 + %293 = bitcast float %291 to i32 + %294 = or i32 %292, %293 + %295 = bitcast i32 %294 to float + %296 = insertelement <4 x float> undef, float %208, i32 0 + %297 = insertelement <4 x float> %296, float %237, i32 1 + %298 = insertelement <4 x float> %297, float %266, i32 2 + %299 = insertelement <4 x float> %298, float %295, i32 3 + %300 = insertelement <4 x float> undef, float %208, i32 0 + %301 = insertelement <4 x float> %300, float %237, i32 1 + %302 = insertelement <4 x float> %301, float %266, i32 2 + %303 = insertelement <4 x float> %302, float %295, i32 3 + %304 = call float @llvm.AMDGPU.dp4(<4 x float> %299, <4 x float> %303) + %305 = bitcast float %304 to i32 + %306 = icmp ne i32 %305, 0 + %307 = sext i1 %306 to i32 + %308 = bitcast i32 %307 to float + %309 = bitcast float %308 to i32 + %310 = xor i32 %309, -1 + %311 = bitcast i32 %310 to float + %312 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 12) + %313 = extractelement <4 x float> %312, i32 0 + %314 = fcmp une float 0xC00574BC60000000, %313 + %315 = select i1 %314, float 1.000000e+00, float 0.000000e+00 + %316 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 12) + %317 = extractelement <4 x float> %316, i32 1 + %318 = fcmp une float 0x40210068E0000000, %317 + %319 = select i1 %318, float 1.000000e+00, float 0.000000e+00 + %320 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 12) + %321 = extractelement <4 x float> %320, i32 2 + %322 = fcmp une float 0xBFC9A6B500000000, %321 + %323 = select i1 %322, float 1.000000e+00, float 0.000000e+00 + %324 = fsub float -0.000000e+00, %315 + %325 = fptosi float %324 to i32 + %326 = fsub float -0.000000e+00, %319 + %327 = fptosi float %326 to i32 + %328 = fsub float -0.000000e+00, %323 + %329 = fptosi float %328 to i32 + %330 = bitcast i32 %325 to float + %331 = bitcast i32 %327 to float + %332 = bitcast i32 %329 to float + %333 = bitcast float %331 to i32 + %334 = bitcast float %332 to i32 + %335 = or i32 %333, %334 + %336 = bitcast i32 %335 to float + %337 = bitcast float %330 to i32 + %338 = bitcast float %336 to i32 + %339 = or i32 %337, %338 + %340 = bitcast i32 %339 to float + %341 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 13) + %342 = extractelement <4 x float> %341, i32 0 + %343 = fcmp une float 0xC0119BDA60000000, %342 + %344 = select i1 %343, float 1.000000e+00, float 0.000000e+00 + %345 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 13) + %346 = extractelement <4 x float> %345, i32 1 + %347 = fcmp une float 0xC02085D640000000, %346 + %348 = select i1 %347, float 1.000000e+00, float 0.000000e+00 + %349 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 13) + %350 = extractelement <4 x float> %349, i32 2 + %351 = fcmp une float 0xBFD7C1BDA0000000, %350 + %352 = select i1 %351, float 1.000000e+00, float 0.000000e+00 + %353 = fsub float -0.000000e+00, %344 + %354 = fptosi float %353 to i32 + %355 = fsub float -0.000000e+00, %348 + %356 = fptosi float %355 to i32 + %357 = fsub float -0.000000e+00, %352 + %358 = fptosi float %357 to i32 + %359 = bitcast i32 %354 to float + %360 = bitcast i32 %356 to float + %361 = bitcast i32 %358 to float + %362 = bitcast float %360 to i32 + %363 = bitcast float %361 to i32 + %364 = or i32 %362, %363 + %365 = bitcast i32 %364 to float + %366 = bitcast float %359 to i32 + %367 = bitcast float %365 to i32 + %368 = or i32 %366, %367 + %369 = bitcast i32 %368 to float + %370 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 14) + %371 = extractelement <4 x float> %370, i32 0 + %372 = fcmp une float 0x401E1D7DC0000000, %371 + %373 = select i1 %372, float 1.000000e+00, float 0.000000e+00 + %374 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 14) + %375 = extractelement <4 x float> %374, i32 1 + %376 = fcmp une float 0xC019893740000000, %375 + %377 = select i1 %376, float 1.000000e+00, float 0.000000e+00 + %378 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 14) + %379 = extractelement <4 x float> %378, i32 2 + %380 = fcmp une float 0x40220F0D80000000, %379 + %381 = select i1 %380, float 1.000000e+00, float 0.000000e+00 + %382 = fsub float -0.000000e+00, %373 + %383 = fptosi float %382 to i32 + %384 = fsub float -0.000000e+00, %377 + %385 = fptosi float %384 to i32 + %386 = fsub float -0.000000e+00, %381 + %387 = fptosi float %386 to i32 + %388 = bitcast i32 %383 to float + %389 = bitcast i32 %385 to float + %390 = bitcast i32 %387 to float + %391 = bitcast float %389 to i32 + %392 = bitcast float %390 to i32 + %393 = or i32 %391, %392 + %394 = bitcast i32 %393 to float + %395 = bitcast float %388 to i32 + %396 = bitcast float %394 to i32 + %397 = or i32 %395, %396 + %398 = bitcast i32 %397 to float + %399 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 15) + %400 = extractelement <4 x float> %399, i32 0 + %401 = fcmp une float 0xC018E2EB20000000, %400 + %402 = select i1 %401, float 1.000000e+00, float 0.000000e+00 + %403 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 15) + %404 = extractelement <4 x float> %403, i32 1 + %405 = fcmp une float 0xBFEA8DB8C0000000, %404 + %406 = select i1 %405, float 1.000000e+00, float 0.000000e+00 + %407 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 15) + %408 = extractelement <4 x float> %407, i32 2 + %409 = fcmp une float 0x4015236E20000000, %408 + %410 = select i1 %409, float 1.000000e+00, float 0.000000e+00 + %411 = fsub float -0.000000e+00, %402 + %412 = fptosi float %411 to i32 + %413 = fsub float -0.000000e+00, %406 + %414 = fptosi float %413 to i32 + %415 = fsub float -0.000000e+00, %410 + %416 = fptosi float %415 to i32 + %417 = bitcast i32 %412 to float + %418 = bitcast i32 %414 to float + %419 = bitcast i32 %416 to float + %420 = bitcast float %418 to i32 + %421 = bitcast float %419 to i32 + %422 = or i32 %420, %421 + %423 = bitcast i32 %422 to float + %424 = bitcast float %417 to i32 + %425 = bitcast float %423 to i32 + %426 = or i32 %424, %425 + %427 = bitcast i32 %426 to float + %428 = insertelement <4 x float> undef, float %340, i32 0 + %429 = insertelement <4 x float> %428, float %369, i32 1 + %430 = insertelement <4 x float> %429, float %398, i32 2 + %431 = insertelement <4 x float> %430, float %427, i32 3 + %432 = insertelement <4 x float> undef, float %340, i32 0 + %433 = insertelement <4 x float> %432, float %369, i32 1 + %434 = insertelement <4 x float> %433, float %398, i32 2 + %435 = insertelement <4 x float> %434, float %427, i32 3 + %436 = call float @llvm.AMDGPU.dp4(<4 x float> %431, <4 x float> %435) + %437 = bitcast float %436 to i32 + %438 = icmp ne i32 %437, 0 + %439 = sext i1 %438 to i32 + %440 = bitcast i32 %439 to float + %441 = bitcast float %440 to i32 + %442 = xor i32 %441, -1 + %443 = bitcast i32 %442 to float + %444 = load <4 x float> addrspace(8)* null + %445 = extractelement <4 x float> %444, i32 0 + %446 = fcmp une float 0xC00574BC60000000, %445 + %447 = select i1 %446, float 1.000000e+00, float 0.000000e+00 + %448 = load <4 x float> addrspace(8)* null + %449 = extractelement <4 x float> %448, i32 1 + %450 = fcmp une float 0x40210068E0000000, %449 + %451 = select i1 %450, float 1.000000e+00, float 0.000000e+00 + %452 = load <4 x float> addrspace(8)* null + %453 = extractelement <4 x float> %452, i32 2 + %454 = fcmp une float 0xBFC9A6B500000000, %453 + %455 = select i1 %454, float 1.000000e+00, float 0.000000e+00 + %456 = load <4 x float> addrspace(8)* null + %457 = extractelement <4 x float> %456, i32 3 + %458 = fcmp une float 0xC0119BDA60000000, %457 + %459 = select i1 %458, float 1.000000e+00, float 0.000000e+00 + %460 = fsub float -0.000000e+00, %447 + %461 = fptosi float %460 to i32 + %462 = fsub float -0.000000e+00, %451 + %463 = fptosi float %462 to i32 + %464 = fsub float -0.000000e+00, %455 + %465 = fptosi float %464 to i32 + %466 = fsub float -0.000000e+00, %459 + %467 = fptosi float %466 to i32 + %468 = bitcast i32 %461 to float + %469 = bitcast i32 %463 to float + %470 = bitcast i32 %465 to float + %471 = bitcast i32 %467 to float + %472 = bitcast float %468 to i32 + %473 = bitcast float %469 to i32 + %474 = or i32 %472, %473 + %475 = bitcast i32 %474 to float + %476 = bitcast float %470 to i32 + %477 = bitcast float %471 to i32 + %478 = or i32 %476, %477 + %479 = bitcast i32 %478 to float + %480 = bitcast float %475 to i32 + %481 = bitcast float %479 to i32 + %482 = or i32 %480, %481 + %483 = bitcast i32 %482 to float + %484 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %485 = extractelement <4 x float> %484, i32 0 + %486 = fcmp une float 0xC02085D640000000, %485 + %487 = select i1 %486, float 1.000000e+00, float 0.000000e+00 + %488 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %489 = extractelement <4 x float> %488, i32 1 + %490 = fcmp une float 0xBFD7C1BDA0000000, %489 + %491 = select i1 %490, float 1.000000e+00, float 0.000000e+00 + %492 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %493 = extractelement <4 x float> %492, i32 2 + %494 = fcmp une float 0x401E1D7DC0000000, %493 + %495 = select i1 %494, float 1.000000e+00, float 0.000000e+00 + %496 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %497 = extractelement <4 x float> %496, i32 3 + %498 = fcmp une float 0xC019893740000000, %497 + %499 = select i1 %498, float 1.000000e+00, float 0.000000e+00 + %500 = fsub float -0.000000e+00, %487 + %501 = fptosi float %500 to i32 + %502 = fsub float -0.000000e+00, %491 + %503 = fptosi float %502 to i32 + %504 = fsub float -0.000000e+00, %495 + %505 = fptosi float %504 to i32 + %506 = fsub float -0.000000e+00, %499 + %507 = fptosi float %506 to i32 + %508 = bitcast i32 %501 to float + %509 = bitcast i32 %503 to float + %510 = bitcast i32 %505 to float + %511 = bitcast i32 %507 to float + %512 = bitcast float %508 to i32 + %513 = bitcast float %509 to i32 + %514 = or i32 %512, %513 + %515 = bitcast i32 %514 to float + %516 = bitcast float %510 to i32 + %517 = bitcast float %511 to i32 + %518 = or i32 %516, %517 + %519 = bitcast i32 %518 to float + %520 = bitcast float %515 to i32 + %521 = bitcast float %519 to i32 + %522 = or i32 %520, %521 + %523 = bitcast i32 %522 to float + %524 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %525 = extractelement <4 x float> %524, i32 0 + %526 = fcmp une float 0x40220F0D80000000, %525 + %527 = select i1 %526, float 1.000000e+00, float 0.000000e+00 + %528 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %529 = extractelement <4 x float> %528, i32 1 + %530 = fcmp une float 0xC018E2EB20000000, %529 + %531 = select i1 %530, float 1.000000e+00, float 0.000000e+00 + %532 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %533 = extractelement <4 x float> %532, i32 2 + %534 = fcmp une float 0xBFEA8DB8C0000000, %533 + %535 = select i1 %534, float 1.000000e+00, float 0.000000e+00 + %536 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %537 = extractelement <4 x float> %536, i32 3 + %538 = fcmp une float 0x4015236E20000000, %537 + %539 = select i1 %538, float 1.000000e+00, float 0.000000e+00 + %540 = fsub float -0.000000e+00, %527 + %541 = fptosi float %540 to i32 + %542 = fsub float -0.000000e+00, %531 + %543 = fptosi float %542 to i32 + %544 = fsub float -0.000000e+00, %535 + %545 = fptosi float %544 to i32 + %546 = fsub float -0.000000e+00, %539 + %547 = fptosi float %546 to i32 + %548 = bitcast i32 %541 to float + %549 = bitcast i32 %543 to float + %550 = bitcast i32 %545 to float + %551 = bitcast i32 %547 to float + %552 = bitcast float %548 to i32 + %553 = bitcast float %549 to i32 + %554 = or i32 %552, %553 + %555 = bitcast i32 %554 to float + %556 = bitcast float %550 to i32 + %557 = bitcast float %551 to i32 + %558 = or i32 %556, %557 + %559 = bitcast i32 %558 to float + %560 = bitcast float %555 to i32 + %561 = bitcast float %559 to i32 + %562 = or i32 %560, %561 + %563 = bitcast i32 %562 to float + %564 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) + %565 = extractelement <4 x float> %564, i32 0 + %566 = fcmp une float 0x4016ED5D00000000, %565 + %567 = select i1 %566, float 1.000000e+00, float 0.000000e+00 + %568 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) + %569 = extractelement <4 x float> %568, i32 1 + %570 = fcmp une float 0x402332FEC0000000, %569 + %571 = select i1 %570, float 1.000000e+00, float 0.000000e+00 + %572 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) + %573 = extractelement <4 x float> %572, i32 2 + %574 = fcmp une float 0xC01484B5E0000000, %573 + %575 = select i1 %574, float 1.000000e+00, float 0.000000e+00 + %576 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) + %577 = extractelement <4 x float> %576, i32 3 + %578 = fcmp une float 0x400179A6C0000000, %577 + %579 = select i1 %578, float 1.000000e+00, float 0.000000e+00 + %580 = fsub float -0.000000e+00, %567 + %581 = fptosi float %580 to i32 + %582 = fsub float -0.000000e+00, %571 + %583 = fptosi float %582 to i32 + %584 = fsub float -0.000000e+00, %575 + %585 = fptosi float %584 to i32 + %586 = fsub float -0.000000e+00, %579 + %587 = fptosi float %586 to i32 + %588 = bitcast i32 %581 to float + %589 = bitcast i32 %583 to float + %590 = bitcast i32 %585 to float + %591 = bitcast i32 %587 to float + %592 = bitcast float %588 to i32 + %593 = bitcast float %589 to i32 + %594 = or i32 %592, %593 + %595 = bitcast i32 %594 to float + %596 = bitcast float %590 to i32 + %597 = bitcast float %591 to i32 + %598 = or i32 %596, %597 + %599 = bitcast i32 %598 to float + %600 = bitcast float %595 to i32 + %601 = bitcast float %599 to i32 + %602 = or i32 %600, %601 + %603 = bitcast i32 %602 to float + %604 = insertelement <4 x float> undef, float %483, i32 0 + %605 = insertelement <4 x float> %604, float %523, i32 1 + %606 = insertelement <4 x float> %605, float %563, i32 2 + %607 = insertelement <4 x float> %606, float %603, i32 3 + %608 = insertelement <4 x float> undef, float %483, i32 0 + %609 = insertelement <4 x float> %608, float %523, i32 1 + %610 = insertelement <4 x float> %609, float %563, i32 2 + %611 = insertelement <4 x float> %610, float %603, i32 3 + %612 = call float @llvm.AMDGPU.dp4(<4 x float> %607, <4 x float> %611) + %613 = bitcast float %612 to i32 + %614 = icmp ne i32 %613, 0 + %615 = sext i1 %614 to i32 + %616 = bitcast i32 %615 to float + %617 = bitcast float %616 to i32 + %618 = xor i32 %617, -1 + %619 = bitcast i32 %618 to float + %620 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) + %621 = extractelement <4 x float> %620, i32 0 + %622 = fcmp une float 0x40210068E0000000, %621 + %623 = select i1 %622, float 1.000000e+00, float 0.000000e+00 + %624 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) + %625 = extractelement <4 x float> %624, i32 1 + %626 = fcmp une float 0xBFC9A6B500000000, %625 + %627 = select i1 %626, float 1.000000e+00, float 0.000000e+00 + %628 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) + %629 = extractelement <4 x float> %628, i32 2 + %630 = fcmp une float 0xC0119BDA60000000, %629 + %631 = select i1 %630, float 1.000000e+00, float 0.000000e+00 + %632 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) + %633 = extractelement <4 x float> %632, i32 3 + %634 = fcmp une float 0xC02085D640000000, %633 + %635 = select i1 %634, float 1.000000e+00, float 0.000000e+00 + %636 = fsub float -0.000000e+00, %623 + %637 = fptosi float %636 to i32 + %638 = fsub float -0.000000e+00, %627 + %639 = fptosi float %638 to i32 + %640 = fsub float -0.000000e+00, %631 + %641 = fptosi float %640 to i32 + %642 = fsub float -0.000000e+00, %635 + %643 = fptosi float %642 to i32 + %644 = bitcast i32 %637 to float + %645 = bitcast i32 %639 to float + %646 = bitcast i32 %641 to float + %647 = bitcast i32 %643 to float + %648 = bitcast float %644 to i32 + %649 = bitcast float %645 to i32 + %650 = or i32 %648, %649 + %651 = bitcast i32 %650 to float + %652 = bitcast float %646 to i32 + %653 = bitcast float %647 to i32 + %654 = or i32 %652, %653 + %655 = bitcast i32 %654 to float + %656 = bitcast float %651 to i32 + %657 = bitcast float %655 to i32 + %658 = or i32 %656, %657 + %659 = bitcast i32 %658 to float + %660 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) + %661 = extractelement <4 x float> %660, i32 0 + %662 = fcmp une float 0xBFD7C1BDA0000000, %661 + %663 = select i1 %662, float 1.000000e+00, float 0.000000e+00 + %664 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) + %665 = extractelement <4 x float> %664, i32 1 + %666 = fcmp une float 0x401E1D7DC0000000, %665 + %667 = select i1 %666, float 1.000000e+00, float 0.000000e+00 + %668 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) + %669 = extractelement <4 x float> %668, i32 2 + %670 = fcmp une float 0xC019893740000000, %669 + %671 = select i1 %670, float 1.000000e+00, float 0.000000e+00 + %672 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) + %673 = extractelement <4 x float> %672, i32 3 + %674 = fcmp une float 0x40220F0D80000000, %673 + %675 = select i1 %674, float 1.000000e+00, float 0.000000e+00 + %676 = fsub float -0.000000e+00, %663 + %677 = fptosi float %676 to i32 + %678 = fsub float -0.000000e+00, %667 + %679 = fptosi float %678 to i32 + %680 = fsub float -0.000000e+00, %671 + %681 = fptosi float %680 to i32 + %682 = fsub float -0.000000e+00, %675 + %683 = fptosi float %682 to i32 + %684 = bitcast i32 %677 to float + %685 = bitcast i32 %679 to float + %686 = bitcast i32 %681 to float + %687 = bitcast i32 %683 to float + %688 = bitcast float %684 to i32 + %689 = bitcast float %685 to i32 + %690 = or i32 %688, %689 + %691 = bitcast i32 %690 to float + %692 = bitcast float %686 to i32 + %693 = bitcast float %687 to i32 + %694 = or i32 %692, %693 + %695 = bitcast i32 %694 to float + %696 = bitcast float %691 to i32 + %697 = bitcast float %695 to i32 + %698 = or i32 %696, %697 + %699 = bitcast i32 %698 to float + %700 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) + %701 = extractelement <4 x float> %700, i32 0 + %702 = fcmp une float 0xC018E2EB20000000, %701 + %703 = select i1 %702, float 1.000000e+00, float 0.000000e+00 + %704 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) + %705 = extractelement <4 x float> %704, i32 1 + %706 = fcmp une float 0xBFEA8DB8C0000000, %705 + %707 = select i1 %706, float 1.000000e+00, float 0.000000e+00 + %708 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) + %709 = extractelement <4 x float> %708, i32 2 + %710 = fcmp une float 0x4015236E20000000, %709 + %711 = select i1 %710, float 1.000000e+00, float 0.000000e+00 + %712 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) + %713 = extractelement <4 x float> %712, i32 3 + %714 = fcmp une float 0x4016ED5D00000000, %713 + %715 = select i1 %714, float 1.000000e+00, float 0.000000e+00 + %716 = fsub float -0.000000e+00, %703 + %717 = fptosi float %716 to i32 + %718 = fsub float -0.000000e+00, %707 + %719 = fptosi float %718 to i32 + %720 = fsub float -0.000000e+00, %711 + %721 = fptosi float %720 to i32 + %722 = fsub float -0.000000e+00, %715 + %723 = fptosi float %722 to i32 + %724 = bitcast i32 %717 to float + %725 = bitcast i32 %719 to float + %726 = bitcast i32 %721 to float + %727 = bitcast i32 %723 to float + %728 = bitcast float %724 to i32 + %729 = bitcast float %725 to i32 + %730 = or i32 %728, %729 + %731 = bitcast i32 %730 to float + %732 = bitcast float %726 to i32 + %733 = bitcast float %727 to i32 + %734 = or i32 %732, %733 + %735 = bitcast i32 %734 to float + %736 = bitcast float %731 to i32 + %737 = bitcast float %735 to i32 + %738 = or i32 %736, %737 + %739 = bitcast i32 %738 to float + %740 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) + %741 = extractelement <4 x float> %740, i32 0 + %742 = fcmp une float 0x402332FEC0000000, %741 + %743 = select i1 %742, float 1.000000e+00, float 0.000000e+00 + %744 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) + %745 = extractelement <4 x float> %744, i32 1 + %746 = fcmp une float 0xC01484B5E0000000, %745 + %747 = select i1 %746, float 1.000000e+00, float 0.000000e+00 + %748 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) + %749 = extractelement <4 x float> %748, i32 2 + %750 = fcmp une float 0x400179A6C0000000, %749 + %751 = select i1 %750, float 1.000000e+00, float 0.000000e+00 + %752 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) + %753 = extractelement <4 x float> %752, i32 3 + %754 = fcmp une float 0xBFEE752540000000, %753 + %755 = select i1 %754, float 1.000000e+00, float 0.000000e+00 + %756 = fsub float -0.000000e+00, %743 + %757 = fptosi float %756 to i32 + %758 = fsub float -0.000000e+00, %747 + %759 = fptosi float %758 to i32 + %760 = fsub float -0.000000e+00, %751 + %761 = fptosi float %760 to i32 + %762 = fsub float -0.000000e+00, %755 + %763 = fptosi float %762 to i32 + %764 = bitcast i32 %757 to float + %765 = bitcast i32 %759 to float + %766 = bitcast i32 %761 to float + %767 = bitcast i32 %763 to float + %768 = bitcast float %764 to i32 + %769 = bitcast float %765 to i32 + %770 = or i32 %768, %769 + %771 = bitcast i32 %770 to float + %772 = bitcast float %766 to i32 + %773 = bitcast float %767 to i32 + %774 = or i32 %772, %773 + %775 = bitcast i32 %774 to float + %776 = bitcast float %771 to i32 + %777 = bitcast float %775 to i32 + %778 = or i32 %776, %777 + %779 = bitcast i32 %778 to float + %780 = insertelement <4 x float> undef, float %659, i32 0 + %781 = insertelement <4 x float> %780, float %699, i32 1 + %782 = insertelement <4 x float> %781, float %739, i32 2 + %783 = insertelement <4 x float> %782, float %779, i32 3 + %784 = insertelement <4 x float> undef, float %659, i32 0 + %785 = insertelement <4 x float> %784, float %699, i32 1 + %786 = insertelement <4 x float> %785, float %739, i32 2 + %787 = insertelement <4 x float> %786, float %779, i32 3 + %788 = call float @llvm.AMDGPU.dp4(<4 x float> %783, <4 x float> %787) + %789 = bitcast float %788 to i32 + %790 = icmp ne i32 %789, 0 + %791 = sext i1 %790 to i32 + %792 = bitcast i32 %791 to float + %793 = bitcast float %792 to i32 + %794 = xor i32 %793, -1 + %795 = bitcast i32 %794 to float + %796 = bitcast float %91 to i32 + %797 = bitcast float %179 to i32 + %798 = and i32 %796, %797 + %799 = bitcast i32 %798 to float + %800 = bitcast float %311 to i32 + %801 = bitcast float %443 to i32 + %802 = and i32 %800, %801 + %803 = bitcast i32 %802 to float + %804 = bitcast float %799 to i32 + %805 = bitcast float %803 to i32 + %806 = and i32 %804, %805 + %807 = bitcast i32 %806 to float + %808 = bitcast float %619 to i32 + %809 = bitcast float %795 to i32 + %810 = and i32 %808, %809 + %811 = bitcast i32 %810 to float + %812 = bitcast float %807 to i32 + %813 = bitcast float %811 to i32 + %814 = and i32 %812, %813 + %815 = bitcast i32 %814 to float + %816 = bitcast float %815 to i32 + %817 = icmp ne i32 %816, 0 + %. = select i1 %817, float 1.000000e+00, float 0.000000e+00 + %.32 = select i1 %817, float 0.000000e+00, float 1.000000e+00 + %818 = insertelement <4 x float> undef, float %0, i32 0 + %819 = insertelement <4 x float> %818, float %1, i32 1 + %820 = insertelement <4 x float> %819, float %2, i32 2 + %821 = insertelement <4 x float> %820, float %3, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %821, i32 60, i32 1) + %822 = insertelement <4 x float> undef, float %.32, i32 0 + %823 = insertelement <4 x float> %822, float %., i32 1 + %824 = insertelement <4 x float> %823, float 0.000000e+00, i32 2 + %825 = insertelement <4 x float> %824, float 1.000000e+00, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %825, i32 0, i32 2) + ret void +} + +declare float @llvm.R600.load.input(i32) #1 + +declare float @llvm.AMDGPU.dp4(<4 x float>, <4 x float>) #1 + +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) + +attributes #0 = { "ShaderType"="1" } +attributes #1 = { readnone } diff --git a/test/CodeGen/R600/and.v4i32.ll b/test/CodeGen/R600/and.v4i32.ll new file mode 100644 index 000000000000..662085e2d673 --- /dev/null +++ b/test/CodeGen/R600/and.v4i32.ll @@ -0,0 +1,15 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: AND_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: AND_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: AND_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: AND_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1 + %a = load <4 x i32> addrspace(1) * %in + %b = load <4 x i32> addrspace(1) * %b_ptr + %result = and <4 x i32> %a, %b + store <4 x i32> %result, <4 x i32> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/dagcombiner-bug-illegal-vec4-int-to-fp.ll b/test/CodeGen/R600/dagcombiner-bug-illegal-vec4-int-to-fp.ll new file mode 100644 index 000000000000..fd958b365961 --- /dev/null +++ b/test/CodeGen/R600/dagcombiner-bug-illegal-vec4-int-to-fp.ll @@ -0,0 +1,36 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; This test is for a bug in +; DAGCombiner::reduceBuildVecConvertToConvertBuildVec() where +; the wrong type was being passed to +; TargetLowering::getOperationAction() when checking the legality of +; ISD::UINT_TO_FP and ISD::SINT_TO_FP opcodes. + + +; CHECK: @sint +; CHECK: INT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @sint(<4 x float> addrspace(1)* %out, i32 addrspace(1)* %in) { +entry: + %ptr = getelementptr i32 addrspace(1)* %in, i32 1 + %sint = load i32 addrspace(1) * %in + %conv = sitofp i32 %sint to float + %0 = insertelement <4 x float> undef, float %conv, i32 0 + %splat = shufflevector <4 x float> %0, <4 x float> undef, <4 x i32> zeroinitializer + store <4 x float> %splat, <4 x float> addrspace(1)* %out + ret void +} + +;CHECK: @uint +;CHECK: UINT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @uint(<4 x float> addrspace(1)* %out, i32 addrspace(1)* %in) { +entry: + %ptr = getelementptr i32 addrspace(1)* %in, i32 1 + %uint = load i32 addrspace(1) * %in + %conv = uitofp i32 %uint to float + %0 = insertelement <4 x float> undef, float %conv, i32 0 + %splat = shufflevector <4 x float> %0, <4 x float> undef, <4 x i32> zeroinitializer + store <4 x float> %splat, <4 x float> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/disconnected-predset-break-bug.ll b/test/CodeGen/R600/disconnected-predset-break-bug.ll new file mode 100644 index 000000000000..09baee7a1dcd --- /dev/null +++ b/test/CodeGen/R600/disconnected-predset-break-bug.ll @@ -0,0 +1,29 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; PRED_SET* instructions must be tied to any instruction that uses their +; result. This tests that there are no instructions between the PRED_SET* +; and the PREDICATE_BREAK in this loop. + +; CHECK: @loop_ge +; CHECK: LOOP_START_DX10 +; CHECK: PRED_SET +; CHECK-NEXT: JUMP +; CHECK-NEXT: LOOP_BREAK +define void @loop_ge(i32 addrspace(1)* nocapture %out, i32 %iterations) nounwind { +entry: + %cmp5 = icmp sgt i32 %iterations, 0 + br i1 %cmp5, label %for.body, label %for.end + +for.body: ; preds = %for.body, %entry + %i.07.in = phi i32 [ %i.07, %for.body ], [ %iterations, %entry ] + %ai.06 = phi i32 [ %add, %for.body ], [ 0, %entry ] + %i.07 = add nsw i32 %i.07.in, -1 + %arrayidx = getelementptr inbounds i32 addrspace(1)* %out, i32 %ai.06 + store i32 %i.07, i32 addrspace(1)* %arrayidx, align 4 + %add = add nsw i32 %ai.06, 1 + %exitcond = icmp eq i32 %add, %iterations + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} diff --git a/test/CodeGen/R600/fabs.ll b/test/CodeGen/R600/fabs.ll new file mode 100644 index 000000000000..0407533eaa5f --- /dev/null +++ b/test/CodeGen/R600/fabs.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: MOV T{{[0-9]+\.[XYZW], \|T[0-9]+\.[XYZW]\|}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @fabs( float %r0) + call void @llvm.AMDGPU.store.output(float %r1, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + +declare float @fabs(float ) readnone diff --git a/test/CodeGen/R600/fadd.ll b/test/CodeGen/R600/fadd.ll new file mode 100644 index 000000000000..d7d1b6572c41 --- /dev/null +++ b/test/CodeGen/R600/fadd.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.R600.load.input(i32 1) + %r2 = fadd float %r0, %r1 + call void @llvm.AMDGPU.store.output(float %r2, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + diff --git a/test/CodeGen/R600/fadd.v4f32.ll b/test/CodeGen/R600/fadd.v4f32.ll new file mode 100644 index 000000000000..85dbfd52cbb3 --- /dev/null +++ b/test/CodeGen/R600/fadd.v4f32.ll @@ -0,0 +1,15 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x float> addrspace(1)* %in, i32 1 + %a = load <4 x float> addrspace(1) * %in + %b = load <4 x float> addrspace(1) * %b_ptr + %result = fadd <4 x float> %a, %b + store <4 x float> %result, <4 x float> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/fcmp-cnd.ll b/test/CodeGen/R600/fcmp-cnd.ll new file mode 100644 index 000000000000..a94cfb5cf2fe --- /dev/null +++ b/test/CodeGen/R600/fcmp-cnd.ll @@ -0,0 +1,14 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;Not checking arguments 2 and 3 to CNDE, because they may change between +;registers and literal.x depending on what the optimizer does. +;CHECK: CNDE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(i32 addrspace(1)* %out, float addrspace(1)* %in) { +entry: + %0 = load float addrspace(1)* %in + %cmp = fcmp oeq float %0, 0.000000e+00 + %value = select i1 %cmp, i32 2, i32 3 + store i32 %value, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/fcmp-cnde-int-args.ll b/test/CodeGen/R600/fcmp-cnde-int-args.ll new file mode 100644 index 000000000000..55aba0d72d39 --- /dev/null +++ b/test/CodeGen/R600/fcmp-cnde-int-args.ll @@ -0,0 +1,16 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; This test checks a bug in R600TargetLowering::LowerSELECT_CC where the +; chance to optimize the fcmp + select instructions to SET* was missed +; due to the fact that the operands to fcmp and select had different types + +; CHECK: SET{{[A-Z]+}}_DX10 + +define void @test(i32 addrspace(1)* %out, float addrspace(1)* %in) { +entry: + %0 = load float addrspace(1)* %in + %cmp = fcmp oeq float %0, 0.000000e+00 + %value = select i1 %cmp, i32 -1, i32 0 + store i32 %value, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/fcmp.ll b/test/CodeGen/R600/fcmp.ll new file mode 100644 index 000000000000..37f621d23958 --- /dev/null +++ b/test/CodeGen/R600/fcmp.ll @@ -0,0 +1,37 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: @fcmp_sext +; CHECK: SETE_DX10 T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @fcmp_sext(i32 addrspace(1)* %out, float addrspace(1)* %in) { +entry: + %0 = load float addrspace(1)* %in + %arrayidx1 = getelementptr inbounds float addrspace(1)* %in, i32 1 + %1 = load float addrspace(1)* %arrayidx1 + %cmp = fcmp oeq float %0, %1 + %sext = sext i1 %cmp to i32 + store i32 %sext, i32 addrspace(1)* %out + ret void +} + +; This test checks that a setcc node with f32 operands is lowered to a +; SET*_DX10 instruction. Previously we were lowering this to: +; SET* + FP_TO_SINT + +; CHECK: @fcmp_br +; CHECK: SET{{[N]*}}E_DX10 T{{[0-9]+\.[XYZW], [a-zA-Z0-9, .]+}}(5.0 + +define void @fcmp_br(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp oeq float %in, 5.0 + br i1 %0, label %IF, label %ENDIF + +IF: + %1 = getelementptr i32 addrspace(1)* %out, i32 1 + store i32 0, i32 addrspace(1)* %1 + br label %ENDIF + +ENDIF: + store i32 0, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/fdiv.v4f32.ll b/test/CodeGen/R600/fdiv.v4f32.ll new file mode 100644 index 000000000000..79e677f541f5 --- /dev/null +++ b/test/CodeGen/R600/fdiv.v4f32.ll @@ -0,0 +1,19 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: RECIP_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: RECIP_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: RECIP_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: RECIP_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x float> addrspace(1)* %in, i32 1 + %a = load <4 x float> addrspace(1) * %in + %b = load <4 x float> addrspace(1) * %b_ptr + %result = fdiv <4 x float> %a, %b + store <4 x float> %result, <4 x float> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/floor.ll b/test/CodeGen/R600/floor.ll new file mode 100644 index 000000000000..845330f28419 --- /dev/null +++ b/test/CodeGen/R600/floor.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: FLOOR T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @floor(float %r0) + call void @llvm.AMDGPU.store.output(float %r1, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + +declare float @floor(float) readonly diff --git a/test/CodeGen/R600/fmad.ll b/test/CodeGen/R600/fmad.ll new file mode 100644 index 000000000000..a3d4d0ff0db7 --- /dev/null +++ b/test/CodeGen/R600/fmad.ll @@ -0,0 +1,19 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: MULADD_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.R600.load.input(i32 1) + %r2 = call float @llvm.R600.load.input(i32 2) + %r3 = fmul float %r0, %r1 + %r4 = fadd float %r3, %r2 + call void @llvm.AMDGPU.store.output(float %r4, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + +declare float @fabs(float ) readnone diff --git a/test/CodeGen/R600/fmax.ll b/test/CodeGen/R600/fmax.ll new file mode 100644 index 000000000000..3708f0b9eed2 --- /dev/null +++ b/test/CodeGen/R600/fmax.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: MAX T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.R600.load.input(i32 1) + %r2 = fcmp uge float %r0, %r1 + %r3 = select i1 %r2, float %r0, float %r1 + call void @llvm.AMDGPU.store.output(float %r3, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) diff --git a/test/CodeGen/R600/fmin.ll b/test/CodeGen/R600/fmin.ll new file mode 100644 index 000000000000..19d59ab3061e --- /dev/null +++ b/test/CodeGen/R600/fmin.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: MIN T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.R600.load.input(i32 1) + %r2 = fcmp uge float %r0, %r1 + %r3 = select i1 %r2, float %r1, float %r0 + call void @llvm.AMDGPU.store.output(float %r3, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) diff --git a/test/CodeGen/R600/fmul.ll b/test/CodeGen/R600/fmul.ll new file mode 100644 index 000000000000..eb1d523c0bb4 --- /dev/null +++ b/test/CodeGen/R600/fmul.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.R600.load.input(i32 1) + %r2 = fmul float %r0, %r1 + call void @llvm.AMDGPU.store.output(float %r2, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + diff --git a/test/CodeGen/R600/fmul.v4f32.ll b/test/CodeGen/R600/fmul.v4f32.ll new file mode 100644 index 000000000000..6d44a0c5c782 --- /dev/null +++ b/test/CodeGen/R600/fmul.v4f32.ll @@ -0,0 +1,15 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: MUL_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x float> addrspace(1)* %in, i32 1 + %a = load <4 x float> addrspace(1) * %in + %b = load <4 x float> addrspace(1) * %b_ptr + %result = fmul <4 x float> %a, %b + store <4 x float> %result, <4 x float> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/fsub.ll b/test/CodeGen/R600/fsub.ll new file mode 100644 index 000000000000..591aa52676a4 --- /dev/null +++ b/test/CodeGen/R600/fsub.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], -T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.R600.load.input(i32 1) + %r2 = fsub float %r0, %r1 + call void @llvm.AMDGPU.store.output(float %r2, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + diff --git a/test/CodeGen/R600/fsub.v4f32.ll b/test/CodeGen/R600/fsub.v4f32.ll new file mode 100644 index 000000000000..612a57e4b609 --- /dev/null +++ b/test/CodeGen/R600/fsub.v4f32.ll @@ -0,0 +1,15 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK: ADD T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x float> addrspace(1)* %in, i32 1 + %a = load <4 x float> addrspace(1) * %in + %b = load <4 x float> addrspace(1) * %b_ptr + %result = fsub <4 x float> %a, %b + store <4 x float> %result, <4 x float> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/i8_to_double_to_float.ll b/test/CodeGen/R600/i8_to_double_to_float.ll new file mode 100644 index 000000000000..39f33227fa4b --- /dev/null +++ b/test/CodeGen/R600/i8_to_double_to_float.ll @@ -0,0 +1,11 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: UINT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(float addrspace(1)* %out, i8 addrspace(1)* %in) { + %1 = load i8 addrspace(1)* %in + %2 = uitofp i8 %1 to double + %3 = fptrunc double %2 to float + store float %3, float addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/icmp-select-sete-reverse-args.ll b/test/CodeGen/R600/icmp-select-sete-reverse-args.ll new file mode 100644 index 000000000000..71705a64f50e --- /dev/null +++ b/test/CodeGen/R600/icmp-select-sete-reverse-args.ll @@ -0,0 +1,18 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;Test that a select with reversed True/False values is correctly lowered +;to a SETNE_INT. There should only be one SETNE_INT instruction. + +;CHECK: SETNE_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK-NOT: SETNE_INT + +define void @test(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { +entry: + %0 = load i32 addrspace(1)* %in + %arrayidx1 = getelementptr inbounds i32 addrspace(1)* %in, i32 1 + %1 = load i32 addrspace(1)* %arrayidx1 + %cmp = icmp eq i32 %0, %1 + %value = select i1 %cmp, i32 0, i32 -1 + store i32 %value, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/jump_address.ll b/test/CodeGen/R600/jump_address.ll new file mode 100644 index 000000000000..cd35bffb1304 --- /dev/null +++ b/test/CodeGen/R600/jump_address.ll @@ -0,0 +1,50 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: JUMP @4 + +define void @main() #0 { +main_body: + %0 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %1 = extractelement <4 x float> %0, i32 0 + %2 = bitcast float %1 to i32 + %3 = icmp eq i32 %2, 0 + %4 = sext i1 %3 to i32 + %5 = bitcast i32 %4 to float + %6 = bitcast float %5 to i32 + %7 = icmp ne i32 %6, 0 + br i1 %7, label %ENDIF, label %ELSE + +ELSE: ; preds = %main_body + %8 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %9 = extractelement <4 x float> %8, i32 0 + %10 = bitcast float %9 to i32 + %11 = icmp eq i32 %10, 1 + %12 = sext i1 %11 to i32 + %13 = bitcast i32 %12 to float + %14 = bitcast float %13 to i32 + %15 = icmp ne i32 %14, 0 + br i1 %15, label %IF13, label %ENDIF + +ENDIF: ; preds = %IF13, %ELSE, %main_body + %temp.0 = phi float [ 0xFFF8000000000000, %main_body ], [ 0.000000e+00, %ELSE ], [ 0.000000e+00, %IF13 ] + %temp1.0 = phi float [ 0.000000e+00, %main_body ], [ %23, %IF13 ], [ 0.000000e+00, %ELSE ] + %temp2.0 = phi float [ 1.000000e+00, %main_body ], [ 0.000000e+00, %ELSE ], [ 0.000000e+00, %IF13 ] + %temp3.0 = phi float [ 5.000000e-01, %main_body ], [ 0.000000e+00, %ELSE ], [ 0.000000e+00, %IF13 ] + %16 = insertelement <4 x float> undef, float %temp.0, i32 0 + %17 = insertelement <4 x float> %16, float %temp1.0, i32 1 + %18 = insertelement <4 x float> %17, float %temp2.0, i32 2 + %19 = insertelement <4 x float> %18, float %temp3.0, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %19, i32 0, i32 0) + ret void + +IF13: ; preds = %ELSE + %20 = load <4 x float> addrspace(8)* null + %21 = extractelement <4 x float> %20, i32 0 + %22 = fsub float -0.000000e+00, %21 + %23 = fadd float 0xFFF8000000000000, %22 + br label %ENDIF +} + +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) + +attributes #0 = { "ShaderType"="0" } diff --git a/test/CodeGen/R600/kcache-fold.ll b/test/CodeGen/R600/kcache-fold.ll new file mode 100644 index 000000000000..3d70e4bd54aa --- /dev/null +++ b/test/CodeGen/R600/kcache-fold.ll @@ -0,0 +1,100 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: @main1 +; CHECK: MOV T{{[0-9]+\.[XYZW], KC0}} +define void @main1() { +main_body: + %0 = load <4 x float> addrspace(8)* null + %1 = extractelement <4 x float> %0, i32 0 + %2 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %3 = extractelement <4 x float> %2, i32 0 + %4 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %5 = extractelement <4 x float> %4, i32 0 + %6 = fcmp ult float %1, 0.000000e+00 + %7 = select i1 %6, float %3, float %5 + %8 = load <4 x float> addrspace(8)* null + %9 = extractelement <4 x float> %8, i32 1 + %10 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %11 = extractelement <4 x float> %10, i32 1 + %12 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %13 = extractelement <4 x float> %12, i32 1 + %14 = fcmp ult float %9, 0.000000e+00 + %15 = select i1 %14, float %11, float %13 + %16 = load <4 x float> addrspace(8)* null + %17 = extractelement <4 x float> %16, i32 2 + %18 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %19 = extractelement <4 x float> %18, i32 2 + %20 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %21 = extractelement <4 x float> %20, i32 2 + %22 = fcmp ult float %17, 0.000000e+00 + %23 = select i1 %22, float %19, float %21 + %24 = load <4 x float> addrspace(8)* null + %25 = extractelement <4 x float> %24, i32 3 + %26 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %27 = extractelement <4 x float> %26, i32 3 + %28 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %29 = extractelement <4 x float> %28, i32 3 + %30 = fcmp ult float %25, 0.000000e+00 + %31 = select i1 %30, float %27, float %29 + %32 = call float @llvm.AMDIL.clamp.(float %7, float 0.000000e+00, float 1.000000e+00) + %33 = call float @llvm.AMDIL.clamp.(float %15, float 0.000000e+00, float 1.000000e+00) + %34 = call float @llvm.AMDIL.clamp.(float %23, float 0.000000e+00, float 1.000000e+00) + %35 = call float @llvm.AMDIL.clamp.(float %31, float 0.000000e+00, float 1.000000e+00) + %36 = insertelement <4 x float> undef, float %32, i32 0 + %37 = insertelement <4 x float> %36, float %33, i32 1 + %38 = insertelement <4 x float> %37, float %34, i32 2 + %39 = insertelement <4 x float> %38, float %35, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %39, i32 0, i32 0) + ret void +} + +; CHECK: @main2 +; CHECK-NOT: MOV +define void @main2() { +main_body: + %0 = load <4 x float> addrspace(8)* null + %1 = extractelement <4 x float> %0, i32 0 + %2 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %3 = extractelement <4 x float> %2, i32 0 + %4 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %5 = extractelement <4 x float> %4, i32 1 + %6 = fcmp ult float %1, 0.000000e+00 + %7 = select i1 %6, float %3, float %5 + %8 = load <4 x float> addrspace(8)* null + %9 = extractelement <4 x float> %8, i32 1 + %10 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %11 = extractelement <4 x float> %10, i32 0 + %12 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %13 = extractelement <4 x float> %12, i32 1 + %14 = fcmp ult float %9, 0.000000e+00 + %15 = select i1 %14, float %11, float %13 + %16 = load <4 x float> addrspace(8)* null + %17 = extractelement <4 x float> %16, i32 2 + %18 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %19 = extractelement <4 x float> %18, i32 3 + %20 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %21 = extractelement <4 x float> %20, i32 2 + %22 = fcmp ult float %17, 0.000000e+00 + %23 = select i1 %22, float %19, float %21 + %24 = load <4 x float> addrspace(8)* null + %25 = extractelement <4 x float> %24, i32 3 + %26 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %27 = extractelement <4 x float> %26, i32 3 + %28 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %29 = extractelement <4 x float> %28, i32 2 + %30 = fcmp ult float %25, 0.000000e+00 + %31 = select i1 %30, float %27, float %29 + %32 = call float @llvm.AMDIL.clamp.(float %7, float 0.000000e+00, float 1.000000e+00) + %33 = call float @llvm.AMDIL.clamp.(float %15, float 0.000000e+00, float 1.000000e+00) + %34 = call float @llvm.AMDIL.clamp.(float %23, float 0.000000e+00, float 1.000000e+00) + %35 = call float @llvm.AMDIL.clamp.(float %31, float 0.000000e+00, float 1.000000e+00) + %36 = insertelement <4 x float> undef, float %32, i32 0 + %37 = insertelement <4 x float> %36, float %33, i32 1 + %38 = insertelement <4 x float> %37, float %34, i32 2 + %39 = insertelement <4 x float> %38, float %35, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %39, i32 0, i32 0) + ret void +} + +declare float @llvm.AMDIL.clamp.(float, float, float) readnone +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) diff --git a/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll b/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll new file mode 100644 index 000000000000..1aae7f9f91f4 --- /dev/null +++ b/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll @@ -0,0 +1,26 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; This tests a bug where LegalizeDAG was not checking the target's +; BooleanContents value and always using one for true, when expanding +; setcc to select_cc. +; +; This bug caused the icmp IR instruction to be expanded to two machine +; instructions, when only one is needed. +; + +; CHECK: @setcc_expand +; CHECK: SET +; CHECK-NOT: CND +define void @setcc_expand(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp eq i32 %in, 5 + br i1 %0, label %IF, label %ENDIF +IF: + %1 = getelementptr i32 addrspace(1)* %out, i32 1 + store i32 0, i32 addrspace(1)* %1 + br label %ENDIF + +ENDIF: + store i32 0, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/lit.local.cfg b/test/CodeGen/R600/lit.local.cfg new file mode 100644 index 000000000000..36ee493e5945 --- /dev/null +++ b/test/CodeGen/R600/lit.local.cfg @@ -0,0 +1,13 @@ +config.suffixes = ['.ll', '.c', '.cpp'] + +def getRoot(config): + if not config.parent: + return config + return getRoot(config.parent) + +root = getRoot(config) + +targets = set(root.targets_to_build.split()) +if not 'R600' in targets: + config.unsupported = True + diff --git a/test/CodeGen/R600/literals.ll b/test/CodeGen/R600/literals.ll new file mode 100644 index 000000000000..e69f64e0e142 --- /dev/null +++ b/test/CodeGen/R600/literals.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; Test using an integer literal constant. +; Generated ASM should be: +; ADD_INT REG literal.x, 5 +; or +; ADD_INT literal.x REG, 5 + +; CHECK: @i32_literal +; CHECK: ADD_INT {{[A-Z0-9,. ]*}}literal.x,{{[A-Z0-9,. ]*}} 5 +define void @i32_literal(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = add i32 5, %in + store i32 %0, i32 addrspace(1)* %out + ret void +} + +; Test using a float literal constant. +; Generated ASM should be: +; ADD REG literal.x, 5.0 +; or +; ADD literal.x REG, 5.0 + +; CHECK: @float_literal +; CHECK: ADD {{[A-Z0-9,. ]*}}literal.x,{{[A-Z0-9,. ]*}} {{[0-9]+}}(5.0 +define void @float_literal(float addrspace(1)* %out, float %in) { +entry: + %0 = fadd float 5.0, %in + store float %0, float addrspace(1)* %out + ret void +} + diff --git a/test/CodeGen/R600/llvm.AMDGPU.mul.ll b/test/CodeGen/R600/llvm.AMDGPU.mul.ll new file mode 100644 index 000000000000..693eb27457c2 --- /dev/null +++ b/test/CodeGen/R600/llvm.AMDGPU.mul.ll @@ -0,0 +1,17 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: MUL NON-IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.R600.load.input(i32 1) + %r2 = call float @llvm.AMDGPU.mul( float %r0, float %r1) + call void @llvm.AMDGPU.store.output(float %r2, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + +declare float @llvm.AMDGPU.mul(float ,float ) readnone diff --git a/test/CodeGen/R600/llvm.AMDGPU.tex.ll b/test/CodeGen/R600/llvm.AMDGPU.tex.ll new file mode 100644 index 000000000000..74331fa26934 --- /dev/null +++ b/test/CodeGen/R600/llvm.AMDGPU.tex.ll @@ -0,0 +1,42 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 1 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 2 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 3 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 4 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 5 +;CHECK: TEX_SAMPLE_CT{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 6 +;CHECK: TEX_SAMPLE_CT{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 7 +;CHECK: TEX_SAMPLE_CT{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 8 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 9 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 10 +;CHECK: TEX_SAMPLE_CT{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 11 +;CHECK: TEX_SAMPLE_CT{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 12 +;CHECK: TEX_SAMPLE_CT{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 13 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 14 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 15 +;CHECK: TEX_SAMPLET{{[0-9]+\.XYZW, T[0-9]+\.XYZW}}, 0, 0, 16 + +define void @test(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { + %addr = load <4 x float> addrspace(1)* %in + %res1 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %addr, i32 0, i32 0, i32 1) + %res2 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res1, i32 0, i32 0, i32 2) + %res3 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res2, i32 0, i32 0, i32 3) + %res4 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res3, i32 0, i32 0, i32 4) + %res5 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res4, i32 0, i32 0, i32 5) + %res6 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res5, i32 0, i32 0, i32 6) + %res7 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res6, i32 0, i32 0, i32 7) + %res8 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res7, i32 0, i32 0, i32 8) + %res9 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res8, i32 0, i32 0, i32 9) + %res10 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res9, i32 0, i32 0, i32 10) + %res11 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res10, i32 0, i32 0, i32 11) + %res12 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res11, i32 0, i32 0, i32 12) + %res13 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res12, i32 0, i32 0, i32 13) + %res14 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res13, i32 0, i32 0, i32 14) + %res15 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res14, i32 0, i32 0, i32 15) + %res16 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %res15, i32 0, i32 0, i32 16) + store <4 x float> %res16, <4 x float> addrspace(1)* %out + ret void +} + +declare <4 x float> @llvm.AMDGPU.tex(<4 x float>, i32, i32, i32) readnone diff --git a/test/CodeGen/R600/llvm.AMDGPU.trunc.ll b/test/CodeGen/R600/llvm.AMDGPU.trunc.ll new file mode 100644 index 000000000000..fac957f7eeec --- /dev/null +++ b/test/CodeGen/R600/llvm.AMDGPU.trunc.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: TRUNC T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.AMDGPU.trunc( float %r0) + call void @llvm.AMDGPU.store.output(float %r1, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + +declare float @llvm.AMDGPU.trunc(float ) readnone diff --git a/test/CodeGen/R600/llvm.SI.fs.interp.constant.ll b/test/CodeGen/R600/llvm.SI.fs.interp.constant.ll new file mode 100644 index 000000000000..bf0cdaa2fa3a --- /dev/null +++ b/test/CodeGen/R600/llvm.SI.fs.interp.constant.ll @@ -0,0 +1,21 @@ +;RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s + +;CHECK: S_MOV_B32 +;CHECK-NEXT: V_INTERP_MOV_F32 + +define void @main(<16 x i8> addrspace(2)* inreg, <16 x i8> addrspace(2)* inreg, <32 x i8> addrspace(2)* inreg, i32 inreg) "ShaderType"="0" { +main_body: + %4 = call float @llvm.SI.fs.constant(i32 0, i32 0, i32 %3) + %5 = call i32 @llvm.SI.packf16(float %4, float %4) + %6 = bitcast i32 %5 to float + call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %6, float %6, float %6, float %6) + ret void +} + +declare void @llvm.AMDGPU.shader.type(i32) + +declare float @llvm.SI.fs.constant(i32, i32, i32) readnone + +declare i32 @llvm.SI.packf16(float, float) readnone + +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) diff --git a/test/CodeGen/R600/llvm.SI.sample.ll b/test/CodeGen/R600/llvm.SI.sample.ll new file mode 100644 index 000000000000..c724395b98c2 --- /dev/null +++ b/test/CodeGen/R600/llvm.SI.sample.ll @@ -0,0 +1,106 @@ +;RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s + +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE_C +;CHECK: IMAGE_SAMPLE_C +;CHECK: IMAGE_SAMPLE_C +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE_C +;CHECK: IMAGE_SAMPLE_C +;CHECK: IMAGE_SAMPLE_C +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE +;CHECK: IMAGE_SAMPLE + +define void @test(i32 %a1, i32 %a2, i32 %a3, i32 %a4) { + %v1 = insertelement <4 x i32> undef, i32 %a1, i32 0 + %v2 = insertelement <4 x i32> undef, i32 %a1, i32 1 + %v3 = insertelement <4 x i32> undef, i32 %a1, i32 2 + %v4 = insertelement <4 x i32> undef, i32 %a1, i32 3 + %v5 = insertelement <4 x i32> undef, i32 %a2, i32 0 + %v6 = insertelement <4 x i32> undef, i32 %a2, i32 1 + %v7 = insertelement <4 x i32> undef, i32 %a2, i32 2 + %v8 = insertelement <4 x i32> undef, i32 %a2, i32 3 + %v9 = insertelement <4 x i32> undef, i32 %a3, i32 0 + %v10 = insertelement <4 x i32> undef, i32 %a3, i32 1 + %v11 = insertelement <4 x i32> undef, i32 %a3, i32 2 + %v12 = insertelement <4 x i32> undef, i32 %a3, i32 3 + %v13 = insertelement <4 x i32> undef, i32 %a4, i32 0 + %v14 = insertelement <4 x i32> undef, i32 %a4, i32 1 + %v15 = insertelement <4 x i32> undef, i32 %a4, i32 2 + %v16 = insertelement <4 x i32> undef, i32 %a4, i32 3 + %res1 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v1, + <8 x i32> undef, <4 x i32> undef, i32 1) + %res2 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v2, + <8 x i32> undef, <4 x i32> undef, i32 2) + %res3 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v3, + <8 x i32> undef, <4 x i32> undef, i32 3) + %res4 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v4, + <8 x i32> undef, <4 x i32> undef, i32 4) + %res5 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v5, + <8 x i32> undef, <4 x i32> undef, i32 5) + %res6 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v6, + <8 x i32> undef, <4 x i32> undef, i32 6) + %res7 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v7, + <8 x i32> undef, <4 x i32> undef, i32 7) + %res8 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v8, + <8 x i32> undef, <4 x i32> undef, i32 8) + %res9 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v9, + <8 x i32> undef, <4 x i32> undef, i32 9) + %res10 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v10, + <8 x i32> undef, <4 x i32> undef, i32 10) + %res11 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v11, + <8 x i32> undef, <4 x i32> undef, i32 11) + %res12 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v12, + <8 x i32> undef, <4 x i32> undef, i32 12) + %res13 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v13, + <8 x i32> undef, <4 x i32> undef, i32 13) + %res14 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v14, + <8 x i32> undef, <4 x i32> undef, i32 14) + %res15 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v15, + <8 x i32> undef, <4 x i32> undef, i32 15) + %res16 = call <4 x float> @llvm.SI.sample.(i32 15, <4 x i32> %v16, + <8 x i32> undef, <4 x i32> undef, i32 16) + %e1 = extractelement <4 x float> %res1, i32 0 + %e2 = extractelement <4 x float> %res2, i32 0 + %e3 = extractelement <4 x float> %res3, i32 0 + %e4 = extractelement <4 x float> %res4, i32 0 + %e5 = extractelement <4 x float> %res5, i32 0 + %e6 = extractelement <4 x float> %res6, i32 0 + %e7 = extractelement <4 x float> %res7, i32 0 + %e8 = extractelement <4 x float> %res8, i32 0 + %e9 = extractelement <4 x float> %res9, i32 0 + %e10 = extractelement <4 x float> %res10, i32 0 + %e11 = extractelement <4 x float> %res11, i32 0 + %e12 = extractelement <4 x float> %res12, i32 0 + %e13 = extractelement <4 x float> %res13, i32 0 + %e14 = extractelement <4 x float> %res14, i32 0 + %e15 = extractelement <4 x float> %res15, i32 0 + %e16 = extractelement <4 x float> %res16, i32 0 + %s1 = fadd float %e1, %e2 + %s2 = fadd float %s1, %e3 + %s3 = fadd float %s2, %e4 + %s4 = fadd float %s3, %e5 + %s5 = fadd float %s4, %e6 + %s6 = fadd float %s5, %e7 + %s7 = fadd float %s6, %e8 + %s8 = fadd float %s7, %e9 + %s9 = fadd float %s8, %e10 + %s10 = fadd float %s9, %e11 + %s11 = fadd float %s10, %e12 + %s12 = fadd float %s11, %e13 + %s13 = fadd float %s12, %e14 + %s14 = fadd float %s13, %e15 + %s15 = fadd float %s14, %e16 + call void @llvm.SI.export(i32 15, i32 0, i32 1, i32 12, i32 0, float %s15, float %s15, float %s15, float %s15) + ret void +} + +declare <4 x float> @llvm.SI.sample.(i32, <4 x i32>, <8 x i32>, <4 x i32>, i32) readnone + +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) diff --git a/test/CodeGen/R600/llvm.cos.ll b/test/CodeGen/R600/llvm.cos.ll new file mode 100644 index 000000000000..dc120bfb00c2 --- /dev/null +++ b/test/CodeGen/R600/llvm.cos.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: COS T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.cos.f32(float %r0) + call void @llvm.AMDGPU.store.output(float %r1, i32 0) + ret void +} + +declare float @llvm.cos.f32(float) readnone + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) diff --git a/test/CodeGen/R600/llvm.pow.ll b/test/CodeGen/R600/llvm.pow.ll new file mode 100644 index 000000000000..b4ce9f429f16 --- /dev/null +++ b/test/CodeGen/R600/llvm.pow.ll @@ -0,0 +1,19 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: LOG_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK-NEXT: MUL NON-IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +;CHECK-NEXT: EXP_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.R600.load.input(i32 1) + %r2 = call float @llvm.pow.f32( float %r0, float %r1) + call void @llvm.AMDGPU.store.output(float %r2, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + +declare float @llvm.pow.f32(float ,float ) readonly diff --git a/test/CodeGen/R600/llvm.sin.ll b/test/CodeGen/R600/llvm.sin.ll new file mode 100644 index 000000000000..5cd6998c9370 --- /dev/null +++ b/test/CodeGen/R600/llvm.sin.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: SIN T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = call float @llvm.sin.f32( float %r0) + call void @llvm.AMDGPU.store.output(float %r1, i32 0) + ret void +} + +declare float @llvm.sin.f32(float) readnone + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) diff --git a/test/CodeGen/R600/load.constant_addrspace.f32.ll b/test/CodeGen/R600/load.constant_addrspace.f32.ll new file mode 100644 index 000000000000..93627283bb94 --- /dev/null +++ b/test/CodeGen/R600/load.constant_addrspace.f32.ll @@ -0,0 +1,9 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: VTX_READ_32 T{{[0-9]+\.X, T[0-9]+\.X}} + +define void @test(float addrspace(1)* %out, float addrspace(2)* %in) { + %1 = load float addrspace(2)* %in + store float %1, float addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/load.i8.ll b/test/CodeGen/R600/load.i8.ll new file mode 100644 index 000000000000..b070dcd52049 --- /dev/null +++ b/test/CodeGen/R600/load.i8.ll @@ -0,0 +1,10 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: VTX_READ_8 T{{[0-9]+\.X, T[0-9]+\.X}} + +define void @test(i32 addrspace(1)* %out, i8 addrspace(1)* %in) { + %1 = load i8 addrspace(1)* %in + %2 = zext i8 %1 to i32 + store i32 %2, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/lshl.ll b/test/CodeGen/R600/lshl.ll new file mode 100644 index 000000000000..423adb9da900 --- /dev/null +++ b/test/CodeGen/R600/lshl.ll @@ -0,0 +1,14 @@ +;RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s + +;CHECK: V_LSHLREV_B32_e32 VGPR0, 1, VGPR0 + +define void @test(i32 %p) { + %i = mul i32 %p, 2 + %r = bitcast i32 %i to float + call void @llvm.SI.export(i32 15, i32 0, i32 1, i32 12, i32 0, float %r, float %r, float %r, float %r) + ret void +} + +declare <4 x float> @llvm.SI.sample.(i32, <4 x i32>, <8 x i32>, <4 x i32>, i32) readnone + +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) diff --git a/test/CodeGen/R600/lshr.ll b/test/CodeGen/R600/lshr.ll new file mode 100644 index 000000000000..551eac1d76bf --- /dev/null +++ b/test/CodeGen/R600/lshr.ll @@ -0,0 +1,14 @@ +;RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s + +;CHECK: V_LSHRREV_B32_e32 VGPR0, 1, VGPR0 + +define void @test(i32 %p) { + %i = udiv i32 %p, 2 + %r = bitcast i32 %i to float + call void @llvm.SI.export(i32 15, i32 0, i32 1, i32 12, i32 0, float %r, float %r, float %r, float %r) + ret void +} + +declare <4 x float> @llvm.SI.sample.(i32, <4 x i32>, <8 x i32>, <4 x i32>, i32) readnone + +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) diff --git a/test/CodeGen/R600/mulhu.ll b/test/CodeGen/R600/mulhu.ll new file mode 100644 index 000000000000..28744e00c3cf --- /dev/null +++ b/test/CodeGen/R600/mulhu.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s + +;CHECK: V_MOV_B32_e32 VGPR1, -1431655765 +;CHECK-NEXT: V_MUL_HI_U32 VGPR0, VGPR0, VGPR1, 0, 0, 0, 0, 0 +;CHECK-NEXT: V_LSHRREV_B32_e32 VGPR0, 1, VGPR0 + +define void @test(i32 %p) { + %i = udiv i32 %p, 3 + %r = bitcast i32 %i to float + call void @llvm.SI.export(i32 15, i32 0, i32 1, i32 12, i32 0, float %r, float %r, float %r, float %r) + ret void +} + +declare <4 x float> @llvm.SI.sample.(i32, <4 x i32>, <8 x i32>, <4 x i32>, i32) readnone + +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) diff --git a/test/CodeGen/R600/predicates.ll b/test/CodeGen/R600/predicates.ll new file mode 100644 index 000000000000..eb8b052b6f72 --- /dev/null +++ b/test/CodeGen/R600/predicates.ll @@ -0,0 +1,104 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; These tests make sure the compiler is optimizing branches using predicates +; when it is legal to do so. + +; CHECK: @simple_if +; CHECK: PRED_SET{{[EGN][ET]*}}_INT Pred, +; CHECK: LSHL T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, 0(0.000000e+00) Pred_sel +define void @simple_if(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp sgt i32 %in, 0 + br i1 %0, label %IF, label %ENDIF + +IF: + %1 = shl i32 %in, 1 + br label %ENDIF + +ENDIF: + %2 = phi i32 [ %in, %entry ], [ %1, %IF ] + store i32 %2, i32 addrspace(1)* %out + ret void +} + +; CHECK: @simple_if_else +; CHECK: PRED_SET{{[EGN][ET]*}}_INT Pred, +; CHECK: LSH{{[LR] T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, 0(0.000000e+00) Pred_sel +; CHECK: LSH{{[LR] T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, 0(0.000000e+00) Pred_sel +define void @simple_if_else(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp sgt i32 %in, 0 + br i1 %0, label %IF, label %ELSE + +IF: + %1 = shl i32 %in, 1 + br label %ENDIF + +ELSE: + %2 = lshr i32 %in, 1 + br label %ENDIF + +ENDIF: + %3 = phi i32 [ %1, %IF ], [ %2, %ELSE ] + store i32 %3, i32 addrspace(1)* %out + ret void +} + +; CHECK: @nested_if +; CHECK: ALU_PUSH_BEFORE +; CHECK: PRED_SET{{[EGN][ET]*}}_INT Exec +; CHECK: JUMP +; CHECK: PRED_SET{{[EGN][ET]*}}_INT Pred, +; CHECK: LSHL T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, 0(0.000000e+00) Pred_sel +; CHECK: POP +define void @nested_if(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp sgt i32 %in, 0 + br i1 %0, label %IF0, label %ENDIF + +IF0: + %1 = add i32 %in, 10 + %2 = icmp sgt i32 %1, 0 + br i1 %2, label %IF1, label %ENDIF + +IF1: + %3 = shl i32 %1, 1 + br label %ENDIF + +ENDIF: + %4 = phi i32 [%in, %entry], [%1, %IF0], [%3, %IF1] + store i32 %4, i32 addrspace(1)* %out + ret void +} + +; CHECK: @nested_if_else +; CHECK: ALU_PUSH_BEFORE +; CHECK: PRED_SET{{[EGN][ET]*}}_INT Exec +; CHECK: JUMP +; CHECK: PRED_SET{{[EGN][ET]*}}_INT Pred, +; CHECK: LSH{{[LR] T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, 0(0.000000e+00) Pred_sel +; CHECK: LSH{{[LR] T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, 1, 0(0.000000e+00) Pred_sel +; CHECK: POP +define void @nested_if_else(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp sgt i32 %in, 0 + br i1 %0, label %IF0, label %ENDIF + +IF0: + %1 = add i32 %in, 10 + %2 = icmp sgt i32 %1, 0 + br i1 %2, label %IF1, label %ELSE1 + +IF1: + %3 = shl i32 %1, 1 + br label %ENDIF + +ELSE1: + %4 = lshr i32 %in, 1 + br label %ENDIF + +ENDIF: + %5 = phi i32 [%in, %entry], [%3, %IF1], [%4, %ELSE1] + store i32 %5, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/reciprocal.ll b/test/CodeGen/R600/reciprocal.ll new file mode 100644 index 000000000000..6838c1ae3662 --- /dev/null +++ b/test/CodeGen/R600/reciprocal.ll @@ -0,0 +1,16 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: RECIP_IEEE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test() { + %r0 = call float @llvm.R600.load.input(i32 0) + %r1 = fdiv float 1.0, %r0 + call void @llvm.AMDGPU.store.output(float %r1, i32 0) + ret void +} + +declare float @llvm.R600.load.input(i32) readnone + +declare void @llvm.AMDGPU.store.output(float, i32) + +declare float @llvm.AMDGPU.rcp(float ) readnone diff --git a/test/CodeGen/R600/schedule-fs-loop-nested-if.ll b/test/CodeGen/R600/schedule-fs-loop-nested-if.ll new file mode 100644 index 000000000000..ba9620c40a49 --- /dev/null +++ b/test/CodeGen/R600/schedule-fs-loop-nested-if.ll @@ -0,0 +1,83 @@ +;RUN: llc < %s -march=r600 -mcpu=cayman -stress-sched -verify-misched +;REQUIRES: asserts + +define void @main() { +main_body: + %0 = call float @llvm.R600.interp.input(i32 0, i32 0) + %1 = call float @llvm.R600.interp.input(i32 1, i32 0) + %2 = call float @llvm.R600.interp.input(i32 2, i32 0) + %3 = call float @llvm.R600.interp.input(i32 3, i32 0) + %4 = fcmp ult float %1, 0.000000e+00 + %5 = select i1 %4, float 1.000000e+00, float 0.000000e+00 + %6 = fsub float -0.000000e+00, %5 + %7 = fptosi float %6 to i32 + %8 = bitcast i32 %7 to float + %9 = fcmp ult float %0, 5.700000e+01 + %10 = select i1 %9, float 1.000000e+00, float 0.000000e+00 + %11 = fsub float -0.000000e+00, %10 + %12 = fptosi float %11 to i32 + %13 = bitcast i32 %12 to float + %14 = bitcast float %8 to i32 + %15 = bitcast float %13 to i32 + %16 = and i32 %14, %15 + %17 = bitcast i32 %16 to float + %18 = bitcast float %17 to i32 + %19 = icmp ne i32 %18, 0 + %20 = fcmp ult float %0, 0.000000e+00 + %21 = select i1 %20, float 1.000000e+00, float 0.000000e+00 + %22 = fsub float -0.000000e+00, %21 + %23 = fptosi float %22 to i32 + %24 = bitcast i32 %23 to float + %25 = bitcast float %24 to i32 + %26 = icmp ne i32 %25, 0 + br i1 %19, label %IF, label %ELSE + +IF: ; preds = %main_body + %. = select i1 %26, float 0.000000e+00, float 1.000000e+00 + %.18 = select i1 %26, float 1.000000e+00, float 0.000000e+00 + br label %ENDIF + +ELSE: ; preds = %main_body + br i1 %26, label %ENDIF, label %ELSE17 + +ENDIF: ; preds = %ELSE17, %ELSE, %IF + %temp1.0 = phi float [ %., %IF ], [ %48, %ELSE17 ], [ 0.000000e+00, %ELSE ] + %temp2.0 = phi float [ 0.000000e+00, %IF ], [ %49, %ELSE17 ], [ 1.000000e+00, %ELSE ] + %temp.0 = phi float [ %.18, %IF ], [ %47, %ELSE17 ], [ 0.000000e+00, %ELSE ] + %27 = call float @llvm.AMDIL.clamp.(float %temp.0, float 0.000000e+00, float 1.000000e+00) + %28 = call float @llvm.AMDIL.clamp.(float %temp1.0, float 0.000000e+00, float 1.000000e+00) + %29 = call float @llvm.AMDIL.clamp.(float %temp2.0, float 0.000000e+00, float 1.000000e+00) + %30 = call float @llvm.AMDIL.clamp.(float 1.000000e+00, float 0.000000e+00, float 1.000000e+00) + %31 = insertelement <4 x float> undef, float %27, i32 0 + %32 = insertelement <4 x float> %31, float %28, i32 1 + %33 = insertelement <4 x float> %32, float %29, i32 2 + %34 = insertelement <4 x float> %33, float %30, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %34, i32 0, i32 0) + ret void + +ELSE17: ; preds = %ELSE + %35 = fadd float 0.000000e+00, 0x3FC99999A0000000 + %36 = fadd float 0.000000e+00, 0x3FC99999A0000000 + %37 = fadd float 0.000000e+00, 0x3FC99999A0000000 + %38 = fadd float %35, 0x3FC99999A0000000 + %39 = fadd float %36, 0x3FC99999A0000000 + %40 = fadd float %37, 0x3FC99999A0000000 + %41 = fadd float %38, 0x3FC99999A0000000 + %42 = fadd float %39, 0x3FC99999A0000000 + %43 = fadd float %40, 0x3FC99999A0000000 + %44 = fadd float %41, 0x3FC99999A0000000 + %45 = fadd float %42, 0x3FC99999A0000000 + %46 = fadd float %43, 0x3FC99999A0000000 + %47 = fadd float %44, 0x3FC99999A0000000 + %48 = fadd float %45, 0x3FC99999A0000000 + %49 = fadd float %46, 0x3FC99999A0000000 + br label %ENDIF +} + +declare float @llvm.R600.interp.input(i32, i32) #0 + +declare float @llvm.AMDIL.clamp.(float, float, float) #0 + +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) + +attributes #0 = { readnone } diff --git a/test/CodeGen/R600/schedule-fs-loop-nested.ll b/test/CodeGen/R600/schedule-fs-loop-nested.ll new file mode 100644 index 000000000000..5e875c49ab51 --- /dev/null +++ b/test/CodeGen/R600/schedule-fs-loop-nested.ll @@ -0,0 +1,88 @@ +;RUN: llc < %s -march=r600 -mcpu=cayman -stress-sched -verify-misched +;REQUIRES: asserts + +define void @main() { +main_body: + %0 = load <4 x float> addrspace(9)* null + %1 = extractelement <4 x float> %0, i32 3 + %2 = fptosi float %1 to i32 + %3 = bitcast i32 %2 to float + %4 = bitcast float %3 to i32 + %5 = sdiv i32 %4, 4 + %6 = bitcast i32 %5 to float + %7 = bitcast float %6 to i32 + %8 = mul i32 %7, 4 + %9 = bitcast i32 %8 to float + %10 = bitcast float %9 to i32 + %11 = sub i32 0, %10 + %12 = bitcast i32 %11 to float + %13 = bitcast float %3 to i32 + %14 = bitcast float %12 to i32 + %15 = add i32 %13, %14 + %16 = bitcast i32 %15 to float + %17 = load <4 x float> addrspace(9)* null + %18 = extractelement <4 x float> %17, i32 0 + %19 = load <4 x float> addrspace(9)* null + %20 = extractelement <4 x float> %19, i32 1 + %21 = load <4 x float> addrspace(9)* null + %22 = extractelement <4 x float> %21, i32 2 + br label %LOOP + +LOOP: ; preds = %IF31, %main_body + %temp12.0 = phi float [ 0.000000e+00, %main_body ], [ %47, %IF31 ] + %temp6.0 = phi float [ %22, %main_body ], [ %temp6.1, %IF31 ] + %temp5.0 = phi float [ %20, %main_body ], [ %temp5.1, %IF31 ] + %temp4.0 = phi float [ %18, %main_body ], [ %temp4.1, %IF31 ] + %23 = bitcast float %temp12.0 to i32 + %24 = bitcast float %6 to i32 + %25 = icmp sge i32 %23, %24 + %26 = sext i1 %25 to i32 + %27 = bitcast i32 %26 to float + %28 = bitcast float %27 to i32 + %29 = icmp ne i32 %28, 0 + br i1 %29, label %IF, label %LOOP29 + +IF: ; preds = %LOOP + %30 = call float @llvm.AMDIL.clamp.(float %temp4.0, float 0.000000e+00, float 1.000000e+00) + %31 = call float @llvm.AMDIL.clamp.(float %temp5.0, float 0.000000e+00, float 1.000000e+00) + %32 = call float @llvm.AMDIL.clamp.(float %temp6.0, float 0.000000e+00, float 1.000000e+00) + %33 = call float @llvm.AMDIL.clamp.(float 1.000000e+00, float 0.000000e+00, float 1.000000e+00) + %34 = insertelement <4 x float> undef, float %30, i32 0 + %35 = insertelement <4 x float> %34, float %31, i32 1 + %36 = insertelement <4 x float> %35, float %32, i32 2 + %37 = insertelement <4 x float> %36, float %33, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %37, i32 0, i32 0) + ret void + +LOOP29: ; preds = %LOOP, %ENDIF30 + %temp6.1 = phi float [ %temp4.1, %ENDIF30 ], [ %temp6.0, %LOOP ] + %temp5.1 = phi float [ %temp6.1, %ENDIF30 ], [ %temp5.0, %LOOP ] + %temp4.1 = phi float [ %temp5.1, %ENDIF30 ], [ %temp4.0, %LOOP ] + %temp20.0 = phi float [ %50, %ENDIF30 ], [ 0.000000e+00, %LOOP ] + %38 = bitcast float %temp20.0 to i32 + %39 = bitcast float %16 to i32 + %40 = icmp sge i32 %38, %39 + %41 = sext i1 %40 to i32 + %42 = bitcast i32 %41 to float + %43 = bitcast float %42 to i32 + %44 = icmp ne i32 %43, 0 + br i1 %44, label %IF31, label %ENDIF30 + +IF31: ; preds = %LOOP29 + %45 = bitcast float %temp12.0 to i32 + %46 = add i32 %45, 1 + %47 = bitcast i32 %46 to float + br label %LOOP + +ENDIF30: ; preds = %LOOP29 + %48 = bitcast float %temp20.0 to i32 + %49 = add i32 %48, 1 + %50 = bitcast i32 %49 to float + br label %LOOP29 +} + +declare float @llvm.AMDIL.clamp.(float, float, float) #0 + +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) + +attributes #0 = { readnone } diff --git a/test/CodeGen/R600/schedule-fs-loop.ll b/test/CodeGen/R600/schedule-fs-loop.ll new file mode 100644 index 000000000000..d142cacd4335 --- /dev/null +++ b/test/CodeGen/R600/schedule-fs-loop.ll @@ -0,0 +1,55 @@ +;RUN: llc < %s -march=r600 -mcpu=cayman -stress-sched -verify-misched +;REQUIRES: asserts + +define void @main() { +main_body: + %0 = load <4 x float> addrspace(9)* null + %1 = extractelement <4 x float> %0, i32 3 + %2 = fptosi float %1 to i32 + %3 = bitcast i32 %2 to float + %4 = load <4 x float> addrspace(9)* null + %5 = extractelement <4 x float> %4, i32 0 + %6 = load <4 x float> addrspace(9)* null + %7 = extractelement <4 x float> %6, i32 1 + %8 = load <4 x float> addrspace(9)* null + %9 = extractelement <4 x float> %8, i32 2 + br label %LOOP + +LOOP: ; preds = %ENDIF, %main_body + %temp4.0 = phi float [ %5, %main_body ], [ %temp5.0, %ENDIF ] + %temp5.0 = phi float [ %7, %main_body ], [ %temp6.0, %ENDIF ] + %temp6.0 = phi float [ %9, %main_body ], [ %temp4.0, %ENDIF ] + %temp8.0 = phi float [ 0.000000e+00, %main_body ], [ %27, %ENDIF ] + %10 = bitcast float %temp8.0 to i32 + %11 = bitcast float %3 to i32 + %12 = icmp sge i32 %10, %11 + %13 = sext i1 %12 to i32 + %14 = bitcast i32 %13 to float + %15 = bitcast float %14 to i32 + %16 = icmp ne i32 %15, 0 + br i1 %16, label %IF, label %ENDIF + +IF: ; preds = %LOOP + %17 = call float @llvm.AMDIL.clamp.(float %temp4.0, float 0.000000e+00, float 1.000000e+00) + %18 = call float @llvm.AMDIL.clamp.(float %temp5.0, float 0.000000e+00, float 1.000000e+00) + %19 = call float @llvm.AMDIL.clamp.(float %temp6.0, float 0.000000e+00, float 1.000000e+00) + %20 = call float @llvm.AMDIL.clamp.(float 1.000000e+00, float 0.000000e+00, float 1.000000e+00) + %21 = insertelement <4 x float> undef, float %17, i32 0 + %22 = insertelement <4 x float> %21, float %18, i32 1 + %23 = insertelement <4 x float> %22, float %19, i32 2 + %24 = insertelement <4 x float> %23, float %20, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %24, i32 0, i32 0) + ret void + +ENDIF: ; preds = %LOOP + %25 = bitcast float %temp8.0 to i32 + %26 = add i32 %25, 1 + %27 = bitcast i32 %26 to float + br label %LOOP +} + +declare float @llvm.AMDIL.clamp.(float, float, float) #0 + +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) + +attributes #0 = { readnone } diff --git a/test/CodeGen/R600/schedule-if-2.ll b/test/CodeGen/R600/schedule-if-2.ll new file mode 100644 index 000000000000..6afd6772926b --- /dev/null +++ b/test/CodeGen/R600/schedule-if-2.ll @@ -0,0 +1,94 @@ +;RUN: llc < %s -march=r600 -mcpu=cayman -stress-sched -verify-misched +;REQUIRES: asserts + +define void @main() { +main_body: + %0 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) + %1 = extractelement <4 x float> %0, i32 0 + %2 = fadd float 1.000000e+03, %1 + %3 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %4 = extractelement <4 x float> %3, i32 0 + %5 = bitcast float %4 to i32 + %6 = icmp eq i32 %5, 0 + %7 = sext i1 %6 to i32 + %8 = bitcast i32 %7 to float + %9 = bitcast float %8 to i32 + %10 = icmp ne i32 %9, 0 + br i1 %10, label %IF, label %ELSE + +IF: ; preds = %main_body + %11 = call float @fabs(float %2) + %12 = fcmp ueq float %11, 0x7FF0000000000000 + %13 = select i1 %12, float 1.000000e+00, float 0.000000e+00 + %14 = fsub float -0.000000e+00, %13 + %15 = fptosi float %14 to i32 + %16 = bitcast i32 %15 to float + %17 = bitcast float %16 to i32 + %18 = icmp ne i32 %17, 0 + %. = select i1 %18, float 0x36A0000000000000, float 0.000000e+00 + %19 = fcmp une float %2, %2 + %20 = select i1 %19, float 1.000000e+00, float 0.000000e+00 + %21 = fsub float -0.000000e+00, %20 + %22 = fptosi float %21 to i32 + %23 = bitcast i32 %22 to float + %24 = bitcast float %23 to i32 + %25 = icmp ne i32 %24, 0 + %temp8.0 = select i1 %25, float 0x36A0000000000000, float 0.000000e+00 + %26 = bitcast float %. to i32 + %27 = sitofp i32 %26 to float + %28 = bitcast float %temp8.0 to i32 + %29 = sitofp i32 %28 to float + %30 = fcmp ugt float %2, 0.000000e+00 + %31 = select i1 %30, float 1.000000e+00, float %2 + %32 = fcmp uge float %31, 0.000000e+00 + %33 = select i1 %32, float %31, float -1.000000e+00 + %34 = fadd float %33, 1.000000e+00 + %35 = fmul float %34, 5.000000e-01 + br label %ENDIF + +ELSE: ; preds = %main_body + %36 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %37 = extractelement <4 x float> %36, i32 0 + %38 = bitcast float %37 to i32 + %39 = icmp eq i32 %38, 1 + %40 = sext i1 %39 to i32 + %41 = bitcast i32 %40 to float + %42 = bitcast float %41 to i32 + %43 = icmp ne i32 %42, 0 + br i1 %43, label %IF23, label %ENDIF + +ENDIF: ; preds = %IF23, %ELSE, %IF + %temp4.0 = phi float [ %2, %IF ], [ %56, %IF23 ], [ 0.000000e+00, %ELSE ] + %temp5.0 = phi float [ %27, %IF ], [ %60, %IF23 ], [ 0.000000e+00, %ELSE ] + %temp6.0 = phi float [ %29, %IF ], [ 0.000000e+00, %ELSE ], [ 0.000000e+00, %IF23 ] + %temp7.0 = phi float [ %35, %IF ], [ 0.000000e+00, %ELSE ], [ 0.000000e+00, %IF23 ] + %44 = insertelement <4 x float> undef, float %temp4.0, i32 0 + %45 = insertelement <4 x float> %44, float %temp5.0, i32 1 + %46 = insertelement <4 x float> %45, float %temp6.0, i32 2 + %47 = insertelement <4 x float> %46, float %temp7.0, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %47, i32 0, i32 0) + ret void + +IF23: ; preds = %ELSE + %48 = fcmp ult float 0.000000e+00, %2 + %49 = select i1 %48, float 1.000000e+00, float 0.000000e+00 + %50 = fsub float -0.000000e+00, %49 + %51 = fptosi float %50 to i32 + %52 = bitcast i32 %51 to float + %53 = bitcast float %52 to i32 + %54 = icmp ne i32 %53, 0 + %.28 = select i1 %54, float 0x36A0000000000000, float 0.000000e+00 + %55 = bitcast float %.28 to i32 + %56 = sitofp i32 %55 to float + %57 = load <4 x float> addrspace(8)* null + %58 = extractelement <4 x float> %57, i32 0 + %59 = fsub float -0.000000e+00, %58 + %60 = fadd float %2, %59 + br label %ENDIF +} + +declare float @fabs(float) #0 + +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) + +attributes #0 = { readonly } diff --git a/test/CodeGen/R600/schedule-if.ll b/test/CodeGen/R600/schedule-if.ll new file mode 100644 index 000000000000..347d92fd6a0e --- /dev/null +++ b/test/CodeGen/R600/schedule-if.ll @@ -0,0 +1,46 @@ +;RUN: llc < %s -march=r600 -mcpu=cayman -stress-sched -verify-misched +;REQUIRES: asserts + +define void @main() { +main_body: + %0 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %1 = extractelement <4 x float> %0, i32 0 + %2 = bitcast float %1 to i32 + %3 = icmp eq i32 %2, 0 + %4 = sext i1 %3 to i32 + %5 = bitcast i32 %4 to float + %6 = bitcast float %5 to i32 + %7 = icmp ne i32 %6, 0 + br i1 %7, label %ENDIF, label %ELSE + +ELSE: ; preds = %main_body + %8 = load <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) + %9 = extractelement <4 x float> %8, i32 0 + %10 = bitcast float %9 to i32 + %11 = icmp eq i32 %10, 1 + %12 = sext i1 %11 to i32 + %13 = bitcast i32 %12 to float + %14 = bitcast float %13 to i32 + %15 = icmp ne i32 %14, 0 + br i1 %15, label %IF13, label %ENDIF + +ENDIF: ; preds = %IF13, %ELSE, %main_body + %temp.0 = phi float [ 1.000000e+03, %main_body ], [ 1.000000e+00, %IF13 ], [ 0.000000e+00, %ELSE ] + %temp1.0 = phi float [ 0.000000e+00, %main_body ], [ %23, %IF13 ], [ 0.000000e+00, %ELSE ] + %temp3.0 = phi float [ 1.000000e+00, %main_body ], [ 0.000000e+00, %ELSE ], [ 0.000000e+00, %IF13 ] + %16 = insertelement <4 x float> undef, float %temp.0, i32 0 + %17 = insertelement <4 x float> %16, float %temp1.0, i32 1 + %18 = insertelement <4 x float> %17, float 0.000000e+00, i32 2 + %19 = insertelement <4 x float> %18, float %temp3.0, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %19, i32 0, i32 0) + ret void + +IF13: ; preds = %ELSE + %20 = load <4 x float> addrspace(8)* null + %21 = extractelement <4 x float> %20, i32 0 + %22 = fsub float -0.000000e+00, %21 + %23 = fadd float 1.000000e+03, %22 + br label %ENDIF +} + +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) diff --git a/test/CodeGen/R600/schedule-vs-if-nested-loop.ll b/test/CodeGen/R600/schedule-vs-if-nested-loop.ll new file mode 100644 index 000000000000..44b7c2f68002 --- /dev/null +++ b/test/CodeGen/R600/schedule-vs-if-nested-loop.ll @@ -0,0 +1,134 @@ +;RUN: llc < %s -march=r600 -mcpu=cayman -stress-sched -verify-misched +;REQUIRES: asserts + +define void @main() { +main_body: + %0 = call float @llvm.R600.load.input(i32 4) + %1 = call float @llvm.R600.load.input(i32 5) + %2 = call float @llvm.R600.load.input(i32 6) + %3 = call float @llvm.R600.load.input(i32 7) + %4 = fcmp ult float %0, 0.000000e+00 + %5 = select i1 %4, float 1.000000e+00, float 0.000000e+00 + %6 = fsub float -0.000000e+00, %5 + %7 = fptosi float %6 to i32 + %8 = bitcast i32 %7 to float + %9 = bitcast float %8 to i32 + %10 = icmp ne i32 %9, 0 + br i1 %10, label %LOOP, label %ENDIF + +ENDIF: ; preds = %ENDIF16, %LOOP, %main_body + %temp.0 = phi float [ 0.000000e+00, %main_body ], [ %temp.1, %LOOP ], [ %temp.1, %ENDIF16 ] + %temp1.0 = phi float [ 1.000000e+00, %main_body ], [ %temp1.1, %LOOP ], [ %temp1.1, %ENDIF16 ] + %temp2.0 = phi float [ 0.000000e+00, %main_body ], [ %temp2.1, %LOOP ], [ %temp2.1, %ENDIF16 ] + %temp3.0 = phi float [ 0.000000e+00, %main_body ], [ %temp3.1, %LOOP ], [ %temp3.1, %ENDIF16 ] + %11 = load <4 x float> addrspace(9)* null + %12 = extractelement <4 x float> %11, i32 0 + %13 = fmul float %12, %0 + %14 = load <4 x float> addrspace(9)* null + %15 = extractelement <4 x float> %14, i32 1 + %16 = fmul float %15, %0 + %17 = load <4 x float> addrspace(9)* null + %18 = extractelement <4 x float> %17, i32 2 + %19 = fmul float %18, %0 + %20 = load <4 x float> addrspace(9)* null + %21 = extractelement <4 x float> %20, i32 3 + %22 = fmul float %21, %0 + %23 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) + %24 = extractelement <4 x float> %23, i32 0 + %25 = fmul float %24, %1 + %26 = fadd float %25, %13 + %27 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) + %28 = extractelement <4 x float> %27, i32 1 + %29 = fmul float %28, %1 + %30 = fadd float %29, %16 + %31 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) + %32 = extractelement <4 x float> %31, i32 2 + %33 = fmul float %32, %1 + %34 = fadd float %33, %19 + %35 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) + %36 = extractelement <4 x float> %35, i32 3 + %37 = fmul float %36, %1 + %38 = fadd float %37, %22 + %39 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) + %40 = extractelement <4 x float> %39, i32 0 + %41 = fmul float %40, %2 + %42 = fadd float %41, %26 + %43 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) + %44 = extractelement <4 x float> %43, i32 1 + %45 = fmul float %44, %2 + %46 = fadd float %45, %30 + %47 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) + %48 = extractelement <4 x float> %47, i32 2 + %49 = fmul float %48, %2 + %50 = fadd float %49, %34 + %51 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) + %52 = extractelement <4 x float> %51, i32 3 + %53 = fmul float %52, %2 + %54 = fadd float %53, %38 + %55 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) + %56 = extractelement <4 x float> %55, i32 0 + %57 = fmul float %56, %3 + %58 = fadd float %57, %42 + %59 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) + %60 = extractelement <4 x float> %59, i32 1 + %61 = fmul float %60, %3 + %62 = fadd float %61, %46 + %63 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) + %64 = extractelement <4 x float> %63, i32 2 + %65 = fmul float %64, %3 + %66 = fadd float %65, %50 + %67 = load <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) + %68 = extractelement <4 x float> %67, i32 3 + %69 = fmul float %68, %3 + %70 = fadd float %69, %54 + %71 = insertelement <4 x float> undef, float %58, i32 0 + %72 = insertelement <4 x float> %71, float %62, i32 1 + %73 = insertelement <4 x float> %72, float %66, i32 2 + %74 = insertelement <4 x float> %73, float %70, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %74, i32 60, i32 1) + %75 = insertelement <4 x float> undef, float %temp.0, i32 0 + %76 = insertelement <4 x float> %75, float %temp1.0, i32 1 + %77 = insertelement <4 x float> %76, float %temp2.0, i32 2 + %78 = insertelement <4 x float> %77, float %temp3.0, i32 3 + call void @llvm.R600.store.swizzle(<4 x float> %78, i32 0, i32 2) + ret void + +LOOP: ; preds = %main_body, %ENDIF19 + %temp.1 = phi float [ %93, %ENDIF19 ], [ 0.000000e+00, %main_body ] + %temp1.1 = phi float [ %94, %ENDIF19 ], [ 1.000000e+00, %main_body ] + %temp2.1 = phi float [ %95, %ENDIF19 ], [ 0.000000e+00, %main_body ] + %temp3.1 = phi float [ %96, %ENDIF19 ], [ 0.000000e+00, %main_body ] + %temp4.0 = phi float [ %97, %ENDIF19 ], [ -2.000000e+00, %main_body ] + %79 = fcmp uge float %temp4.0, %0 + %80 = select i1 %79, float 1.000000e+00, float 0.000000e+00 + %81 = fsub float -0.000000e+00, %80 + %82 = fptosi float %81 to i32 + %83 = bitcast i32 %82 to float + %84 = bitcast float %83 to i32 + %85 = icmp ne i32 %84, 0 + br i1 %85, label %ENDIF, label %ENDIF16 + +ENDIF16: ; preds = %LOOP + %86 = fcmp une float %2, %temp4.0 + %87 = select i1 %86, float 1.000000e+00, float 0.000000e+00 + %88 = fsub float -0.000000e+00, %87 + %89 = fptosi float %88 to i32 + %90 = bitcast i32 %89 to float + %91 = bitcast float %90 to i32 + %92 = icmp ne i32 %91, 0 + br i1 %92, label %ENDIF, label %ENDIF19 + +ENDIF19: ; preds = %ENDIF16 + %93 = fadd float %temp.1, 1.000000e+00 + %94 = fadd float %temp1.1, 0.000000e+00 + %95 = fadd float %temp2.1, 0.000000e+00 + %96 = fadd float %temp3.1, 0.000000e+00 + %97 = fadd float %temp4.0, 1.000000e+00 + br label %LOOP +} + +declare float @llvm.R600.load.input(i32) #0 + +declare void @llvm.R600.store.swizzle(<4 x float>, i32, i32) + +attributes #0 = { readnone } diff --git a/test/CodeGen/R600/sdiv.ll b/test/CodeGen/R600/sdiv.ll new file mode 100644 index 000000000000..3556facfbab3 --- /dev/null +++ b/test/CodeGen/R600/sdiv.ll @@ -0,0 +1,21 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; The code generated by sdiv is long and complex and may frequently change. +; The goal of this test is to make sure the ISel doesn't fail. +; +; This program was previously failing to compile when one of the selectcc +; opcodes generated by the sdiv lowering was being legalized and optimized to: +; selectcc Remainder -1, 0, -1, SETGT +; This was fixed by adding an additional pattern in R600Instructions.td to +; match this pattern with a CNDGE_INT. + +; CHECK: RETURN + +define void @test(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { + %den_ptr = getelementptr i32 addrspace(1)* %in, i32 1 + %num = load i32 addrspace(1) * %in + %den = load i32 addrspace(1) * %den_ptr + %result = sdiv i32 %num, %den + store i32 %result, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/selectcc-icmp-select-float.ll b/test/CodeGen/R600/selectcc-icmp-select-float.ll new file mode 100644 index 000000000000..359ca1e6f8ce --- /dev/null +++ b/test/CodeGen/R600/selectcc-icmp-select-float.ll @@ -0,0 +1,15 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; Note additional optimizations may cause this SGT to be replaced with a +; CND* instruction. +; CHECK: SETGT_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], literal.x, -1}} +; Test a selectcc with i32 LHS/RHS and float True/False + +define void @test(float addrspace(1)* %out, i32 addrspace(1)* %in) { +entry: + %0 = load i32 addrspace(1)* %in + %1 = icmp sge i32 %0, 0 + %2 = select i1 %1, float 1.0, float 0.0 + store float %2, float addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/selectcc-opt.ll b/test/CodeGen/R600/selectcc-opt.ll new file mode 100644 index 000000000000..02d935390423 --- /dev/null +++ b/test/CodeGen/R600/selectcc-opt.ll @@ -0,0 +1,64 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: @test_a +; CHECK-NOT: CND +; CHECK: SET{{[NEQGTL]+}}_DX10 + +define void @test_a(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ult float %in, 0.000000e+00 + %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 + %2 = fsub float -0.000000e+00, %1 + %3 = fptosi float %2 to i32 + %4 = bitcast i32 %3 to float + %5 = bitcast float %4 to i32 + %6 = icmp ne i32 %5, 0 + br i1 %6, label %IF, label %ENDIF + +IF: + %7 = getelementptr i32 addrspace(1)* %out, i32 1 + store i32 0, i32 addrspace(1)* %7 + br label %ENDIF + +ENDIF: + store i32 0, i32 addrspace(1)* %out + ret void +} + +; Same as test_a, but the branch labels are swapped to produce the inverse cc +; for the icmp instruction + +; CHECK: @test_b +; CHECK: SET{{[GTEQN]+}}_DX10 +; CHECK-NEXT: PRED_ +define void @test_b(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ult float %in, 0.0 + %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 + %2 = fsub float -0.000000e+00, %1 + %3 = fptosi float %2 to i32 + %4 = bitcast i32 %3 to float + %5 = bitcast float %4 to i32 + %6 = icmp ne i32 %5, 0 + br i1 %6, label %ENDIF, label %IF + +IF: + %7 = getelementptr i32 addrspace(1)* %out, i32 1 + store i32 0, i32 addrspace(1)* %7 + br label %ENDIF + +ENDIF: + store i32 0, i32 addrspace(1)* %out + ret void +} + +; Test a CND*_INT instruction with float true/false values +; CHECK: @test_c +; CHECK: CND{{[GTE]+}}_INT +define void @test_c(float addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp sgt i32 %in, 0 + %1 = select i1 %0, float 2.0, float 3.0 + store float %1, float addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/selectcc_cnde.ll b/test/CodeGen/R600/selectcc_cnde.ll new file mode 100644 index 000000000000..f0a0f512ba15 --- /dev/null +++ b/test/CodeGen/R600/selectcc_cnde.ll @@ -0,0 +1,11 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK-NOT: SETE +;CHECK: CNDE T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], 1.0, literal.x, [-0-9]+\(2.0}} +define void @test(float addrspace(1)* %out, float addrspace(1)* %in) { + %1 = load float addrspace(1)* %in + %2 = fcmp oeq float %1, 0.0 + %3 = select i1 %2, float 1.0, float 2.0 + store float %3, float addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/selectcc_cnde_int.ll b/test/CodeGen/R600/selectcc_cnde_int.ll new file mode 100644 index 000000000000..b38078e26db6 --- /dev/null +++ b/test/CodeGen/R600/selectcc_cnde_int.ll @@ -0,0 +1,11 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK-NOT: SETE_INT +;CHECK: CNDE_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], 1, literal.x, 2}} +define void @test(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { + %1 = load i32 addrspace(1)* %in + %2 = icmp eq i32 %1, 0 + %3 = select i1 %2, i32 1, i32 2 + store i32 %3, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/set-dx10.ll b/test/CodeGen/R600/set-dx10.ll new file mode 100644 index 000000000000..54febcf0e68e --- /dev/null +++ b/test/CodeGen/R600/set-dx10.ll @@ -0,0 +1,137 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; These tests check that floating point comparisons which are used by select +; to store integer true (-1) and false (0) values are lowered to one of the +; SET*DX10 instructions. + +; CHECK: @fcmp_une_select_fptosi +; CHECK: SETNE_DX10 T{{[0-9]+\.[XYZW]}}, T{{[0-9]+\.[XYZW]}}, literal.x, 1084227584(5.000000e+00) +define void @fcmp_une_select_fptosi(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp une float %in, 5.0 + %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 + %2 = fsub float -0.000000e+00, %1 + %3 = fptosi float %2 to i32 + store i32 %3, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_une_select_i32 +; CHECK: SETNE_DX10 T{{[0-9]+\.[XYZW]}}, T{{[0-9]+\.[XYZW]}}, literal.x, 1084227584(5.000000e+00) +define void @fcmp_une_select_i32(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp une float %in, 5.0 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_ueq_select_fptosi +; CHECK: SETE_DX10 T{{[0-9]+\.[XYZW]}}, T{{[0-9]+\.[XYZW]}}, literal.x, 1084227584(5.000000e+00) +define void @fcmp_ueq_select_fptosi(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ueq float %in, 5.0 + %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 + %2 = fsub float -0.000000e+00, %1 + %3 = fptosi float %2 to i32 + store i32 %3, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_ueq_select_i32 +; CHECK: SETE_DX10 T{{[0-9]+\.[XYZW]}}, T{{[0-9]+\.[XYZW]}}, literal.x, 1084227584(5.000000e+00) +define void @fcmp_ueq_select_i32(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ueq float %in, 5.0 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_ugt_select_fptosi +; CHECK: SETGT_DX10 T{{[0-9]+\.[XYZW]}}, T{{[0-9]+\.[XYZW]}}, literal.x, 1084227584(5.000000e+00) +define void @fcmp_ugt_select_fptosi(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ugt float %in, 5.0 + %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 + %2 = fsub float -0.000000e+00, %1 + %3 = fptosi float %2 to i32 + store i32 %3, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_ugt_select_i32 +; CHECK: SETGT_DX10 T{{[0-9]+\.[XYZW]}}, T{{[0-9]+\.[XYZW]}}, literal.x, 1084227584(5.000000e+00) +define void @fcmp_ugt_select_i32(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ugt float %in, 5.0 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_uge_select_fptosi +; CHECK: SETGE_DX10 T{{[0-9]+\.[XYZW]}}, T{{[0-9]+\.[XYZW]}}, literal.x, 1084227584(5.000000e+00) +define void @fcmp_uge_select_fptosi(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp uge float %in, 5.0 + %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 + %2 = fsub float -0.000000e+00, %1 + %3 = fptosi float %2 to i32 + store i32 %3, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_uge_select_i32 +; CHECK: SETGE_DX10 T{{[0-9]+\.[XYZW]}}, T{{[0-9]+\.[XYZW]}}, literal.x, 1084227584(5.000000e+00) +define void @fcmp_uge_select_i32(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp uge float %in, 5.0 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_ule_select_fptosi +; CHECK: SETGE_DX10 T{{[0-9]+\.[XYZW]}}, literal.x, T{{[0-9]+\.[XYZW]}}, 1084227584(5.000000e+00) +define void @fcmp_ule_select_fptosi(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ule float %in, 5.0 + %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 + %2 = fsub float -0.000000e+00, %1 + %3 = fptosi float %2 to i32 + store i32 %3, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_ule_select_i32 +; CHECK: SETGE_DX10 T{{[0-9]+\.[XYZW]}}, literal.x, T{{[0-9]+\.[XYZW]}}, 1084227584(5.000000e+00) +define void @fcmp_ule_select_i32(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ule float %in, 5.0 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_ult_select_fptosi +; CHECK: SETGT_DX10 T{{[0-9]+\.[XYZW]}}, literal.x, T{{[0-9]+\.[XYZW]}}, 1084227584(5.000000e+00) +define void @fcmp_ult_select_fptosi(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ult float %in, 5.0 + %1 = select i1 %0, float 1.000000e+00, float 0.000000e+00 + %2 = fsub float -0.000000e+00, %1 + %3 = fptosi float %2 to i32 + store i32 %3, i32 addrspace(1)* %out + ret void +} + +; CHECK: @fcmp_ult_select_i32 +; CHECK: SETGT_DX10 T{{[0-9]+\.[XYZW]}}, literal.x, T{{[0-9]+\.[XYZW]}}, 1084227584(5.000000e+00) +define void @fcmp_ult_select_i32(i32 addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ult float %in, 5.0 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/setcc.v4i32.ll b/test/CodeGen/R600/setcc.v4i32.ll new file mode 100644 index 000000000000..0752f2e63dbf --- /dev/null +++ b/test/CodeGen/R600/setcc.v4i32.ll @@ -0,0 +1,12 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s +;CHECK: SETE_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @test(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1 + %a = load <4 x i32> addrspace(1) * %in + %b = load <4 x i32> addrspace(1) * %b_ptr + %result = icmp eq <4 x i32> %a, %b + %sext = sext <4 x i1> %result to <4 x i32> + store <4 x i32> %sext, <4 x i32> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/seto.ll b/test/CodeGen/R600/seto.ll new file mode 100644 index 000000000000..5ab4b87d570c --- /dev/null +++ b/test/CodeGen/R600/seto.ll @@ -0,0 +1,13 @@ +;RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s + +;CHECK: V_CMP_O_F32_e64 SGPR0_SGPR1, VGPR0, VGPR0, 0, 0, 0, 0 + +define void @main(float %p) { +main_body: + %c = fcmp oeq float %p, %p + %r = select i1 %c, float 1.000000e+00, float 0.000000e+00 + call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %r, float %r, float %r, float %r) + ret void +} + +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) diff --git a/test/CodeGen/R600/setuo.ll b/test/CodeGen/R600/setuo.ll new file mode 100644 index 000000000000..320835576d41 --- /dev/null +++ b/test/CodeGen/R600/setuo.ll @@ -0,0 +1,13 @@ +;RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s + +;CHECK: V_CMP_U_F32_e64 SGPR0_SGPR1, VGPR0, VGPR0, 0, 0, 0, 0 + +define void @main(float %p) { +main_body: + %c = fcmp une float %p, %p + %r = select i1 %c, float 1.000000e+00, float 0.000000e+00 + call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %r, float %r, float %r, float %r) + ret void +} + +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) diff --git a/test/CodeGen/R600/short-args.ll b/test/CodeGen/R600/short-args.ll new file mode 100644 index 000000000000..b69e327bf6df --- /dev/null +++ b/test/CodeGen/R600/short-args.ll @@ -0,0 +1,41 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: @i8_arg +; CHECK: VTX_READ_8 T{{[0-9]+\.X, T[0-9]+\.X}} + +define void @i8_arg(i32 addrspace(1)* nocapture %out, i8 %in) nounwind { +entry: + %0 = zext i8 %in to i32 + store i32 %0, i32 addrspace(1)* %out, align 4 + ret void +} + +; CHECK: @i8_zext_arg +; CHECK: VTX_READ_8 T{{[0-9]+\.X, T[0-9]+\.X}} + +define void @i8_zext_arg(i32 addrspace(1)* nocapture %out, i8 zeroext %in) nounwind { +entry: + %0 = zext i8 %in to i32 + store i32 %0, i32 addrspace(1)* %out, align 4 + ret void +} + +; CHECK: @i16_arg +; CHECK: VTX_READ_16 T{{[0-9]+\.X, T[0-9]+\.X}} + +define void @i16_arg(i32 addrspace(1)* nocapture %out, i16 %in) nounwind { +entry: + %0 = zext i16 %in to i32 + store i32 %0, i32 addrspace(1)* %out, align 4 + ret void +} + +; CHECK: @i16_zext_arg +; CHECK: VTX_READ_16 T{{[0-9]+\.X, T[0-9]+\.X}} + +define void @i16_zext_arg(i32 addrspace(1)* nocapture %out, i16 zeroext %in) nounwind { +entry: + %0 = zext i16 %in to i32 + store i32 %0, i32 addrspace(1)* %out, align 4 + ret void +} diff --git a/test/CodeGen/R600/store.v4f32.ll b/test/CodeGen/R600/store.v4f32.ll new file mode 100644 index 000000000000..8b0d24445971 --- /dev/null +++ b/test/CodeGen/R600/store.v4f32.ll @@ -0,0 +1,9 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: RAT_WRITE_CACHELESS_128 T{{[0-9]+\.XYZW, T[0-9]+\.X}}, 1 + +define void @test(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { + %1 = load <4 x float> addrspace(1) * %in + store <4 x float> %1, <4 x float> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/store.v4i32.ll b/test/CodeGen/R600/store.v4i32.ll new file mode 100644 index 000000000000..a659815ddeba --- /dev/null +++ b/test/CodeGen/R600/store.v4i32.ll @@ -0,0 +1,9 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;CHECK: RAT_WRITE_CACHELESS_128 T{{[0-9]+\.XYZW, T[0-9]+\.X}}, 1 + +define void @test(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { + %1 = load <4 x i32> addrspace(1) * %in + store <4 x i32> %1, <4 x i32> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/udiv.v4i32.ll b/test/CodeGen/R600/udiv.v4i32.ll new file mode 100644 index 000000000000..47657a6be75e --- /dev/null +++ b/test/CodeGen/R600/udiv.v4i32.ll @@ -0,0 +1,15 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;The code generated by udiv is long and complex and may frequently change. +;The goal of this test is to make sure the ISel doesn't fail when it gets +;a v4i32 udiv +;CHECK: RETURN + +define void @test(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1 + %a = load <4 x i32> addrspace(1) * %in + %b = load <4 x i32> addrspace(1) * %b_ptr + %result = udiv <4 x i32> %a, %b + store <4 x i32> %result, <4 x i32> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/unsupported-cc.ll b/test/CodeGen/R600/unsupported-cc.ll new file mode 100644 index 000000000000..b48c59151831 --- /dev/null +++ b/test/CodeGen/R600/unsupported-cc.ll @@ -0,0 +1,83 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; These tests are for condition codes that are not supported by the hardware + +; CHECK: @slt +; CHECK: SETGT_INT T{{[0-9]+\.[XYZW]}}, literal.x, {{T[0-9]+\.[XYZW]}}, 5(7.006492e-45) +define void @slt(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp slt i32 %in, 5 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @ult_i32 +; CHECK: SETGT_UINT T{{[0-9]+\.[XYZW]}}, literal.x, {{T[0-9]+\.[XYZW]}}, 5(7.006492e-45) +define void @ult_i32(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp ult i32 %in, 5 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @ult_float +; CHECK: SETGT T{{[0-9]+\.[XYZW]}}, literal.x, {{T[0-9]+\.[XYZW]}}, 1084227584(5.000000e+00) +define void @ult_float(float addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ult float %in, 5.0 + %1 = select i1 %0, float 1.0, float 0.0 + store float %1, float addrspace(1)* %out + ret void +} + +; CHECK: @olt +; CHECK: SETGT T{{[0-9]+\.[XYZW]}}, literal.x, {{T[0-9]+\.[XYZW]}}, 1084227584(5.000000e+00) +define void @olt(float addrspace(1)* %out, float %in) { +entry: + %0 = fcmp olt float %in, 5.0 + %1 = select i1 %0, float 1.0, float 0.0 + store float %1, float addrspace(1)* %out + ret void +} + +; CHECK: @sle +; CHECK: SETGT_INT T{{[0-9]+\.[XYZW]}}, literal.x, {{T[0-9]+\.[XYZW]}}, 6(8.407791e-45) +define void @sle(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp sle i32 %in, 5 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @ule_i32 +; CHECK: SETGT_UINT T{{[0-9]+\.[XYZW]}}, literal.x, {{T[0-9]+\.[XYZW]}}, 6(8.407791e-45) +define void @ule_i32(i32 addrspace(1)* %out, i32 %in) { +entry: + %0 = icmp ule i32 %in, 5 + %1 = select i1 %0, i32 -1, i32 0 + store i32 %1, i32 addrspace(1)* %out + ret void +} + +; CHECK: @ule_float +; CHECK: SETGE T{{[0-9]+\.[XYZW]}}, literal.x, {{T[0-9]+\.[XYZW]}}, 1084227584(5.000000e+00) +define void @ule_float(float addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ule float %in, 5.0 + %1 = select i1 %0, float 1.0, float 0.0 + store float %1, float addrspace(1)* %out + ret void +} + +; CHECK: @ole +; CHECK: SETGE T{{[0-9]+\.[XYZW]}}, literal.x, {{T[0-9]+\.[XYZW]}}, 1084227584(5.000000e+00) +define void @ole(float addrspace(1)* %out, float %in) { +entry: + %0 = fcmp ole float %in, 5.0 + %1 = select i1 %0, float 1.0, float 0.0 + store float %1, float addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/urem.v4i32.ll b/test/CodeGen/R600/urem.v4i32.ll new file mode 100644 index 000000000000..2e7388caa6ce --- /dev/null +++ b/test/CodeGen/R600/urem.v4i32.ll @@ -0,0 +1,15 @@ +;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +;The code generated by urem is long and complex and may frequently change. +;The goal of this test is to make sure the ISel doesn't fail when it gets +;a v4i32 urem +;CHECK: RETURN + +define void @test(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { + %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1 + %a = load <4 x i32> addrspace(1) * %in + %b = load <4 x i32> addrspace(1) * %b_ptr + %result = urem <4 x i32> %a, %b + store <4 x i32> %result, <4 x i32> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/R600/vec4-expand.ll b/test/CodeGen/R600/vec4-expand.ll new file mode 100644 index 000000000000..8f62bc692908 --- /dev/null +++ b/test/CodeGen/R600/vec4-expand.ll @@ -0,0 +1,53 @@ +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s + +; CHECK: @fp_to_sint +; CHECK: FLT_TO_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: FLT_TO_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: FLT_TO_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: FLT_TO_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @fp_to_sint(<4 x i32> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { + %value = load <4 x float> addrspace(1) * %in + %result = fptosi <4 x float> %value to <4 x i32> + store <4 x i32> %result, <4 x i32> addrspace(1)* %out + ret void +} + +; CHECK: @fp_to_uint +; CHECK: FLT_TO_UINT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: FLT_TO_UINT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: FLT_TO_UINT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: FLT_TO_UINT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @fp_to_uint(<4 x i32> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { + %value = load <4 x float> addrspace(1) * %in + %result = fptoui <4 x float> %value to <4 x i32> + store <4 x i32> %result, <4 x i32> addrspace(1)* %out + ret void +} + +; CHECK: @sint_to_fp +; CHECK: INT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: INT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: INT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: INT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @sint_to_fp(<4 x float> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { + %value = load <4 x i32> addrspace(1) * %in + %result = sitofp <4 x i32> %value to <4 x float> + store <4 x float> %result, <4 x float> addrspace(1)* %out + ret void +} + +; CHECK: @uint_to_fp +; CHECK: UINT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: UINT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: UINT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} +; CHECK: UINT_TO_FLT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} + +define void @uint_to_fp(<4 x float> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { + %value = load <4 x i32> addrspace(1) * %in + %result = uitofp <4 x i32> %value to <4 x float> + store <4 x float> %result, <4 x float> addrspace(1)* %out + ret void +} diff --git a/test/CodeGen/SI/sanity.ll b/test/CodeGen/SI/sanity.ll new file mode 100644 index 000000000000..62cdcf5eca28 --- /dev/null +++ b/test/CodeGen/SI/sanity.ll @@ -0,0 +1,37 @@ +;RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s + +; CHECK: S_ENDPGM + +define void @main() { +main_body: + call void @llvm.AMDGPU.shader.type(i32 1) + %0 = load <4 x i32> addrspace(2)* addrspace(8)* inttoptr (i32 6 to <4 x i32> addrspace(2)* addrspace(8)*) + %1 = getelementptr <4 x i32> addrspace(2)* %0, i32 0 + %2 = load <4 x i32> addrspace(2)* %1 + %3 = call i32 @llvm.SI.vs.load.buffer.index() + %4 = call <4 x float> @llvm.SI.vs.load.input(<4 x i32> %2, i32 0, i32 %3) + %5 = extractelement <4 x float> %4, i32 0 + %6 = extractelement <4 x float> %4, i32 1 + %7 = extractelement <4 x float> %4, i32 2 + %8 = extractelement <4 x float> %4, i32 3 + %9 = load <4 x i32> addrspace(2)* addrspace(8)* inttoptr (i32 6 to <4 x i32> addrspace(2)* addrspace(8)*) + %10 = getelementptr <4 x i32> addrspace(2)* %9, i32 1 + %11 = load <4 x i32> addrspace(2)* %10 + %12 = call i32 @llvm.SI.vs.load.buffer.index() + %13 = call <4 x float> @llvm.SI.vs.load.input(<4 x i32> %11, i32 0, i32 %12) + %14 = extractelement <4 x float> %13, i32 0 + %15 = extractelement <4 x float> %13, i32 1 + %16 = extractelement <4 x float> %13, i32 2 + %17 = extractelement <4 x float> %13, i32 3 + call void @llvm.SI.export(i32 15, i32 0, i32 0, i32 32, i32 0, float %14, float %15, float %16, float %17) + call void @llvm.SI.export(i32 15, i32 0, i32 1, i32 12, i32 0, float %5, float %6, float %7, float %8) + ret void +} + +declare void @llvm.AMDGPU.shader.type(i32) + +declare i32 @llvm.SI.vs.load.buffer.index() readnone + +declare <4 x float> @llvm.SI.vs.load.input(<4 x i32>, i32, i32) + +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) diff --git a/test/CodeGen/SPARC/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/SPARC/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index 3b644986f2e4..000000000000 --- a/test/CodeGen/SPARC/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=sparc -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/SPARC/64bit.ll b/test/CodeGen/SPARC/64bit.ll new file mode 100644 index 000000000000..0d4e191c9509 --- /dev/null +++ b/test/CodeGen/SPARC/64bit.ll @@ -0,0 +1,146 @@ +; RUN: llc < %s -march=sparcv9 | FileCheck %s + +; CHECK: ret2: +; CHECK: or %g0, %i1, %i0 +define i64 @ret2(i64 %a, i64 %b) { + ret i64 %b +} + +; CHECK: shl_imm +; CHECK: sllx %i0, 7, %i0 +define i64 @shl_imm(i64 %a) { + %x = shl i64 %a, 7 + ret i64 %x +} + +; CHECK: sra_reg +; CHECK: srax %i0, %i1, %i0 +define i64 @sra_reg(i64 %a, i64 %b) { + %x = ashr i64 %a, %b + ret i64 %x +} + +; Immediate materialization. Many of these patterns could actually be merged +; into the restore instruction: +; +; restore %g0, %g0, %o0 +; +; CHECK: ret_imm0 +; CHECK: or %g0, %g0, %i0 +define i64 @ret_imm0() { + ret i64 0 +} + +; CHECK: ret_simm13 +; CHECK: or %g0, -4096, %i0 +define i64 @ret_simm13() { + ret i64 -4096 +} + +; CHECK: ret_sethi +; CHECK: sethi 4, %i0 +; CHECK-NOT: or +; CHECK: restore +define i64 @ret_sethi() { + ret i64 4096 +} + +; CHECK: ret_sethi +; CHECK: sethi 4, [[R:%[goli][0-7]]] +; CHECK: or [[R]], 1, %i0 +define i64 @ret_sethi_or() { + ret i64 4097 +} + +; CHECK: ret_nimm33 +; CHECK: sethi 4, [[R:%[goli][0-7]]] +; CHECK: xor [[R]], -4, %i0 +define i64 @ret_nimm33() { + ret i64 -4100 +} + +; CHECK: ret_bigimm +; CHECK: sethi +; CHECK: sethi +define i64 @ret_bigimm() { + ret i64 6800754272627607872 +} + +; CHECK: reg_reg_alu +; CHECK: add %i0, %i1, [[R0:%[goli][0-7]]] +; CHECK: sub [[R0]], %i2, [[R1:%[goli][0-7]]] +; CHECK: andn [[R1]], %i0, %i0 +define i64 @reg_reg_alu(i64 %x, i64 %y, i64 %z) { + %a = add i64 %x, %y + %b = sub i64 %a, %z + %c = xor i64 %x, -1 + %d = and i64 %b, %c + ret i64 %d +} + +; CHECK: reg_imm_alu +; CHECK: add %i0, -5, [[R0:%[goli][0-7]]] +; CHECK: xor [[R0]], 2, %i0 +define i64 @reg_imm_alu(i64 %x, i64 %y, i64 %z) { + %a = add i64 %x, -5 + %b = xor i64 %a, 2 + ret i64 %b +} + +; CHECK: loads +; CHECK: ldx [%i0] +; CHECK: stx % +; CHECK: ld [%i1] +; CHECK: st % +; CHECK: ldsw [%i2] +; CHECK: stx % +; CHECK: ldsh [%i3] +; CHECK: sth % +define i64 @loads(i64* %p, i32* %q, i32* %r, i16* %s) { + %a = load i64* %p + %ai = add i64 1, %a + store i64 %ai, i64* %p + %b = load i32* %q + %b2 = zext i32 %b to i64 + %bi = trunc i64 %ai to i32 + store i32 %bi, i32* %q + %c = load i32* %r + %c2 = sext i32 %c to i64 + store i64 %ai, i64* %p + %d = load i16* %s + %d2 = sext i16 %d to i64 + %di = trunc i64 %ai to i16 + store i16 %di, i16* %s + + %x1 = add i64 %a, %b2 + %x2 = add i64 %c2, %d2 + %x3 = add i64 %x1, %x2 + ret i64 %x3 +} + +; CHECK: stores +; CHECK: ldx [%i0+8], [[R:%[goli][0-7]]] +; CHECK: stx [[R]], [%i0+16] +; CHECK: st [[R]], [%i1+-8] +; CHECK: sth [[R]], [%i2+40] +; CHECK: stb [[R]], [%i3+-20] +define void @stores(i64* %p, i32* %q, i16* %r, i8* %s) { + %p1 = getelementptr i64* %p, i64 1 + %p2 = getelementptr i64* %p, i64 2 + %pv = load i64* %p1 + store i64 %pv, i64* %p2 + + %q2 = getelementptr i32* %q, i32 -2 + %qv = trunc i64 %pv to i32 + store i32 %qv, i32* %q2 + + %r2 = getelementptr i16* %r, i16 20 + %rv = trunc i64 %pv to i16 + store i16 %rv, i16* %r2 + + %s2 = getelementptr i8* %s, i8 -20 + %sv = trunc i64 %pv to i8 + store i8 %sv, i8* %s2 + + ret void +} diff --git a/test/CodeGen/SPARC/64cond.ll b/test/CodeGen/SPARC/64cond.ll new file mode 100644 index 000000000000..6e66a262a4f2 --- /dev/null +++ b/test/CodeGen/SPARC/64cond.ll @@ -0,0 +1,56 @@ +; RUN: llc < %s -march=sparcv9 | FileCheck %s +; Testing 64-bit conditionals. + +; CHECK: cmpri +; CHECK: subcc %i1, 1 +; CHECK: bpe %xcc, +define void @cmpri(i64* %p, i64 %x) { +entry: + %tobool = icmp eq i64 %x, 1 + br i1 %tobool, label %if.end, label %if.then + +if.then: + store i64 %x, i64* %p, align 8 + br label %if.end + +if.end: + ret void +} + +; CHECK: cmprr +; CHECK: subcc %i1, %i2 +; CHECK: bpgu %xcc, +define void @cmprr(i64* %p, i64 %x, i64 %y) { +entry: + %tobool = icmp ugt i64 %x, %y + br i1 %tobool, label %if.end, label %if.then + +if.then: + store i64 %x, i64* %p, align 8 + br label %if.end + +if.end: + ret void +} + +; CHECK: selecti32_xcc +; CHECK: subcc %i0, %i1 +; CHECK: movg %xcc, %i2, %i3 +; CHECK: or %g0, %i3, %i0 +define i32 @selecti32_xcc(i64 %x, i64 %y, i32 %a, i32 %b) { +entry: + %tobool = icmp sgt i64 %x, %y + %rv = select i1 %tobool, i32 %a, i32 %b + ret i32 %rv +} + +; CHECK: selecti64_xcc +; CHECK: subcc %i0, %i1 +; CHECK: movg %xcc, %i2, %i3 +; CHECK: or %g0, %i3, %i0 +define i64 @selecti64_xcc(i64 %x, i64 %y, i64 %a, i64 %b) { +entry: + %tobool = icmp sgt i64 %x, %y + %rv = select i1 %tobool, i64 %a, i64 %b + ret i64 %rv +} diff --git a/test/CodeGen/SPARC/DbgValueOtherTargets.test b/test/CodeGen/SPARC/DbgValueOtherTargets.test new file mode 100644 index 000000000000..a669bf848d65 --- /dev/null +++ b/test/CodeGen/SPARC/DbgValueOtherTargets.test @@ -0,0 +1 @@ +RUN: llc -O0 -march=sparc -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/SPARC/ctpop.ll b/test/CodeGen/SPARC/ctpop.ll index e56f4947b52a..916a41496e2a 100644 --- a/test/CodeGen/SPARC/ctpop.ll +++ b/test/CodeGen/SPARC/ctpop.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -march=sparc -mattr=-v9 | not grep popc -; RUN: llc < %s -march=sparcv9 -mattr=v9 | grep popc +; RUN: llc < %s -march=sparc -mattr=+v9 | grep popc declare i32 @llvm.ctpop.i32(i32) diff --git a/test/CodeGen/SPARC/lit.local.cfg b/test/CodeGen/SPARC/lit.local.cfg index 786fee9e6610..6f30a8797967 100644 --- a/test/CodeGen/SPARC/lit.local.cfg +++ b/test/CodeGen/SPARC/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'Sparc' in targets: diff --git a/test/CodeGen/Thumb/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/Thumb/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index b9039774d42e..000000000000 --- a/test/CodeGen/Thumb/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=thumb -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/Thumb/2010-07-15-debugOrdering.ll b/test/CodeGen/Thumb/2010-07-15-debugOrdering.ll index 9f5a677ed356..d6b649569173 100644 --- a/test/CodeGen/Thumb/2010-07-15-debugOrdering.ll +++ b/test/CodeGen/Thumb/2010-07-15-debugOrdering.ll @@ -47,8 +47,8 @@ declare double @sqrt(double) nounwind readonly declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !0 = metadata !{i32 46, i32 0, metadata !1, null} -!1 = metadata !{i32 524299, metadata !2, i32 44, i32 0} ; [ DW_TAG_lexical_block ] -!2 = metadata !{i32 524299, metadata !3, i32 44, i32 0} ; [ DW_TAG_lexical_block ] +!1 = metadata !{i32 524299, metadata !4, metadata !2, i32 44, i32 0} ; [ DW_TAG_lexical_block ] +!2 = metadata !{i32 524299, metadata !4, metadata !3, i32 44, i32 0} ; [ DW_TAG_lexical_block ] !3 = metadata !{i32 524334, i32 0, metadata !4, metadata !"getClosestDiagonal3", metadata !"getClosestDiagonal3", metadata !"_Z19getClosestDiagonal3ii", metadata !4, i32 44, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, null} ; [ DW_TAG_subprogram ] !4 = metadata !{i32 524329, metadata !"ggEdgeDiscrepancy.cc", metadata !"/Volumes/Home/grosbaj/sources/llvm-externals/speccpu2000/benchspec/CINT2000/252.eon/src", metadata !5} ; [ DW_TAG_file_type ] !5 = metadata !{i32 524305, i32 0, i32 4, metadata !"ggEdgeDiscrepancy.cc", metadata !"/Volumes/Home/grosbaj/sources/llvm-externals/speccpu2000/benchspec/CINT2000/252.eon/src", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build 00)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] @@ -61,7 +61,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !12 = metadata !{i32 524289, metadata !4, metadata !"", metadata !4, i32 0, i64 192, i64 32, i64 0, i32 0, metadata !13, metadata !14, i32 0, null} ; [ DW_TAG_array_type ] !13 = metadata !{i32 524324, metadata !4, metadata !"double", metadata !4, i32 0, i64 64, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] !14 = metadata !{metadata !15} -!15 = metadata !{i32 524321, i64 0, i64 2} ; [ DW_TAG_subrange_type ] +!15 = metadata !{i32 524321, i64 0, i64 3} ; [ DW_TAG_subrange_type ] !16 = metadata !{i32 524334, i32 0, metadata !8, metadata !"ggVector3", metadata !"ggVector3", metadata !"", metadata !9, i32 72, metadata !17, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null} ; [ DW_TAG_subprogram ] !17 = metadata !{i32 524309, metadata !4, metadata !"", metadata !4, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !18, i32 0, null} ; [ DW_TAG_subroutine_type ] !18 = metadata !{null, metadata !19, metadata !20} @@ -140,8 +140,8 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !91 = metadata !{i32 524544, metadata !1, metadata !"vx", metadata !4, i32 46, metadata !13} ; [ DW_TAG_auto_variable ] !92 = metadata !{i32 48, i32 0, metadata !1, null} !93 = metadata !{i32 218, i32 0, metadata !94, metadata !96} -!94 = metadata !{i32 524299, metadata !95, i32 217, i32 0} ; [ DW_TAG_lexical_block ] -!95 = metadata !{i32 524299, metadata !77, i32 217, i32 0} ; [ DW_TAG_lexical_block ] +!94 = metadata !{i32 524299, metadata !4, metadata !95, i32 217, i32 0} ; [ DW_TAG_lexical_block ] +!95 = metadata !{i32 524299, metadata !4, metadata !77, i32 217, i32 0} ; [ DW_TAG_lexical_block ] !96 = metadata !{i32 51, i32 0, metadata !1, null} !97 = metadata !{i32 227, i32 0, metadata !94, metadata !96} !98 = metadata !{i32 52, i32 0, metadata !1, null} diff --git a/test/CodeGen/Thumb/DbgValueOtherTargets.test b/test/CodeGen/Thumb/DbgValueOtherTargets.test new file mode 100644 index 000000000000..afb18a43be47 --- /dev/null +++ b/test/CodeGen/Thumb/DbgValueOtherTargets.test @@ -0,0 +1 @@ +RUN: llc -O0 -march=thumb -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/Thumb/iabs.ll b/test/CodeGen/Thumb/iabs.ll index 2e77660c45c1..76224bc5348c 100644 --- a/test/CodeGen/Thumb/iabs.ll +++ b/test/CodeGen/Thumb/iabs.ll @@ -1,22 +1,20 @@ -; RUN: llc < %s -march=thumb -stats 2>&1 | \ -; RUN: grep "4 .*Number of machine instrs printed" - -;; Integer absolute value, should produce something as good as: -;; Thumb: -;; movs r0, r0 -;; bpl -;; rsb r0, r0, #0 (with opitmization, bpl + rsb is if-converted into rsbmi) -;; bx lr +; RUN: llc < %s -mtriple=thumb-unknown-unknown -filetype=obj -o %t.o +; RUN: llvm-objdump -disassemble -arch=thumb %t.o | FileCheck %s define i32 @test(i32 %a) { %tmp1neg = sub i32 0, %a %b = icmp sgt i32 %a, -1 %abs = select i1 %b, i32 %a, i32 %tmp1neg ret i32 %abs -; CHECK: movs r0, r0 -; CHECK: bpl -; CHECK: rsb r0, r0, #0 -; CHECK: bx lr -} +; This test just checks that 4 instructions were emitted + +; CHECK: {{text}} +; CHECK: 0: +; CHECK-NEXT: 2: +; CHECK-NEXT: 4: +; CHECK-NEXT: 6: + +; CHECK-NOT: 8: +} diff --git a/test/CodeGen/Thumb/lit.local.cfg b/test/CodeGen/Thumb/lit.local.cfg index cb77b09ef4ad..4d75f581a1d2 100644 --- a/test/CodeGen/Thumb/lit.local.cfg +++ b/test/CodeGen/Thumb/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'ARM' in targets: diff --git a/test/CodeGen/Thumb/stack-coloring-without-frame-ptr.ll b/test/CodeGen/Thumb/stack-coloring-without-frame-ptr.ll new file mode 100644 index 000000000000..3f6407a0a3c0 --- /dev/null +++ b/test/CodeGen/Thumb/stack-coloring-without-frame-ptr.ll @@ -0,0 +1,29 @@ +; RUN: llc < %s -march=thumb -mcpu=arm1022e + +%iterator = type { i8**, i8**, i8**, i8*** } +%insert_iterator = type { %deque*, %iterator } +%deque = type { %iterator, %iterator, i8***, i32 } + +define i32 @test_thumbv5e_fp_elim() nounwind optsize { +entry: + %var1 = alloca %iterator, align 4 + %var2 = alloca %insert_iterator, align 4 + %var3 = alloca %deque, align 4 + + %0 = bitcast %deque* %var3 to i8* + %1 = bitcast %iterator* %var1 to i8* + call void @llvm.lifetime.start(i64 16, i8* %1) nounwind + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %0, i32 16, i32 4, i1 false) + call void @llvm.lifetime.end(i64 16, i8* %1) nounwind + + %2 = bitcast %insert_iterator* %var2 to i8* + call void @llvm.lifetime.start(i64 20, i8* %2) nounwind + + ret i32 0 +} + +declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind + +declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind + +declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind diff --git a/test/CodeGen/Thumb2/2013-02-19-tail-call-register-hint.ll b/test/CodeGen/Thumb2/2013-02-19-tail-call-register-hint.ll new file mode 100644 index 000000000000..502b138f65c8 --- /dev/null +++ b/test/CodeGen/Thumb2/2013-02-19-tail-call-register-hint.ll @@ -0,0 +1,53 @@ +; RUN: llc < %s -mtriple=thumbv7s-apple-ios6.0.0 -verify-machineinstrs + +; Check to make sure the tail-call return at the end doesn't use a +; callee-saved register. Register hinting from t2LDRDri was getting this +; wrong. The intervening call will force allocation to try a high register +; first, so the hint will attempt to fire, but must be rejected due to +; not being in the allocation order for the tcGPR register class. +; The machine instruction verifier will make sure that all actually worked +; out the way it's supposed to. + +%"myclass" = type { %struct.foo } +%struct.foo = type { i32, [40 x i8] } + +define hidden void @func(i8* %Data) nounwind ssp { + %1 = getelementptr inbounds i8* %Data, i32 12 + %2 = bitcast i8* %1 to %"myclass"* + tail call void @abc(%"myclass"* %2) nounwind + tail call void @def(%"myclass"* %2) nounwind + %3 = getelementptr inbounds i8* %Data, i32 8 + %4 = bitcast i8* %3 to i8** + %5 = load i8** %4, align 4, !tbaa !0 + tail call void @ghi(i8* %5) nounwind + %6 = bitcast i8* %Data to void (i8*)** + %7 = load void (i8*)** %6, align 4, !tbaa !0 + %8 = getelementptr inbounds i8* %Data, i32 4 + %9 = bitcast i8* %8 to i8** + %10 = load i8** %9, align 4, !tbaa !0 + %11 = icmp eq i8* %Data, null + br i1 %11, label %14, label %12 + +; <label>:12 ; preds = %0 + %13 = tail call %"myclass"* @jkl(%"myclass"* %2) nounwind + tail call void @mno(i8* %Data) nounwind + br label %14 + +; <label>:14 ; preds = %12, %0 + tail call void %7(i8* %10) nounwind + ret void +} + +declare void @mno(i8*) + +declare void @def(%"myclass"*) + +declare void @abc(%"myclass"*) + +declare void @ghi(i8*) + +declare %"myclass"* @jkl(%"myclass"*) nounwind + +!0 = metadata !{metadata !"any pointer", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/Thumb2/2013-03-02-vduplane-nonconstant-source-index.ll b/test/CodeGen/Thumb2/2013-03-02-vduplane-nonconstant-source-index.ll new file mode 100644 index 000000000000..937ecc0d6679 --- /dev/null +++ b/test/CodeGen/Thumb2/2013-03-02-vduplane-nonconstant-source-index.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -mtriple=thumbv7-apple-ios | FileCheck %s + +define void @bar(<4 x i32>* %p, i32 %lane, <4 x i32> %phitmp) nounwind { +; CHECK: vst1.64 {d{{[0-9]+}}, d{{[0-9]+}}}, [r[[SOURCE:[0-9]+]]:128] +; CHECK: add.w r[[ADDR:[0-9]+]], r[[SOURCE]], {{r[0-9]+}}, lsl #2 +; CHECK: vld1.32 {[[DREG:d[0-9]+]][], [[DREG2:d[0-9]+]][]}, [r[[ADDR]]:32] +; CHECK: vst1.32 {[[DREG]], [[DREG2]]}, [r0] + %val = extractelement <4 x i32> %phitmp, i32 %lane + %r1 = insertelement <4 x i32> undef, i32 %val, i32 1 + %r2 = insertelement <4 x i32> %r1, i32 %val, i32 2 + %r3 = insertelement <4 x i32> %r2, i32 %val, i32 3 + store <4 x i32> %r3, <4 x i32>* %p, align 4 + ret void +} diff --git a/test/CodeGen/Thumb2/2013-03-06-vector-sext-operand-scalarize.ll b/test/CodeGen/Thumb2/2013-03-06-vector-sext-operand-scalarize.ll new file mode 100644 index 000000000000..203815fadc9c --- /dev/null +++ b/test/CodeGen/Thumb2/2013-03-06-vector-sext-operand-scalarize.ll @@ -0,0 +1,19 @@ +; RUN: llc < %s -mtriple=thumbv7-apple-darwin | FileCheck %s + +; Testing that these don't crash/assert. The loop vectorizer can end up +; with odd constructs like this. The code actually generated is incidental. +define <1 x i64> @test_zext(i32 %a) nounwind { +; CHECK: test_zext: + %Cmp = icmp uge i32 %a, 42 + %vec = insertelement <1 x i1> zeroinitializer, i1 %Cmp, i32 0 + %Se = zext <1 x i1> %vec to <1 x i64> + ret <1 x i64> %Se +} + +define <1 x i64> @test_sext(i32 %a) nounwind { +; CHECK: test_sext: + %Cmp = icmp uge i32 %a, 42 + %vec = insertelement <1 x i1> zeroinitializer, i1 %Cmp, i32 0 + %Se = sext <1 x i1> %vec to <1 x i64> + ret <1 x i64> %Se +} diff --git a/test/CodeGen/Thumb2/aligned-spill.ll b/test/CodeGen/Thumb2/aligned-spill.ll index c98ca8098583..3a2803f91f16 100644 --- a/test/CodeGen/Thumb2/aligned-spill.ll +++ b/test/CodeGen/Thumb2/aligned-spill.ll @@ -26,8 +26,8 @@ entry: ; NEON: bic r4, r4, #15 ; Stack pointer must be updated before the spills. ; NEON: mov sp, r4 -; NEON: vst1.64 {d8, d9, d10, d11}, [r4, :128]! -; NEON: vst1.64 {d12, d13, d14, d15}, [r4, :128] +; NEON: vst1.64 {d8, d9, d10, d11}, [r4:128]! +; NEON: vst1.64 {d12, d13, d14, d15}, [r4:128] ; Stack pointer adjustment for the stack frame contents. ; This could legally happen before the spills. ; Since the spill slot is only 8 bytes, technically it would be fine to only @@ -36,8 +36,8 @@ entry: ; NEON: sub sp, #16 ; The epilog is free to use another scratch register than r4. ; NEON: add r[[R4:[0-9]+]], sp, #16 -; NEON: vld1.64 {d8, d9, d10, d11}, [r[[R4]], :128]! -; NEON: vld1.64 {d12, d13, d14, d15}, [r[[R4]], :128] +; NEON: vld1.64 {d8, d9, d10, d11}, [r[[R4]]:128]! +; NEON: vld1.64 {d12, d13, d14, d15}, [r[[R4]]:128] ; The stack pointer restore must happen after the reloads. ; NEON: mov sp, ; NEON: pop @@ -57,8 +57,8 @@ entry: ; NEON: bic r4, r4, #15 ; Stack pointer must be updated before the spills. ; NEON: mov sp, r4 -; NEON: vst1.64 {d8, d9, d10, d11}, [r4, :128]! -; NEON: vst1.64 {d12, d13}, [r4, :128] +; NEON: vst1.64 {d8, d9, d10, d11}, [r4:128]! +; NEON: vst1.64 {d12, d13}, [r4:128] ; NEON: vstr d14, [r4, #16] ; Epilog ; NEON: vld1.64 {d8, d9, d10, d11}, @@ -84,7 +84,7 @@ entry: ; NEON: bic r4, r4, #15 ; Stack pointer must be updated before the spills. ; NEON: mov sp, r4 -; NEON: vst1.64 {d8, d9}, [r4, :128] +; NEON: vst1.64 {d8, d9}, [r4:128] ; NEON: vstr d10, [r4, #16] ; Epilog ; NEON: vld1.64 {d8, d9}, diff --git a/test/CodeGen/Thumb2/cortex-fp.ll b/test/CodeGen/Thumb2/cortex-fp.ll index b7df2fbf546c..f6cea72caecd 100644 --- a/test/CodeGen/Thumb2/cortex-fp.ll +++ b/test/CodeGen/Thumb2/cortex-fp.ll @@ -7,7 +7,7 @@ define float @foo(float %a, float %b) { entry: ; CHECK: foo ; CORTEXM3: blx ___mulsf3 -; CORTEXM4: vmul.f32 s0, s2, s0 +; CORTEXM4: vmul.f32 s ; CORTEXA8: vmul.f32 d %0 = fmul float %a, %b ret float %0 diff --git a/test/CodeGen/Thumb2/crash.ll b/test/CodeGen/Thumb2/crash.ll index cb4d08058f41..6ce0b82b94d7 100644 --- a/test/CodeGen/Thumb2/crash.ll +++ b/test/CodeGen/Thumb2/crash.ll @@ -1,4 +1,5 @@ ; RUN: llc < %s -mtriple=thumbv7-apple-darwin -mcpu=cortex-a8 -verify-machineinstrs +; RUN: llc < %s -mtriple=thumbv7-apple-darwin -mcpu=cortex-a8 -verify-machineinstrs -O0 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32-n32" target triple = "thumbv7-apple-darwin10" @@ -76,3 +77,11 @@ entry: store i32 %num, i32* %p2, align 4 ret void } + +; Check RAFast handling of inline assembly with many dense clobbers. +; The large tuple aliases of the vector registers can cause problems. +define void @rdar13249625(double* nocapture %p) nounwind { + %1 = tail call double asm sideeffect "@ $0", "=w,~{d0},~{q1},~{q2},~{q3},~{q4},~{q5},~{q6},~{q7},~{q8},~{q9},~{q10},~{q11},~{q12},~{q13},~{q14},~{q15}"() nounwind + store double %1, double* %p, align 4 + ret void +} diff --git a/test/CodeGen/Thumb2/thumb2-ldr_post.ll b/test/CodeGen/Thumb2/thumb2-ldr_post.ll index 2178eecb43e4..bce847471beb 100644 --- a/test/CodeGen/Thumb2/thumb2-ldr_post.ll +++ b/test/CodeGen/Thumb2/thumb2-ldr_post.ll @@ -1,5 +1,4 @@ -; RUN: llc < %s -march=thumb -mattr=+thumb2 | \ -; RUN: grep "ldr.*\[.*\]," | count 1 +; RUN: llc < %s -march=thumb -mattr=+thumb2 | FileCheck %s define i32 @test(i32 %a, i32 %b, i32 %c) { %tmp1 = mul i32 %a, %b ; <i32> [#uses=2] @@ -9,4 +8,5 @@ define i32 @test(i32 %a, i32 %b, i32 %c) { %tmp5 = mul i32 %tmp4, %tmp3 ; <i32> [#uses=1] ret i32 %tmp5 } +; CHECK: ldr r{{.*}}, [{{.*}}], diff --git a/test/CodeGen/Thumb2/thumb2-mul.ll b/test/CodeGen/Thumb2/thumb2-mul.ll index ac059bdaf05d..a8134e630821 100644 --- a/test/CodeGen/Thumb2/thumb2-mul.ll +++ b/test/CodeGen/Thumb2/thumb2-mul.ll @@ -15,7 +15,7 @@ entry: ; CHECK: t1: ; CHECK: mla r0, r2, r0, r1 ; CHECK: add.w r0, r0, r0, lsl #3 -; CHECL: add.w r0, r3, r0, lsl #2 +; CHECK: add.w r0, r3, r0, lsl #2 %mul = mul i32 %n, %i %add = add i32 %mul, %j %0 = ptrtoint %struct.CMPoint* %thePoints to i32 diff --git a/test/CodeGen/Thumb2/thumb2-shifter.ll b/test/CodeGen/Thumb2/thumb2-shifter.ll index 98854a1205f8..05dd90cfbfed 100644 --- a/test/CodeGen/Thumb2/thumb2-shifter.ll +++ b/test/CodeGen/Thumb2/thumb2-shifter.ll @@ -1,24 +1,27 @@ -; RUN: llc < %s -march=thumb -mattr=+thumb2,+t2xtpk | FileCheck %s +; RUN: llc < %s -march=thumb -mcpu=cortex-a8 | FileCheck %s --check-prefix=A8 +; RUN: llc < %s -march=thumb -mcpu=swift | FileCheck %s --check-prefix=SWIFT + +; rdar://12892707 define i32 @t2ADDrs_lsl(i32 %X, i32 %Y) { -; CHECK: t2ADDrs_lsl -; CHECK: add.w r0, r0, r1, lsl #16 +; A8: t2ADDrs_lsl +; A8: add.w r0, r0, r1, lsl #16 %A = shl i32 %Y, 16 %B = add i32 %X, %A ret i32 %B } define i32 @t2ADDrs_lsr(i32 %X, i32 %Y) { -; CHECK: t2ADDrs_lsr -; CHECK: add.w r0, r0, r1, lsr #16 +; A8: t2ADDrs_lsr +; A8: add.w r0, r0, r1, lsr #16 %A = lshr i32 %Y, 16 %B = add i32 %X, %A ret i32 %B } define i32 @t2ADDrs_asr(i32 %X, i32 %Y) { -; CHECK: t2ADDrs_asr -; CHECK: add.w r0, r0, r1, asr #16 +; A8: t2ADDrs_asr +; A8: add.w r0, r0, r1, asr #16 %A = ashr i32 %Y, 16 %B = add i32 %X, %A ret i32 %B @@ -26,8 +29,8 @@ define i32 @t2ADDrs_asr(i32 %X, i32 %Y) { ; i32 ror(n) = (x >> n) | (x << (32 - n)) define i32 @t2ADDrs_ror(i32 %X, i32 %Y) { -; CHECK: t2ADDrs_ror -; CHECK: add.w r0, r0, r1, ror #16 +; A8: t2ADDrs_ror +; A8: add.w r0, r0, r1, ror #16 %A = lshr i32 %Y, 16 %B = shl i32 %Y, 16 %C = or i32 %B, %A @@ -36,13 +39,66 @@ define i32 @t2ADDrs_ror(i32 %X, i32 %Y) { } define i32 @t2ADDrs_noRegShift(i32 %X, i32 %Y, i8 %sh) { -; CHECK: t2ADDrs_noRegShift -; CHECK: uxtb r2, r2 -; CHECK: lsls r1, r2 -; CHECK: add r0, r1 +; A8: t2ADDrs_noRegShift +; A8: uxtb r2, r2 +; A8: lsls r1, r2 +; A8: add r0, r1 + +; SWIFT: t2ADDrs_noRegShift +; SWIFT-NOT: lsls +; SWIFT: lsl.w + %shift.upgrd.1 = zext i8 %sh to i32 + %A = shl i32 %Y, %shift.upgrd.1 + %B = add i32 %X, %A + ret i32 %B +} + +define i32 @t2ADDrs_noRegShift2(i32 %X, i32 %Y, i8 %sh) { +; A8: t2ADDrs_noRegShift2 +; A8: uxtb r2, r2 +; A8: lsrs r1, r2 +; A8: add r0, r1 + +; SWIFT: t2ADDrs_noRegShift2 +; SWIFT-NOT: lsrs +; SWIFT: lsr.w + %shift.upgrd.1 = zext i8 %sh to i32 + %A = lshr i32 %Y, %shift.upgrd.1 + %B = add i32 %X, %A + ret i32 %B +} + +define i32 @t2ADDrs_noRegShift3(i32 %X, i32 %Y, i8 %sh) { +; A8: t2ADDrs_noRegShift3 +; A8: uxtb r2, r2 +; A8: asrs r1, r2 +; A8: add r0, r1 + +; SWIFT: t2ADDrs_noRegShift3 +; SWIFT-NOT: asrs +; SWIFT: asr.w + %shift.upgrd.1 = zext i8 %sh to i32 + %A = ashr i32 %Y, %shift.upgrd.1 + %B = add i32 %X, %A + ret i32 %B +} + +define i32 @t2ADDrs_optsize(i32 %X, i32 %Y, i8 %sh) optsize { +; SWIFT: t2ADDrs_optsize +; SWIFT-NOT: lsl.w +; SWIFT: lsls %shift.upgrd.1 = zext i8 %sh to i32 %A = shl i32 %Y, %shift.upgrd.1 %B = add i32 %X, %A ret i32 %B } +define i32 @t2ADDrs_minsize(i32 %X, i32 %Y, i8 %sh) minsize { +; SWIFT: t2ADDrs_minsize +; SWIFT-NOT: lsr.w +; SWIFT: lsrs + %shift.upgrd.1 = zext i8 %sh to i32 + %A = lshr i32 %Y, %shift.upgrd.1 + %B = add i32 %X, %A + ret i32 %B +} diff --git a/test/CodeGen/Thumb2/thumb2-spill-q.ll b/test/CodeGen/Thumb2/thumb2-spill-q.ll index d9a0617f5a46..5bff268e2c3e 100644 --- a/test/CodeGen/Thumb2/thumb2-spill-q.ll +++ b/test/CodeGen/Thumb2/thumb2-spill-q.ll @@ -12,8 +12,8 @@ declare <4 x float> @llvm.arm.neon.vld1.v4f32(i8*, i32) nounwind readonly define void @aaa(%quuz* %this, i8* %block) { ; CHECK: aaa: ; CHECK: bic r4, r4, #15 -; CHECK: vst1.64 {{.*}}[{{.*}}, :128] -; CHECK: vld1.64 {{.*}}[{{.*}}, :128] +; CHECK: vst1.64 {{.*}}[{{.*}}:128] +; CHECK: vld1.64 {{.*}}[{{.*}}:128] entry: %aligned_vec = alloca <4 x float>, align 16 %"alloca point" = bitcast i32 0 to i32 diff --git a/test/CodeGen/X86/2003-08-03-CallArgLiveRanges.ll b/test/CodeGen/X86/2003-08-03-CallArgLiveRanges.ll index 0af2445d7fba..2e4cb1fe7eda 100644 --- a/test/CodeGen/X86/2003-08-03-CallArgLiveRanges.ll +++ b/test/CodeGen/X86/2003-08-03-CallArgLiveRanges.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; The old instruction selector used to load all arguments to a call up in ; registers, then start pushing them all onto the stack. This is bad news as ; it makes a ton of annoying overlapping live ranges. This code should not diff --git a/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll b/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll index 1a3d74918d1a..7673124d5dda 100644 --- a/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll +++ b/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -stats 2>&1 | \ ; RUN: grep asm-printer | grep 7 diff --git a/test/CodeGen/X86/2006-05-01-SchedCausingSpills.ll b/test/CodeGen/X86/2006-05-01-SchedCausingSpills.ll index 5cba3efeefb8..faa3e21a934d 100644 --- a/test/CodeGen/X86/2006-05-01-SchedCausingSpills.ll +++ b/test/CodeGen/X86/2006-05-01-SchedCausingSpills.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -mcpu=yonah -stats 2>&1 | \ ; RUN: not grep "Number of register spills" ; END. diff --git a/test/CodeGen/X86/2006-05-02-InstrSched1.ll b/test/CodeGen/X86/2006-05-02-InstrSched1.ll index 1c75f93915a7..0afddd8f876f 100644 --- a/test/CodeGen/X86/2006-05-02-InstrSched1.ll +++ b/test/CodeGen/X86/2006-05-02-InstrSched1.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -relocation-model=static -stats 2>&1 | \ ; RUN: grep asm-printer | grep 14 ; diff --git a/test/CodeGen/X86/2006-05-02-InstrSched2.ll b/test/CodeGen/X86/2006-05-02-InstrSched2.ll index 95eefa1e7196..222b7a0b41fd 100644 --- a/test/CodeGen/X86/2006-05-02-InstrSched2.ll +++ b/test/CodeGen/X86/2006-05-02-InstrSched2.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -stats 2>&1 | \ ; RUN: grep asm-printer | grep 13 diff --git a/test/CodeGen/X86/2006-05-11-InstrSched.ll b/test/CodeGen/X86/2006-05-11-InstrSched.ll index 37c510786a5e..6912351d7b7e 100644 --- a/test/CodeGen/X86/2006-05-11-InstrSched.ll +++ b/test/CodeGen/X86/2006-05-11-InstrSched.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu -mcpu=penryn -mattr=+sse2 -stats -realign-stack=0 2>&1 | \ ; RUN: grep "asm-printer" | grep 35 diff --git a/test/CodeGen/X86/2008-02-18-TailMergingBug.ll b/test/CodeGen/X86/2008-02-18-TailMergingBug.ll index a1b973d7ccfa..363a6008a00d 100644 --- a/test/CodeGen/X86/2008-02-18-TailMergingBug.ll +++ b/test/CodeGen/X86/2008-02-18-TailMergingBug.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -mcpu=yonah -stats 2>&1 | grep "Number of block tails merged" | grep 16 ; PR1909 diff --git a/test/CodeGen/X86/2008-05-22-FoldUnalignedLoad.ll b/test/CodeGen/X86/2008-05-22-FoldUnalignedLoad.ll index 19a73543c65e..fc38135032c2 100644 --- a/test/CodeGen/X86/2008-05-22-FoldUnalignedLoad.ll +++ b/test/CodeGen/X86/2008-05-22-FoldUnalignedLoad.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86 -mattr=+sse2 | grep movups | count 2 +; RUN: llc < %s -march=x86 -mcpu=penryn | FileCheck %s define void @a(<4 x float>* %x) nounwind { entry: @@ -8,4 +8,10 @@ entry: ret void } +; CHECK: a: +; CHECK: movups +; CHECK: movups +; CHECK-NOT: movups +; CHECK: ret + declare <4 x float> @llvm.x86.sse.rcp.ps(<4 x float>) diff --git a/test/CodeGen/X86/2008-08-31-EH_RETURN64.ll b/test/CodeGen/X86/2008-08-31-EH_RETURN64.ll index d423bfc389df..496779c468f4 100644 --- a/test/CodeGen/X86/2008-08-31-EH_RETURN64.ll +++ b/test/CodeGen/X86/2008-08-31-EH_RETURN64.ll @@ -1,10 +1,15 @@ ; Check that eh_return & unwind_init were properly lowered -; RUN: llc < %s | grep %rbp | count 7 -; RUN: llc < %s | grep %rcx | count 3 +; RUN: llc < %s -verify-machineinstrs | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" target triple = "x86_64-unknown-linux-gnu" +; CHECK: test +; CHECK: pushq %rbp +; CHECK: movq %rsp, %rbp +; CHECK: popq %rbp +; CHECK: movq %rcx, %rsp +; CHECK: ret # eh_return, addr: %rcx define i8* @test(i64 %a, i8* %b) { entry: call void @llvm.eh.unwind.init() @@ -15,3 +20,36 @@ entry: declare void @llvm.eh.return.i64(i64, i8*) declare void @llvm.eh.unwind.init() + +@b = common global i32 0, align 4 +@a = common global i32 0, align 4 + +; PR14750 +; This function contains a normal return as well as eh_return. +; CHECK: _Unwind_Resume_or_Rethrow +define i32 @_Unwind_Resume_or_Rethrow() nounwind uwtable ssp { +entry: + %0 = load i32* @b, align 4 + %tobool = icmp eq i32 %0, 0 + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + ret i32 0 + +if.end: ; preds = %entry + %call = tail call i32 (...)* @_Unwind_ForcedUnwind_Phase2() nounwind + store i32 %call, i32* @a, align 4 + %tobool1 = icmp eq i32 %call, 0 + br i1 %tobool1, label %cond.end, label %cond.true + +cond.true: ; preds = %if.end + tail call void @abort() noreturn nounwind + unreachable + +cond.end: ; preds = %if.end + tail call void @llvm.eh.return.i64(i64 0, i8* null) + unreachable +} + +declare i32 @_Unwind_ForcedUnwind_Phase2(...) +declare void @abort() noreturn diff --git a/test/CodeGen/X86/2008-10-27-CoalescerBug.ll b/test/CodeGen/X86/2008-10-27-CoalescerBug.ll index b2cf34cd2033..0310a5dcb565 100644 --- a/test/CodeGen/X86/2008-10-27-CoalescerBug.ll +++ b/test/CodeGen/X86/2008-10-27-CoalescerBug.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=i386-apple-darwin -mattr=+sse2 -stats 2>&1 | FileCheck %s ; Now this test spills one register. But a reload in the loop is cheaper than ; the divsd so it's a win. diff --git a/test/CodeGen/X86/2008-10-27-StackRealignment.ll b/test/CodeGen/X86/2008-10-27-StackRealignment.ll deleted file mode 100644 index a57f7166cadc..000000000000 --- a/test/CodeGen/X86/2008-10-27-StackRealignment.ll +++ /dev/null @@ -1,22 +0,0 @@ -; Linux doesn't support stack realignment for functions with allocas (PR2888). -; Until it does, we shouldn't use movaps to access the stack. On targets with -; sufficiently aligned stack (e.g. darwin) we should. -; PR8969 - make 32-bit linux have a 16-byte aligned stack -; RUN: llc < %s -mtriple=i386-pc-linux-gnu -mcpu=yonah | grep movaps | count 2 -; RUN: llc < %s -mtriple=i686-apple-darwin9 -mcpu=yonah | grep movaps | count 2 - - -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" -target triple = "i386-pc-linux-gnu" - -define void @foo(i32 %t) nounwind { - %tmp1210 = alloca i8, i32 32, align 4 - call void @llvm.memset.p0i8.i64(i8* %tmp1210, i8 0, i64 32, i32 4, i1 false) - %x = alloca i8, i32 %t - call void @dummy(i8* %x) - ret void -} - -declare void @dummy(i8*) - -declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind diff --git a/test/CodeGen/X86/2009-02-12-DebugInfoVLA.ll b/test/CodeGen/X86/2009-02-12-DebugInfoVLA.ll index 0dca14d064eb..890fd0f067cf 100644 --- a/test/CodeGen/X86/2009-02-12-DebugInfoVLA.ll +++ b/test/CodeGen/X86/2009-02-12-DebugInfoVLA.ll @@ -78,7 +78,7 @@ declare void @llvm.stackrestore(i8*) nounwind !9 = metadata !{i32 458767, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !10} ; [ DW_TAG_pointer_type ] !10 = metadata !{i32 458753, metadata !2, metadata !"", metadata !2, i32 0, i64 8, i64 8, i64 0, i32 0, metadata !5, metadata !11, i32 0, null} ; [ DW_TAG_array_type ] !11 = metadata !{metadata !12} -!12 = metadata !{i32 458785, i64 0, i64 0} ; [ DW_TAG_subrange_type ] +!12 = metadata !{i32 458785, i64 0, i64 1} ; [ DW_TAG_subrange_type ] !13 = metadata !{i32 3, i32 0, metadata !14, null} !14 = metadata !{i32 458763, metadata !1, i32 0, i32 0} ; [ DW_TAG_lexical_block ] !15 = metadata !{i32 4, i32 0, metadata !14, null} diff --git a/test/CodeGen/X86/2009-02-25-CommuteBug.ll b/test/CodeGen/X86/2009-02-25-CommuteBug.ll index 9cbf35094061..9ea34e27a17e 100644 --- a/test/CodeGen/X86/2009-02-25-CommuteBug.ll +++ b/test/CodeGen/X86/2009-02-25-CommuteBug.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -mattr=+sse2 -stats 2>&1 | not grep commuted ; rdar://6608609 diff --git a/test/CodeGen/X86/2009-02-26-MachineLICMBug.ll b/test/CodeGen/X86/2009-02-26-MachineLICMBug.ll index d50fe6f73a00..68a9fafb6de8 100644 --- a/test/CodeGen/X86/2009-02-26-MachineLICMBug.ll +++ b/test/CodeGen/X86/2009-02-26-MachineLICMBug.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86-64 -mattr=+sse3,+sse41 -mcpu=penryn -stats 2>&1 | grep "5 machine-licm" ; RUN: llc < %s -march=x86-64 -mattr=+sse3,+sse41 -mcpu=penryn | FileCheck %s ; rdar://6627786 diff --git a/test/CodeGen/X86/2009-03-23-MultiUseSched.ll b/test/CodeGen/X86/2009-03-23-MultiUseSched.ll index d934ec9a88f8..351a1722a231 100644 --- a/test/CodeGen/X86/2009-03-23-MultiUseSched.ll +++ b/test/CodeGen/X86/2009-03-23-MultiUseSched.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=x86_64-linux -relocation-model=static -o /dev/null -stats -info-output-file - > %t ; RUN: not grep spill %t ; RUN: not grep "%rsp" %t diff --git a/test/CodeGen/X86/2009-04-16-SpillerUnfold.ll b/test/CodeGen/X86/2009-04-16-SpillerUnfold.ll index ad18a0c5b94d..0607eda271af 100644 --- a/test/CodeGen/X86/2009-04-16-SpillerUnfold.ll +++ b/test/CodeGen/X86/2009-04-16-SpillerUnfold.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=x86_64-apple-darwin10.0 -relocation-model=pic -disable-fp-elim -stats 2>&1 | grep "Number of modref unfolded" ; XFAIL: * ; 69408 removed the opportunity for this optimization to work diff --git a/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll b/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll index 94075e78a28a..c2d9d84d4c5a 100644 --- a/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll +++ b/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll @@ -6,15 +6,16 @@ define void @t(i32 %count) ssp nounwind { entry: ; CHECK: t: -; CHECK: movq ___stack_chk_guard@GOTPCREL(%rip) -; CHECK: movups L_str(%rip), %xmm0 +; CHECK: movups L_str+12(%rip), %xmm0 +; CHECK: movups L_str(%rip), %xmm1 %tmp0 = alloca [60 x i8], align 1 %tmp1 = getelementptr inbounds [60 x i8]* %tmp0, i64 0, i64 0 br label %bb1 bb1: ; CHECK: LBB0_1: -; CHECK: movaps %xmm0, (%rsp) +; CHECK: movups %xmm0, 12(%rsp) +; CHECK: movaps %xmm1, (%rsp) %tmp2 = phi i32 [ %tmp3, %bb1 ], [ 0, %entry ] call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp1, i8* getelementptr inbounds ([28 x i8]* @str, i64 0, i64 0), i64 28, i32 1, i1 false) %tmp3 = add i32 %tmp2, 1 diff --git a/test/CodeGen/X86/2010-01-18-DbgValue.ll b/test/CodeGen/X86/2010-01-18-DbgValue.ll index 85ee091c3478..7dba332b1bec 100644 --- a/test/CodeGen/X86/2010-01-18-DbgValue.ll +++ b/test/CodeGen/X86/2010-01-18-DbgValue.ll @@ -28,21 +28,25 @@ return: ; preds = %entry declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone -!0 = metadata !{i32 524545, metadata !1, metadata !"my_r0", metadata !2, i32 11, metadata !7} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 11, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"b2.c", metadata !"/tmp/", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"b2.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!llvm.dbg.cu = !{!3} + +!0 = metadata !{i32 786689, metadata !1, metadata !"my_r0", metadata !2, i32 11, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 11, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, double (%struct.Rect*)* @foo, null, null, null, i32 11} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !19} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 1, metadata !2, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, null, null, metadata !18, null, metadata !""} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !19, metadata !2, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6, metadata !7} -!6 = metadata !{i32 524324, metadata !2, metadata !"double", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 524307, metadata !2, metadata !"Rect", metadata !2, i32 6, i64 256, i64 64, i64 0, i32 0, null, metadata !8, i32 0, null} ; [ DW_TAG_structure_type ] +!6 = metadata !{i32 786468, metadata !19, metadata !2, metadata !"double", i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786451, metadata !19, metadata !2, metadata !"Rect", i32 6, i64 256, i64 64, i64 0, i32 0, null, metadata !8, i32 0, null} ; [ DW_TAG_structure_type ] !8 = metadata !{metadata !9, metadata !14} -!9 = metadata !{i32 524301, metadata !7, metadata !"P1", metadata !2, i32 7, i64 128, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] -!10 = metadata !{i32 524307, metadata !2, metadata !"Pt", metadata !2, i32 1, i64 128, i64 64, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_structure_type ] +!9 = metadata !{i32 786445, metadata !19, metadata !7, metadata !"P1", i32 7, i64 128, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] +!10 = metadata !{i32 786451, metadata !19, metadata !2, metadata !"Pt", i32 1, i64 128, i64 64, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_structure_type ] !11 = metadata !{metadata !12, metadata !13} -!12 = metadata !{i32 524301, metadata !10, metadata !"x", metadata !2, i32 2, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] -!13 = metadata !{i32 524301, metadata !10, metadata !"y", metadata !2, i32 3, i64 64, i64 64, i64 64, i32 0, metadata !6} ; [ DW_TAG_member ] -!14 = metadata !{i32 524301, metadata !7, metadata !"P2", metadata !2, i32 8, i64 128, i64 64, i64 128, i32 0, metadata !10} ; [ DW_TAG_member ] +!12 = metadata !{i32 786445, metadata !19, metadata !10, metadata !"x", i32 2, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] +!13 = metadata !{i32 786445, metadata !19, metadata !10, metadata !"y", i32 3, i64 64, i64 64, i64 64, i32 0, metadata !6} ; [ DW_TAG_member ] +!14 = metadata !{i32 786445, metadata !19, metadata !7, metadata !"P2", i32 8, i64 128, i64 64, i64 128, i32 0, metadata !10} ; [ DW_TAG_member ] !15 = metadata !{i32 11, i32 0, metadata !1, null} !16 = metadata !{i32 12, i32 0, metadata !17, null} -!17 = metadata !{i32 524299, metadata !1, i32 11, i32 0} ; [ DW_TAG_lexical_block ] +!17 = metadata !{i32 786443, metadata !1, i32 11, i32 0} ; [ DW_TAG_lexical_block ] +!18 = metadata !{metadata !1} +!19 = metadata !{metadata !"b2.c", metadata !"/tmp/"} diff --git a/test/CodeGen/X86/2010-01-19-OptExtBug.ll b/test/CodeGen/X86/2010-01-19-OptExtBug.ll index eb4a5c04a2ae..ec24e73c34ac 100644 --- a/test/CodeGen/X86/2010-01-19-OptExtBug.ll +++ b/test/CodeGen/X86/2010-01-19-OptExtBug.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=x86_64-apple-darwin11 -relocation-model=pic -disable-fp-elim -stats 2>&1 | not grep ext-opt define fastcc i8* @S_scan_str(i8* %start, i32 %keep_quoted, i32 %keep_delims) nounwind ssp { diff --git a/test/CodeGen/X86/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/X86/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index 42f19b3ad86a..000000000000 --- a/test/CodeGen/X86/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=x86 -asm-verbose < %s | FileCheck %s -; RUN: llc -O0 -march=x86-64 -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} diff --git a/test/CodeGen/X86/2010-05-25-DotDebugLoc.ll b/test/CodeGen/X86/2010-05-25-DotDebugLoc.ll index 2fceab6f091f..8ab93fcb978f 100644 --- a/test/CodeGen/X86/2010-05-25-DotDebugLoc.ll +++ b/test/CodeGen/X86/2010-05-25-DotDebugLoc.ll @@ -198,27 +198,27 @@ declare float @copysignf(float, float) nounwind readnone declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.lv = !{!0, !11, !12, !13, !14, !16, !17, !18} +!llvm.dbg.cu = !{!3} -!0 = metadata !{i32 524545, metadata !1, metadata !"a", metadata !2, i32 1921, metadata !9} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"__divsc3", metadata !"__divsc3", metadata !"__divsc3", metadata !2, i32 1922, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"libgcc2.c", metadata !"/Users/yash/clean/LG.D/gcc/../../llvmgcc/gcc", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"libgcc2.c", metadata !"/Users/yash/clean/LG.D/gcc/../../llvmgcc/gcc", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786689, metadata !1, metadata !"a", metadata !2, i32 1921, metadata !9, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"__divsc3", metadata !"__divsc3", metadata !"__divsc3", metadata !2, i32 1922, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, %0 (float, float, float, float)* @__divsc3, null, null, metadata !43, i32 1922} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !45} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 1, metadata !2, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, metadata !"", i32 0, null, null, metadata !44, null, metadata !""} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !45, metadata !2, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6, metadata !9, metadata !9, metadata !9, metadata !9} -!6 = metadata !{i32 524310, metadata !7, metadata !"SCtype", metadata !7, i32 170, i64 0, i64 0, i64 0, i32 0, metadata !8} ; [ DW_TAG_typedef ] -!7 = metadata !{i32 524329, metadata !"libgcc2.h", metadata !"/Users/yash/clean/LG.D/gcc/../../llvmgcc/gcc", metadata !3} ; [ DW_TAG_file_type ] -!8 = metadata !{i32 524324, metadata !2, metadata !"complex float", metadata !2, i32 0, i64 64, i64 32, i64 0, i32 0, i32 3} ; [ DW_TAG_base_type ] -!9 = metadata !{i32 524310, metadata !7, metadata !"SFtype", metadata !7, i32 167, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_typedef ] -!10 = metadata !{i32 524324, metadata !2, metadata !"float", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!11 = metadata !{i32 524545, metadata !1, metadata !"b", metadata !2, i32 1921, metadata !9} ; [ DW_TAG_arg_variable ] -!12 = metadata !{i32 524545, metadata !1, metadata !"c", metadata !2, i32 1921, metadata !9} ; [ DW_TAG_arg_variable ] -!13 = metadata !{i32 524545, metadata !1, metadata !"d", metadata !2, i32 1921, metadata !9} ; [ DW_TAG_arg_variable ] -!14 = metadata !{i32 524544, metadata !15, metadata !"denom", metadata !2, i32 1923, metadata !9} ; [ DW_TAG_auto_variable ] -!15 = metadata !{i32 524299, metadata !1, i32 1922, i32 0} ; [ DW_TAG_lexical_block ] -!16 = metadata !{i32 524544, metadata !15, metadata !"ratio", metadata !2, i32 1923, metadata !9} ; [ DW_TAG_auto_variable ] -!17 = metadata !{i32 524544, metadata !15, metadata !"x", metadata !2, i32 1923, metadata !9} ; [ DW_TAG_auto_variable ] -!18 = metadata !{i32 524544, metadata !15, metadata !"y", metadata !2, i32 1923, metadata !9} ; [ DW_TAG_auto_variable ] +!6 = metadata !{i32 786454, metadata !46, metadata !7, metadata !"SCtype", i32 170, i64 0, i64 0, i64 0, i32 0, metadata !8} ; [ DW_TAG_typedef ] +!7 = metadata !{i32 786473, metadata !46} ; [ DW_TAG_file_type ] +!8 = metadata !{i32 786468, metadata !45, metadata !2, metadata !"complex float", i32 0, i64 64, i64 32, i64 0, i32 0, i32 3} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786454, metadata !46, metadata !7, metadata !"SFtype", i32 167, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_typedef ] +!10 = metadata !{i32 786468, metadata !45, metadata !2, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!11 = metadata !{i32 786689, metadata !1, metadata !"b", metadata !2, i32 1921, metadata !9, i32 0, null} ; [ DW_TAG_arg_variable ] +!12 = metadata !{i32 786689, metadata !1, metadata !"c", metadata !2, i32 1921, metadata !9, i32 0, null} ; [ DW_TAG_arg_variable ] +!13 = metadata !{i32 786689, metadata !1, metadata !"d", metadata !2, i32 1921, metadata !9, i32 0, null} ; [ DW_TAG_arg_variable ] +!14 = metadata !{i32 786688, metadata !15, metadata !"denom", metadata !2, i32 1923, metadata !9, i32 0, null} ; [ DW_TAG_auto_variable ] +!15 = metadata !{i32 786443, metadata !2, metadata !1, i32 1922, i32 0} ; [ DW_TAG_lexical_block ] +!16 = metadata !{i32 786688, metadata !15, metadata !"ratio", metadata !2, i32 1923, metadata !9, i32 0, null} ; [ DW_TAG_auto_variable ] +!17 = metadata !{i32 786688, metadata !15, metadata !"x", metadata !2, i32 1923, metadata !9, i32 0, null} ; [ DW_TAG_auto_variable ] +!18 = metadata !{i32 786688, metadata !15, metadata !"y", metadata !2, i32 1923, metadata !9, i32 0, null} ; [ DW_TAG_auto_variable ] !19 = metadata !{i32 1929, i32 0, metadata !15, null} !20 = metadata !{i32 1931, i32 0, metadata !15, null} !21 = metadata !{i32 1932, i32 0, metadata !15, null} @@ -243,3 +243,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !40 = metadata !{i32 1964, i32 0, metadata !15, null} !41 = metadata !{i32 1965, i32 0, metadata !15, null} !42 = metadata !{i32 1969, i32 0, metadata !15, null} +!43 = metadata !{metadata !0, metadata !11, metadata !12, metadata !13, metadata !14, metadata !16, metadata !17, metadata !18} +!44 = metadata !{metadata !1} +!45 = metadata !{metadata !"libgcc2.c", metadata !"/Users/yash/clean/LG.D/gcc/../../llvmgcc/gcc"} +!46 = metadata !{metadata !"libgcc2.h", metadata !"/Users/yash/clean/LG.D/gcc/../../llvmgcc/gcc"} diff --git a/test/CodeGen/X86/2010-05-26-DotDebugLoc.ll b/test/CodeGen/X86/2010-05-26-DotDebugLoc.ll index 7909d2736b9c..6519ca063a7c 100644 --- a/test/CodeGen/X86/2010-05-26-DotDebugLoc.ll +++ b/test/CodeGen/X86/2010-05-26-DotDebugLoc.ll @@ -21,40 +21,45 @@ declare void @foo(i32) nounwind optsize noinline ssp declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.gv = !{!0} -!llvm.dbg.lv = !{!4, !8, !18, !25, !26} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 524340, i32 0, metadata !1, metadata !"ret", metadata !"ret", metadata !"", metadata !1, i32 7, metadata !3, i1 false, i1 true, null} ; [ DW_TAG_variable ] -!1 = metadata !{i32 524329, metadata !"foo.c", metadata !"/tmp/", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 524305, i32 0, i32 1, metadata !"foo.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!4 = metadata !{i32 524545, metadata !5, metadata !"x", metadata !1, i32 12, metadata !3} ; [ DW_TAG_arg_variable ] -!5 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 13, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786484, i32 0, metadata !1, metadata !"ret", metadata !"ret", metadata !"", metadata !1, i32 7, metadata !3, i1 false, i1 true, null} ; [ DW_TAG_variable ] +!1 = metadata !{i32 786473, metadata !36} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !36, i32 1, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, metadata !"", i32 0, null, null, metadata !32, metadata !31, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786468, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!4 = metadata !{i32 786689, metadata !5, metadata !"x", metadata !1, i32 12, metadata !3, i32 0, null} ; [ DW_TAG_arg_variable ] +!5 = metadata !{i32 786478, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 13, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, void (i32)* @foo, null, null, metadata !33, i32 13} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ] !7 = metadata !{null, metadata !3} -!8 = metadata !{i32 524545, metadata !9, metadata !"myvar", metadata !1, i32 17, metadata !13} ; [ DW_TAG_arg_variable ] -!9 = metadata !{i32 524334, i32 0, metadata !1, metadata !"bar", metadata !"bar", metadata !"bar", metadata !1, i32 17, metadata !10, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] -!10 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ] +!8 = metadata !{i32 786689, metadata !9, metadata !"myvar", metadata !1, i32 17, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] +!9 = metadata !{i32 786478, metadata !1, metadata !"bar", metadata !"bar", metadata !"bar", metadata !1, i32 17, metadata !10, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i8* (%struct.a*)* @bar, null, null, metadata !34, i32 17} ; [ DW_TAG_subprogram ] +!10 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ] !11 = metadata !{metadata !12, metadata !13} -!12 = metadata !{i32 524303, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] -!13 = metadata !{i32 524303, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_pointer_type ] -!14 = metadata !{i32 524307, metadata !1, metadata !"a", metadata !1, i32 2, i64 128, i64 64, i64 0, i32 0, null, metadata !15, i32 0, null} ; [ DW_TAG_structure_type ] +!12 = metadata !{i32 786447, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!13 = metadata !{i32 786447, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_pointer_type ] +!14 = metadata !{i32 786451, metadata !1, metadata !"a", metadata !1, i32 2, i64 128, i64 64, i64 0, i32 0, null, metadata !15, i32 0, null} ; [ DW_TAG_structure_type ] !15 = metadata !{metadata !16, metadata !17} -!16 = metadata !{i32 524301, metadata !14, metadata !"c", metadata !1, i32 3, i64 32, i64 32, i64 0, i32 0, metadata !3} ; [ DW_TAG_member ] -!17 = metadata !{i32 524301, metadata !14, metadata !"d", metadata !1, i32 4, i64 64, i64 64, i64 64, i32 0, metadata !13} ; [ DW_TAG_member ] -!18 = metadata !{i32 524545, metadata !19, metadata !"argc", metadata !1, i32 22, metadata !3} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 524334, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 22, metadata !20, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] -!20 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !21, i32 0, null} ; [ DW_TAG_subroutine_type ] +!16 = metadata !{i32 786445, metadata !14, metadata !"c", metadata !1, i32 3, i64 32, i64 32, i64 0, i32 0, metadata !3} ; [ DW_TAG_member ] +!17 = metadata !{i32 786445, metadata !14, metadata !"d", metadata !1, i32 4, i64 64, i64 64, i64 64, i32 0, metadata !13} ; [ DW_TAG_member ] +!18 = metadata !{i32 786689, metadata !19, metadata !"argc", metadata !1, i32 22, metadata !3, i32 0, null} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786478, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 22, metadata !20, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, null, null, null, metadata !35, i32 22} ; [ DW_TAG_subprogram ] +!20 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !21, i32 0, null} ; [ DW_TAG_subroutine_type ] !21 = metadata !{metadata !3, metadata !3, metadata !22} -!22 = metadata !{i32 524303, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !23} ; [ DW_TAG_pointer_type ] -!23 = metadata !{i32 524303, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !24} ; [ DW_TAG_pointer_type ] -!24 = metadata !{i32 524324, metadata !1, metadata !"char", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!25 = metadata !{i32 524545, metadata !19, metadata !"argv", metadata !1, i32 22, metadata !22} ; [ DW_TAG_arg_variable ] -!26 = metadata !{i32 524544, metadata !27, metadata !"e", metadata !1, i32 23, metadata !14} ; [ DW_TAG_auto_variable ] -!27 = metadata !{i32 524299, metadata !19, i32 22, i32 0} ; [ DW_TAG_lexical_block ] +!22 = metadata !{i32 786447, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !23} ; [ DW_TAG_pointer_type ] +!23 = metadata !{i32 786447, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !24} ; [ DW_TAG_pointer_type ] +!24 = metadata !{i32 786468, metadata !1, metadata !"char", metadata !1, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!25 = metadata !{i32 786689, metadata !19, metadata !"argv", metadata !1, i32 22, metadata !22, i32 0, null} ; [ DW_TAG_arg_variable ] +!26 = metadata !{i32 786688, metadata !27, metadata !"e", metadata !1, i32 23, metadata !14, i32 0, null} ; [ DW_TAG_auto_variable ] +!27 = metadata !{i32 786443, metadata !36, metadata !19, i32 22, i32 0, i32 0} ; [ DW_TAG_lexical_block ] !28 = metadata !{i32 18, i32 0, metadata !29, null} -!29 = metadata !{i32 524299, metadata !9, i32 17, i32 0} ; [ DW_TAG_lexical_block ] +!29 = metadata !{i32 786443, metadata !36, metadata !9, i32 17, i32 0, i32 1} ; [ DW_TAG_lexical_block ] !30 = metadata !{i32 19, i32 0, metadata !29, null} +!31 = metadata !{metadata !0} +!32 = metadata !{metadata !5, metadata !9, metadata !19} +!33 = metadata !{metadata !4} +!34 = metadata !{metadata !8} +!35 = metadata !{metadata !18, metadata !25, metadata !26} +!36 = metadata !{metadata !"foo.c", metadata !"/tmp/"} ; The variable bar:myvar changes registers after the first movq. ; It is cobbered by popq %rbx @@ -79,4 +84,4 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone ; CHECK-NEXT: .short Lset{{.*}} ; CHECK-NEXT: Ltmp{{.*}}: ; CHECK-NEXT: .byte 83 -; CHECK-NEXT: Ltmp{{.*}}:
\ No newline at end of file +; CHECK-NEXT: Ltmp{{.*}}: diff --git a/test/CodeGen/X86/2010-05-28-Crash.ll b/test/CodeGen/X86/2010-05-28-Crash.ll index 1a0da3177a22..4ea3bf077841 100644 --- a/test/CodeGen/X86/2010-05-28-Crash.ll +++ b/test/CodeGen/X86/2010-05-28-Crash.ll @@ -22,23 +22,27 @@ entry: ret i32 %1, !dbg !13 } -!llvm.dbg.lv = !{!0, !7} +!llvm.dbg.cu = !{!3} -!0 = metadata !{i32 524545, metadata !1, metadata !"y", metadata !2, i32 2, metadata !6} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"f.c", metadata !"/tmp", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"f.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786689, metadata !1, metadata !"y", metadata !2, i32 2, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 (i32)* @foo, null, null, metadata !15, i32 2} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !18} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 1, metadata !2, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, metadata !"", i32 0, null, null, metadata !17, null, metadata !""} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6, metadata !6} -!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 524545, metadata !8, metadata !"x", metadata !2, i32 6, metadata !6} ; [ DW_TAG_arg_variable ] -!8 = metadata !{i32 524334, i32 0, metadata !2, metadata !"bar", metadata !"bar", metadata !"bar", metadata !2, i32 6, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786689, metadata !8, metadata !"x", metadata !2, i32 6, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!8 = metadata !{i32 786478, metadata !2, metadata !"bar", metadata !"bar", metadata !"bar", metadata !2, i32 6, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 (i32)* @bar, null, null, metadata !16, i32 6} ; [ DW_TAG_subprogram ] !9 = metadata !{i32 3, i32 0, metadata !10, null} -!10 = metadata !{i32 524299, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] +!10 = metadata !{i32 786443, metadata !2, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] !11 = metadata !{i32 1} !12 = metadata !{i32 3, i32 0, metadata !10, metadata !13} !13 = metadata !{i32 7, i32 0, metadata !14, null} -!14 = metadata !{i32 524299, metadata !8, i32 6, i32 0} ; [ DW_TAG_lexical_block ] +!14 = metadata !{i32 786443, metadata !2, metadata !8, i32 6, i32 0} ; [ DW_TAG_lexical_block ] +!15 = metadata !{metadata !0} +!16 = metadata !{metadata !7} +!17 = metadata !{metadata !1, metadata !8} +!18 = metadata !{metadata !"f.c", metadata !"/tmp"} ;CHECK: DEBUG_VALUE: bar:x <- E ;CHECK: Ltmp diff --git a/test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll b/test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll index a9c03ee563d8..b764b0b34597 100644 --- a/test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll +++ b/test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll @@ -21,34 +21,35 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.lv = !{!0, !14, !15, !16, !17, !24, !25, !28} -!0 = metadata !{i32 524545, metadata !1, metadata !"this", metadata !3, i32 11, metadata !12} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEi", metadata !3, i32 11, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524307, metadata !3, metadata !"foo", metadata !3, i32 3, i64 32, i64 32, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_structure_type ] -!3 = metadata !{i32 524329, metadata !"foo.cp", metadata !"/tmp/", metadata !4} ; [ DW_TAG_file_type ] -!4 = metadata !{i32 524305, i32 0, i32 4, metadata !"foo.cp", metadata !"/tmp/", metadata !"4.2.1 LLVM build", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] +!0 = metadata !{i32 786689, metadata !1, metadata !"this", metadata !3, i32 11, metadata !12, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !3, metadata !2, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEi", i32 11, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, i32 (%struct.foo*, i32)* @_ZN3foo3bazEi, null, null, null, i32 11} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786451, metadata !3, metadata !"foo", metadata !3, i32 3, i64 32, i64 32, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_structure_type ] +!3 = metadata !{i32 786473, metadata !31} ; [ DW_TAG_file_type ] +!4 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cp", metadata !"/tmp/", metadata !"4.2.1 LLVM build", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] !5 = metadata !{metadata !6, metadata !1, metadata !8} -!6 = metadata !{i32 524301, metadata !2, metadata !"y", metadata !3, i32 8, i64 32, i64 32, i64 0, i32 0, metadata !7} ; [ DW_TAG_member ] -!7 = metadata !{i32 524324, metadata !3, metadata !"int", metadata !3, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!8 = metadata !{i32 524334, i32 0, metadata !2, metadata !"baz", metadata !"baz", metadata !"_ZN3foo3bazEi", metadata !3, i32 15, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] -!9 = metadata !{i32 524309, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0, null} ; [ DW_TAG_subroutine_type ] +!6 = metadata !{i32 786445, metadata !2, metadata !"y", metadata !3, i32 8, i64 32, i64 32, i64 0, i32 0, metadata !7} ; [ DW_TAG_member ] +!7 = metadata !{i32 786468, metadata !3, metadata !"int", metadata !3, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 786478, metadata !3, metadata !2, metadata !"baz", metadata !"baz", metadata !"_ZN3foo3bazEi", i32 15, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, i32 (%struct.foo*, i32)* @_ZN3foo3bazEi, null, null, null, i32 15} ; [ DW_TAG_subprogram ] +!9 = metadata !{i32 786453, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0, null} ; [ DW_TAG_subroutine_type ] !10 = metadata !{metadata !7, metadata !11, metadata !7} -!11 = metadata !{i32 524303, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !2} ; [ DW_TAG_pointer_type ] -!12 = metadata !{i32 524326, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !13} ; [ DW_TAG_const_type ] -!13 = metadata !{i32 524303, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !2} ; [ DW_TAG_pointer_type ] -!14 = metadata !{i32 524545, metadata !1, metadata !"x", metadata !3, i32 11, metadata !7} ; [ DW_TAG_arg_variable ] -!15 = metadata !{i32 524545, metadata !8, metadata !"this", metadata !3, i32 15, metadata !12} ; [ DW_TAG_arg_variable ] -!16 = metadata !{i32 524545, metadata !8, metadata !"x", metadata !3, i32 15, metadata !7} ; [ DW_TAG_arg_variable ] -!17 = metadata !{i32 524545, metadata !18, metadata !"argc", metadata !3, i32 19, metadata !7} ; [ DW_TAG_arg_variable ] -!18 = metadata !{i32 524334, i32 0, metadata !3, metadata !"main", metadata !"main", metadata !"main", metadata !3, i32 19, metadata !19, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true} ; [ DW_TAG_subprogram ] -!19 = metadata !{i32 524309, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !20, i32 0, null} ; [ DW_TAG_subroutine_type ] +!11 = metadata !{i32 786447, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !2} ; [ DW_TAG_pointer_type ] +!12 = metadata !{i32 786470, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !13} ; [ DW_TAG_const_type ] +!13 = metadata !{i32 786447, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !2} ; [ DW_TAG_pointer_type ] +!14 = metadata !{i32 786689, metadata !1, metadata !"x", metadata !3, i32 11, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!15 = metadata !{i32 786689, metadata !8, metadata !"this", metadata !3, i32 15, metadata !12, i32 0, null} ; [ DW_TAG_arg_variable ] +!16 = metadata !{i32 786689, metadata !8, metadata !"x", metadata !3, i32 15, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!17 = metadata !{i32 786689, metadata !18, metadata !"argc", metadata !3, i32 19, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!18 = metadata !{i32 786478, metadata !3, metadata !3, metadata !"main", metadata !"main", metadata !"main", i32 19, metadata !19, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, null, null, null, null, i32 19} ; [ DW_TAG_subprogram ] +!19 = metadata !{i32 786453, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !20, i32 0, null} ; [ DW_TAG_subroutine_type ] !20 = metadata !{metadata !7, metadata !7, metadata !21} -!21 = metadata !{i32 524303, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !22} ; [ DW_TAG_pointer_type ] -!22 = metadata !{i32 524303, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !23} ; [ DW_TAG_pointer_type ] -!23 = metadata !{i32 524324, metadata !3, metadata !"char", metadata !3, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!24 = metadata !{i32 524545, metadata !18, metadata !"argv", metadata !3, i32 19, metadata !21} ; [ DW_TAG_arg_variable ] -!25 = metadata !{i32 524544, metadata !26, metadata !"a", metadata !3, i32 20, metadata !2} ; [ DW_TAG_auto_variable ] -!26 = metadata !{i32 524299, metadata !27, i32 19, i32 0} ; [ DW_TAG_lexical_block ] -!27 = metadata !{i32 524299, metadata !18, i32 19, i32 0} ; [ DW_TAG_lexical_block ] -!28 = metadata !{i32 524544, metadata !26, metadata !"b", metadata !3, i32 21, metadata !7} ; [ DW_TAG_auto_variable ] +!21 = metadata !{i32 786447, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !22} ; [ DW_TAG_pointer_type ] +!22 = metadata !{i32 786447, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !23} ; [ DW_TAG_pointer_type ] +!23 = metadata !{i32 786468, metadata !3, metadata !"char", metadata !3, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!24 = metadata !{i32 786689, metadata !18, metadata !"argv", metadata !3, i32 19, metadata !21, i32 0, null} ; [ DW_TAG_arg_variable ] +!25 = metadata !{i32 786688, metadata !26, metadata !"a", metadata !3, i32 20, metadata !2, i32 0, null} ; [ DW_TAG_auto_variable ] +!26 = metadata !{i32 786443, metadata !27, i32 19, i32 0} ; [ DW_TAG_lexical_block ] +!27 = metadata !{i32 786443, metadata !18, i32 19, i32 0} ; [ DW_TAG_lexical_block ] +!28 = metadata !{i32 786688, metadata !26, metadata !"b", metadata !3, i32 21, metadata !7, i32 0, null} ; [ DW_TAG_auto_variable ] !29 = metadata !{i32 16, i32 0, metadata !30, null} -!30 = metadata !{i32 524299, metadata !8, i32 15, i32 0} ; [ DW_TAG_lexical_block ] +!30 = metadata !{i32 786443, metadata !8, i32 15, i32 0} ; [ DW_TAG_lexical_block ] +!31 = metadata !{metadata !"foo.cp", metadata !"/tmp/"} diff --git a/test/CodeGen/X86/2010-07-06-DbgCrash.ll b/test/CodeGen/X86/2010-07-06-DbgCrash.ll index edd6015b0d28..208e93e098e6 100644 --- a/test/CodeGen/X86/2010-07-06-DbgCrash.ll +++ b/test/CodeGen/X86/2010-07-06-DbgCrash.ll @@ -16,7 +16,7 @@ !103 = metadata !{i32 524299, metadata !97, i32 73, i32 0} ; [ DW_TAG_lexical_block ] !104 = metadata !{i32 524289, metadata !38, metadata !"", metadata !38, i32 0, i64 85312, i64 64, i64 0, i32 0, metadata !46, metadata !105, i32 0, null} ; [ DW_TAG_array_type ] !105 = metadata !{metadata !106} -!106 = metadata !{i32 524321, i64 0, i64 1332} ; [ DW_TAG_subrange_type ] +!106 = metadata !{i32 524321, i64 0, i64 1333} ; [ DW_TAG_subrange_type ] !107 = metadata !{i32 73, i32 0, metadata !103, null} define i32 @main() nounwind ssp { diff --git a/test/CodeGen/X86/2010-08-04-StackVariable.ll b/test/CodeGen/X86/2010-08-04-StackVariable.ll index ba36fe7c12fd..aaa562a439d5 100644 --- a/test/CodeGen/X86/2010-08-04-StackVariable.ll +++ b/test/CodeGen/X86/2010-08-04-StackVariable.ll @@ -74,51 +74,52 @@ return: ; preds = %entry declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0, !9, !16, !17, !20} +!llvm.dbg.cu = !{!3} +!46 = metadata !{metadata !0, metadata !9, metadata !16, metadata !17, metadata !20} -!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"SVal", metadata !"SVal", metadata !"", metadata !2, i32 11, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 524307, metadata !2, metadata !"SVal", metadata !2, i32 1, i64 128, i64 64, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_structure_type ] -!2 = metadata !{i32 524329, metadata !"small.cc", metadata !"/Users/manav/R8248330", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 4, metadata !"small.cc", metadata !"/Users/manav/R8248330", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] +!0 = metadata !{i32 786478, metadata !1, metadata !"SVal", metadata !"SVal", metadata !"", metadata !2, i32 11, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null, null, null, null, i32 11} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786451, metadata !2, metadata !"SVal", metadata !2, i32 1, i64 128, i64 64, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_structure_type ] +!2 = metadata !{i32 786473, metadata !"small.cc", metadata !"/Users/manav/R8248330", metadata !3} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 4, metadata !2, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, null, null, metadata !46, null, metadata !""} ; [ DW_TAG_compile_unit ] !4 = metadata !{metadata !5, metadata !7, metadata !0, metadata !9} -!5 = metadata !{i32 524301, metadata !1, metadata !"Data", metadata !2, i32 7, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] -!6 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] -!7 = metadata !{i32 524301, metadata !1, metadata !"Kind", metadata !2, i32 8, i64 32, i64 32, i64 64, i32 0, metadata !8} ; [ DW_TAG_member ] -!8 = metadata !{i32 524324, metadata !2, metadata !"unsigned int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!9 = metadata !{i32 524334, i32 0, metadata !1, metadata !"~SVal", metadata !"~SVal", metadata !"", metadata !2, i32 12, metadata !10, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null} ; [ DW_TAG_subprogram ] -!10 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{i32 786445, metadata !1, metadata !"Data", metadata !2, i32 7, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] +!6 = metadata !{i32 786447, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!7 = metadata !{i32 786445, metadata !1, metadata !"Kind", metadata !2, i32 8, i64 32, i64 32, i64 64, i32 0, metadata !8} ; [ DW_TAG_member ] +!8 = metadata !{i32 786468, metadata !2, metadata !"unsigned int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786478, metadata !1, metadata !"~SVal", metadata !"~SVal", metadata !"", metadata !2, i32 12, metadata !10, i1 false, i1 false, i32 0, i32 0, null, i1 false, i1 false, null, null, null, null, i32 12} ; [ DW_TAG_subprogram ] +!10 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ] !11 = metadata !{null, metadata !12, metadata !13} -!12 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !1} ; [ DW_TAG_pointer_type ] -!13 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!14 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null} ; [ DW_TAG_subroutine_type ] +!12 = metadata !{i32 786447, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !1} ; [ DW_TAG_pointer_type ] +!13 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null} ; [ DW_TAG_subroutine_type ] !15 = metadata !{null, metadata !12} -!16 = metadata !{i32 524334, i32 0, metadata !1, metadata !"SVal", metadata !"SVal", metadata !"_ZN4SValC1Ev", metadata !2, i32 11, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, void (%struct.SVal*)* @_ZN4SValC1Ev} ; [ DW_TAG_subprogram ] -!17 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"_Z3fooi4SVal", metadata !2, i32 16, metadata !18, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32, %struct.SVal*)* @_Z3fooi4SVal} ; [ DW_TAG_subprogram ] -!18 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !19, i32 0, null} ; [ DW_TAG_subroutine_type ] +!16 = metadata !{i32 786478, metadata !1, metadata !"SVal", metadata !"SVal", metadata !"_ZN4SValC1Ev", metadata !2, i32 11, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, void (%struct.SVal*)* @_ZN4SValC1Ev, null, null, null, i32 11} ; [ DW_TAG_subprogram ] +!17 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"_Z3fooi4SVal", metadata !2, i32 16, metadata !18, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32, %struct.SVal*)* @_Z3fooi4SVal, null, null, null, i32 16} ; [ DW_TAG_subprogram ] +!18 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !19, i32 0, null} ; [ DW_TAG_subroutine_type ] !19 = metadata !{metadata !13, metadata !13, metadata !1} -!20 = metadata !{i32 524334, i32 0, metadata !2, metadata !"main", metadata !"main", metadata !"main", metadata !2, i32 23, metadata !21, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!21 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !22, i32 0, null} ; [ DW_TAG_subroutine_type ] +!20 = metadata !{i32 786478, metadata !2, metadata !"main", metadata !"main", metadata !"main", metadata !2, i32 23, metadata !21, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @main, null, null, null, i32 23} ; [ DW_TAG_subprogram ] +!21 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !22, i32 0, null} ; [ DW_TAG_subroutine_type ] !22 = metadata !{metadata !13} -!23 = metadata !{i32 524545, metadata !17, metadata !"i", metadata !2, i32 16, metadata !13} ; [ DW_TAG_arg_variable ] +!23 = metadata !{i32 786689, metadata !17, metadata !"i", metadata !2, i32 16, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] !24 = metadata !{i32 16, i32 0, metadata !17, null} -!25 = metadata !{i32 524545, metadata !17, metadata !"location", metadata !2, i32 16, metadata !26} ; [ DW_TAG_arg_variable ] -!26 = metadata !{i32 524304, metadata !2, metadata !"SVal", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !1} ; [ DW_TAG_reference_type ] +!25 = metadata !{i32 786689, metadata !17, metadata !"location", metadata !2, i32 16, metadata !26, i32 0, null} ; [ DW_TAG_arg_variable ] +!26 = metadata !{i32 786448, metadata !2, metadata !"SVal", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !1} ; [ DW_TAG_reference_type ] !27 = metadata !{i32 17, i32 0, metadata !28, null} -!28 = metadata !{i32 524299, metadata !17, i32 16, i32 0, metadata !2, i32 2} ; [ DW_TAG_lexical_block ] +!28 = metadata !{i32 786443, metadata !2, metadata !17, i32 16, i32 0, i32 2} ; [ DW_TAG_lexical_block ] !29 = metadata !{i32 18, i32 0, metadata !28, null} !30 = metadata !{i32 20, i32 0, metadata !28, null} -!31 = metadata !{i32 524545, metadata !16, metadata !"this", metadata !2, i32 11, metadata !32} ; [ DW_TAG_arg_variable ] -!32 = metadata !{i32 524326, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !33} ; [ DW_TAG_const_type ] -!33 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !1} ; [ DW_TAG_pointer_type ] +!31 = metadata !{i32 786689, metadata !16, metadata !"this", metadata !2, i32 11, metadata !32, i32 0, null} ; [ DW_TAG_arg_variable ] +!32 = metadata !{i32 786470, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !33} ; [ DW_TAG_const_type ] +!33 = metadata !{i32 786447, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !1} ; [ DW_TAG_pointer_type ] !34 = metadata !{i32 11, i32 0, metadata !16, null} !35 = metadata !{i32 11, i32 0, metadata !36, null} -!36 = metadata !{i32 524299, metadata !37, i32 11, i32 0, metadata !2, i32 1} ; [ DW_TAG_lexical_block ] -!37 = metadata !{i32 524299, metadata !16, i32 11, i32 0, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] -!38 = metadata !{i32 524544, metadata !39, metadata !"v", metadata !2, i32 24, metadata !1} ; [ DW_TAG_auto_variable ] -!39 = metadata !{i32 524299, metadata !40, i32 23, i32 0, metadata !2, i32 4} ; [ DW_TAG_lexical_block ] -!40 = metadata !{i32 524299, metadata !20, i32 23, i32 0, metadata !2, i32 3} ; [ DW_TAG_lexical_block ] +!36 = metadata !{i32 786443, metadata !2, metadata !37, i32 11, i32 0, i32 1} ; [ DW_TAG_lexical_block ] +!37 = metadata !{i32 786443, metadata !2, metadata !16, i32 11, i32 0, i32 0} ; [ DW_TAG_lexical_block ] +!38 = metadata !{i32 786688, metadata !39, metadata !"v", metadata !2, i32 24, metadata !1, i32 0, null} ; [ DW_TAG_auto_variable ] +!39 = metadata !{i32 786443, metadata !2, metadata !40, i32 23, i32 0, i32 4} ; [ DW_TAG_lexical_block ] +!40 = metadata !{i32 786443, metadata !2, metadata !20, i32 23, i32 0, i32 3} ; [ DW_TAG_lexical_block ] !41 = metadata !{i32 24, i32 0, metadata !39, null} !42 = metadata !{i32 25, i32 0, metadata !39, null} !43 = metadata !{i32 26, i32 0, metadata !39, null} -!44 = metadata !{i32 524544, metadata !39, metadata !"k", metadata !2, i32 26, metadata !13} ; [ DW_TAG_auto_variable ] +!44 = metadata !{i32 786688, metadata !39, metadata !"k", metadata !2, i32 26, metadata !13, i32 0, null} ; [ DW_TAG_auto_variable ] !45 = metadata !{i32 27, i32 0, metadata !39, null} diff --git a/test/CodeGen/X86/2010-08-10-DbgConstant.ll b/test/CodeGen/X86/2010-08-10-DbgConstant.ll deleted file mode 100644 index b3cc35d723f7..000000000000 --- a/test/CodeGen/X86/2010-08-10-DbgConstant.ll +++ /dev/null @@ -1,25 +0,0 @@ -; RUN: llc -mtriple=i686-linux -O0 < %s | FileCheck %s -; CHECK: DW_TAG_constant -; CHECK-NEXT: .long .Lstring3 #{{#?}} DW_AT_name - -define void @foo() nounwind ssp { -entry: - call void @bar(i32 201), !dbg !8 - ret void, !dbg !8 -} - -declare void @bar(i32) - -!llvm.dbg.sp = !{!0} -!llvm.dbg.gv = !{!5} - -!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, void ()* @foo} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 524329, metadata !"/tmp/l.c", metadata !"/Volumes/Lalgate/clean/D", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 524305, i32 0, i32 12, metadata !"/tmp/l.c", metadata !"/Volumes/Lalgate/clean/D", metadata !"clang 2.8", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{null} -!5 = metadata !{i32 524327, i32 0, metadata !1, metadata !"ro", metadata !"ro", metadata !"ro", metadata !1, i32 1, metadata !6, i1 true, i1 true, i32 201} ; [ DW_TAG_constant ] -!6 = metadata !{i32 524326, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !7} ; [ DW_TAG_const_type ] -!7 = metadata !{i32 524324, metadata !1, metadata !"unsigned int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!8 = metadata !{i32 3, i32 14, metadata !9, null} -!9 = metadata !{i32 524299, metadata !0, i32 3, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] diff --git a/test/CodeGen/X86/2010-09-16-EmptyFilename.ll b/test/CodeGen/X86/2010-09-16-EmptyFilename.ll index bed8c8a77b9a..de0d216e266f 100644 --- a/test/CodeGen/X86/2010-09-16-EmptyFilename.ll +++ b/test/CodeGen/X86/2010-09-16-EmptyFilename.ll @@ -12,18 +12,21 @@ entry: ret i32 21, !dbg !10 } -!llvm.dbg.sp = !{!0, !6} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 53, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @foo} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 524329, metadata !"", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 524305, i32 0, i32 12, metadata !"bug.c", metadata !"/private/tmp", metadata !"clang version 2.9 (trunk 114084)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 53, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @foo} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !14} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !15, i32 12, metadata !"clang version 2.9 (trunk 114084)", i1 false, metadata !"", i32 0, null, null, metadata !13, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null, null, metadata !13, null} ; [ DW_TAG_subroutine_type ] !4 = metadata !{metadata !5} -!5 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 524334, i32 0, metadata !7, metadata !"bar", metadata !"bar", metadata !"bar", metadata !7, i32 4, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @bar} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 524329, metadata !"bug.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] +!5 = metadata !{i32 786468, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !7, metadata !"bar", metadata !"bar", metadata !"bar", metadata !7, i32 4, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @bar} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786473, metadata !15} ; [ DW_TAG_file_type ] !8 = metadata !{i32 53, i32 13, metadata !9, null} -!9 = metadata !{i32 524299, metadata !0, i32 53, i32 11, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!9 = metadata !{i32 786443, metadata !0, i32 53, i32 11, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] !10 = metadata !{i32 4, i32 13, metadata !11, null} -!11 = metadata !{i32 524299, metadata !12, i32 4, i32 13, metadata !7, i32 2} ; [ DW_TAG_lexical_block ] -!12 = metadata !{i32 524299, metadata !6, i32 4, i32 11, metadata !7, i32 1} ; [ DW_TAG_lexical_block ] +!11 = metadata !{i32 786443, metadata !12, i32 4, i32 13, metadata !7, i32 2} ; [ DW_TAG_lexical_block ] +!12 = metadata !{i32 786443, metadata !6, i32 4, i32 11, metadata !7, i32 1} ; [ DW_TAG_lexical_block ] +!13 = metadata !{metadata !0, metadata !6} +!14 = metadata !{metadata !"", metadata !"/private/tmp"} +!15 = metadata !{metadata !"bug.c", metadata !"/private/tmp"} diff --git a/test/CodeGen/X86/2010-11-02-DbgParameter.ll b/test/CodeGen/X86/2010-11-02-DbgParameter.ll index 79c0cf35c660..31a6822b34b8 100644 --- a/test/CodeGen/X86/2010-11-02-DbgParameter.ll +++ b/test/CodeGen/X86/2010-11-02-DbgParameter.ll @@ -15,21 +15,23 @@ entry: declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0} -!llvm.dbg.lv.foo = !{!6} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (%struct.bar*)* @foo} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"one.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"one.c", metadata !"/private/tmp", metadata !"clang version 2.9 (trunk 117922)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (%struct.bar*)* @foo, null, null, metadata !16, i32 3} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !17} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 12, metadata !1, metadata !"clang version 2.9 (trunk 117922)", i1 true, metadata !"", i32 0, null, null, metadata !15, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] !4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 590081, metadata !0, metadata !"i", metadata !1, i32 3, metadata !7, i32 0} ; [ DW_TAG_arg_variable ] -!7 = metadata !{i32 589839, metadata !1, metadata !"", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] -!8 = metadata !{i32 589843, metadata !1, metadata !"bar", metadata !1, i32 2, i64 64, i64 32, i64 0, i32 0, null, metadata !9, i32 0, null} ; [ DW_TAG_structure_type ] +!5 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786689, metadata !0, metadata !"i", metadata !1, i32 3, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!7 = metadata !{i32 786447, metadata !1, metadata !"", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] +!8 = metadata !{i32 786451, metadata !1, metadata !"bar", metadata !1, i32 2, i64 64, i64 32, i64 0, i32 0, null, metadata !9, i32 0, null} ; [ DW_TAG_structure_type ] !9 = metadata !{metadata !10, metadata !11} -!10 = metadata !{i32 589837, metadata !1, metadata !"x", metadata !1, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !5} ; [ DW_TAG_member ] -!11 = metadata !{i32 589837, metadata !1, metadata !"y", metadata !1, i32 2, i64 32, i64 32, i64 32, i32 0, metadata !5} ; [ DW_TAG_member ] +!10 = metadata !{i32 786445, metadata !1, metadata !"x", metadata !1, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !5} ; [ DW_TAG_member ] +!11 = metadata !{i32 786445, metadata !1, metadata !"y", metadata !1, i32 2, i64 32, i64 32, i64 32, i32 0, metadata !5} ; [ DW_TAG_member ] !12 = metadata !{i32 3, i32 47, metadata !0, null} !13 = metadata !{i32 4, i32 2, metadata !14, null} -!14 = metadata !{i32 589835, metadata !0, i32 3, i32 50, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!14 = metadata !{i32 786443, metadata !0, i32 3, i32 50, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!15 = metadata !{metadata !0} +!16 = metadata !{metadata !6} +!17 = metadata !{metadata !"one.c", metadata !"/private/tmp"} diff --git a/test/CodeGen/X86/2010-12-02-MC-Set.ll b/test/CodeGen/X86/2010-12-02-MC-Set.ll index 31446786ec15..4d8d974f703e 100644 --- a/test/CodeGen/X86/2010-12-02-MC-Set.ll +++ b/test/CodeGen/X86/2010-12-02-MC-Set.ll @@ -6,17 +6,18 @@ entry: ret void, !dbg !5 } -!llvm.dbg.sp = !{!0} +!llvm.dbg.cu = !{!2} +!7 = metadata !{metadata !0} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @foo} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"e.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"e.c", metadata !"/private/tmp", metadata !"clang version 2.9 (trunk 120563)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @foo, null, null, null, i32 0} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !"e.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 12, metadata !1, metadata !"clang version 2.9 (trunk 120563)", i1 false, metadata !"", i32 0, null, null, metadata !7, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] !4 = metadata !{null} !5 = metadata !{i32 5, i32 1, metadata !6, null} -!6 = metadata !{i32 589835, metadata !0, i32 3, i32 16, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!6 = metadata !{i32 786443, metadata !0, i32 3, i32 16, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] ; CHECK: .subsections_via_symbols ; CHECK-NEXT: __debug_line -; CHECK-NEXT: Ltmp +; CHECK-NEXT: Lline_table_start0 ; CHECK-NEXT: Ltmp{{[0-9]}} = (Ltmp diff --git a/test/CodeGen/X86/2011-01-24-DbgValue-Before-Use.ll b/test/CodeGen/X86/2011-01-24-DbgValue-Before-Use.ll index 166dcf259989..2355528a81e8 100644 --- a/test/CodeGen/X86/2011-01-24-DbgValue-Before-Use.ll +++ b/test/CodeGen/X86/2011-01-24-DbgValue-Before-Use.ll @@ -4,7 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-darwin10.0.0" ; Check debug info for variable z_s -;CHECK: .long Lset13 +;CHECK: .long Lset14 ;CHECK-NEXT: ## DW_AT_decl_file ;CHECK-NEXT: ## DW_AT_decl_line ;CHECK-NEXT: ## DW_AT_type @@ -69,35 +69,37 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone declare i32 @puts(i8* nocapture) nounwind -!llvm.dbg.sp = !{!0, !6} -!llvm.dbg.lv.gcd = !{!10, !11, !12} -!llvm.dbg.lv.main = !{!14, !17} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"gcd", metadata !"gcd", metadata !"", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i64 (i64, i64)* @gcd} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"rem_small.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"rem_small.c", metadata !"/private/tmp", metadata !"clang version 2.9 (trunk 124117)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"gcd", metadata !"gcd", metadata !"", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i64 (i64, i64)* @gcd, null, null, metadata !29, i32 0} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !31} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !31, i32 12, metadata !"clang version 2.9 (trunk 124117)", i1 true, metadata !"", i32 0, null, null, metadata !28, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !1, metadata !"", 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 589860, metadata !2, metadata !"long int", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 25, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, i32 ()* @main} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{i32 786468, null, metadata !2, metadata !"long int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 25, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, i32 ()* @main, null, null, metadata !30, i32 0} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786453, metadata !1, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9} -!9 = metadata !{i32 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!10 = metadata !{i32 590081, metadata !0, metadata !"a", metadata !1, i32 5, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!11 = metadata !{i32 590081, metadata !0, metadata !"b", metadata !1, i32 5, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!12 = metadata !{i32 590080, metadata !13, metadata !"c", metadata !1, i32 6, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!13 = metadata !{i32 589835, metadata !0, i32 5, i32 52, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!14 = metadata !{i32 590080, metadata !15, metadata !"m", metadata !1, i32 26, metadata !16, i32 0} ; [ DW_TAG_auto_variable ] -!15 = metadata !{i32 589835, metadata !6, i32 25, i32 12, metadata !1, i32 2} ; [ DW_TAG_lexical_block ] -!16 = metadata !{i32 589860, metadata !2, metadata !"unsigned int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!17 = metadata !{i32 590080, metadata !15, metadata !"z_s", metadata !1, i32 27, metadata !9, i32 0} ; [ DW_TAG_auto_variable ] +!9 = metadata !{i32 786468, null, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!10 = metadata !{i32 786689, metadata !0, metadata !"a", metadata !1, i32 5, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!11 = metadata !{i32 786689, metadata !0, metadata !"b", metadata !1, i32 5, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!12 = metadata !{i32 786688, metadata !13, metadata !"c", metadata !1, i32 6, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!13 = metadata !{i32 786443, metadata !1, metadata !0, i32 5, i32 52, i32 0} ; [ DW_TAG_lexical_block ] +!14 = metadata !{i32 786688, metadata !15, metadata !"m", metadata !1, i32 26, metadata !16, i32 0, null} ; [ DW_TAG_auto_variable ] +!15 = metadata !{i32 786443, metadata !1, metadata !6, i32 25, i32 12, i32 2} ; [ DW_TAG_lexical_block ] +!16 = metadata !{i32 786468, null, metadata !2, metadata !"unsigned int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!17 = metadata !{i32 786688, metadata !15, metadata !"z_s", metadata !1, i32 27, metadata !9, i32 0, null} ; [ DW_TAG_auto_variable ] !18 = metadata !{i32 5, i32 41, metadata !0, null} !19 = metadata !{i32 5, i32 49, metadata !0, null} !20 = metadata !{i32 7, i32 5, metadata !13, null} !21 = metadata !{i32 8, i32 9, metadata !22, null} -!22 = metadata !{i32 589835, metadata !13, i32 7, i32 14, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] +!22 = metadata !{i32 786443, metadata !1, metadata !13, i32 7, i32 14, i32 1} ; [ DW_TAG_lexical_block ] !23 = metadata !{i32 9, i32 9, metadata !22, null} !24 = metadata !{i32 26, i32 38, metadata !15, null} !25 = metadata !{i32 27, i32 38, metadata !15, null} !26 = metadata !{i32 28, i32 9, metadata !15, null} !27 = metadata !{i32 30, i32 1, metadata !15, null} +!28 = metadata !{metadata !0, metadata !6} +!29 = metadata !{metadata !10, metadata !11, metadata !12} +!30 = metadata !{metadata !14, metadata !17} +!31 = metadata !{metadata !"rem_small.c", metadata !"/private/tmp"} diff --git a/test/CodeGen/X86/2011-06-12-FastAllocSpill.ll b/test/CodeGen/X86/2011-06-12-FastAllocSpill.ll index 47ef693cc25e..6f43b94b264a 100644 --- a/test/CodeGen/X86/2011-06-12-FastAllocSpill.ll +++ b/test/CodeGen/X86/2011-06-12-FastAllocSpill.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -O0 -disable-fp-elim -relocation-model=pic -stats 2>&1 | FileCheck %s ; ; This test should not cause any spilling with RAFast. diff --git a/test/CodeGen/X86/2011-09-14-valcoalesce.ll b/test/CodeGen/X86/2011-09-14-valcoalesce.ll index a5ec614a943b..54d2b403509d 100644 --- a/test/CodeGen/X86/2011-09-14-valcoalesce.ll +++ b/test/CodeGen/X86/2011-09-14-valcoalesce.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86 -disable-code-place | FileCheck %s +; RUN: llc < %s -march=x86 -disable-block-placement | FileCheck %s ; ; Test RegistersDefinedFromSameValue. We have multiple copies of the same vreg: ; while.body85.i: diff --git a/test/CodeGen/X86/2011-10-19-LegelizeLoad.ll b/test/CodeGen/X86/2011-10-19-LegelizeLoad.ll index a7207537de21..da734d4b6454 100644 --- a/test/CodeGen/X86/2011-10-19-LegelizeLoad.ll +++ b/test/CodeGen/X86/2011-10-19-LegelizeLoad.ll @@ -16,8 +16,8 @@ target triple = "x86_64-unknown-linux-gnu" ; CHECK: main define i32 @main() nounwind uwtable { entry: -; CHECK: movsbq j(%rip), % -; CHECK: movsbq i(%rip), % +; CHECK: pmovsxbq j(%rip), % +; CHECK: pmovsxbq i(%rip), % %0 = load <2 x i8>* @i, align 8 %1 = load <2 x i8>* @j, align 8 %div = sdiv <2 x i8> %1, %0 diff --git a/test/CodeGen/X86/2011-11-30-or.ll b/test/CodeGen/X86/2011-11-30-or.ll index 0a949eb29b89..8ac4632329b3 100644 --- a/test/CodeGen/X86/2011-11-30-or.ll +++ b/test/CodeGen/X86/2011-11-30-or.ll @@ -8,15 +8,15 @@ target triple = "x86_64-apple-macosx10.6.6" ; CHECK: pblendvb %xmm1, %xmm2 ; CHECK: ret -define void @select_func() { +define void @select_func(<8 x i16> %in) { entry: - %c.lobit.i.i.i = ashr <8 x i16> <i16 17, i16 5, i16 1, i16 15, i16 19, i16 15, i16 4, i16 1> , <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15> - %a35 = bitcast <8 x i16> %c.lobit.i.i.i to <2 x i64> + %c.lobit.i.i.i = ashr <8 x i16> %in, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15> %and.i56.i.i.i = and <8 x i16> %c.lobit.i.i.i, <i16 25, i16 8, i16 65, i16 25, i16 8, i16 95, i16 15, i16 45> %and.i5.i.i.i = bitcast <8 x i16> %and.i56.i.i.i to <2 x i64> - %neg.i.i.i.i = xor <2 x i64> %a35, <i64 -1, i64 -1> - %and.i.i.i.i = and <2 x i64> zeroinitializer, %neg.i.i.i.i - %or.i.i.i.i = or <2 x i64> %and.i.i.i.i, %and.i5.i.i.i + %neg.i.i.i.i = xor <8 x i16> %c.lobit.i.i.i, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> + %and.i.i.i = and <8 x i16> %neg.i.i.i.i, <i16 45, i16 15, i16 95, i16 8, i16 25, i16 65, i16 8, i16 25> + %and.i2.i.i.i = bitcast <8 x i16> %and.i.i.i to <2 x i64> + %or.i.i.i.i = or <2 x i64> %and.i2.i.i.i, %and.i5.i.i.i %a37 = bitcast <2 x i64> %or.i.i.i.i to <8 x i16> store <8 x i16> %a37, <8 x i16> addrspace(1)* undef, align 4 ret void diff --git a/test/CodeGen/X86/2012-01-11-split-cv.ll b/test/CodeGen/X86/2012-01-11-split-cv.ll index 6b9007291901..7e914984fe44 100644 --- a/test/CodeGen/X86/2012-01-11-split-cv.ll +++ b/test/CodeGen/X86/2012-01-11-split-cv.ll @@ -2,7 +2,7 @@ ;CHECK: add18i16 define void @add18i16(<18 x i16>* nocapture sret %ret, <18 x i16>* %bp) nounwind { -;CHECK: vmovups +;CHECK: vmovaps %b = load <18 x i16>* %bp, align 16 %x = add <18 x i16> zeroinitializer, %b store <18 x i16> %x, <18 x i16>* %ret, align 16 diff --git a/test/CodeGen/X86/2012-03-26-PostRALICMBug.ll b/test/CodeGen/X86/2012-03-26-PostRALICMBug.ll index 18a331377353..90d8d3d2dd6d 100644 --- a/test/CodeGen/X86/2012-03-26-PostRALICMBug.ll +++ b/test/CodeGen/X86/2012-03-26-PostRALICMBug.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -stats 2>&1 | \ ; RUN: not grep "Number of machine instructions hoisted out of loops post regalloc" diff --git a/test/CodeGen/Generic/2012-07-15-BuildVectorPromote.ll b/test/CodeGen/X86/2012-07-15-BuildVectorPromote.ll index 6591c64d871e..078f1b05c3fc 100644 --- a/test/CodeGen/Generic/2012-07-15-BuildVectorPromote.ll +++ b/test/CodeGen/X86/2012-07-15-BuildVectorPromote.ll @@ -1,4 +1,4 @@ -; RUN: llc -mcpu=corei7 < %s +; RUN: llc < %s -march=x86 -mcpu=corei7 ; We don't care about the output, just that it doesn't crash define <1 x i1> @buildvec_promote() { diff --git a/test/CodeGen/X86/2012-07-15-broadcastfold.ll b/test/CodeGen/X86/2012-07-15-broadcastfold.ll index 3b7a8a7b871c..2c7dfc8dfd45 100644 --- a/test/CodeGen/X86/2012-07-15-broadcastfold.ll +++ b/test/CodeGen/X86/2012-07-15-broadcastfold.ll @@ -3,7 +3,7 @@ declare x86_fastcallcc i64 @barrier() ;CHECK: bcast_fold -;CHECK: vmovaps %xmm{{[0-9]+}}, [[SPILLED:[^\)]+\)]] +;CHECK: vmov{{[au]}}ps %xmm{{[0-9]+}}, [[SPILLED:[^\)]+\)]] ;CHECK: barrier ;CHECK: vbroadcastss [[SPILLED]], %ymm0 ;CHECK: ret diff --git a/test/CodeGen/X86/2012-11-28-merge-store-alias.ll b/test/CodeGen/X86/2012-11-28-merge-store-alias.ll new file mode 100644 index 000000000000..756e86e0f801 --- /dev/null +++ b/test/CodeGen/X86/2012-11-28-merge-store-alias.ll @@ -0,0 +1,52 @@ +; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mtriple=x86_64-pc-win64 | FileCheck %s + +; CHECK: merge_stores_can +; CHECK: callq foo +; CHECK-NEXT: xorps %xmm0, %xmm0 +; CHECK-NEXT: movups %xmm0 +; CHECK: callq foo +; CHECK: ret +declare i32 @foo([10 x i32]* ) + +define i32 @merge_stores_can() nounwind ssp { + %object1 = alloca [10 x i32] + + %ret0 = call i32 @foo([10 x i32]* %object1) nounwind + + %O1_1 = getelementptr [10 x i32]* %object1, i64 0, i32 1 + %O1_2 = getelementptr [10 x i32]* %object1, i64 0, i32 2 + %O1_3 = getelementptr [10 x i32]* %object1, i64 0, i32 3 + %O1_4 = getelementptr [10 x i32]* %object1, i64 0, i32 4 + %ld_ptr = getelementptr [10 x i32]* %object1, i64 0, i32 9 + + store i32 0, i32* %O1_1 + store i32 0, i32* %O1_2 + %ret = load i32* %ld_ptr ; <--- does not alias. + store i32 0, i32* %O1_3 + store i32 0, i32* %O1_4 + + %ret1 = call i32 @foo([10 x i32]* %object1) nounwind + + ret i32 %ret +} + +; CHECK: merge_stores_cant +; CHECK-NOT: xorps %xmm0, %xmm0 +; CHECK-NOT: movups %xmm0 +; CHECK: ret +define i32 @merge_stores_cant([10 x i32]* %in0, [10 x i32]* %in1) nounwind ssp { + + %O1_1 = getelementptr [10 x i32]* %in1, i64 0, i32 1 + %O1_2 = getelementptr [10 x i32]* %in1, i64 0, i32 2 + %O1_3 = getelementptr [10 x i32]* %in1, i64 0, i32 3 + %O1_4 = getelementptr [10 x i32]* %in1, i64 0, i32 4 + %ld_ptr = getelementptr [10 x i32]* %in0, i64 0, i32 2 + + store i32 0, i32* %O1_1 + store i32 0, i32* %O1_2 + %ret = load i32* %ld_ptr ; <--- may alias + store i32 0, i32* %O1_3 + store i32 0, i32* %O1_4 + + ret i32 %ret +} diff --git a/test/CodeGen/X86/2012-11-30-handlemove-dbg.ll b/test/CodeGen/X86/2012-11-30-handlemove-dbg.ll new file mode 100644 index 000000000000..9525653f3fff --- /dev/null +++ b/test/CodeGen/X86/2012-11-30-handlemove-dbg.ll @@ -0,0 +1,51 @@ +; RUN: llc < %s -mtriple=x86_64-apple-macosx -enable-misched \ +; RUN: -verify-machineinstrs | FileCheck %s +; +; Test LiveInterval update handling of DBG_VALUE. +; rdar://12777252. +; +; CHECK: %entry +; CHECK: DEBUG_VALUE: hg +; CHECK: je + +%struct.node.0.27 = type { i16, double, [3 x double], i32, i32 } +%struct.hgstruct.2.29 = type { %struct.bnode.1.28*, [3 x double], double, [3 x double] } +%struct.bnode.1.28 = type { i16, double, [3 x double], i32, i32, [3 x double], [3 x double], [3 x double], double, %struct.bnode.1.28*, %struct.bnode.1.28* } + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +define signext i16 @subdivp(%struct.node.0.27* nocapture %p, double %dsq, double %tolsq, %struct.hgstruct.2.29* nocapture byval align 8 %hg) nounwind uwtable readonly ssp { +entry: + call void @llvm.dbg.declare(metadata !{%struct.hgstruct.2.29* %hg}, metadata !4) + %type = getelementptr inbounds %struct.node.0.27* %p, i64 0, i32 0 + %0 = load i16* %type, align 2, !tbaa !8 + %cmp = icmp eq i16 %0, 1 + br i1 %cmp, label %return, label %for.cond.preheader + +for.cond.preheader: ; preds = %entry + %arrayidx6.1 = getelementptr inbounds %struct.hgstruct.2.29* %hg, i64 0, i32 1, i64 1 + %cmp22 = fcmp olt double 0.000000e+00, %dsq + %conv24 = zext i1 %cmp22 to i16 + br label %return + +return: ; preds = %for.cond.preheader, %entry + %retval.0 = phi i16 [ %conv24, %for.cond.preheader ], [ 0, %entry ] + ret i16 %retval.0 +} + +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"MultiSource/Benchmarks/Olden/bh/newbh.c", metadata !"MultiSource/Benchmarks/Olden/bh", metadata !"clang version 3.3 (trunk 168918) (llvm/trunk 168920)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ] [MultiSource/Benchmarks/Olden/bh/newbh.c] [DW_LANG_C99] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{null} +!4 = metadata !{i32 786689, null, metadata !"hg", metadata !5, i32 67109589, metadata !6, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [hg] [line 725] +!5 = metadata !{i32 786473, metadata !11} ; [ DW_TAG_file_type ] +!6 = metadata !{i32 786454, metadata !11, null, metadata !"hgstruct", i32 492, i64 0, i64 0, i64 0, i32 0, metadata !7} ; [ DW_TAG_typedef ] [hgstruct] [line 492, size 0, align 0, offset 0] [from ] +!7 = metadata !{i32 786451, metadata !11, null, metadata !"", i32 487, i64 512, i64 64, i32 0, i32 0, null, null, i32 0, i32 0, i32 0} ; [ DW_TAG_structure_type ] [line 487, size 512, align 64, offset 0] [from ] +!8 = metadata !{metadata !"short", metadata !9} +!9 = metadata !{metadata !"omnipotent char", metadata !10} +!10 = metadata !{metadata !"Simple C/C++ TBAA"} +!11 = metadata !{metadata !"MultiSource/Benchmarks/Olden/bh/newbh.c", metadata !"MultiSource/Benchmarks/Olden/bh"} diff --git a/test/CodeGen/X86/2012-11-30-misched-dbg.ll b/test/CodeGen/X86/2012-11-30-misched-dbg.ll new file mode 100644 index 000000000000..a0fbbb2ff9ef --- /dev/null +++ b/test/CodeGen/X86/2012-11-30-misched-dbg.ll @@ -0,0 +1,136 @@ +; RUN: llc < %s -mtriple=x86_64-apple-macosx -enable-misched \ +; RUN: -verify-machineinstrs | FileCheck %s +; +; Test MachineScheduler handling of DBG_VALUE. +; rdar://12776937. +; +; CHECK: %if.else581 +; CHECK: DEBUG_VALUE: num1 +; CHECK: call + +%union.rec = type {} + +@.str15 = external hidden unnamed_addr constant [6 x i8], align 1 + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +define i32 @AttachGalley(%union.rec** nocapture %suspend_pt) nounwind uwtable ssp { +entry: + %num14075 = alloca [20 x i8], align 16 + br label %if.end33 + +if.end33: ; preds = %entry + %cmp1733 = icmp eq i32 undef, 0 + br label %if.else581 + +if.else581: ; preds = %if.end33 + %cmp586 = icmp eq i8 undef, -123 + br i1 %cmp586, label %if.then588, label %if.else594 + +if.then588: ; preds = %if.else581 + br label %for.cond1710.preheader + +if.else594: ; preds = %if.else581 + unreachable + +for.cond1710.preheader: ; preds = %if.then588 + br label %for.cond1710 + +for.cond1710: ; preds = %for.cond1710, %for.cond1710.preheader + br i1 undef, label %for.cond1710, label %if.then3344 + +if.then3344: + br label %if.then4073 + +if.then4073: ; preds = %if.then3344 + call void @llvm.dbg.declare(metadata !{[20 x i8]* %num14075}, metadata !4) + %arraydecay4078 = getelementptr inbounds [20 x i8]* %num14075, i64 0, i64 0 + %0 = load i32* undef, align 4 + %add4093 = add nsw i32 %0, 0 + %conv4094 = sitofp i32 %add4093 to float + %div4095 = fdiv float %conv4094, 5.670000e+02 + %conv4096 = fpext float %div4095 to double + %call4097 = call i32 (i8*, i32, i64, i8*, ...)* @__sprintf_chk(i8* %arraydecay4078, i32 0, i64 20, i8* getelementptr inbounds ([6 x i8]* @.str15, i64 0, i64 0), double %conv4096) nounwind + br i1 %cmp1733, label %if.then4107, label %if.else4114 + +if.then4107: ; preds = %if.then4073 + unreachable + +if.else4114: ; preds = %if.then4073 + unreachable +} + +declare i32 @__sprintf_chk(i8*, i32, i64, i8*, ...) + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c", metadata !"MultiSource/Benchmarks/MiBench/consumer-typeset", metadata !"clang version 3.3 (trunk 168918) (llvm/trunk 168920)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] [MultiSource/Benchmarks/MiBench/consumer-typeset/MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] [DW_LANG_C99] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{} +!4 = metadata !{i32 786688, metadata !5, metadata !"num1", metadata !14, i32 815, metadata !15, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [num1] [line 815] +!5 = metadata !{i32 786443, metadata !6, i32 815, i32 0, metadata !14, i32 177} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!6 = metadata !{i32 786443, metadata !7, i32 812, i32 0, metadata !14, i32 176} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!7 = metadata !{i32 786443, metadata !8, i32 807, i32 0, metadata !14, i32 175} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!8 = metadata !{i32 786443, metadata !9, i32 440, i32 0, metadata !14, i32 94} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!9 = metadata !{i32 786443, metadata !10, i32 435, i32 0, metadata !14, i32 91} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!10 = metadata !{i32 786443, metadata !11, i32 434, i32 0, metadata !14, i32 90} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!11 = metadata !{i32 786443, metadata !12, i32 250, i32 0, metadata !14, i32 24} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!12 = metadata !{i32 786443, metadata !13, i32 249, i32 0, metadata !14, i32 23} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!13 = metadata !{i32 786443, metadata !3, i32 221, i32 0, metadata !14, i32 19} ; [ DW_TAG_lexical_block ] [MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c] +!14 = metadata !{i32 786473, metadata !19} ; [ DW_TAG_file_type ] +!15 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 160, i64 8, i32 0, i32 0, metadata !16, metadata !17, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 160, align 8, offset 0] [from char] +!16 = metadata !{i32 786468, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char] +!17 = metadata !{metadata !18} +!18 = metadata !{i32 786465, i64 0, i64 20} ; [ DW_TAG_subrange_type ] [0, 19] +!19 = metadata !{metadata !"MultiSource/Benchmarks/MiBench/consumer-typeset/z19.c", metadata !"MultiSource/Benchmarks/MiBench/consumer-typeset"} + +; Test DebugValue uses visited by RegisterPressureTracker findUseBetween(). +; +; CHECK: @main +; CHECK: DEBUG_VALUE: X +; CHECK: call + +%"class.__gnu_cxx::hash_map" = type { %"class.__gnu_cxx::hashtable" } +%"class.__gnu_cxx::hashtable" = type { i64, i64, i64, i64, i64, i64 } + +define void @main() uwtable ssp { +entry: + %X = alloca %"class.__gnu_cxx::hash_map", align 8 + br i1 undef, label %cond.true, label %cond.end + +cond.true: ; preds = %entry + unreachable + +cond.end: ; preds = %entry + call void @llvm.dbg.declare(metadata !{%"class.__gnu_cxx::hash_map"* %X}, metadata !31) + %_M_num_elements.i.i.i.i = getelementptr inbounds %"class.__gnu_cxx::hash_map"* %X, i64 0, i32 0, i32 5 + invoke void @_Znwm() + to label %exit.i unwind label %lpad2.i.i.i.i + +exit.i: ; preds = %cond.end + unreachable + +lpad2.i.i.i.i: ; preds = %cond.end + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup + br i1 undef, label %lpad.body.i.i, label %if.then.i.i.i.i.i.i.i.i + +if.then.i.i.i.i.i.i.i.i: ; preds = %lpad2.i.i.i.i + unreachable + +lpad.body.i.i: ; preds = %lpad2.i.i.i.i + resume { i8*, i32 } %0 +} + +declare i32 @__gxx_personality_v0(...) + +declare void @_Znwm() + +!llvm.dbg.cu = !{!30} + +!30 = metadata !{i32 786449, i32 0, i32 4, metadata !"SingleSource/Benchmarks/Shootout-C++/hash.cpp", metadata !"SingleSource/Benchmarks/Shootout-C++", metadata !"clang version 3.3 (trunk 169129) (llvm/trunk 169135)", i1 true, i1 true, metadata !"", i32 0, null, null, null, null} ; [ DW_TAG_compile_unit ] [SingleSource/Benchmarks/Shootout-C++/hash.cpp] [DW_LANG_C_plus_plus] +!31 = metadata !{i32 786688, null, metadata !"X", null, i32 29, metadata !32, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [X] [line 29] +!32 = metadata !{i32 786454, metadata !34, null, metadata !"HM", i32 28, i64 0, i64 0, i64 0, i32 0, null} ; [ DW_TAG_typedef ] [HM] [line 28, size 0, align 0, offset 0] [from ] +!33 = metadata !{i32 786473, metadata !34} ; [ DW_TAG_file_type ] +!34 = metadata !{metadata !"SingleSource/Benchmarks/Shootout-C++/hash.cpp", metadata !"SingleSource/Benchmarks/Shootout-C++"} diff --git a/test/CodeGen/X86/2012-11-30-regpres-dbg.ll b/test/CodeGen/X86/2012-11-30-regpres-dbg.ll new file mode 100644 index 000000000000..df93c5647d95 --- /dev/null +++ b/test/CodeGen/X86/2012-11-30-regpres-dbg.ll @@ -0,0 +1,44 @@ +; RUN: llc < %s -mtriple=x86_64-apple-macosx -enable-misched \ +; RUN: -verify-machineinstrs | FileCheck %s +; +; Test RegisterPressure handling of DBG_VALUE. +; +; CHECK: %entry +; CHECK: DEBUG_VALUE: callback +; CHECK: ret + +%struct.btCompoundLeafCallback = type { i32, i32 } + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +define void @test() unnamed_addr uwtable ssp align 2 { +entry: + %callback = alloca %struct.btCompoundLeafCallback, align 8 + br i1 undef, label %if.end, label %if.then + +if.then: ; preds = %entry + unreachable + +if.end: ; preds = %entry + call void @llvm.dbg.declare(metadata !{%struct.btCompoundLeafCallback* %callback}, metadata !3) + %m = getelementptr inbounds %struct.btCompoundLeafCallback* %callback, i64 0, i32 1 + store i32 0, i32* undef, align 8 + %cmp12447 = icmp sgt i32 undef, 0 + br i1 %cmp12447, label %for.body.lr.ph, label %invoke.cont44 + +for.body.lr.ph: ; preds = %if.end + unreachable + +invoke.cont44: ; preds = %if.end + ret void +} + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"MultiSource/Benchmarks/Bullet/btCompoundCollisionAlgorithm.cpp", metadata !"MultiSource/Benchmarks/Bullet", metadata !"clang version 3.3 (trunk 168984) (llvm/trunk 168983)", i1 true, i1 true, metadata !"", i32 0, metadata !1, null, null, null} ; [ DW_TAG_compile_unit ] [MultiSource/Benchmarks/Bullet/MultiSource/Benchmarks/Bullet/btCompoundCollisionAlgorithm.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !2} +!2 = metadata !{null, null} +!3 = metadata !{i32 786688, null, metadata !"callback", null, i32 214, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [callback] [line 214] +!4 = metadata !{i32 786451, metadata !6, null, metadata !"btCompoundLeafCallback", i32 90, i64 512, i64 64, i32 0, i32 0, null, null, i32 0, null, null} ; [ DW_TAG_structure_type ] [btCompoundLeafCallback] [line 90, size 512, align 64, offset 0] [from ] +!5 = metadata !{i32 786473, metadata !6} ; [ DW_TAG_file_type ] +!6 = metadata !{metadata !"MultiSource/Benchmarks/Bullet/btCompoundCollisionAlgorithm.cpp", metadata !"MultiSource/Benchmarks/Bullet"} diff --git a/test/CodeGen/X86/2012-12-06-python27-miscompile.ll b/test/CodeGen/X86/2012-12-06-python27-miscompile.ll new file mode 100644 index 000000000000..d9effc92fa92 --- /dev/null +++ b/test/CodeGen/X86/2012-12-06-python27-miscompile.ll @@ -0,0 +1,23 @@ +; RUN: llc < %s -march=x86 -mcpu=corei7 -mtriple=i686-pc-win32 | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +; Make sure that we are zeroing one memory location at a time using xorl and +; not both using XMM registers. + +;CHECK: @foo +;CHECK: xorl +;CHECK-NOT: xmm +;CHECK: ret +define i32 @foo (i64* %so) nounwind uwtable ssp { +entry: + %used = getelementptr inbounds i64* %so, i32 3 + store i64 0, i64* %used, align 8 + %fill = getelementptr inbounds i64* %so, i32 2 + %L = load i64* %fill, align 8 + store i64 0, i64* %fill, align 8 + %cmp28 = icmp sgt i64 %L, 0 + %R = sext i1 %cmp28 to i32 + ret i32 %R +} diff --git a/test/CodeGen/X86/2012-12-1-merge-multiple.ll b/test/CodeGen/X86/2012-12-1-merge-multiple.ll new file mode 100644 index 000000000000..5931c3d27be1 --- /dev/null +++ b/test/CodeGen/X86/2012-12-1-merge-multiple.ll @@ -0,0 +1,31 @@ +; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mtriple=x86_64-pc-win64 | FileCheck %s + +; CHECK: multiple_stores_on_chain +; CHECK: movabsq +; CHECK: movq +; CHECK: movabsq +; CHECK: movq +; CHECK: ret +define void @multiple_stores_on_chain(i16 * %A) { +entry: + %a0 = getelementptr inbounds i16* %A, i64 0 + %a1 = getelementptr inbounds i16* %A, i64 1 + %a2 = getelementptr inbounds i16* %A, i64 2 + %a3 = getelementptr inbounds i16* %A, i64 3 + %a4 = getelementptr inbounds i16* %A, i64 4 + %a5 = getelementptr inbounds i16* %A, i64 5 + %a6 = getelementptr inbounds i16* %A, i64 6 + %a7 = getelementptr inbounds i16* %A, i64 7 + + store i16 0, i16* %a0 + store i16 1, i16* %a1 + store i16 2, i16* %a2 + store i16 3, i16* %a3 + store i16 4, i16* %a4 + store i16 5, i16* %a5 + store i16 6, i16* %a6 + store i16 7, i16* %a7 + + ret void +} + diff --git a/test/CodeGen/X86/2012-12-12-DAGCombineCrash.ll b/test/CodeGen/X86/2012-12-12-DAGCombineCrash.ll new file mode 100644 index 000000000000..8cef2c8201c6 --- /dev/null +++ b/test/CodeGen/X86/2012-12-12-DAGCombineCrash.ll @@ -0,0 +1,46 @@ +; RUN: llc -march=x86 -mtriple=i686-apple-ios -mcpu=yonah < %s +; rdar://12868039 + +define void @t() nounwind ssp { + %1 = alloca i32 + %2 = ptrtoint i32* %1 to i32 + br label %3 + +; <label>:3 ; preds = %5, %3, %0 + switch i32 undef, label %3 [ + i32 611946160, label %5 + i32 954117870, label %4 + ] + +; <label>:4 ; preds = %3 + ret void + +; <label>:5 ; preds = %5, %3 + %6 = add i32 0, 148 + %7 = and i32 %6, 48 + %8 = add i32 %7, 0 + %9 = or i32 %2, %8 + %10 = xor i32 -1, %2 + %11 = or i32 %8, %10 + %12 = or i32 %9, %11 + %13 = xor i32 %9, %11 + %14 = sub i32 %12, %13 + %15 = xor i32 2044674005, %14 + %16 = xor i32 %15, 0 + %17 = shl nuw nsw i32 %16, 1 + %18 = sub i32 0, %17 + %19 = and i32 %18, 2051242402 + %20 = sub i32 0, %19 + %21 = xor i32 %20, 0 + %22 = xor i32 %21, 0 + %23 = add i32 0, %22 + %24 = shl i32 %23, 1 + %25 = or i32 1, %24 + %26 = add i32 0, %25 + %27 = trunc i32 %26 to i8 + %28 = xor i8 %27, 125 + %29 = add i8 %28, -16 + %30 = add i8 0, %29 + store i8 %30, i8* null + br i1 undef, label %5, label %3 +} diff --git a/test/CodeGen/X86/2012-12-14-v8fp80-crash.ll b/test/CodeGen/X86/2012-12-14-v8fp80-crash.ll new file mode 100644 index 000000000000..c465527bd867 --- /dev/null +++ b/test/CodeGen/X86/2012-12-14-v8fp80-crash.ll @@ -0,0 +1,22 @@ +; RUN: llc < %s -march=x86 -mcpu=corei7 -mtriple=i686-pc-win32 + +; Make sure we don't crash on this testcase. + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +define void @_ZN6VectorIfE3equIeEEvfRKS_IT_E() nounwind uwtable ssp align 2 { +entry: + br i1 undef, label %while.end, label %while.body.lr.ph + +while.body.lr.ph: ; preds = %entry + br label %vector.body + +vector.body: ; preds = %vector.body, %while.body.lr.ph + %0 = fptrunc <8 x x86_fp80> undef to <8 x float> + store <8 x float> %0, <8 x float>* undef, align 4 + br label %vector.body + +while.end: ; preds = %entry + ret void +} diff --git a/test/CodeGen/X86/2012-12-19-NoImplicitFloat.ll b/test/CodeGen/X86/2012-12-19-NoImplicitFloat.ll new file mode 100644 index 000000000000..302566520671 --- /dev/null +++ b/test/CodeGen/X86/2012-12-19-NoImplicitFloat.ll @@ -0,0 +1,17 @@ +; RUN: llc -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core2 < %s | FileCheck %s +; Test that we do not introduce vector operations with noimplicitfloat. +; rdar://12879313 + +%struct1 = type { i32*, i32* } + +define void @test() nounwind noimplicitfloat { +entry: +; CHECK-NOT: xmm +; CHECK: ret + %0 = load %struct1** undef, align 8 + %1 = getelementptr inbounds %struct1* %0, i64 0, i32 0 + store i32* null, i32** %1, align 8 + %2 = getelementptr inbounds %struct1* %0, i64 0, i32 1 + store i32* null, i32** %2, align 8 + ret void +} diff --git a/test/CodeGen/X86/2013-01-09-DAGCombineBug.ll b/test/CodeGen/X86/2013-01-09-DAGCombineBug.ll new file mode 100644 index 000000000000..1b417e54a2f7 --- /dev/null +++ b/test/CodeGen/X86/2013-01-09-DAGCombineBug.ll @@ -0,0 +1,74 @@ +; RUN: llc -mtriple=x86_64-apple-macosx10.5.0 < %s + +; rdar://12968664 + +define void @t() nounwind uwtable ssp { + br label %4 + +; <label>:1 ; preds = %4, %2 + ret void + +; <label>:2 ; preds = %6, %5, %3, %2 + switch i32 undef, label %2 [ + i32 1090573978, label %1 + i32 1090573938, label %3 + i32 1090573957, label %5 + ] + +; <label>:3 ; preds = %4, %2 + br i1 undef, label %2, label %4 + +; <label>:4 ; preds = %6, %5, %3, %0 + switch i32 undef, label %11 [ + i32 1090573938, label %3 + i32 1090573957, label %5 + i32 1090573978, label %1 + i32 165205179, label %6 + ] + +; <label>:5 ; preds = %4, %2 + br i1 undef, label %2, label %4 + +; <label>:6 ; preds = %4 + %7 = icmp eq i32 undef, 590901838 + %8 = or i1 false, %7 + %9 = or i1 true, %8 + %10 = xor i1 %8, %9 + br i1 %10, label %4, label %2 + +; <label>:11 ; preds = %11, %4 + br label %11 +} + +; PR15608 +@global = external constant [2 x i8] + +define void @PR15608() { +bb: + br label %bb3 + +bb1: ; No predecessors! + br i1 icmp ult (i64 xor (i64 zext (i1 trunc (i192 lshr (i192 or (i192 shl (i192 zext (i64 trunc (i128 lshr (i128 trunc (i384 lshr (i384 or (i384 shl (i384 zext (i64 ptrtoint ([2 x i8]* @global to i64) to i384), i384 192), i384 425269881901436522087161771558896140289), i384 128) to i128), i128 64) to i64) to i192), i192 64), i192 1), i192 128) to i1) to i64), i64 1), i64 1), label %bb2, label %bb3 + +bb2: ; preds = %bb1 + unreachable + +bb3: ; preds = %bb1, %bb + br i1 xor (i1 trunc (i192 lshr (i192 or (i192 shl (i192 zext (i64 trunc (i128 lshr (i128 trunc (i384 lshr (i384 or (i384 shl (i384 zext (i64 ptrtoint ([2 x i8]* @global to i64) to i384), i384 192), i384 425269881901436522087161771558896140289), i384 128) to i128), i128 64) to i64) to i192), i192 64), i192 1), i192 128) to i1), i1 trunc (i192 lshr (i192 or (i192 and (i192 or (i192 shl (i192 zext (i64 trunc (i128 lshr (i128 trunc (i384 lshr (i384 or (i384 shl (i384 zext (i64 ptrtoint ([2 x i8]* @global to i64) to i384), i384 192), i384 425269881901436522087161771558896140289), i384 128) to i128), i128 64) to i64) to i192), i192 64), i192 1), i192 -340282366920938463463374607431768211457), i192 shl (i192 zext (i1 trunc (i192 lshr (i192 or (i192 shl (i192 zext (i64 trunc (i128 lshr (i128 trunc (i384 lshr (i384 or (i384 shl (i384 zext (i64 ptrtoint ([2 x i8]* @global to i64) to i384), i384 192), i384 425269881901436522087161771558896140289), i384 128) to i128), i128 64) to i64) to i192), i192 64), i192 1), i192 128) to i1) to i192), i192 128)), i192 128) to i1)), label %bb7, label %bb4 + +bb4: ; preds = %bb6, %bb3 + %tmp = phi i1 [ true, %bb6 ], [ trunc (i192 lshr (i192 or (i192 and (i192 or (i192 shl (i192 zext (i64 trunc (i128 lshr (i128 trunc (i384 lshr (i384 or (i384 shl (i384 zext (i64 ptrtoint ([2 x i8]* @global to i64) to i384), i384 192), i384 425269881901436522087161771558896140289), i384 128) to i128), i128 64) to i64) to i192), i192 64), i192 1), i192 -340282366920938463463374607431768211457), i192 shl (i192 zext (i1 trunc (i192 lshr (i192 or (i192 shl (i192 zext (i64 trunc (i128 lshr (i128 trunc (i384 lshr (i384 or (i384 shl (i384 zext (i64 ptrtoint ([2 x i8]* @global to i64) to i384), i384 192), i384 425269881901436522087161771558896140289), i384 128) to i128), i128 64) to i64) to i192), i192 64), i192 1), i192 128) to i1) to i192), i192 128)), i192 128) to i1), %bb3 ] + br i1 false, label %bb8, label %bb5 + +bb5: ; preds = %bb4 + br i1 %tmp, label %bb8, label %bb6 + +bb6: ; preds = %bb5 + br i1 false, label %bb8, label %bb4 + +bb7: ; preds = %bb3 + unreachable + +bb8: ; preds = %bb6, %bb5, %bb4 + unreachable +} diff --git a/test/CodeGen/X86/2013-02-12-ShuffleToZext.ll b/test/CodeGen/X86/2013-02-12-ShuffleToZext.ll new file mode 100644 index 000000000000..614ccda5e250 --- /dev/null +++ b/test/CodeGen/X86/2013-02-12-ShuffleToZext.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -mtriple=x86_64-pc-win32 | FileCheck %s + +; CHECK: test +; CHECK: vpmovzxwd +; CHECK: vpmovzxwd +define void @test(<4 x i64> %a, <4 x i16>* %buf) { + %ex1 = extractelement <4 x i64> %a, i32 0 + %ex2 = extractelement <4 x i64> %a, i32 1 + %x1 = bitcast i64 %ex1 to <4 x i16> + %x2 = bitcast i64 %ex2 to <4 x i16> + %Sh = shufflevector <4 x i16> %x1, <4 x i16> %x2, <4 x i32> <i32 0, i32 1, i32 4, i32 5> + store <4 x i16> %Sh, <4 x i16>* %buf, align 1 + ret void +} diff --git a/test/CodeGen/X86/2013-03-13-VEX-DestReg.ll b/test/CodeGen/X86/2013-03-13-VEX-DestReg.ll new file mode 100644 index 000000000000..03b6bdeafa87 --- /dev/null +++ b/test/CodeGen/X86/2013-03-13-VEX-DestReg.ll @@ -0,0 +1,31 @@ +; RUN: llc < %s -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core-avx-i -show-mc-encoding + +; ModuleID = 'bugpoint-reduced-simplified.bc' +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@b = external global [8 x float], align 32 +@e = external global [8 x float], align 16 + +define void @main() #0 { +entry: + %0 = load <8 x float>* bitcast ([8 x float]* @b to <8 x float>*), align 32, !tbaa !0 + %bitcast.i = extractelement <8 x float> %0, i32 0 + %vecinit.i.i = insertelement <4 x float> undef, float %bitcast.i, i32 0 + %vecinit2.i.i = insertelement <4 x float> %vecinit.i.i, float 0.000000e+00, i32 1 + %vecinit3.i.i = insertelement <4 x float> %vecinit2.i.i, float 0.000000e+00, i32 2 + %vecinit4.i.i = insertelement <4 x float> %vecinit3.i.i, float 0.000000e+00, i32 3 + %1 = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %vecinit4.i.i) #2 + %vecext.i.i = extractelement <4 x float> %1, i32 0 + store float %vecext.i.i, float* getelementptr inbounds ([8 x float]* @e, i64 0, i64 0), align 16, !tbaa !0 + unreachable +} + +declare <4 x float> @llvm.x86.sse.rcp.ss(<4 x float>) #1 + +attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } +attributes #2 = { nounwind } + +!0 = metadata !{metadata !"omnipotent char", metadata !1} +!1 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/X86/Atomics-64.ll b/test/CodeGen/X86/Atomics-64.ll index 8e93762cec17..8b0a349a8be3 100644 --- a/test/CodeGen/X86/Atomics-64.ll +++ b/test/CodeGen/X86/Atomics-64.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -march=x86-64 > %t -; RUN: llc < %s -march=x86 > %t +; RUN: llc < %s -march=x86-64 > %t.x86-64 +; RUN: llc < %s -march=x86 > %t.x86 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" target triple = "x86_64-apple-darwin8" diff --git a/test/CodeGen/X86/DbgValueOtherTargets.test b/test/CodeGen/X86/DbgValueOtherTargets.test new file mode 100644 index 000000000000..7b4d431c93b1 --- /dev/null +++ b/test/CodeGen/X86/DbgValueOtherTargets.test @@ -0,0 +1,2 @@ +RUN: llc -O0 -march=x86 -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll +RUN: llc -O0 -march=x86-64 -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/X86/GC/erlang-gc.ll b/test/CodeGen/X86/GC/erlang-gc.ll new file mode 100644 index 000000000000..c55b7f6dcf61 --- /dev/null +++ b/test/CodeGen/X86/GC/erlang-gc.ll @@ -0,0 +1,25 @@ +; RUN: llc -mtriple=x86_64-linux-gnu < %s | FileCheck %s --check-prefix=CHECK64 +; RUN: llc -mtriple=i686-linux-gnu < %s | FileCheck %s --check-prefix=CHECK32 + +define i32 @main(i32 %x) nounwind gc "erlang" { + %puts = tail call i32 @foo(i32 %x) + ret i32 0 + +; CHECK64: .section .note.gc,"",@progbits +; CHECK64-NEXT: .align 8 +; CHECK64-NEXT: .short 1 # safe point count +; CHECK64-NEXT: .long .Ltmp0 # safe point address +; CHECK64-NEXT: .short 1 # stack frame size (in words) +; CHECK64-NEXT: .short 0 # stack arity +; CHECK64-NEXT: .short 0 # live root count + +; CHECK32: .section .note.gc,"",@progbits +; CHECK32-NEXT: .align 4 +; CHECK32-NEXT: .short 1 # safe point count +; CHECK32-NEXT: .long .Ltmp0 # safe point address +; CHECK32-NEXT: .short 3 # stack frame size (in words) +; CHECK32-NEXT: .short 0 # stack arity +; CHECK32-NEXT: .short 0 # live root count +} + +declare i32 @foo(i32) diff --git a/test/CodeGen/X86/GC/ocaml-gc.ll b/test/CodeGen/X86/GC/ocaml-gc.ll new file mode 100644 index 000000000000..44241a90d0e7 --- /dev/null +++ b/test/CodeGen/X86/GC/ocaml-gc.ll @@ -0,0 +1,31 @@ +; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s + +define i32 @main(i32 %x) nounwind gc "ocaml" { +; CHECK: .text +; CHECK-NEXT: .globl caml_3C_stdin_3E___code_begin +; CHECK-NEXT: caml_3C_stdin_3E___code_begin: +; CHECK-NEXT: .data +; CHECK-NEXT: .globl caml_3C_stdin_3E___data_begin +; CHECK-NEXT: caml_3C_stdin_3E___data_begin: + + %puts = tail call i32 @foo(i32 %x) + ret i32 0 + +; CHECK: .globl caml_3C_stdin_3E___code_end +; CHECK-NEXT: caml_3C_stdin_3E___code_end: +; CHECK-NEXT: .data +; CHECK-NEXT: .globl caml_3C_stdin_3E___data_end +; CHECK-NEXT: caml_3C_stdin_3E___data_end: +; CHECK-NEXT: .quad 0 +; CHECK-NEXT: .globl caml_3C_stdin_3E___frametable +; CHECK-NEXT: caml_3C_stdin_3E___frametable: +; CHECK-NEXT: .short 1 +; CHECK-NEXT: .align 8 +; CHECK-NEXT: # live roots for main +; CHECK-NEXT: .quad .Ltmp0 +; CHECK-NEXT: .short 8 +; CHECK-NEXT: .short 0 +; CHECK-NEXT: .align 8 +} + +declare i32 @foo(i32) diff --git a/test/CodeGen/X86/MachineSink-DbgValue.ll b/test/CodeGen/X86/MachineSink-DbgValue.ll index ea791a3c083c..227ef3466e0a 100644 --- a/test/CodeGen/X86/MachineSink-DbgValue.ll +++ b/test/CodeGen/X86/MachineSink-DbgValue.ll @@ -26,24 +26,25 @@ bb2: declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!llvm.dbg.sp = !{!1} -!llvm.dbg.lv.foo = !{!6, !7, !10} -!0 = metadata !{i32 589841, i32 0, i32 12, metadata !"a.c", metadata !"/private/tmp", metadata !"Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"", metadata !2, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i32*)* @foo, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"a.c", metadata !"/private/tmp", metadata !0} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589845, 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 ] +!0 = metadata !{i32 786449, metadata !20, i32 12, metadata !"Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)", i1 true, metadata !"", i32 0, null, null, metadata !18, null, null} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"", metadata !2, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i32*)* @foo, null, null, metadata !19, i32 0} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !20} ; [ 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 589860, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 590081, metadata !1, metadata !"i", metadata !2, i32 16777218, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!7 = metadata !{i32 590081, metadata !1, metadata !"c", metadata !2, i32 33554434, metadata !8, i32 0} ; [ DW_TAG_arg_variable ] -!8 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] -!9 = metadata !{i32 589860, metadata !0, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!10 = metadata !{i32 590080, metadata !11, metadata !"a", metadata !2, i32 3, metadata !9, i32 0} ; [ DW_TAG_auto_variable ] -!11 = metadata !{i32 589835, metadata !1, i32 2, i32 25, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] +!5 = metadata !{i32 786468, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786689, metadata !1, metadata !"i", metadata !2, i32 16777218, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!7 = metadata !{i32 786689, metadata !1, metadata !"c", metadata !2, i32 33554434, metadata !8, i32 0, null} ; [ DW_TAG_arg_variable ] +!8 = metadata !{i32 786447, metadata !0, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] +!9 = metadata !{i32 786468, metadata !0, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!10 = metadata !{i32 786688, metadata !11, metadata !"a", metadata !2, i32 3, metadata !9, i32 0, null} ; [ DW_TAG_auto_variable ] +!11 = metadata !{i32 786443, metadata !20, metadata !1, i32 2, i32 25, i32 0} ; [ DW_TAG_lexical_block ] !12 = metadata !{i32 2, i32 13, metadata !1, null} !13 = metadata !{i32 2, i32 22, metadata !1, null} !14 = metadata !{i32 3, i32 14, metadata !11, null} !15 = metadata !{i32 4, i32 3, metadata !11, null} !16 = metadata !{i32 5, i32 5, metadata !11, null} !17 = metadata !{i32 7, i32 1, metadata !11, null} +!18 = metadata !{metadata !1} +!19 = metadata !{metadata !6, metadata !7, metadata !10} +!20 = metadata !{metadata !"a.c", metadata !"/private/tmp"} diff --git a/test/CodeGen/X86/MachineSink-PHIUse.ll b/test/CodeGen/X86/MachineSink-PHIUse.ll index 33141680aa92..1329200c3e6e 100644 --- a/test/CodeGen/X86/MachineSink-PHIUse.ll +++ b/test/CodeGen/X86/MachineSink-PHIUse.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=x86_64-appel-darwin -disable-cgp-branch-opts -stats 2>&1 | grep "machine-sink" define fastcc void @t() nounwind ssp { diff --git a/test/CodeGen/X86/MergeConsecutiveStores.ll b/test/CodeGen/X86/MergeConsecutiveStores.ll index 64825bac9719..bb227a0185df 100644 --- a/test/CodeGen/X86/MergeConsecutiveStores.ll +++ b/test/CodeGen/X86/MergeConsecutiveStores.ll @@ -40,9 +40,43 @@ define void @merge_const_store(i32 %count, %struct.A* nocapture %p) nounwind uwt ret void } +; No vectors because we use noimplicitfloat +; CHECK: merge_const_store_no_vec +; CHECK-NOT: vmovups +; CHECK: ret +define void @merge_const_store_no_vec(i32 %count, %struct.B* nocapture %p) noimplicitfloat{ + %1 = icmp sgt i32 %count, 0 + br i1 %1, label %.lr.ph, label %._crit_edge +.lr.ph: + %i.02 = phi i32 [ %10, %.lr.ph ], [ 0, %0 ] + %.01 = phi %struct.B* [ %11, %.lr.ph ], [ %p, %0 ] + %2 = getelementptr inbounds %struct.B* %.01, i64 0, i32 0 + store i32 0, i32* %2, align 4 + %3 = getelementptr inbounds %struct.B* %.01, i64 0, i32 1 + store i32 0, i32* %3, align 4 + %4 = getelementptr inbounds %struct.B* %.01, i64 0, i32 2 + store i32 0, i32* %4, align 4 + %5 = getelementptr inbounds %struct.B* %.01, i64 0, i32 3 + store i32 0, i32* %5, align 4 + %6 = getelementptr inbounds %struct.B* %.01, i64 0, i32 4 + store i32 0, i32* %6, align 4 + %7 = getelementptr inbounds %struct.B* %.01, i64 0, i32 5 + store i32 0, i32* %7, align 4 + %8 = getelementptr inbounds %struct.B* %.01, i64 0, i32 6 + store i32 0, i32* %8, align 4 + %9 = getelementptr inbounds %struct.B* %.01, i64 0, i32 7 + store i32 0, i32* %9, align 4 + %10 = add nsw i32 %i.02, 1 + %11 = getelementptr inbounds %struct.B* %.01, i64 1 + %exitcond = icmp eq i32 %10, %count + br i1 %exitcond, label %._crit_edge, label %.lr.ph +._crit_edge: + ret void +} + ; Move the constants using a single vector store. ; CHECK: merge_const_store_vec -; CHECK: vmovups %ymm0, (%rsi) +; CHECK: vmovups ; CHECK: ret define void @merge_const_store_vec(i32 %count, %struct.B* nocapture %p) nounwind uwtable noinline ssp { %1 = icmp sgt i32 %count, 0 @@ -303,3 +337,99 @@ block4: ; preds = %4, %.lr.ph ret void } +; Make sure that we merge the consecutive load/store sequence below and use a +; word (16 bit) instead of a byte copy. +; CHECK: MergeLoadStoreBaseIndexOffset +; CHECK: movw (%{{.*}},%{{.*}}), [[REG:%[a-z]+]] +; CHECK: movw [[REG]], (%{{.*}}) +define void @MergeLoadStoreBaseIndexOffset(i64* %a, i8* %b, i8* %c, i32 %n) { + br label %1 + +; <label>:1 + %.09 = phi i32 [ %n, %0 ], [ %11, %1 ] + %.08 = phi i8* [ %b, %0 ], [ %10, %1 ] + %.0 = phi i64* [ %a, %0 ], [ %2, %1 ] + %2 = getelementptr inbounds i64* %.0, i64 1 + %3 = load i64* %.0, align 1 + %4 = getelementptr inbounds i8* %c, i64 %3 + %5 = load i8* %4, align 1 + %6 = add i64 %3, 1 + %7 = getelementptr inbounds i8* %c, i64 %6 + %8 = load i8* %7, align 1 + store i8 %5, i8* %.08, align 1 + %9 = getelementptr inbounds i8* %.08, i64 1 + store i8 %8, i8* %9, align 1 + %10 = getelementptr inbounds i8* %.08, i64 2 + %11 = add nsw i32 %.09, -1 + %12 = icmp eq i32 %11, 0 + br i1 %12, label %13, label %1 + +; <label>:13 + ret void +} + +; Make sure that we merge the consecutive load/store sequence below and use a +; word (16 bit) instead of a byte copy even if there are intermediate sign +; extensions. +; CHECK: MergeLoadStoreBaseIndexOffsetSext +; CHECK: movw (%{{.*}},%{{.*}}), [[REG:%[a-z]+]] +; CHECK: movw [[REG]], (%{{.*}}) +define void @MergeLoadStoreBaseIndexOffsetSext(i8* %a, i8* %b, i8* %c, i32 %n) { + br label %1 + +; <label>:1 + %.09 = phi i32 [ %n, %0 ], [ %12, %1 ] + %.08 = phi i8* [ %b, %0 ], [ %11, %1 ] + %.0 = phi i8* [ %a, %0 ], [ %2, %1 ] + %2 = getelementptr inbounds i8* %.0, i64 1 + %3 = load i8* %.0, align 1 + %4 = sext i8 %3 to i64 + %5 = getelementptr inbounds i8* %c, i64 %4 + %6 = load i8* %5, align 1 + %7 = add i64 %4, 1 + %8 = getelementptr inbounds i8* %c, i64 %7 + %9 = load i8* %8, align 1 + store i8 %6, i8* %.08, align 1 + %10 = getelementptr inbounds i8* %.08, i64 1 + store i8 %9, i8* %10, align 1 + %11 = getelementptr inbounds i8* %.08, i64 2 + %12 = add nsw i32 %.09, -1 + %13 = icmp eq i32 %12, 0 + br i1 %13, label %14, label %1 + +; <label>:14 + ret void +} + +; However, we can only merge ignore sign extensions when they are on all memory +; computations; +; CHECK: loadStoreBaseIndexOffsetSextNoSex +; CHECK-NOT: movw (%{{.*}},%{{.*}}), [[REG:%[a-z]+]] +; CHECK-NOT: movw [[REG]], (%{{.*}}) +define void @loadStoreBaseIndexOffsetSextNoSex(i8* %a, i8* %b, i8* %c, i32 %n) { + br label %1 + +; <label>:1 + %.09 = phi i32 [ %n, %0 ], [ %12, %1 ] + %.08 = phi i8* [ %b, %0 ], [ %11, %1 ] + %.0 = phi i8* [ %a, %0 ], [ %2, %1 ] + %2 = getelementptr inbounds i8* %.0, i64 1 + %3 = load i8* %.0, align 1 + %4 = sext i8 %3 to i64 + %5 = getelementptr inbounds i8* %c, i64 %4 + %6 = load i8* %5, align 1 + %7 = add i8 %3, 1 + %wrap.4 = sext i8 %7 to i64 + %8 = getelementptr inbounds i8* %c, i64 %wrap.4 + %9 = load i8* %8, align 1 + store i8 %6, i8* %.08, align 1 + %10 = getelementptr inbounds i8* %.08, i64 1 + store i8 %9, i8* %10, align 1 + %11 = getelementptr inbounds i8* %.08, i64 2 + %12 = add nsw i32 %.09, -1 + %13 = icmp eq i32 %12, 0 + br i1 %13, label %14, label %1 + +; <label>:14 + ret void +} diff --git a/test/CodeGen/X86/WidenArith.ll b/test/CodeGen/X86/WidenArith.ll new file mode 100644 index 000000000000..0383bd665b0f --- /dev/null +++ b/test/CodeGen/X86/WidenArith.ll @@ -0,0 +1,23 @@ +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx | FileCheck %s + +;CHECK: test +;CHECK: vaddps +;CHECK: vmulps +;CHECK: vsubps +;CHECK: vcmpltps +;CHECK: vcmpltps +;CHECK: vandps +;CHECK: vandps +;CHECK: ret +define <8 x i32> @test(<8 x float> %a, <8 x float> %b) { + %c1 = fadd <8 x float> %a, %b + %b1 = fmul <8 x float> %b, %a + %d = fsub <8 x float> %b1, %c1 + %res1 = fcmp olt <8 x float> %a, %b1 + %res2 = fcmp olt <8 x float> %c1, %d + %andr = and <8 x i1>%res1, %res2 + %ex = zext <8 x i1> %andr to <8 x i32> + ret <8 x i32>%ex +} + + diff --git a/test/CodeGen/X86/atom-bypass-slow-division-64.ll b/test/CodeGen/X86/atom-bypass-slow-division-64.ll new file mode 100644 index 000000000000..a3bbea3c996b --- /dev/null +++ b/test/CodeGen/X86/atom-bypass-slow-division-64.ll @@ -0,0 +1,46 @@ +; RUN: llc < %s -mcpu=atom -mtriple=i686-linux -march=x86-64 | FileCheck %s + +; Additional tests for 64-bit divide bypass + +define i64 @Test_get_quotient(i64 %a, i64 %b) nounwind { +; CHECK: Test_get_quotient: +; CHECK: orq %rsi, %rcx +; CHECK-NEXT: testq $-65536, %rcx +; CHECK-NEXT: je +; CHECK: idivq +; CHECK: ret +; CHECK: divw +; CHECK: ret + %result = sdiv i64 %a, %b + ret i64 %result +} + +define i64 @Test_get_remainder(i64 %a, i64 %b) nounwind { +; CHECK: Test_get_remainder: +; CHECK: orq %rsi, %rcx +; CHECK-NEXT: testq $-65536, %rcx +; CHECK-NEXT: je +; CHECK: idivq +; CHECK: ret +; CHECK: divw +; CHECK: ret + %result = srem i64 %a, %b + ret i64 %result +} + +define i64 @Test_get_quotient_and_remainder(i64 %a, i64 %b) nounwind { +; CHECK: Test_get_quotient_and_remainder: +; CHECK: orq %rsi, %rcx +; CHECK-NEXT: testq $-65536, %rcx +; CHECK-NEXT: je +; CHECK: idivq +; CHECK: divw +; CHECK: addq +; CHECK: ret +; CHECK-NOT: idivq +; CHECK-NOT: divw + %resultdiv = sdiv i64 %a, %b + %resultrem = srem i64 %a, %b + %result = add i64 %resultdiv, %resultrem + ret i64 %result +} diff --git a/test/CodeGen/X86/atom-bypass-slow-division.ll b/test/CodeGen/X86/atom-bypass-slow-division.ll index e7c9605d3e88..4612940445cb 100644 --- a/test/CodeGen/X86/atom-bypass-slow-division.ll +++ b/test/CodeGen/X86/atom-bypass-slow-division.ll @@ -1,7 +1,7 @@ -; RUN: llc < %s -mcpu=atom -mtriple=i686-linux | FileCheck %s +; RUN: llc < %s -mcpu=atom -mtriple=i686-linux | FileCheck %s -define i32 @test_get_quotient(i32 %a, i32 %b) nounwind { -; CHECK: test_get_quotient +define i32 @Test_get_quotient(i32 %a, i32 %b) nounwind { +; CHECK: Test_get_quotient: ; CHECK: orl %ecx, %edx ; CHECK-NEXT: testl $-256, %edx ; CHECK-NEXT: je @@ -13,8 +13,8 @@ define i32 @test_get_quotient(i32 %a, i32 %b) nounwind { ret i32 %result } -define i32 @test_get_remainder(i32 %a, i32 %b) nounwind { -; CHECK: test_get_remainder +define i32 @Test_get_remainder(i32 %a, i32 %b) nounwind { +; CHECK: Test_get_remainder: ; CHECK: orl %ecx, %edx ; CHECK-NEXT: testl $-256, %edx ; CHECK-NEXT: je @@ -26,8 +26,8 @@ define i32 @test_get_remainder(i32 %a, i32 %b) nounwind { ret i32 %result } -define i32 @test_get_quotient_and_remainder(i32 %a, i32 %b) nounwind { -; CHECK: test_get_quotient_and_remainder +define i32 @Test_get_quotient_and_remainder(i32 %a, i32 %b) nounwind { +; CHECK: Test_get_quotient_and_remainder: ; CHECK: orl %ecx, %edx ; CHECK-NEXT: testl $-256, %edx ; CHECK-NEXT: je @@ -35,7 +35,7 @@ define i32 @test_get_quotient_and_remainder(i32 %a, i32 %b) nounwind { ; CHECK: divb ; CHECK: addl ; CHECK: ret -; CEECK-NOT: idivl +; CHECK-NOT: idivl ; CHECK-NOT: divb %resultdiv = sdiv i32 %a, %b %resultrem = srem i32 %a, %b @@ -43,8 +43,8 @@ define i32 @test_get_quotient_and_remainder(i32 %a, i32 %b) nounwind { ret i32 %result } -define i32 @test_use_div_and_idiv(i32 %a, i32 %b) nounwind { -; CHECK: test_use_div_and_idiv +define i32 @Test_use_div_and_idiv(i32 %a, i32 %b) nounwind { +; CHECK: Test_use_div_and_idiv: ; CHECK: idivl ; CHECK: divb ; CHECK: divl @@ -57,34 +57,34 @@ define i32 @test_use_div_and_idiv(i32 %a, i32 %b) nounwind { ret i32 %result } -define i32 @test_use_div_imm_imm() nounwind { -; CHECK: test_use_div_imm_imm +define i32 @Test_use_div_imm_imm() nounwind { +; CHECK: Test_use_div_imm_imm: ; CHECK: movl $64 %resultdiv = sdiv i32 256, 4 ret i32 %resultdiv } -define i32 @test_use_div_reg_imm(i32 %a) nounwind { -; CHECK: test_use_div_reg_imm -; CEHCK-NOT: test +define i32 @Test_use_div_reg_imm(i32 %a) nounwind { +; CHECK: Test_use_div_reg_imm: +; CHECK-NOT: test ; CHECK-NOT: idiv ; CHECK-NOT: divb %resultdiv = sdiv i32 %a, 33 ret i32 %resultdiv } -define i32 @test_use_rem_reg_imm(i32 %a) nounwind { -; CHECK: test_use_rem_reg_imm -; CEHCK-NOT: test +define i32 @Test_use_rem_reg_imm(i32 %a) nounwind { +; CHECK: Test_use_rem_reg_imm: +; CHECK-NOT: test ; CHECK-NOT: idiv ; CHECK-NOT: divb %resultrem = srem i32 %a, 33 ret i32 %resultrem } -define i32 @test_use_divrem_reg_imm(i32 %a) nounwind { -; CHECK: test_use_divrem_reg_imm -; CEHCK-NOT: test +define i32 @Test_use_divrem_reg_imm(i32 %a) nounwind { +; CHECK: Test_use_divrem_reg_imm: +; CHECK-NOT: test ; CHECK-NOT: idiv ; CHECK-NOT: divb %resultdiv = sdiv i32 %a, 33 @@ -93,8 +93,8 @@ define i32 @test_use_divrem_reg_imm(i32 %a) nounwind { ret i32 %result } -define i32 @test_use_div_imm_reg(i32 %a) nounwind { -; CHECK: test_use_div_imm_reg +define i32 @Test_use_div_imm_reg(i32 %a) nounwind { +; CHECK: Test_use_div_imm_reg: ; CHECK: test ; CHECK: idiv ; CHECK: divb @@ -102,8 +102,8 @@ define i32 @test_use_div_imm_reg(i32 %a) nounwind { ret i32 %resultdiv } -define i32 @test_use_rem_imm_reg(i32 %a) nounwind { -; CHECK: test_use_rem_imm_reg +define i32 @Test_use_rem_imm_reg(i32 %a) nounwind { +; CHECK: Test_use_rem_imm_reg: ; CHECK: test ; CHECK: idiv ; CHECK: divb diff --git a/test/CodeGen/X86/atom-call-reg-indirect-foldedreload32.ll b/test/CodeGen/X86/atom-call-reg-indirect-foldedreload32.ll new file mode 100644 index 000000000000..2a34e0298f30 --- /dev/null +++ b/test/CodeGen/X86/atom-call-reg-indirect-foldedreload32.ll @@ -0,0 +1,77 @@ +; RUN: llc < %s -mtriple=i386-linux-gnu -mcpu=atom 2>&1 | \ +; RUN: grep "calll" | not grep "(" +; RUN: llc < %s -mtriple=i386-linux-gnu -mcpu=core2 2>&1 | \ +; RUN: grep "calll" | grep "*funcp" +; +; original source code built with clang -S -emit-llvm -M32 test32.c: +; +; int a, b, c, d, e, f, g, h, i, j; +; extern int (*funcp)(int, int, int, int, int, int, int, int); +; extern int sum; +; +; void func() +; { +; sum = 0; +; for( i = a; i < b; ++i ) +; { +; sum += (*funcp)(i, b, c, d, e, f, g, h); +; } +; } +; +; ModuleID = 'test32.c' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" +target triple = "i386-unknown-linux-gnu" + +@sum = external global i32 +@a = common global i32 0, align 4 +@i = common global i32 0, align 4 +@b = common global i32 0, align 4 +@funcp = external global i32 (i32, i32, i32, i32, i32, i32, i32, i32)* +@c = common global i32 0, align 4 +@d = common global i32 0, align 4 +@e = common global i32 0, align 4 +@f = common global i32 0, align 4 +@g = common global i32 0, align 4 +@h = common global i32 0, align 4 +@j = common global i32 0, align 4 + +define void @func() #0 { +entry: + store i32 0, i32* @sum, align 4 + %0 = load i32* @a, align 4 + store i32 %0, i32* @i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %1 = load i32* @i, align 4 + %2 = load i32* @b, align 4 + %cmp = icmp slt i32 %1, %2 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %3 = load i32 (i32, i32, i32, i32, i32, i32, i32, i32)** @funcp, align 4 + %4 = load i32* @i, align 4 + %5 = load i32* @b, align 4 + %6 = load i32* @c, align 4 + %7 = load i32* @d, align 4 + %8 = load i32* @e, align 4 + %9 = load i32* @f, align 4 + %10 = load i32* @g, align 4 + %11 = load i32* @h, align 4 + %call = call i32 %3(i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11) + %12 = load i32* @sum, align 4 + %add = add nsw i32 %12, %call + store i32 %add, i32* @sum, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %13 = load i32* @i, align 4 + %inc = add nsw i32 %13, 1 + store i32 %inc, i32* @i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } diff --git a/test/CodeGen/X86/atom-call-reg-indirect-foldedreload64.ll b/test/CodeGen/X86/atom-call-reg-indirect-foldedreload64.ll new file mode 100644 index 000000000000..bcfbd6107a56 --- /dev/null +++ b/test/CodeGen/X86/atom-call-reg-indirect-foldedreload64.ll @@ -0,0 +1,91 @@ +; RUN: llc < %s -mtriple=x86_64-linux-gnu -mcpu=atom 2>&1 | \ +; RUN: grep "callq" | not grep "(" +; RUN: llc < %s -mtriple=x86_64-linux-gnu -mcpu=core2 2>&1 | \ +; RUN: grep "callq" | grep "*funcp" +; +; Original source code built with clang -S -emit-llvm -m64 test64.c: +; int a, b, c, d, e, f, g, h, i, j, k, l, m, n; +; extern int (*funcp)(int, int, int, int, int, int, +; int, int, int, int, int, int, +; int, int); +; extern int sum; +; +; void func() +; { +; sum = 0; +; for( i = a; i < b; ++i ) +; { +; sum += (*funcp)(a, i, i*2, i/b, c, d, e, f, g, h, j, k, l, n); +; } +; } +; +; ModuleID = 'test64.c' +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@sum = external global i32 +@a = common global i32 0, align 4 +@i = common global i32 0, align 4 +@b = common global i32 0, align 4 +@funcp = external global i32 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32)* +@c = common global i32 0, align 4 +@d = common global i32 0, align 4 +@e = common global i32 0, align 4 +@f = common global i32 0, align 4 +@g = common global i32 0, align 4 +@h = common global i32 0, align 4 +@j = common global i32 0, align 4 +@k = common global i32 0, align 4 +@l = common global i32 0, align 4 +@n = common global i32 0, align 4 +@m = common global i32 0, align 4 + +define void @func() #0 { +entry: + store i32 0, i32* @sum, align 4 + %0 = load i32* @a, align 4 + store i32 %0, i32* @i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %1 = load i32* @i, align 4 + %2 = load i32* @b, align 4 + %cmp = icmp slt i32 %1, %2 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %3 = load i32 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32)** @funcp, align 8 + %4 = load i32* @a, align 4 + %5 = load i32* @i, align 4 + %6 = load i32* @i, align 4 + %mul = mul nsw i32 %6, 2 + %7 = load i32* @i, align 4 + %8 = load i32* @b, align 4 + %div = sdiv i32 %7, %8 + %9 = load i32* @c, align 4 + %10 = load i32* @d, align 4 + %11 = load i32* @e, align 4 + %12 = load i32* @f, align 4 + %13 = load i32* @g, align 4 + %14 = load i32* @h, align 4 + %15 = load i32* @j, align 4 + %16 = load i32* @k, align 4 + %17 = load i32* @l, align 4 + %18 = load i32* @n, align 4 + %call = call i32 %3(i32 %4, i32 %5, i32 %mul, i32 %div, i32 %9, i32 %10, i32 %11, i32 %12, i32 %13, i32 %14, i32 %15, i32 %16, i32 %17, i32 %18) + %19 = load i32* @sum, align 4 + %add = add nsw i32 %19, %call + store i32 %add, i32* @sum, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %20 = load i32* @i, align 4 + %inc = add nsw i32 %20, 1 + store i32 %inc, i32* @i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } diff --git a/test/CodeGen/X86/atom-call-reg-indirect.ll b/test/CodeGen/X86/atom-call-reg-indirect.ll new file mode 100644 index 000000000000..632781130d06 --- /dev/null +++ b/test/CodeGen/X86/atom-call-reg-indirect.ll @@ -0,0 +1,45 @@ +; RUN: llc < %s -mcpu=atom -mtriple=i686-linux | FileCheck -check-prefix=ATOM32 %s +; RUN: llc < %s -mcpu=core2 -mtriple=i686-linux | FileCheck -check-prefix=ATOM-NOT32 %s +; RUN: llc < %s -mcpu=atom -mtriple=x86_64-linux | FileCheck -check-prefix=ATOM64 %s +; RUN: llc < %s -mcpu=core2 -mtriple=x86_64-linux | FileCheck -check-prefix=ATOM-NOT64 %s + + +; fn_ptr.ll +%class.A = type { i32 (...)** } + +define i32 @test1() #0 { + ;ATOM: test1 +entry: + %call = tail call %class.A* @_Z3facv() + %0 = bitcast %class.A* %call to void (%class.A*)*** + %vtable = load void (%class.A*)*** %0, align 8 + %1 = load void (%class.A*)** %vtable, align 8 + ;ATOM32: movl (%ecx), %ecx + ;ATOM32: calll *%ecx + ;ATOM-NOT32: calll *(%ecx) + ;ATOM64: movq (%rcx), %rcx + ;ATOM64: callq *%rcx + ;ATOM-NOT64: callq *(%rcx) + tail call void %1(%class.A* %call) + ret i32 0 +} + +declare %class.A* @_Z3facv() #1 + +; virt_fn.ll +@p = external global void (i32)** + +define i32 @test2() #0 { + ;ATOM: test2 +entry: + %0 = load void (i32)*** @p, align 8 + %1 = load void (i32)** %0, align 8 + ;ATOM32: movl (%eax), %eax + ;ATOM32: calll *%eax + ;ATOM-NOT: calll *(%eax) + ;ATOM64: movq (%rax), %rax + ;ATOM64: callq *%rax + ;ATOM-NOT64: callq *(%rax) + tail call void %1(i32 2) + ret i32 0 +} diff --git a/test/CodeGen/X86/atom-pad-short-functions.ll b/test/CodeGen/X86/atom-pad-short-functions.ll new file mode 100644 index 000000000000..b9a39e08cb51 --- /dev/null +++ b/test/CodeGen/X86/atom-pad-short-functions.ll @@ -0,0 +1,103 @@ +; RUN: llc < %s -O1 -mcpu=atom -mtriple=i686-linux | FileCheck %s + +declare void @external_function(...) + +define i32 @test_return_val(i32 %a) nounwind { +; CHECK: test_return_val +; CHECK: movl +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: ret + ret i32 %a +} + +define i32 @test_optsize(i32 %a) nounwind optsize { +; CHECK: test_optsize +; CHECK: movl +; CHECK-NEXT: ret + ret i32 %a +} + +define i32 @test_minsize(i32 %a) nounwind minsize { +; CHECK: test_minsize +; CHECK: movl +; CHECK-NEXT: ret + ret i32 %a +} + +define i32 @test_add(i32 %a, i32 %b) nounwind { +; CHECK: test_add +; CHECK: addl +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: ret + %result = add i32 %a, %b + ret i32 %result +} + +define i32 @test_multiple_ret(i32 %a, i32 %b, i1 %c) nounwind { +; CHECK: @test_multiple_ret +; CHECK: je + +; CHECK: nop +; CHECK: nop +; CHECK: ret + +; CHECK: nop +; CHECK: nop +; CHECK: ret + + br i1 %c, label %bb1, label %bb2 + +bb1: + ret i32 %a + +bb2: + ret i32 %b +} + +define void @test_call_others(i32 %x) nounwind +{ +; CHECK: test_call_others +; CHECK: je + %tobool = icmp eq i32 %x, 0 + br i1 %tobool, label %if.end, label %true.case + +; CHECK: jmp external_function +true.case: + tail call void bitcast (void (...)* @external_function to void ()*)() nounwind + br label %if.end + +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: ret +if.end: + ret void + +} + +define void @test_branch_to_same_bb(i32 %x, i32 %y) nounwind { +; CHECK: @test_branch_to_same_bb + %cmp = icmp sgt i32 %x, 0 + br i1 %cmp, label %while.cond, label %while.end + +while.cond: + br label %while.cond + +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: nop +; CHECK: ret +while.end: + ret void +} + diff --git a/test/CodeGen/X86/atomic-dagsched.ll b/test/CodeGen/X86/atomic-dagsched.ll new file mode 100644 index 000000000000..0e7cf8c09668 --- /dev/null +++ b/test/CodeGen/X86/atomic-dagsched.ll @@ -0,0 +1,110 @@ +; RUN: llc < %s -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s + +define void @test(i8** %a, i64* %b, i64 %c, i64 %d) nounwind { +entry: + %ptrtoarg4 = load i8** %a, align 8 + %brglist1 = getelementptr i8** %a, i64 1 + %ptrtoarg25 = load i8** %brglist1, align 8 + %0 = load i64* %b, align 8 + %1 = mul i64 %0, 4 + %scevgep = getelementptr i8* %ptrtoarg25, i64 %1 + %2 = mul i64 %d, 4 + br label %loop.cond + +loop.cond: ; preds = %test.exit, %entry + %asr.iv6 = phi i8* [ %29, %test.exit ], [ %scevgep, %entry ] + %iv = phi i64 [ %0, %entry ], [ %28, %test.exit ] + %3 = icmp eq i64 %iv, %c + br i1 %3, label %return, label %loop + +loop: ; preds = %loop.cond + %4 = load i64* addrspace(256)* inttoptr (i64 264 to i64* addrspace(256)*), align 8, !tbaa !0 + %5 = load i64* %4, align 8, !tbaa !3 + %vector.size.i = ashr i64 %5, 3 + %num.vector.wi.i = shl i64 %vector.size.i, 3 + %6 = icmp eq i64 %vector.size.i, 0 + br i1 %6, label %scalarIf.i, label %dim_0_vector_pre_head.i + +dim_0_vector_pre_head.i: ; preds = %loop + %7 = trunc i64 %5 to i32 + %tempvector_func.i = insertelement <8 x i32> undef, i32 %7, i32 0 + %vectorvector_func.i = shufflevector <8 x i32> %tempvector_func.i, <8 x i32> undef, <8 x i32> zeroinitializer + br label %vector_kernel_entry.i + +vector_kernel_entry.i: ; preds = %vector_kernel_entry.i, %dim_0_vector_pre_head.i + %asr.iv9 = phi i8* [ %scevgep10, %vector_kernel_entry.i ], [ %asr.iv6, %dim_0_vector_pre_head.i ] + %asr.iv = phi i64 [ %asr.iv.next, %vector_kernel_entry.i ], [ %vector.size.i, %dim_0_vector_pre_head.i ] + %8 = bitcast i8* %ptrtoarg4 to i32 addrspace(1)* + %asr.iv911 = bitcast i8* %asr.iv9 to <8 x i32> addrspace(1)* + %9 = load <8 x i32> addrspace(1)* %asr.iv911, align 4 + %extract8vector_func.i = extractelement <8 x i32> %9, i32 0 + %extract9vector_func.i = extractelement <8 x i32> %9, i32 1 + %extract10vector_func.i = extractelement <8 x i32> %9, i32 2 + %extract11vector_func.i = extractelement <8 x i32> %9, i32 3 + %extract12vector_func.i = extractelement <8 x i32> %9, i32 4 + %extract13vector_func.i = extractelement <8 x i32> %9, i32 5 + %extract14vector_func.i = extractelement <8 x i32> %9, i32 6 + %extract15vector_func.i = extractelement <8 x i32> %9, i32 7 + %10 = atomicrmw min i32 addrspace(1)* %8, i32 %extract8vector_func.i seq_cst + %11 = atomicrmw min i32 addrspace(1)* %8, i32 %extract9vector_func.i seq_cst + %12 = atomicrmw min i32 addrspace(1)* %8, i32 %extract10vector_func.i seq_cst + %13 = atomicrmw min i32 addrspace(1)* %8, i32 %extract11vector_func.i seq_cst + %14 = atomicrmw min i32 addrspace(1)* %8, i32 %extract12vector_func.i seq_cst + %15 = atomicrmw min i32 addrspace(1)* %8, i32 %extract13vector_func.i seq_cst + %16 = atomicrmw min i32 addrspace(1)* %8, i32 %extract14vector_func.i seq_cst + %17 = atomicrmw min i32 addrspace(1)* %8, i32 %extract15vector_func.i seq_cst + store <8 x i32> %vectorvector_func.i, <8 x i32> addrspace(1)* %asr.iv911, align 4 + %asr.iv.next = add i64 %asr.iv, -1 + %scevgep10 = getelementptr i8* %asr.iv9, i64 32 + %dim_0_vector_cmp.to.max.i = icmp eq i64 %asr.iv.next, 0 + br i1 %dim_0_vector_cmp.to.max.i, label %scalarIf.i, label %vector_kernel_entry.i + +scalarIf.i: ; preds = %vector_kernel_entry.i, %loop + %exec_wi.i = phi i64 [ 0, %loop ], [ %num.vector.wi.i, %vector_kernel_entry.i ] + %18 = icmp eq i64 %exec_wi.i, %5 + br i1 %18, label %test.exit, label %dim_0_pre_head.i + +dim_0_pre_head.i: ; preds = %scalarIf.i + %19 = load i64* addrspace(256)* inttoptr (i64 264 to i64* addrspace(256)*), align 8, !tbaa !0 + %20 = load i64* %19, align 8, !tbaa !3 + %21 = trunc i64 %20 to i32 + %22 = mul i64 %vector.size.i, 8 + br label %scalar_kernel_entry.i + +scalar_kernel_entry.i: ; preds = %scalar_kernel_entry.i, %dim_0_pre_head.i + %asr.iv12 = phi i64 [ %asr.iv.next13, %scalar_kernel_entry.i ], [ %22, %dim_0_pre_head.i ] + %23 = bitcast i8* %asr.iv6 to i32 addrspace(1)* + %24 = bitcast i8* %ptrtoarg4 to i32 addrspace(1)* + %scevgep16 = getelementptr i32 addrspace(1)* %23, i64 %asr.iv12 + %25 = load i32 addrspace(1)* %scevgep16, align 4, !tbaa !4 + %26 = atomicrmw min i32 addrspace(1)* %24, i32 %25 seq_cst + %scevgep15 = getelementptr i32 addrspace(1)* %23, i64 %asr.iv12 + store i32 %21, i32 addrspace(1)* %scevgep15, align 4, !tbaa !4 + %asr.iv.next13 = add i64 %asr.iv12, 1 + %dim_0_cmp.to.max.i = icmp eq i64 %5, %asr.iv.next13 + br i1 %dim_0_cmp.to.max.i, label %test.exit, label %scalar_kernel_entry.i + +test.exit: ; preds = %scalar_kernel_entry.i, %scalarIf.i + %27 = bitcast i8* %asr.iv6 to i1* + %28 = add i64 %iv, %d + store i64 %28, i64* %b, align 8 + %scevgep8 = getelementptr i1* %27, i64 %2 + %29 = bitcast i1* %scevgep8 to i8* + br label %loop.cond + +return: ; preds = %loop.cond + store i64 %0, i64* %b, align 8 + ret void +} + +!0 = metadata !{metadata !"any pointer", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"long", metadata !1} +!4 = metadata !{metadata !"int", metadata !1} + +; CHECK: test +; CHECK: decq +; CHECK-NOT: cmpxchgl +; CHECK: jne +; CHECK: ret diff --git a/test/CodeGen/X86/atomic-load-store-wide.ll b/test/CodeGen/X86/atomic-load-store-wide.ll index a9ebfef2ebeb..17e04f059034 100644 --- a/test/CodeGen/X86/atomic-load-store-wide.ll +++ b/test/CodeGen/X86/atomic-load-store-wide.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86 | FileCheck %s +; RUN: llc < %s -march=x86 -verify-machineinstrs | FileCheck %s ; 64-bit load/store on x86-32 ; FIXME: The generated code can be substantially improved. diff --git a/test/CodeGen/X86/atomic-load-store.ll b/test/CodeGen/X86/atomic-load-store.ll index fee45859c16a..86a744ed00f0 100644 --- a/test/CodeGen/X86/atomic-load-store.ll +++ b/test/CodeGen/X86/atomic-load-store.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -mtriple=x86_64-apple-macosx10.7.0 -verify-machineinstrs | FileCheck %s -; RUN: llc < %s -mtriple=x86_64-apple-macosx10.7.0 -O0 | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-apple-macosx10.7.0 -verify-machineinstrs -O0 | FileCheck %s define void @test1(i32* %ptr, i32 %val1) { ; CHECK: test1 diff --git a/test/CodeGen/X86/atomic-minmax-i6432.ll b/test/CodeGen/X86/atomic-minmax-i6432.ll index e3ef605f7f1c..62f784f69608 100644 --- a/test/CodeGen/X86/atomic-minmax-i6432.ll +++ b/test/CodeGen/X86/atomic-minmax-i6432.ll @@ -1,5 +1,6 @@ -; RUN: llc -march=x86 -mattr=+cmov -mtriple=i386-pc-linux < %s | FileCheck %s -check-prefix=LINUX -; RUN: llc -march=x86 -mtriple=i386-macosx -relocation-model=pic < %s | FileCheck %s -check-prefix=PIC +; RUN: llc -march=x86 -mattr=+cmov -mtriple=i386-pc-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=LINUX +; RUN: llc -march=x86 -mattr=-cmov -mtriple=i386-pc-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=NOCMOV +; RUN: llc -march=x86 -mtriple=i386-macosx -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s -check-prefix=PIC @sc64 = external global i64 @@ -16,6 +17,16 @@ define void @atomic_maxmin_i6432() { ; LINUX: lock ; LINUX-NEXT: cmpxchg8b ; LINUX: jne [[LABEL]] +; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]] +; NOCMOV: cmpl +; NOCMOV: setl +; NOCMOV: cmpl +; NOCMOV: setl +; NOCMOV: jne +; NOCMOV: jne +; NOCMOV: lock +; NOCMOV-NEXT: cmpxchg8b +; NOCMOV: jne [[LABEL]] %2 = atomicrmw min i64* @sc64, i64 6 acquire ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]] ; LINUX: cmpl @@ -27,6 +38,16 @@ define void @atomic_maxmin_i6432() { ; LINUX: lock ; LINUX-NEXT: cmpxchg8b ; LINUX: jne [[LABEL]] +; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]] +; NOCMOV: cmpl +; NOCMOV: setg +; NOCMOV: cmpl +; NOCMOV: setg +; NOCMOV: jne +; NOCMOV: jne +; NOCMOV: lock +; NOCMOV-NEXT: cmpxchg8b +; NOCMOV: jne [[LABEL]] %3 = atomicrmw umax i64* @sc64, i64 7 acquire ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]] ; LINUX: cmpl @@ -38,6 +59,16 @@ define void @atomic_maxmin_i6432() { ; LINUX: lock ; LINUX-NEXT: cmpxchg8b ; LINUX: jne [[LABEL]] +; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]] +; NOCMOV: cmpl +; NOCMOV: setb +; NOCMOV: cmpl +; NOCMOV: setb +; NOCMOV: jne +; NOCMOV: jne +; NOCMOV: lock +; NOCMOV-NEXT: cmpxchg8b +; NOCMOV: jne [[LABEL]] %4 = atomicrmw umin i64* @sc64, i64 8 acquire ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]] ; LINUX: cmpl @@ -49,6 +80,16 @@ define void @atomic_maxmin_i6432() { ; LINUX: lock ; LINUX-NEXT: cmpxchg8b ; LINUX: jne [[LABEL]] +; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]] +; NOCMOV: cmpl +; NOCMOV: seta +; NOCMOV: cmpl +; NOCMOV: seta +; NOCMOV: jne +; NOCMOV: jne +; NOCMOV: lock +; NOCMOV-NEXT: cmpxchg8b +; NOCMOV: jne [[LABEL]] ret void } diff --git a/test/CodeGen/X86/atomic-or.ll b/test/CodeGen/X86/atomic-or.ll index 3f02eafb44a2..d759beb2caa8 100644 --- a/test/CodeGen/X86/atomic-or.ll +++ b/test/CodeGen/X86/atomic-or.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86-64 | FileCheck %s +; RUN: llc < %s -march=x86-64 -verify-machineinstrs | FileCheck %s ; rdar://9692967 diff --git a/test/CodeGen/X86/atomic-pointer.ll b/test/CodeGen/X86/atomic-pointer.ll index a455277be4db..ec3e6c3a8c19 100644 --- a/test/CodeGen/X86/atomic-pointer.ll +++ b/test/CodeGen/X86/atomic-pointer.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=i686-none-linux | FileCheck %s +; RUN: llc < %s -mtriple=i686-none-linux -verify-machineinstrs | FileCheck %s define i32* @test_atomic_ptr_load(i32** %a0) { ; CHECK: test_atomic_ptr_load diff --git a/test/CodeGen/X86/atomic16.ll b/test/CodeGen/X86/atomic16.ll index 824995d6cb98..ec2887e29f81 100644 --- a/test/CodeGen/X86/atomic16.ll +++ b/test/CodeGen/X86/atomic16.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -show-mc-encoding | FileCheck %s --check-prefix X64 -; RUN: llc < %s -O0 -mtriple=i386-unknown-unknown -mcpu=corei7 | FileCheck %s --check-prefix X32 +; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -verify-machineinstrs -show-mc-encoding | FileCheck %s --check-prefix X64 +; RUN: llc < %s -O0 -mtriple=i386-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32 @sc16 = external global i16 diff --git a/test/CodeGen/X86/atomic32.ll b/test/CodeGen/X86/atomic32.ll index dc927d8cb6f6..3cb9ca1c76c7 100644 --- a/test/CodeGen/X86/atomic32.ll +++ b/test/CodeGen/X86/atomic32.ll @@ -1,5 +1,6 @@ -; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 | FileCheck %s --check-prefix X64 -; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 | FileCheck %s --check-prefix X32 +; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64 +; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32 +; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -mattr=-cmov -verify-machineinstrs | FileCheck %s --check-prefix NOCMOV @sc32 = external global i32 @@ -164,9 +165,15 @@ define void @atomic_fetch_max32(i32 %x) nounwind { ; X32: cmov ; X32: lock ; X32: cmpxchgl + +; NOCMOV: cmpl +; NOCMOV: jl +; NOCMOV: lock +; NOCMOV: cmpxchgl ret void ; X64: ret ; X32: ret +; NOCMOV: ret } define void @atomic_fetch_min32(i32 %x) nounwind { @@ -180,9 +187,15 @@ define void @atomic_fetch_min32(i32 %x) nounwind { ; X32: cmov ; X32: lock ; X32: cmpxchgl + +; NOCMOV: cmpl +; NOCMOV: jg +; NOCMOV: lock +; NOCMOV: cmpxchgl ret void ; X64: ret ; X32: ret +; NOCMOV: ret } define void @atomic_fetch_umax32(i32 %x) nounwind { @@ -196,9 +209,15 @@ define void @atomic_fetch_umax32(i32 %x) nounwind { ; X32: cmov ; X32: lock ; X32: cmpxchgl + +; NOCMOV: cmpl +; NOCMOV: jb +; NOCMOV: lock +; NOCMOV: cmpxchgl ret void ; X64: ret ; X32: ret +; NOCMOV: ret } define void @atomic_fetch_umin32(i32 %x) nounwind { @@ -207,13 +226,20 @@ define void @atomic_fetch_umin32(i32 %x) nounwind { ; X64: cmov ; X64: lock ; X64: cmpxchgl + ; X32: cmpl ; X32: cmov ; X32: lock ; X32: cmpxchgl + +; NOCMOV: cmpl +; NOCMOV: ja +; NOCMOV: lock +; NOCMOV: cmpxchgl ret void ; X64: ret ; X32: ret +; NOCMOV: ret } define void @atomic_fetch_cmpxchg32() nounwind { diff --git a/test/CodeGen/X86/atomic64.ll b/test/CodeGen/X86/atomic64.ll index 45785cc8fe52..aa000455753f 100644 --- a/test/CodeGen/X86/atomic64.ll +++ b/test/CodeGen/X86/atomic64.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 | FileCheck %s --check-prefix X64 +; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64 @sc64 = external global i64 diff --git a/test/CodeGen/X86/atomic6432.ll b/test/CodeGen/X86/atomic6432.ll index f9b21c5bc75e..31e66c876e3d 100644 --- a/test/CodeGen/X86/atomic6432.ll +++ b/test/CodeGen/X86/atomic6432.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 | FileCheck %s --check-prefix X32 +; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32 @sc64 = external global i64 diff --git a/test/CodeGen/X86/atomic8.ll b/test/CodeGen/X86/atomic8.ll index 412428406dcf..3278ed1f504e 100644 --- a/test/CodeGen/X86/atomic8.ll +++ b/test/CodeGen/X86/atomic8.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 | FileCheck %s --check-prefix X64 -; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 | FileCheck %s --check-prefix X32 +; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64 +; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32 @sc8 = external global i8 diff --git a/test/CodeGen/X86/atomic_add.ll b/test/CodeGen/X86/atomic_add.ll index d94499889de4..6b3a6b224dba 100644 --- a/test/CodeGen/X86/atomic_add.ll +++ b/test/CodeGen/X86/atomic_add.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86-64 | FileCheck %s +; RUN: llc < %s -march=x86-64 -verify-machineinstrs | FileCheck %s ; rdar://7103704 diff --git a/test/CodeGen/X86/atomic_op.ll b/test/CodeGen/X86/atomic_op.ll index c5fa07d07d80..a378d6e8d684 100644 --- a/test/CodeGen/X86/atomic_op.ll +++ b/test/CodeGen/X86/atomic_op.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mcpu=generic -march=x86 -mattr=+cmov | FileCheck %s +; RUN: llc < %s -mcpu=generic -march=x86 -mattr=+cmov -verify-machineinstrs | FileCheck %s target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" diff --git a/test/CodeGen/X86/avx-cvt.ll b/test/CodeGen/X86/avx-cvt.ll index d0a7fe01009e..22fad7ce4b7d 100644 --- a/test/CodeGen/X86/avx-cvt.ll +++ b/test/CodeGen/X86/avx-cvt.ll @@ -18,6 +18,12 @@ define <4 x double> @sitofp01(<4 x i32> %a) { ret <4 x double> %b } +; CHECK: vcvtdq2ps %ymm +define <8 x float> @sitofp02(<8 x i16> %a) { + %b = sitofp <8 x i16> %a to <8 x float> + ret <8 x float> %b +} + ; CHECK: vcvttpd2dqy %ymm define <4 x i32> @fptosi01(<4 x double> %a) { %b = fptosi <4 x double> %a to <4 x i32> @@ -46,7 +52,7 @@ entry: ret double %conv } -; CHECK: vcvtsi2sd (% +; CHECK: vcvtsi2sdl (% define double @funcB(i32* nocapture %e) nounwind uwtable readonly ssp { entry: %tmp1 = load i32* %e, align 4 @@ -54,7 +60,7 @@ entry: ret double %conv } -; CHECK: vcvtsi2ss (% +; CHECK: vcvtsi2ssl (% define float @funcC(i32* nocapture %e) nounwind uwtable readonly ssp { entry: %tmp1 = load i32* %e, align 4 diff --git a/test/CodeGen/X86/avx-intel-ocl.ll b/test/CodeGen/X86/avx-intel-ocl.ll index 1446b36a0fb4..055072098a25 100644 --- a/test/CodeGen/X86/avx-intel-ocl.ll +++ b/test/CodeGen/X86/avx-intel-ocl.ll @@ -1,9 +1,12 @@ -; RUN: llc < %s -mtriple=i386-pc-win32 -mcpu=corei7-avx -mattr=+avx | FileCheck -check-prefix=WIN32 %s +; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck -check-prefix=X32 %s +; RUN: llc < %s -mtriple=i386-pc-win32 -mcpu=corei7-avx -mattr=+avx | FileCheck -check-prefix=X32 %s ; RUN: llc < %s -mtriple=x86_64-win32 -mcpu=corei7-avx -mattr=+avx | FileCheck -check-prefix=WIN64 %s -; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck -check-prefix=NOT_WIN %s +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck -check-prefix=X64 %s declare <16 x float> @func_float16_ptr(<16 x float>, <16 x float> *) declare <16 x float> @func_float16(<16 x float>, <16 x float>) +declare i32 @func_int(i32, i32) + ; WIN64: testf16_inp ; WIN64: vaddps {{.*}}, {{%ymm[0-1]}} ; WIN64: vaddps {{.*}}, {{%ymm[0-1]}} @@ -11,19 +14,19 @@ declare <16 x float> @func_float16(<16 x float>, <16 x float>) ; WIN64: call ; WIN64: ret -; WIN32: testf16_inp -; WIN32: movl %eax, (%esp) -; WIN32: vaddps {{.*}}, {{%ymm[0-1]}} -; WIN32: vaddps {{.*}}, {{%ymm[0-1]}} -; WIN32: call -; WIN32: ret +; X32: testf16_inp +; X32: movl %eax, (%esp) +; X32: vaddps {{.*}}, {{%ymm[0-1]}} +; X32: vaddps {{.*}}, {{%ymm[0-1]}} +; X32: call +; X32: ret -; NOT_WIN: testf16_inp -; NOT_WIN: vaddps {{.*}}, {{%ymm[0-1]}} -; NOT_WIN: vaddps {{.*}}, {{%ymm[0-1]}} -; NOT_WIN: leaq {{.*}}(%rsp), %rdi -; NOT_WIN: call -; NOT_WIN: ret +; X64: testf16_inp +; X64: vaddps {{.*}}, {{%ymm[0-1]}} +; X64: vaddps {{.*}}, {{%ymm[0-1]}} +; X64: leaq {{.*}}(%rsp), %rdi +; X64: call +; X64: ret ;test calling conventions - input parameters define <16 x float> @testf16_inp(<16 x float> %a, <16 x float> %b) nounwind { @@ -45,11 +48,11 @@ define <16 x float> @testf16_inp(<16 x float> %a, <16 x float> %b) nounwind { ; WIN64: ret ; preserved ymm8-ymm15 -; NOT_WIN: testf16_regs -; NOT_WIN: call -; NOT_WIN: vaddps {{%ymm[8-9]}}, %ymm0, %ymm0 -; NOT_WIN: vaddps {{%ymm[8-9]}}, %ymm1, %ymm1 -; NOT_WIN: ret +; X64: testf16_regs +; X64: call +; X64: vaddps {{%ymm[8-9]}}, %ymm0, %ymm0 +; X64: vaddps {{%ymm[8-9]}}, %ymm1, %ymm1 +; X64: ret define <16 x float> @testf16_regs(<16 x float> %a, <16 x float> %b) nounwind { %y = alloca <16 x float>, align 16 @@ -84,24 +87,83 @@ define <16 x float> @testf16_regs(<16 x float> %a, <16 x float> %b) nounwind { ; WIN64: vmovaps {{.*(%rsp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload ; WIN64: vmovaps {{.*(%rsp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload -; NOT_WIN: vmovaps {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rbp) ## 32-byte Spill -; NOT_WIN: vmovaps {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rbp) ## 32-byte Spill -; NOT_WIN: vmovaps {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rbp) ## 32-byte Spill -; NOT_WIN: vmovaps {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rbp) ## 32-byte Spill -; NOT_WIN: vmovaps {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rbp) ## 32-byte Spill -; NOT_WIN: vmovaps {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rbp) ## 32-byte Spill -; NOT_WIN: vmovaps {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rbp) ## 32-byte Spill -; NOT_WIN: vmovaps {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rbp) ## 32-byte Spill -; NOT_WIN: call -; NOT_WIN: vmovaps {{.*}}(%rbp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload -; NOT_WIN: vmovaps {{.*}}(%rbp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload -; NOT_WIN: vmovaps {{.*}}(%rbp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload -; NOT_WIN: vmovaps {{.*}}(%rbp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload -; NOT_WIN: vmovaps {{.*}}(%rbp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload -; NOT_WIN: vmovaps {{.*}}(%rbp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload -; NOT_WIN: vmovaps {{.*}}(%rbp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload -; NOT_WIN: vmovaps {{.*}}(%rbp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload +; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Folded Spill +; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Folded Spill +; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Folded Spill +; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Folded Spill +; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Folded Spill +; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Folded Spill +; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Folded Spill +; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Folded Spill +; X64: call +; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Folded Reload +; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Folded Reload +; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Folded Reload +; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Folded Reload +; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Folded Reload +; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Folded Reload +; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Folded Reload +; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Folded Reload define intel_ocl_bicc <16 x float> @test_prolog_epilog(<16 x float> %a, <16 x float> %b) nounwind { %c = call <16 x float> @func_float16(<16 x float> %a, <16 x float> %b) ret <16 x float> %c } + +; test functions with integer parameters +; pass parameters on stack for 32-bit platform +; X32: movl {{.*}}, 4(%esp) +; X32: movl {{.*}}, (%esp) +; X32: call +; X32: addl {{.*}}, %eax + +; pass parameters in registers for 64-bit platform +; X64: leal {{.*}}, %edi +; X64: movl {{.*}}, %esi +; X64: call +; X64: addl {{.*}}, %eax +define i32 @test_int(i32 %a, i32 %b) nounwind { + %c1 = add i32 %a, %b + %c2 = call intel_ocl_bicc i32 @func_int(i32 %c1, i32 %a) + %c = add i32 %c2, %b + ret i32 %c +} + +; WIN64: test_float4 +; WIN64-NOT: vzeroupper +; WIN64: call +; WIN64-NOT: vzeroupper +; WIN64: call +; WIN64: ret + +; X64: test_float4 +; X64-NOT: vzeroupper +; X64: call +; X64-NOT: vzeroupper +; X64: call +; X64: ret + +; X32: test_float4 +; X32: vzeroupper +; X32: call +; X32: vzeroupper +; X32: call +; X32: ret + +declare <4 x float> @func_float4(<4 x float>, <4 x float>, <4 x float>) + +define <8 x float> @test_float4(<8 x float> %a, <8 x float> %b, <8 x float> %c) nounwind readnone { +entry: + %0 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> + %1 = shufflevector <8 x float> %b, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> + %2 = shufflevector <8 x float> %c, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> + %call.i = tail call intel_ocl_bicc <4 x float> @func_float4(<4 x float> %0, <4 x float> %1, <4 x float> %2) nounwind + %3 = shufflevector <4 x float> %call.i, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef> + %4 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> + %5 = shufflevector <8 x float> %b, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> + %6 = shufflevector <8 x float> %c, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> + %call.i2 = tail call intel_ocl_bicc <4 x float> @func_float4(<4 x float> %4, <4 x float> %5, <4 x float> %6) nounwind + %7 = shufflevector <4 x float> %call.i2, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef> + %8 = shufflevector <8 x float> %3, <8 x float> %7, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11> + ret <8 x float> %8 +} + diff --git a/test/CodeGen/X86/avx-intrinsics-x86.ll b/test/CodeGen/X86/avx-intrinsics-x86.ll index 88ecd5a5d34f..0be83f648d1a 100644 --- a/test/CodeGen/X86/avx-intrinsics-x86.ll +++ b/test/CodeGen/X86/avx-intrinsics-x86.ll @@ -671,7 +671,9 @@ define void @test_x86_sse2_storeu_dq(i8* %a0, <16 x i8> %a1) { ; CHECK: test_x86_sse2_storeu_dq ; CHECK: movl ; CHECK: vmovdqu - call void @llvm.x86.sse2.storeu.dq(i8* %a0, <16 x i8> %a1) + ; add operation forces the execution domain. + %a2 = add <16 x i8> %a1, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> + call void @llvm.x86.sse2.storeu.dq(i8* %a0, <16 x i8> %a2) ret void } declare void @llvm.x86.sse2.storeu.dq(i8*, <16 x i8>) nounwind @@ -681,6 +683,7 @@ define void @test_x86_sse2_storeu_pd(i8* %a0, <2 x double> %a1) { ; CHECK: test_x86_sse2_storeu_pd ; CHECK: movl ; CHECK: vmovupd + ; fadd operation forces the execution domain. %a2 = fadd <2 x double> %a1, <double 0x0, double 0x4200000000000000> call void @llvm.x86.sse2.storeu.pd(i8* %a0, <2 x double> %a2) ret void @@ -2345,7 +2348,7 @@ declare <4 x double> @llvm.x86.avx.vpermil.pd.256(<4 x double>, i8) nounwind rea define <4 x float> @test_x86_avx_vpermil_ps(<4 x float> %a0) { - ; CHECK: vpermilps + ; CHECK: vpshufd %res = call <4 x float> @llvm.x86.avx.vpermil.ps(<4 x float> %a0, i8 7) ; <<4 x float>> [#uses=1] ret <4 x float> %res } diff --git a/test/CodeGen/X86/avx-load-store.ll b/test/CodeGen/X86/avx-load-store.ll index c9fc66a8a791..a6775aba0989 100644 --- a/test/CodeGen/X86/avx-load-store.ll +++ b/test/CodeGen/X86/avx-load-store.ll @@ -53,19 +53,24 @@ define void @storev16i16(<16 x i16> %a) nounwind { unreachable } -; CHECK: vmovups %ymm +; CHECK: storev16i16_01 +; CHECK: vextractf128 +; CHECK: vmovups %xmm define void @storev16i16_01(<16 x i16> %a) nounwind { store <16 x i16> %a, <16 x i16>* undef, align 4 unreachable } +; CHECK: storev32i8 ; CHECK: vmovaps %ymm define void @storev32i8(<32 x i8> %a) nounwind { store <32 x i8> %a, <32 x i8>* undef, align 32 unreachable } -; CHECK: vmovups %ymm +; CHECK: storev32i8_01 +; CHECK: vextractf128 +; CHECK: vmovups %xmm define void @storev32i8_01(<32 x i8> %a) nounwind { store <32 x i8> %a, <32 x i8>* undef, align 4 unreachable @@ -109,3 +114,38 @@ cif_mixed_test_any_check: ; preds = %cif_mask_mixed unreachable } +; CHECK: add8i32 +; CHECK: vmovups +; CHECK: vmovups +; CHECK-NOT: vinsertf128 +; CHECK-NOT: vextractf128 +; CHECK: vmovups +; CHECK: vmovups +define void @add8i32(<8 x i32>* %ret, <8 x i32>* %bp) nounwind { + %b = load <8 x i32>* %bp, align 1 + %x = add <8 x i32> zeroinitializer, %b + store <8 x i32> %x, <8 x i32>* %ret, align 1 + ret void +} + +; CHECK: add4i64a64 +; CHECK: vmovaps ({{.*}}), %ymm{{.*}} +; CHECK: vmovaps %ymm{{.*}}, ({{.*}}) +define void @add4i64a64(<4 x i64>* %ret, <4 x i64>* %bp) nounwind { + %b = load <4 x i64>* %bp, align 64 + %x = add <4 x i64> zeroinitializer, %b + store <4 x i64> %x, <4 x i64>* %ret, align 64 + ret void +} + +; CHECK: add4i64a16 +; CHECK: vmovaps {{.*}}({{.*}}), %xmm{{.*}} +; CHECK: vmovaps {{.*}}({{.*}}), %xmm{{.*}} +; CHECK: vmovaps %xmm{{.*}}, {{.*}}({{.*}}) +; CHECK: vmovaps %xmm{{.*}}, {{.*}}({{.*}}) +define void @add4i64a16(<4 x i64>* %ret, <4 x i64>* %bp) nounwind { + %b = load <4 x i64>* %bp, align 16 + %x = add <4 x i64> zeroinitializer, %b + store <4 x i64> %x, <4 x i64>* %ret, align 16 + ret void +} diff --git a/test/CodeGen/X86/avx-sext.ll b/test/CodeGen/X86/avx-sext.ll index 3713a8c37799..b9c700051005 100755 --- a/test/CodeGen/X86/avx-sext.ll +++ b/test/CodeGen/X86/avx-sext.ll @@ -1,17 +1,188 @@ -; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx | FileCheck %s -check-prefix=AVX +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core2 | FileCheck %s -check-prefix=SSSE3 +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=pentium4 | FileCheck %s -check-prefix=SSE2 define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp { -;CHECK: sext_8i16_to_8i32 -;CHECK: vpmovsxwd +; AVX: sext_8i16_to_8i32 +; AVX: vpmovsxwd %B = sext <8 x i16> %A to <8 x i32> ret <8 x i32>%B } define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp { -;CHECK: sext_4i32_to_4i64 -;CHECK: vpmovsxdq +; AVX: sext_4i32_to_4i64 +; AVX: vpmovsxdq %B = sext <4 x i32> %A to <4 x i64> ret <4 x i64>%B } + +; AVX: load_sext_test1 +; AVX: vpmovsxwd (%r{{[^,]*}}), %xmm{{.*}} +; AVX: ret + +; SSSE3: load_sext_test1 +; SSSE3: movq +; SSSE3: punpcklwd %xmm{{.*}}, %xmm{{.*}} +; SSSE3: psrad $16 +; SSSE3: ret + +; SSE2: load_sext_test1 +; SSE2: movq +; SSE2: punpcklwd %xmm{{.*}}, %xmm{{.*}} +; SSE2: psrad $16 +; SSE2: ret +define <4 x i32> @load_sext_test1(<4 x i16> *%ptr) { + %X = load <4 x i16>* %ptr + %Y = sext <4 x i16> %X to <4 x i32> + ret <4 x i32>%Y +} + +; AVX: load_sext_test2 +; AVX: vpmovsxbd (%r{{[^,]*}}), %xmm{{.*}} +; AVX: ret + +; SSSE3: load_sext_test2 +; SSSE3: movd +; SSSE3: pshufb +; SSSE3: psrad $24 +; SSSE3: ret + +; SSE2: load_sext_test2 +; SSE2: movl +; SSE2: psrad $24 +; SSE2: ret +define <4 x i32> @load_sext_test2(<4 x i8> *%ptr) { + %X = load <4 x i8>* %ptr + %Y = sext <4 x i8> %X to <4 x i32> + ret <4 x i32>%Y +} + +; AVX: load_sext_test3 +; AVX: vpmovsxbq (%r{{[^,]*}}), %xmm{{.*}} +; AVX: ret + +; SSSE3: load_sext_test3 +; SSSE3: movsbq +; SSSE3: movsbq +; SSSE3: punpcklqdq +; SSSE3: ret + +; SSE2: load_sext_test3 +; SSE2: movsbq +; SSE2: movsbq +; SSE2: punpcklqdq +; SSE2: ret +define <2 x i64> @load_sext_test3(<2 x i8> *%ptr) { + %X = load <2 x i8>* %ptr + %Y = sext <2 x i8> %X to <2 x i64> + ret <2 x i64>%Y +} + +; AVX: load_sext_test4 +; AVX: vpmovsxwq (%r{{[^,]*}}), %xmm{{.*}} +; AVX: ret + +; SSSE3: load_sext_test4 +; SSSE3: movswq +; SSSE3: movswq +; SSSE3: punpcklqdq +; SSSE3: ret + +; SSE2: load_sext_test4 +; SSE2: movswq +; SSE2: movswq +; SSE2: punpcklqdq +; SSE2: ret +define <2 x i64> @load_sext_test4(<2 x i16> *%ptr) { + %X = load <2 x i16>* %ptr + %Y = sext <2 x i16> %X to <2 x i64> + ret <2 x i64>%Y +} + +; AVX: load_sext_test5 +; AVX: vpmovsxdq (%r{{[^,]*}}), %xmm{{.*}} +; AVX: ret + +; SSSE3: load_sext_test5 +; SSSE3: movslq +; SSSE3: movslq +; SSSE3: punpcklqdq +; SSSE3: ret + +; SSE2: load_sext_test5 +; SSE2: movslq +; SSE2: movslq +; SSE2: punpcklqdq +; SSE2: ret +define <2 x i64> @load_sext_test5(<2 x i32> *%ptr) { + %X = load <2 x i32>* %ptr + %Y = sext <2 x i32> %X to <2 x i64> + ret <2 x i64>%Y +} + +; AVX: load_sext_test6 +; AVX: vpmovsxbw (%r{{[^,]*}}), %xmm{{.*}} +; AVX: ret + +; SSSE3: load_sext_test6 +; SSSE3: movq +; SSSE3: punpcklbw +; SSSE3: psraw $8 +; SSSE3: ret + +; SSE2: load_sext_test6 +; SSE2: movq +; SSE2: punpcklbw +; SSE2: psraw $8 +; SSE2: ret +define <8 x i16> @load_sext_test6(<8 x i8> *%ptr) { + %X = load <8 x i8>* %ptr + %Y = sext <8 x i8> %X to <8 x i16> + ret <8 x i16>%Y +} + +; AVX: sext_4i1_to_4i64 +; AVX: vpslld $31 +; AVX: vpsrad $31 +; AVX: vpmovsxdq +; AVX: vpmovsxdq +; AVX: ret +define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) { + %extmask = sext <4 x i1> %mask to <4 x i64> + ret <4 x i64> %extmask +} + +; AVX: sext_4i8_to_4i64 +; AVX: vpslld $24 +; AVX: vpsrad $24 +; AVX: vpmovsxdq +; AVX: vpmovsxdq +; AVX: ret +define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) { + %extmask = sext <4 x i8> %mask to <4 x i64> + ret <4 x i64> %extmask +} + +; AVX: sext_4i8_to_4i64 +; AVX: vpmovsxbd +; AVX: vpmovsxdq +; AVX: vpmovsxdq +; AVX: ret +define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) { + %X = load <4 x i8>* %ptr + %Y = sext <4 x i8> %X to <4 x i64> + ret <4 x i64>%Y +} + +; AVX: sext_4i16_to_4i64 +; AVX: vpmovsxwd +; AVX: vpmovsxdq +; AVX: vpmovsxdq +; AVX: ret +define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) { + %X = load <4 x i16>* %ptr + %Y = sext <4 x i16> %X to <4 x i64> + ret <4 x i64>%Y +} diff --git a/test/CodeGen/X86/avx-shift.ll b/test/CodeGen/X86/avx-shift.ll index 681747b844a0..01eb7361e293 100644 --- a/test/CodeGen/X86/avx-shift.ll +++ b/test/CodeGen/X86/avx-shift.ll @@ -105,13 +105,22 @@ define <32 x i8> @vshift12(<32 x i8> %a) nounwind readnone { ; CHECK: _vshift08 ; CHECK: vextractf128 $1 ; CHECK: vpslld $23 -; CHECK: vextractf128 $1 ; CHECK: vpslld $23 define <8 x i32> @vshift08(<8 x i32> %a) nounwind { %bitop = shl <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, %a ret <8 x i32> %bitop } +; PR15141 +; CHECK: _vshift13: +; CHECK-NOT: vpsll +; CHECK: vcvttps2dq +; CHECK-NEXT: vpmulld +define <4 x i32> @vshift13(<4 x i32> %in) { + %T = shl <4 x i32> %in, <i32 0, i32 1, i32 2, i32 4> + ret <4 x i32> %T +} + ;;; Uses shifts for sign extension ; CHECK: _sext_v16i16 ; CHECK: vpsllw diff --git a/test/CodeGen/X86/avx-shuffle.ll b/test/CodeGen/X86/avx-shuffle.ll index ec11654b3556..73faa1fe0d40 100644 --- a/test/CodeGen/X86/avx-shuffle.ll +++ b/test/CodeGen/X86/avx-shuffle.ll @@ -6,7 +6,7 @@ define <4 x float> @test1(<4 x float> %a) nounwind { ret <4 x float> %b ; CHECK: test1: ; CHECK: vshufps -; CHECK: vpermilps +; CHECK: vpshufd } ; rdar://10538417 @@ -98,23 +98,23 @@ define i32 @test10(<4 x i32> %a) nounwind { } define <4 x float> @test11(<4 x float> %a) nounwind { -; check: test11 -; check: vpermilps $27 +; CHECK: test11 +; CHECK: vpshufd $27 %tmp1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> ret <4 x float> %tmp1 } define <4 x float> @test12(<4 x float>* %a) nounwind { ; CHECK: test12 -; CHECK: vpermilps $27, ( +; CHECK: vpshufd %tmp0 = load <4 x float>* %a %tmp1 = shufflevector <4 x float> %tmp0, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> ret <4 x float> %tmp1 } define <4 x i32> @test13(<4 x i32> %a) nounwind { -; check: test13 -; check: vpshufd $27 +; CHECK: test13 +; CHECK: vpshufd $27 %tmp1 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> ret <4 x i32> %tmp1 } @@ -246,3 +246,54 @@ define <8 x float> @test19(<8 x float> %A, <8 x float>%B) nounwind { ret <8 x float>%S } +; rdar://12684358 +; Make sure loads happen before stores. +; CHECK: swap8doubles +; CHECK: vmovups {{[0-9]*}}(%rdi), %xmm{{[0-9]+}} +; CHECK: vmovups {{[0-9]*}}(%rdi), %xmm{{[0-9]+}} +; CHECK: vmovups {{[0-9]*}}(%rdi), %xmm{{[0-9]+}} +; CHECK: vmovups {{[0-9]*}}(%rdi), %xmm{{[0-9]+}} +; CHECK: vmovaps {{[0-9]*}}(%rsi), %ymm{{[0-9]+}} +; CHECK: vmovaps {{[0-9]*}}(%rsi), %ymm{{[0-9]+}} +; CHECK: vmovaps %xmm{{[0-9]+}}, {{[0-9]*}}(%rdi) +; CHECK: vextractf128 +; CHECK: vmovaps %xmm{{[0-9]+}}, {{[0-9]*}}(%rdi) +; CHECK: vextractf128 +; CHECK: vmovaps %ymm{{[0-9]+}}, {{[0-9]*}}(%rsi) +; CHECK: vmovaps %ymm{{[0-9]+}}, {{[0-9]*}}(%rsi) +define void @swap8doubles(double* nocapture %A, double* nocapture %C) nounwind uwtable ssp { +entry: + %add.ptr = getelementptr inbounds double* %A, i64 2 + %v.i = bitcast double* %A to <2 x double>* + %0 = load <2 x double>* %v.i, align 1 + %shuffle.i.i = shufflevector <2 x double> %0, <2 x double> <double 0.000000e+00, double undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 2> + %v1.i = bitcast double* %add.ptr to <2 x double>* + %1 = load <2 x double>* %v1.i, align 1 + %2 = tail call <4 x double> @llvm.x86.avx.vinsertf128.pd.256(<4 x double> %shuffle.i.i, <2 x double> %1, i8 1) nounwind + %add.ptr1 = getelementptr inbounds double* %A, i64 6 + %add.ptr2 = getelementptr inbounds double* %A, i64 4 + %v.i27 = bitcast double* %add.ptr2 to <2 x double>* + %3 = load <2 x double>* %v.i27, align 1 + %shuffle.i.i28 = shufflevector <2 x double> %3, <2 x double> <double 0.000000e+00, double undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 2> + %v1.i29 = bitcast double* %add.ptr1 to <2 x double>* + %4 = load <2 x double>* %v1.i29, align 1 + %5 = tail call <4 x double> @llvm.x86.avx.vinsertf128.pd.256(<4 x double> %shuffle.i.i28, <2 x double> %4, i8 1) nounwind + %6 = bitcast double* %C to <4 x double>* + %7 = load <4 x double>* %6, align 32 + %add.ptr5 = getelementptr inbounds double* %C, i64 4 + %8 = bitcast double* %add.ptr5 to <4 x double>* + %9 = load <4 x double>* %8, align 32 + %shuffle.i26 = shufflevector <4 x double> %7, <4 x double> undef, <2 x i32> <i32 0, i32 1> + %10 = tail call <2 x double> @llvm.x86.avx.vextractf128.pd.256(<4 x double> %7, i8 1) + %shuffle.i = shufflevector <4 x double> %9, <4 x double> undef, <2 x i32> <i32 0, i32 1> + %11 = tail call <2 x double> @llvm.x86.avx.vextractf128.pd.256(<4 x double> %9, i8 1) + store <2 x double> %shuffle.i26, <2 x double>* %v.i, align 16 + store <2 x double> %10, <2 x double>* %v1.i, align 16 + store <2 x double> %shuffle.i, <2 x double>* %v.i27, align 16 + store <2 x double> %11, <2 x double>* %v1.i29, align 16 + store <4 x double> %2, <4 x double>* %6, align 32 + store <4 x double> %5, <4 x double>* %8, align 32 + ret void +} +declare <2 x double> @llvm.x86.avx.vextractf128.pd.256(<4 x double>, i8) nounwind readnone +declare <4 x double> @llvm.x86.avx.vinsertf128.pd.256(<4 x double>, <2 x double>, i8) nounwind readnone diff --git a/test/CodeGen/X86/avx-splat.ll b/test/CodeGen/X86/avx-splat.ll index 94bcddd97592..5c01c2cc5b50 100644 --- a/test/CodeGen/X86/avx-splat.ll +++ b/test/CodeGen/X86/avx-splat.ll @@ -3,8 +3,8 @@ ; CHECK: vpunpcklbw %xmm ; CHECK-NEXT: vpunpckhbw %xmm +; CHECK-NEXT: vpshufd $85 ; CHECK-NEXT: vinsertf128 $1 -; CHECK-NEXT: vpermilps $85 define <32 x i8> @funcA(<32 x i8> %a) nounwind uwtable readnone ssp { entry: %shuffle = shufflevector <32 x i8> %a, <32 x i8> undef, <32 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> @@ -12,8 +12,8 @@ entry: } ; CHECK: vpunpckhwd %xmm +; CHECK-NEXT: vpshufd $85 ; CHECK-NEXT: vinsertf128 $1 -; CHECK-NEXT: vpermilps $85 define <16 x i16> @funcB(<16 x i16> %a) nounwind uwtable readnone ssp { entry: %shuffle = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> @@ -47,9 +47,9 @@ entry: ; shuffle (scalar_to_vector (load (ptr + 4))), undef, <0, 0, 0, 0> ; To: ; shuffle (vload ptr)), undef, <1, 1, 1, 1> -; CHECK: vmovaps +; CHECK: vmovdqa +; CHECK-NEXT: vpshufd $-1 ; CHECK-NEXT: vinsertf128 $1 -; CHECK-NEXT: vpermilps $-1 define <8 x float> @funcE() nounwind { allocas: %udx495 = alloca [18 x [18 x float]], align 32 @@ -75,8 +75,8 @@ __load_and_broadcast_32.exit1249: ; preds = %load.i1247, %for_ex ret <8 x float> %load_broadcast12281250 } -; CHECK: vinsertf128 $1 -; CHECK-NEXT: vpermilps $0 +; CHECK: vpshufd $0 +; CHECK-NEXT: vinsertf128 $1 define <8 x float> @funcF(i32 %val) nounwind { %ret6 = insertelement <8 x i32> undef, i32 %val, i32 6 %ret7 = insertelement <8 x i32> %ret6, i32 %val, i32 7 @@ -84,8 +84,8 @@ define <8 x float> @funcF(i32 %val) nounwind { ret <8 x float> %tmp } -; CHECK: vinsertf128 $1 -; CHECK-NEXT: vpermilps $0 +; CHECK: vpshufd $0 +; CHECK-NEXT: vinsertf128 $1 define <8 x float> @funcG(<8 x float> %a) nounwind uwtable readnone ssp { entry: %shuffle = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> @@ -93,8 +93,8 @@ entry: } ; CHECK: vextractf128 $1 +; CHECK-NEXT: vpshufd ; CHECK-NEXT: vinsertf128 $1 -; CHECK-NEXT: vpermilps $85 define <8 x float> @funcH(<8 x float> %a) nounwind uwtable readnone ssp { entry: %shuffle = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> diff --git a/test/CodeGen/X86/avx-vextractf128.ll b/test/CodeGen/X86/avx-vextractf128.ll index ff56a454996e..ad8365bb59c0 100644 --- a/test/CodeGen/X86/avx-vextractf128.ll +++ b/test/CodeGen/X86/avx-vextractf128.ll @@ -102,3 +102,21 @@ entry: store <2 x i64> %2, <2 x i64>* %addr, align 1 ret void } + +; PR15462 +define void @t9(i64* %p) { + store i64 0, i64* %p + %q = getelementptr i64* %p, i64 1 + store i64 0, i64* %q + %r = getelementptr i64* %p, i64 2 + store i64 0, i64* %r + %s = getelementptr i64* %p, i64 3 + store i64 0, i64* %s + ret void + +; CHECK: t9: +; CHECK: vxorps %xmm +; CHECK-NOT: vextractf +; CHECK: vmovups +; CHECK: vmovups +} diff --git a/test/CodeGen/X86/avx-vpermil.ll b/test/CodeGen/X86/avx-vpermil.ll index cb904b93313a..7f2f9d821dd5 100644 --- a/test/CodeGen/X86/avx-vpermil.ll +++ b/test/CodeGen/X86/avx-vpermil.ll @@ -45,8 +45,8 @@ entry: ret <8 x float> %shuffle } -; CHECK: palignr -; CHECK: palignr +; CHECK: palignr $8 +; CHECK: psrldq $8 define <8 x float> @funcF(<8 x float> %a) nounwind uwtable readnone ssp { entry: %shuffle = shufflevector <8 x float> %a, <8 x float> zeroinitializer, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9> diff --git a/test/CodeGen/X86/avx-zext.ll b/test/CodeGen/X86/avx-zext.ll index b630e9d14612..582537ea906f 100755 --- a/test/CodeGen/X86/avx-zext.ll +++ b/test/CodeGen/X86/avx-zext.ll @@ -18,11 +18,10 @@ define <4 x i64> @zext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp ret <4 x i64>%B } - define <8 x i32> @zext_8i8_to_8i32(<8 x i8> %z) { ;CHECK: zext_8i8_to_8i32 ;CHECK: vpunpckhwd -;CHECK: vpunpcklwd +;CHECK: vpmovzxwd ;CHECK: vinsertf128 ;CHECK: ret %t = zext <8 x i8> %z to <8 x i32> diff --git a/test/CodeGen/X86/avx2-conversions.ll b/test/CodeGen/X86/avx2-conversions.ll index b47491335a31..3ce08dcc7370 100755 --- a/test/CodeGen/X86/avx2-conversions.ll +++ b/test/CodeGen/X86/avx2-conversions.ll @@ -63,6 +63,47 @@ define <8 x i32> @zext_8i8_8i32(<8 x i8> %A) nounwind { ret <8 x i32>%B } +; CHECK: load_sext_test1 +; CHECK: vpmovsxdq (%r{{[^,]*}}), %ymm{{.*}} +; CHECK: ret +define <4 x i64> @load_sext_test1(<4 x i32> *%ptr) { + %X = load <4 x i32>* %ptr + %Y = sext <4 x i32> %X to <4 x i64> + ret <4 x i64>%Y +} + +; CHECK: load_sext_test2 +; CHECK: vpmovsxbq (%r{{[^,]*}}), %ymm{{.*}} +; CHECK: ret +define <4 x i64> @load_sext_test2(<4 x i8> *%ptr) { + %X = load <4 x i8>* %ptr + %Y = sext <4 x i8> %X to <4 x i64> + ret <4 x i64>%Y +} +; CHECK: load_sext_test3 +; CHECK: vpmovsxwq (%r{{[^,]*}}), %ymm{{.*}} +; CHECK: ret +define <4 x i64> @load_sext_test3(<4 x i16> *%ptr) { + %X = load <4 x i16>* %ptr + %Y = sext <4 x i16> %X to <4 x i64> + ret <4 x i64>%Y +} +; CHECK: load_sext_test4 +; CHECK: vpmovsxwd (%r{{[^,]*}}), %ymm{{.*}} +; CHECK: ret +define <8 x i32> @load_sext_test4(<8 x i16> *%ptr) { + %X = load <8 x i16>* %ptr + %Y = sext <8 x i16> %X to <8 x i32> + ret <8 x i32>%Y +} +; CHECK: load_sext_test5 +; CHECK: vpmovsxbd (%r{{[^,]*}}), %ymm{{.*}} +; CHECK: ret +define <8 x i32> @load_sext_test5(<8 x i8> *%ptr) { + %X = load <8 x i8>* %ptr + %Y = sext <8 x i8> %X to <8 x i32> + ret <8 x i32>%Y +} diff --git a/test/CodeGen/X86/avx2-logic.ll b/test/CodeGen/X86/avx2-logic.ll index 13ebaa6f8797..a5bb1a8f8e44 100644 --- a/test/CodeGen/X86/avx2-logic.ll +++ b/test/CodeGen/X86/avx2-logic.ll @@ -48,9 +48,8 @@ entry: ; CHECK: vpblendvb ; CHECK: vpblendvb %ymm ; CHECK: ret -define <32 x i8> @vpblendvb(<32 x i8> %x, <32 x i8> %y) { - %min_is_x = icmp ult <32 x i8> %x, %y - %min = select <32 x i1> %min_is_x, <32 x i8> %x, <32 x i8> %y +define <32 x i8> @vpblendvb(<32 x i1> %cond, <32 x i8> %x, <32 x i8> %y) { + %min = select <32 x i1> %cond, <32 x i8> %x, <32 x i8> %y ret <32 x i8> %min } diff --git a/test/CodeGen/X86/avx2-shuffle.ll b/test/CodeGen/X86/avx2-shuffle.ll index a414e6880c32..cf319cb7fe1d 100644 --- a/test/CodeGen/X86/avx2-shuffle.ll +++ b/test/CodeGen/X86/avx2-shuffle.ll @@ -4,15 +4,62 @@ ; The mask for the vpblendw instruction needs to be identical for both halves ; of the YMM. Need to use two vpblendw instructions. -; CHECK: blendw1 -; CHECK: vpblendw -; CHECK: vpblendw +; CHECK: vpblendw_test1 +; mask = 10010110,b = 150,d +; CHECK: vpblendw $150, %ymm ; CHECK: ret -define <16 x i16> @blendw1(<16 x i16> %a, <16 x i16> %b) nounwind alwaysinline { - %t = shufflevector <16 x i16> %a, <16 x i16> %b, <16 x i32> <i32 0, i32 17, i32 18, i32 3, i32 20, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 31> +define <16 x i16> @vpblendw_test1(<16 x i16> %a, <16 x i16> %b) nounwind alwaysinline { + %t = shufflevector <16 x i16> %a, <16 x i16> %b, <16 x i32> <i32 0, i32 17, i32 18, i32 3, i32 20, i32 5, i32 6, i32 23, + i32 8, i32 25, i32 26, i32 11, i32 28, i32 13, i32 14, i32 31> ret <16 x i16> %t } +; CHECK: vpblendw_test2 +; mask1 = 00010110 = 22 +; mask2 = 10000000 = 128 +; CHECK: vpblendw $128, %xmm +; CHECK: vpblendw $22, %xmm +; CHECK: vinserti128 +; CHECK: ret +define <16 x i16> @vpblendw_test2(<16 x i16> %a, <16 x i16> %b) nounwind alwaysinline { + %t = shufflevector <16 x i16> %a, <16 x i16> %b, <16 x i32> <i32 0, i32 17, i32 18, i32 3, i32 20, i32 5, i32 6, i32 7, + i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 31> + ret <16 x i16> %t +} + +; CHECK: blend_test1 +; CHECK: vpblendd +; CHECK: ret +define <8 x i32> @blend_test1(<8 x i32> %a, <8 x i32> %b) nounwind alwaysinline { + %t = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 3, i32 12, i32 5, i32 6, i32 7> + ret <8 x i32> %t +} + +; CHECK: blend_test2 +; CHECK: vpblendd +; CHECK: ret +define <8 x i32> @blend_test2(<8 x i32> %a, <8 x i32> %b) nounwind alwaysinline { + %t = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 3, i32 12, i32 5, i32 6, i32 7> + ret <8 x i32> %t +} + + +; CHECK: blend_test3 +; CHECK: vblendps +; CHECK: ret +define <8 x float> @blend_test3(<8 x float> %a, <8 x float> %b) nounwind alwaysinline { + %t = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 3, i32 12, i32 5, i32 6, i32 7> + ret <8 x float> %t +} + +; CHECK: blend_test4 +; CHECK: vblendpd +; CHECK: ret
+define <4 x i64> @blend_test4(<4 x i64> %a, <4 x i64> %b) nounwind alwaysinline {
+ %t = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 3>
+ ret <4 x i64> %t
+} + ; CHECK: vpshufhw $27, %ymm define <16 x i16> @vpshufhw(<16 x i16> %src1) nounwind uwtable readnone ssp { entry: diff --git a/test/CodeGen/X86/blend-msb.ll b/test/CodeGen/X86/blend-msb.ll index 11f811f8cf63..e565da74a082 100644 --- a/test/CodeGen/X86/blend-msb.ll +++ b/test/CodeGen/X86/blend-msb.ll @@ -5,7 +5,8 @@ ; shifting the needed bit to the MSB, and not using shl+sra. ;CHECK: vsel_float -;CHECK: pslld +;CHECK: movl $-2147483648 +;CHECK-NEXT: movd ;CHECK-NEXT: blendvps ;CHECK: ret define <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) { @@ -14,7 +15,8 @@ define <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) { } ;CHECK: vsel_4xi8 -;CHECK: pslld +;CHECK: movl $-2147483648 +;CHECK-NEXT: movd ;CHECK-NEXT: blendvps ;CHECK: ret define <4 x i8> @vsel_4xi8(<4 x i8> %v1, <4 x i8> %v2) { diff --git a/test/CodeGen/X86/bmi.ll b/test/CodeGen/X86/bmi.ll index 43c47c0fa8a5..b89e648c52d9 100644 --- a/test/CodeGen/X86/bmi.ll +++ b/test/CodeGen/X86/bmi.ll @@ -26,6 +26,14 @@ define i32 @t3(i32 %x) nounwind { ; CHECK: tzcntl } +define i32 @tzcnt32_load(i32* %x) nounwind { + %x1 = load i32* %x + %tmp = tail call i32 @llvm.cttz.i32(i32 %x1, i1 false ) + ret i32 %tmp +; CHECK: tzcnt32_load: +; CHECK: tzcntl ({{.*}}) +} + define i64 @t4(i64 %x) nounwind { %tmp = tail call i64 @llvm.cttz.i64( i64 %x, i1 false ) ret i64 %tmp @@ -69,6 +77,15 @@ define i32 @andn32(i32 %x, i32 %y) nounwind readnone { ; CHECK: andnl } +define i32 @andn32_load(i32 %x, i32* %y) nounwind readnone { + %y1 = load i32* %y + %tmp1 = xor i32 %x, -1 + %tmp2 = and i32 %y1, %tmp1 + ret i32 %tmp2 +; CHECK: andn32_load: +; CHECK: andnl ({{.*}}) +} + define i64 @andn64(i64 %x, i64 %y) nounwind readnone { %tmp1 = xor i64 %x, -1 %tmp2 = and i64 %tmp1, %y @@ -84,6 +101,14 @@ define i32 @bextr32(i32 %x, i32 %y) nounwind readnone { ; CHECK: bextrl } +define i32 @bextr32_load(i32* %x, i32 %y) nounwind readnone { + %x1 = load i32* %x + %tmp = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x1, i32 %y) + ret i32 %tmp +; CHECK: bextr32_load: +; CHECK: bextrl {{.*}}, ({{.*}}), {{.*}} +} + declare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone define i64 @bextr64(i64 %x, i64 %y) nounwind readnone { @@ -102,6 +127,14 @@ define i32 @bzhi32(i32 %x, i32 %y) nounwind readnone { ; CHECK: bzhil } +define i32 @bzhi32_load(i32* %x, i32 %y) nounwind readnone { + %x1 = load i32* %x + %tmp = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %x1, i32 %y) + ret i32 %tmp +; CHECK: bzhi32_load: +; CHECK: bzhil {{.*}}, ({{.*}}), {{.*}} +} + declare i32 @llvm.x86.bmi.bzhi.32(i32, i32) nounwind readnone define i64 @bzhi64(i64 %x, i64 %y) nounwind readnone { @@ -121,6 +154,15 @@ define i32 @blsi32(i32 %x) nounwind readnone { ; CHECK: blsil } +define i32 @blsi32_load(i32* %x) nounwind readnone { + %x1 = load i32* %x + %tmp = sub i32 0, %x1 + %tmp2 = and i32 %x1, %tmp + ret i32 %tmp2 +; CHECK: blsi32_load: +; CHECK: blsil ({{.*}}) +} + define i64 @blsi64(i64 %x) nounwind readnone { %tmp = sub i64 0, %x %tmp2 = and i64 %tmp, %x @@ -137,6 +179,15 @@ define i32 @blsmsk32(i32 %x) nounwind readnone { ; CHECK: blsmskl } +define i32 @blsmsk32_load(i32* %x) nounwind readnone { + %x1 = load i32* %x + %tmp = sub i32 %x1, 1 + %tmp2 = xor i32 %x1, %tmp + ret i32 %tmp2 +; CHECK: blsmsk32_load: +; CHECK: blsmskl ({{.*}}) +} + define i64 @blsmsk64(i64 %x) nounwind readnone { %tmp = sub i64 %x, 1 %tmp2 = xor i64 %tmp, %x @@ -153,6 +204,15 @@ define i32 @blsr32(i32 %x) nounwind readnone { ; CHECK: blsrl } +define i32 @blsr32_load(i32* %x) nounwind readnone { + %x1 = load i32* %x + %tmp = sub i32 %x1, 1 + %tmp2 = and i32 %x1, %tmp + ret i32 %tmp2 +; CHECK: blsr32_load: +; CHECK: blsrl ({{.*}}) +} + define i64 @blsr64(i64 %x) nounwind readnone { %tmp = sub i64 %x, 1 %tmp2 = and i64 %tmp, %x @@ -168,6 +228,14 @@ define i32 @pdep32(i32 %x, i32 %y) nounwind readnone { ; CHECK: pdepl } +define i32 @pdep32_load(i32 %x, i32* %y) nounwind readnone { + %y1 = load i32* %y + %tmp = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 %y1) + ret i32 %tmp +; CHECK: pdep32_load: +; CHECK: pdepl ({{.*}}) +} + declare i32 @llvm.x86.bmi.pdep.32(i32, i32) nounwind readnone define i64 @pdep64(i64 %x, i64 %y) nounwind readnone { @@ -186,6 +254,14 @@ define i32 @pext32(i32 %x, i32 %y) nounwind readnone { ; CHECK: pextl } +define i32 @pext32_load(i32 %x, i32* %y) nounwind readnone { + %y1 = load i32* %y + %tmp = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 %y1) + ret i32 %tmp +; CHECK: pext32_load: +; CHECK: pextl ({{.*}}) +} + declare i32 @llvm.x86.bmi.pext.32(i32, i32) nounwind readnone define i64 @pext64(i64 %x, i64 %y) nounwind readnone { diff --git a/test/CodeGen/X86/bool-simplify.ll b/test/CodeGen/X86/bool-simplify.ll index 09eb5d1038f7..fa6f6e85e9b8 100644 --- a/test/CodeGen/X86/bool-simplify.ll +++ b/test/CodeGen/X86/bool-simplify.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86-64 -mattr=+sse41,-avx,+rdrand | FileCheck %s +; RUN: llc < %s -march=x86-64 -mattr=+sse41,-avx,+rdrand,+rdseed | FileCheck %s define i32 @foo(<2 x i64> %c, i32 %a, i32 %b) { %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c) @@ -39,7 +39,22 @@ define i32 @bax(<2 x i64> %c) { ; CHECK: ret } -define i32 @rnd(i32 %arg) nounwind uwtable { +define i16 @rnd16(i16 %arg) nounwind uwtable { + %1 = tail call { i16, i32 } @llvm.x86.rdrand.16() nounwind + %2 = extractvalue { i16, i32 } %1, 0 + %3 = extractvalue { i16, i32 } %1, 1 + %4 = icmp eq i32 %3, 0 + %5 = select i1 %4, i16 0, i16 %arg + %6 = add i16 %5, %2 + ret i16 %6 +; CHECK: rnd16 +; CHECK: rdrand +; CHECK: cmov +; CHECK-NOT: cmov +; CHECK: ret +} + +define i32 @rnd32(i32 %arg) nounwind uwtable { %1 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind %2 = extractvalue { i32, i32 } %1, 0 %3 = extractvalue { i32, i32 } %1, 1 @@ -47,12 +62,77 @@ define i32 @rnd(i32 %arg) nounwind uwtable { %5 = select i1 %4, i32 0, i32 %arg %6 = add i32 %5, %2 ret i32 %6 -; CHECK: rnd +; CHECK: rnd32 ; CHECK: rdrand ; CHECK: cmov ; CHECK-NOT: cmov ; CHECK: ret } +define i64 @rnd64(i64 %arg) nounwind uwtable { + %1 = tail call { i64, i32 } @llvm.x86.rdrand.64() nounwind + %2 = extractvalue { i64, i32 } %1, 0 + %3 = extractvalue { i64, i32 } %1, 1 + %4 = icmp eq i32 %3, 0 + %5 = select i1 %4, i64 0, i64 %arg + %6 = add i64 %5, %2 + ret i64 %6 +; CHECK: rnd64 +; CHECK: rdrand +; CHECK: cmov +; CHECK-NOT: cmov +; CHECK: ret +} + +define i16 @seed16(i16 %arg) nounwind uwtable { + %1 = tail call { i16, i32 } @llvm.x86.rdseed.16() nounwind + %2 = extractvalue { i16, i32 } %1, 0 + %3 = extractvalue { i16, i32 } %1, 1 + %4 = icmp eq i32 %3, 0 + %5 = select i1 %4, i16 0, i16 %arg + %6 = add i16 %5, %2 + ret i16 %6 +; CHECK: seed16 +; CHECK: rdseed +; CHECK: cmov +; CHECK-NOT: cmov +; CHECK: ret +} + +define i32 @seed32(i32 %arg) nounwind uwtable { + %1 = tail call { i32, i32 } @llvm.x86.rdseed.32() nounwind + %2 = extractvalue { i32, i32 } %1, 0 + %3 = extractvalue { i32, i32 } %1, 1 + %4 = icmp eq i32 %3, 0 + %5 = select i1 %4, i32 0, i32 %arg + %6 = add i32 %5, %2 + ret i32 %6 +; CHECK: seed32 +; CHECK: rdseed +; CHECK: cmov +; CHECK-NOT: cmov +; CHECK: ret +} + +define i64 @seed64(i64 %arg) nounwind uwtable { + %1 = tail call { i64, i32 } @llvm.x86.rdseed.64() nounwind + %2 = extractvalue { i64, i32 } %1, 0 + %3 = extractvalue { i64, i32 } %1, 1 + %4 = icmp eq i32 %3, 0 + %5 = select i1 %4, i64 0, i64 %arg + %6 = add i64 %5, %2 + ret i64 %6 +; CHECK: seed64 +; CHECK: rdseed +; CHECK: cmov +; CHECK-NOT: cmov +; CHECK: ret +} + declare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) nounwind readnone +declare { i16, i32 } @llvm.x86.rdrand.16() nounwind declare { i32, i32 } @llvm.x86.rdrand.32() nounwind +declare { i64, i32 } @llvm.x86.rdrand.64() nounwind +declare { i16, i32 } @llvm.x86.rdseed.16() nounwind +declare { i32, i32 } @llvm.x86.rdseed.32() nounwind +declare { i64, i32 } @llvm.x86.rdseed.64() nounwind diff --git a/test/CodeGen/X86/bt.ll b/test/CodeGen/X86/bt.ll index ec447e5e9c81..39a784dec37d 100644 --- a/test/CodeGen/X86/bt.ll +++ b/test/CodeGen/X86/bt.ll @@ -1,6 +1,4 @@ -; RUN: llc < %s -march=x86 | grep btl | count 28 -; RUN: llc < %s -march=x86 -mcpu=pentium4 | grep btl | not grep esp -; RUN: llc < %s -march=x86 -mcpu=penryn | grep btl | not grep esp +; RUN: llc < %s -mtriple=i386-apple-macosx -mcpu=penryn | FileCheck %s ; PR3253 ; The register+memory form of the BT instruction should be usable on @@ -21,6 +19,9 @@ define void @test2(i32 %x, i32 %n) nounwind { entry: +; CHECK: test2 +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = lshr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, 1 ; <i32> [#uses=1] %tmp4 = icmp eq i32 %tmp3, 0 ; <i1> [#uses=1] @@ -36,6 +37,9 @@ UnifiedReturnBlock: ; preds = %entry define void @test2b(i32 %x, i32 %n) nounwind { entry: +; CHECK: test2b +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = lshr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 1, %tmp29 %tmp4 = icmp eq i32 %tmp3, 0 ; <i1> [#uses=1] @@ -51,6 +55,9 @@ UnifiedReturnBlock: ; preds = %entry define void @atest2(i32 %x, i32 %n) nounwind { entry: +; CHECK: atest2 +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = ashr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, 1 ; <i32> [#uses=1] %tmp4 = icmp eq i32 %tmp3, 0 ; <i1> [#uses=1] @@ -66,6 +73,8 @@ UnifiedReturnBlock: ; preds = %entry define void @atest2b(i32 %x, i32 %n) nounwind { entry: +; CHECK: atest2b +; CHECK: btl %eax, %ecx %tmp29 = ashr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 1, %tmp29 %tmp4 = icmp eq i32 %tmp3, 0 ; <i1> [#uses=1] @@ -81,6 +90,9 @@ UnifiedReturnBlock: ; preds = %entry define void @test3(i32 %x, i32 %n) nounwind { entry: +; CHECK: test3 +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, %x ; <i32> [#uses=1] %tmp4 = icmp eq i32 %tmp3, 0 ; <i1> [#uses=1] @@ -96,6 +108,9 @@ UnifiedReturnBlock: ; preds = %entry define void @test3b(i32 %x, i32 %n) nounwind { entry: +; CHECK: test3b +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %x, %tmp29 %tmp4 = icmp eq i32 %tmp3, 0 ; <i1> [#uses=1] @@ -111,6 +126,9 @@ UnifiedReturnBlock: ; preds = %entry define void @testne2(i32 %x, i32 %n) nounwind { entry: +; CHECK: testne2 +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = lshr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, 1 ; <i32> [#uses=1] %tmp4 = icmp ne i32 %tmp3, 0 ; <i1> [#uses=1] @@ -126,6 +144,9 @@ UnifiedReturnBlock: ; preds = %entry define void @testne2b(i32 %x, i32 %n) nounwind { entry: +; CHECK: testne2b +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = lshr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 1, %tmp29 %tmp4 = icmp ne i32 %tmp3, 0 ; <i1> [#uses=1] @@ -141,6 +162,9 @@ UnifiedReturnBlock: ; preds = %entry define void @atestne2(i32 %x, i32 %n) nounwind { entry: +; CHECK: atestne2 +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = ashr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, 1 ; <i32> [#uses=1] %tmp4 = icmp ne i32 %tmp3, 0 ; <i1> [#uses=1] @@ -156,6 +180,9 @@ UnifiedReturnBlock: ; preds = %entry define void @atestne2b(i32 %x, i32 %n) nounwind { entry: +; CHECK: atestne2b +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = ashr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 1, %tmp29 %tmp4 = icmp ne i32 %tmp3, 0 ; <i1> [#uses=1] @@ -171,6 +198,9 @@ UnifiedReturnBlock: ; preds = %entry define void @testne3(i32 %x, i32 %n) nounwind { entry: +; CHECK: testne3 +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, %x ; <i32> [#uses=1] %tmp4 = icmp ne i32 %tmp3, 0 ; <i1> [#uses=1] @@ -186,6 +216,9 @@ UnifiedReturnBlock: ; preds = %entry define void @testne3b(i32 %x, i32 %n) nounwind { entry: +; CHECK: testne3b +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %x, %tmp29 %tmp4 = icmp ne i32 %tmp3, 0 ; <i1> [#uses=1] @@ -201,6 +234,9 @@ UnifiedReturnBlock: ; preds = %entry define void @query2(i32 %x, i32 %n) nounwind { entry: +; CHECK: query2 +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = lshr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, 1 ; <i32> [#uses=1] %tmp4 = icmp eq i32 %tmp3, 1 ; <i1> [#uses=1] @@ -216,6 +252,9 @@ UnifiedReturnBlock: ; preds = %entry define void @query2b(i32 %x, i32 %n) nounwind { entry: +; CHECK: query2b +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = lshr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 1, %tmp29 %tmp4 = icmp eq i32 %tmp3, 1 ; <i1> [#uses=1] @@ -231,6 +270,9 @@ UnifiedReturnBlock: ; preds = %entry define void @aquery2(i32 %x, i32 %n) nounwind { entry: +; CHECK: aquery2 +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = ashr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, 1 ; <i32> [#uses=1] %tmp4 = icmp eq i32 %tmp3, 1 ; <i1> [#uses=1] @@ -246,6 +288,9 @@ UnifiedReturnBlock: ; preds = %entry define void @aquery2b(i32 %x, i32 %n) nounwind { entry: +; CHECK: aquery2b +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = ashr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 1, %tmp29 %tmp4 = icmp eq i32 %tmp3, 1 ; <i1> [#uses=1] @@ -261,6 +306,9 @@ UnifiedReturnBlock: ; preds = %entry define void @query3(i32 %x, i32 %n) nounwind { entry: +; CHECK: query3 +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, %x ; <i32> [#uses=1] %tmp4 = icmp eq i32 %tmp3, %tmp29 ; <i1> [#uses=1] @@ -276,6 +324,9 @@ UnifiedReturnBlock: ; preds = %entry define void @query3b(i32 %x, i32 %n) nounwind { entry: +; CHECK: query3b +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %x, %tmp29 %tmp4 = icmp eq i32 %tmp3, %tmp29 ; <i1> [#uses=1] @@ -291,6 +342,9 @@ UnifiedReturnBlock: ; preds = %entry define void @query3x(i32 %x, i32 %n) nounwind { entry: +; CHECK: query3x +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, %x ; <i32> [#uses=1] %tmp4 = icmp eq i32 %tmp29, %tmp3 ; <i1> [#uses=1] @@ -306,6 +360,9 @@ UnifiedReturnBlock: ; preds = %entry define void @query3bx(i32 %x, i32 %n) nounwind { entry: +; CHECK: query3bx +; CHECK: btl %eax, %ecx +; CHECK: jae %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %x, %tmp29 %tmp4 = icmp eq i32 %tmp29, %tmp3 ; <i1> [#uses=1] @@ -321,6 +378,9 @@ UnifiedReturnBlock: ; preds = %entry define void @queryne2(i32 %x, i32 %n) nounwind { entry: +; CHECK: queryne2 +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = lshr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, 1 ; <i32> [#uses=1] %tmp4 = icmp ne i32 %tmp3, 1 ; <i1> [#uses=1] @@ -336,6 +396,9 @@ UnifiedReturnBlock: ; preds = %entry define void @queryne2b(i32 %x, i32 %n) nounwind { entry: +; CHECK: queryne2b +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = lshr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 1, %tmp29 %tmp4 = icmp ne i32 %tmp3, 1 ; <i1> [#uses=1] @@ -351,6 +414,9 @@ UnifiedReturnBlock: ; preds = %entry define void @aqueryne2(i32 %x, i32 %n) nounwind { entry: +; CHECK: aqueryne2 +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = ashr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, 1 ; <i32> [#uses=1] %tmp4 = icmp ne i32 %tmp3, 1 ; <i1> [#uses=1] @@ -366,6 +432,9 @@ UnifiedReturnBlock: ; preds = %entry define void @aqueryne2b(i32 %x, i32 %n) nounwind { entry: +; CHECK: aqueryne2b +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = ashr i32 %x, %n ; <i32> [#uses=1] %tmp3 = and i32 1, %tmp29 %tmp4 = icmp ne i32 %tmp3, 1 ; <i1> [#uses=1] @@ -381,6 +450,9 @@ UnifiedReturnBlock: ; preds = %entry define void @queryne3(i32 %x, i32 %n) nounwind { entry: +; CHECK: queryne3 +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, %x ; <i32> [#uses=1] %tmp4 = icmp ne i32 %tmp3, %tmp29 ; <i1> [#uses=1] @@ -396,6 +468,9 @@ UnifiedReturnBlock: ; preds = %entry define void @queryne3b(i32 %x, i32 %n) nounwind { entry: +; CHECK: queryne3b +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %x, %tmp29 %tmp4 = icmp ne i32 %tmp3, %tmp29 ; <i1> [#uses=1] @@ -411,6 +486,9 @@ UnifiedReturnBlock: ; preds = %entry define void @queryne3x(i32 %x, i32 %n) nounwind { entry: +; CHECK: queryne3x +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %tmp29, %x ; <i32> [#uses=1] %tmp4 = icmp ne i32 %tmp29, %tmp3 ; <i1> [#uses=1] @@ -426,6 +504,9 @@ UnifiedReturnBlock: ; preds = %entry define void @queryne3bx(i32 %x, i32 %n) nounwind { entry: +; CHECK: queryne3bx +; CHECK: btl %eax, %ecx +; CHECK: jb %tmp29 = shl i32 1, %n ; <i32> [#uses=1] %tmp3 = and i32 %x, %tmp29 %tmp4 = icmp ne i32 %tmp29, %tmp3 ; <i1> [#uses=1] @@ -440,3 +521,16 @@ UnifiedReturnBlock: ; preds = %entry } declare void @foo() + +; rdar://12755626 +define zeroext i1 @invert(i32 %flags, i32 %flag) nounwind { +; CHECK: invert +; CHECK: btl %eax, %ecx +; CHECK: setae +entry: + %neg = xor i32 %flags, -1 + %shl = shl i32 1, %flag + %and = and i32 %shl, %neg + %tobool = icmp ne i32 %and, 0 + ret i1 %tobool +} diff --git a/test/CodeGen/X86/byval2.ll b/test/CodeGen/X86/byval2.ll index 196efe58e6f3..c5187db6de4b 100644 --- a/test/CodeGen/X86/byval2.ll +++ b/test/CodeGen/X86/byval2.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=X64 +; RUN: llc < %s -mtriple=x86_64-linux -mattr=-avx | FileCheck %s -check-prefix=X64 ; X64-NOT: movsq ; X64: rep ; X64-NOT: rep @@ -12,7 +12,7 @@ ; Win64 has not supported byval yet. -; RUN: llc < %s -march=x86 | FileCheck %s -check-prefix=X32 +; RUN: llc < %s -march=x86 -mattr=-avx | FileCheck %s -check-prefix=X32 ; X32-NOT: movsl ; X32: rep ; X32-NOT: rep diff --git a/test/CodeGen/X86/byval3.ll b/test/CodeGen/X86/byval3.ll index f3b125c6e3ba..d06fd8898e7f 100644 --- a/test/CodeGen/X86/byval3.ll +++ b/test/CodeGen/X86/byval3.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=X64 +; RUN: llc < %s -mtriple=x86_64-linux -mattr=-avx | FileCheck %s -check-prefix=X64 ; X64-NOT: movsq ; X64: rep ; X64-NOT: rep @@ -12,7 +12,7 @@ ; Win64 has not supported byval yet. -; RUN: llc < %s -march=x86 | FileCheck %s -check-prefix=X32 +; RUN: llc < %s -march=x86 -mattr=-avx | FileCheck %s -check-prefix=X32 ; X32-NOT: movsl ; X32: rep ; X32-NOT: rep diff --git a/test/CodeGen/X86/byval4.ll b/test/CodeGen/X86/byval4.ll index b7a4aa3f9b01..4711e4511112 100644 --- a/test/CodeGen/X86/byval4.ll +++ b/test/CodeGen/X86/byval4.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=X64 +; RUN: llc < %s -mtriple=x86_64-linux -mattr=-avx | FileCheck %s -check-prefix=X64 ; X64-NOT: movsq ; X64: rep ; X64-NOT: rep @@ -12,7 +12,7 @@ ; Win64 has not supported byval yet. -; RUN: llc < %s -march=x86 | FileCheck %s -check-prefix=X32 +; RUN: llc < %s -march=x86 -mattr=-avx | FileCheck %s -check-prefix=X32 ; X32-NOT: movsl ; X32: rep ; X32-NOT: rep diff --git a/test/CodeGen/X86/byval5.ll b/test/CodeGen/X86/byval5.ll index dca093602241..f24a5f9aa3b4 100644 --- a/test/CodeGen/X86/byval5.ll +++ b/test/CodeGen/X86/byval5.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=X64 +; RUN: llc < %s -mtriple=x86_64-linux -mattr=-avx | FileCheck %s -check-prefix=X64 ; X64-NOT: movsq ; X64: rep ; X64-NOT: rep @@ -12,7 +12,7 @@ ; Win64 has not supported byval yet. -; RUN: llc < %s -march=x86 | FileCheck %s -check-prefix=X32 +; RUN: llc < %s -march=x86 -mattr=-avx | FileCheck %s -check-prefix=X32 ; X32-NOT: movsl ; X32: rep ; X32-NOT: rep diff --git a/test/CodeGen/X86/cas.ll b/test/CodeGen/X86/cas.ll new file mode 100644 index 000000000000..c2dd05ef7302 --- /dev/null +++ b/test/CodeGen/X86/cas.ll @@ -0,0 +1,73 @@ +; RUN: llc -mtriple=x86_64-pc-linux-gnu %s -o - | FileCheck %s + +; C code this came from +;bool cas(float volatile *p, float *expected, float desired) { +; bool success; +; __asm__ __volatile__("lock; cmpxchg %[desired], %[mem]; " +; "mov %[expected], %[expected_out]; " +; "sete %[success]" +; : [success] "=a" (success), +; [expected_out] "=rm" (*expected) +; : [expected] "a" (*expected), +; [desired] "q" (desired), +; [mem] "m" (*p) +; : "memory", "cc"); +; return success; +;} + +define zeroext i1 @cas(float* %p, float* %expected, float %desired) nounwind { +entry: + %p.addr = alloca float*, align 8 + %expected.addr = alloca float*, align 8 + %desired.addr = alloca float, align 4 + %success = alloca i8, align 1 + store float* %p, float** %p.addr, align 8 + store float* %expected, float** %expected.addr, align 8 + store float %desired, float* %desired.addr, align 4 + %0 = load float** %expected.addr, align 8 + %1 = load float** %expected.addr, align 8 + %2 = load float* %1, align 4 + %3 = load float* %desired.addr, align 4 + %4 = load float** %p.addr, align 8 + %5 = call i8 asm sideeffect "lock; cmpxchg $3, $4; mov $2, $1; sete $0", "={ax},=*rm,{ax},q,*m,~{memory},~{cc},~{dirflag},~{fpsr},~{flags}"(float* %0, float %2, float %3, float* %4) nounwind + store i8 %5, i8* %success, align 1 + %6 = load i8* %success, align 1 + %tobool = trunc i8 %6 to i1 + ret i1 %tobool +} + +; CHECK: @cas +; Make sure we're emitting a move from eax. +; CHECK: #APP +; CHECK-NEXT: lock;{{.*}}mov %eax,{{.*}} +; CHECK-NEXT: #NO_APP + +define zeroext i1 @cas2(i8* %p, i8* %expected, i1 zeroext %desired) nounwind { +entry: + %p.addr = alloca i8*, align 8 + %expected.addr = alloca i8*, align 8 + %desired.addr = alloca i8, align 1 + %success = alloca i8, align 1 + store i8* %p, i8** %p.addr, align 8 + store i8* %expected, i8** %expected.addr, align 8 + %frombool = zext i1 %desired to i8 + store i8 %frombool, i8* %desired.addr, align 1 + %0 = load i8** %expected.addr, align 8 + %1 = load i8** %expected.addr, align 8 + %2 = load i8* %1, align 1 + %tobool = trunc i8 %2 to i1 + %3 = load i8* %desired.addr, align 1 + %tobool1 = trunc i8 %3 to i1 + %4 = load i8** %p.addr, align 8 + %5 = call i8 asm sideeffect "lock; cmpxchg $3, $4; mov $2, $1; sete $0", "={ax},=*rm,{ax},q,*m,~{memory},~{cc},~{dirflag},~{fpsr},~{flags}"(i8* %0, i1 %tobool, i1 %tobool1, i8* %4) nounwind + store i8 %5, i8* %success, align 1 + %6 = load i8* %success, align 1 + %tobool2 = trunc i8 %6 to i1 + ret i1 %tobool2 +} + +; CHECK: @cas2 +; Make sure we're emitting a move from %al here. +; CHECK: #APP +; CHECK-NEXT: lock;{{.*}}mov %al,{{.*}} +; CHECK-NEXT: #NO_APP diff --git a/test/CodeGen/X86/clobber-fi0.ll b/test/CodeGen/X86/clobber-fi0.ll new file mode 100644 index 000000000000..38a42dbf1aa1 --- /dev/null +++ b/test/CodeGen/X86/clobber-fi0.ll @@ -0,0 +1,37 @@ +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +; In the code below we need to copy the EFLAGS because of scheduling constraints. +; When copying the EFLAGS we need to write to the stack with push/pop. This forces +; us to emit the prolog. + +; CHECK: main +; CHECK: subq{{.*}}rsp +; CHECK: ret +define i32 @main(i32 %arg, i8** %arg1) nounwind { +bb: + %tmp = alloca i32, align 4 ; [#uses=3 type=i32*] + %tmp2 = alloca i32, align 4 ; [#uses=3 type=i32*] + %tmp3 = alloca i32 ; [#uses=1 type=i32*] + store i32 1, i32* %tmp, align 4 + store i32 1, i32* %tmp2, align 4 + br label %bb4 + +bb4: ; preds = %bb4, %bb + %tmp6 = load i32* %tmp2, align 4 ; [#uses=1 type=i32] + %tmp7 = add i32 %tmp6, -1 ; [#uses=2 type=i32] + store i32 %tmp7, i32* %tmp2, align 4 + %tmp8 = icmp eq i32 %tmp7, 0 ; [#uses=1 type=i1] + %tmp9 = load i32* %tmp ; [#uses=1 type=i32] + %tmp10 = add i32 %tmp9, -1 ; [#uses=1 type=i32] + store i32 %tmp10, i32* %tmp3 + br i1 %tmp8, label %bb11, label %bb4 + +bb11: ; preds = %bb4 + %tmp12 = load i32* %tmp, align 4 ; [#uses=1 type=i32] + ret i32 %tmp12 +} + + diff --git a/test/CodeGen/X86/cmp.ll b/test/CodeGen/X86/cmp.ll index eb06327f55a6..1855fe2fb89e 100644 --- a/test/CodeGen/X86/cmp.ll +++ b/test/CodeGen/X86/cmp.ll @@ -151,3 +151,18 @@ entry: %conv = zext i1 %cmp to i32 ret i32 %conv } + +define i32 @test12() uwtable ssp { +; CHECK: test12: +; CHECK: testb + %1 = call zeroext i1 @test12b() + br i1 %1, label %2, label %3 + +; <label>:2 ; preds = %0 + ret i32 1 + +; <label>:3 ; preds = %0 + ret i32 2 +} + +declare zeroext i1 @test12b() diff --git a/test/CodeGen/X86/coalesce-implicitdef.ll b/test/CodeGen/X86/coalesce-implicitdef.ll new file mode 100644 index 000000000000..19cd08cf3797 --- /dev/null +++ b/test/CodeGen/X86/coalesce-implicitdef.ll @@ -0,0 +1,130 @@ +; RUN: llc < %s -verify-coalescing +; PR14732 +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10" + +@c = common global i32 0, align 4 +@b = common global i32 0, align 4 +@a = common global i32 0, align 4 +@d = common global i32 0, align 4 + +; This function creates an IMPLICIT_DEF with a long live range, even after +; ProcessImplicitDefs. +; +; The coalescer should be able to deal with all kinds of IMPLICIT_DEF live +; ranges, even if they are not common. + +define void @f() nounwind uwtable ssp { +entry: + %i = alloca i32, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc34, %entry + %i.0.load44 = phi i32 [ %inc35, %for.inc34 ], [ undef, %entry ] + %pi.0 = phi i32* [ %pi.4, %for.inc34 ], [ undef, %entry ] + %tobool = icmp eq i32 %i.0.load44, 0 + br i1 %tobool, label %for.end36, label %for.body + +for.body: ; preds = %for.cond + store i32 0, i32* @c, align 4, !tbaa !0 + br label %for.body2 + +for.body2: ; preds = %for.body, %for.inc + %i.0.load45 = phi i32 [ %i.0.load44, %for.body ], [ 0, %for.inc ] + %tobool3 = icmp eq i32 %i.0.load45, 0 + br i1 %tobool3, label %if.then10, label %if.then + +if.then: ; preds = %for.body2 + store i32 0, i32* %i, align 4, !tbaa !0 + br label %for.body6 + +for.body6: ; preds = %if.then, %for.body6 + store i32 0, i32* %i, align 4 + br i1 true, label %for.body6, label %for.inc + +if.then10: ; preds = %for.body2 + store i32 1, i32* @b, align 4, !tbaa !0 + ret void + +for.inc: ; preds = %for.body6 + br i1 undef, label %for.body2, label %if.end30 + +while.condthread-pre-split: ; preds = %label.loopexit, %while.condthread-pre-split.lr.ph.lr.ph, %for.inc27.backedge + %0 = phi i32 [ %inc28, %for.inc27.backedge ], [ %inc285863, %while.condthread-pre-split.lr.ph.lr.ph ], [ %inc2858, %label.loopexit ] + %inc2060 = phi i32 [ %inc20, %for.inc27.backedge ], [ %a.promoted.pre, %while.condthread-pre-split.lr.ph.lr.ph ], [ %inc20, %label.loopexit ] + br label %while.cond + +while.cond: ; preds = %while.condthread-pre-split, %while.cond + %p2.1.in = phi i32* [ %pi.3.ph, %while.cond ], [ %i, %while.condthread-pre-split ] + %p2.1 = bitcast i32* %p2.1.in to i16* + br i1 %tobool19, label %while.end, label %while.cond + +while.end: ; preds = %while.cond + %inc20 = add nsw i32 %inc2060, 1 + %tobool21 = icmp eq i32 %inc2060, 0 + br i1 %tobool21, label %for.inc27.backedge, label %if.then22 + +for.inc27.backedge: ; preds = %while.end, %if.then22 + %inc28 = add nsw i32 %0, 1 + store i32 %inc28, i32* @b, align 4, !tbaa !0 + %tobool17 = icmp eq i32 %inc28, 0 + br i1 %tobool17, label %for.inc27.if.end30.loopexit56_crit_edge, label %while.condthread-pre-split + +if.then22: ; preds = %while.end + %1 = load i16* %p2.1, align 2, !tbaa !3 + %tobool23 = icmp eq i16 %1, 0 + br i1 %tobool23, label %for.inc27.backedge, label %label.loopexit + +label.loopexit: ; preds = %if.then22 + store i32 %inc20, i32* @a, align 4, !tbaa !0 + %inc2858 = add nsw i32 %0, 1 + store i32 %inc2858, i32* @b, align 4, !tbaa !0 + %tobool1759 = icmp eq i32 %inc2858, 0 + br i1 %tobool1759, label %if.end30, label %while.condthread-pre-split + +for.inc27.if.end30.loopexit56_crit_edge: ; preds = %for.inc27.backedge + store i32 %inc20, i32* @a, align 4, !tbaa !0 + br label %if.end30 + +if.end30: ; preds = %for.inc27.if.end30.loopexit56_crit_edge, %label.loopexit, %label.preheader, %for.inc + %i.0.load46 = phi i32 [ 0, %for.inc ], [ %i.0.load4669, %label.preheader ], [ %i.0.load4669, %label.loopexit ], [ %i.0.load4669, %for.inc27.if.end30.loopexit56_crit_edge ] + %pi.4 = phi i32* [ %i, %for.inc ], [ %pi.3.ph, %label.preheader ], [ %pi.3.ph, %label.loopexit ], [ %pi.3.ph, %for.inc27.if.end30.loopexit56_crit_edge ] + %2 = load i32* %pi.4, align 4, !tbaa !0 + %tobool31 = icmp eq i32 %2, 0 + br i1 %tobool31, label %for.inc34, label %label.preheader + +for.inc34: ; preds = %if.end30 + %inc35 = add nsw i32 %i.0.load46, 1 + store i32 %inc35, i32* %i, align 4 + br label %for.cond + +for.end36: ; preds = %for.cond + store i32 1, i32* %i, align 4 + %3 = load i32* @c, align 4, !tbaa !0 + %tobool37 = icmp eq i32 %3, 0 + br i1 %tobool37, label %label.preheader, label %land.rhs + +land.rhs: ; preds = %for.end36 + store i32 0, i32* @a, align 4, !tbaa !0 + br label %label.preheader + +label.preheader: ; preds = %for.end36, %if.end30, %land.rhs + %i.0.load4669 = phi i32 [ 1, %land.rhs ], [ %i.0.load46, %if.end30 ], [ 1, %for.end36 ] + %pi.3.ph = phi i32* [ %pi.0, %land.rhs ], [ %pi.4, %if.end30 ], [ %pi.0, %for.end36 ] + %4 = load i32* @b, align 4, !tbaa !0 + %inc285863 = add nsw i32 %4, 1 + store i32 %inc285863, i32* @b, align 4, !tbaa !0 + %tobool175964 = icmp eq i32 %inc285863, 0 + br i1 %tobool175964, label %if.end30, label %while.condthread-pre-split.lr.ph.lr.ph + +while.condthread-pre-split.lr.ph.lr.ph: ; preds = %label.preheader + %.pr50 = load i32* @d, align 4, !tbaa !0 + %tobool19 = icmp eq i32 %.pr50, 0 + %a.promoted.pre = load i32* @a, align 4, !tbaa !0 + br label %while.condthread-pre-split +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"short", metadata !1} diff --git a/test/CodeGen/X86/coldcc64.ll b/test/CodeGen/X86/coldcc64.ll new file mode 100644 index 000000000000..4db56bbaea2d --- /dev/null +++ b/test/CodeGen/X86/coldcc64.ll @@ -0,0 +1,24 @@ +; RUN: llc < %s | FileCheck %s + +target triple = "x86_64-linux-gnu" + +define coldcc void @foo() { +; CHECK: pushq %rbp +; CHECK: pushq %r15 +; CHECK: pushq %r14 +; CHECK: pushq %r13 +; CHECK: pushq %r12 +; CHECK: pushq %r11 +; CHECK: pushq %r10 +; CHECK: pushq %r9 +; CHECK: pushq %r8 +; CHECK: pushq %rdi +; CHECK: pushq %rsi +; CHECK: pushq %rdx +; CHECK: pushq %rcx +; CHECK: pushq %rbx +; CHECK: movaps %xmm15 +; CHECK: movaps %xmm0 + call void asm sideeffect "", "~{xmm15},~{xmm0},~{rbp},~{r15},~{r14},~{r13},~{r12},~{r11},~{r10},~{r9},~{r8},~{rdi},~{rsi},~{rdx},~{rcx},~{rbx}"() + ret void +} diff --git a/test/CodeGen/X86/complex-fca.ll b/test/CodeGen/X86/complex-fca.ll index 7e7acaa98a76..8ad38a4ee5c0 100644 --- a/test/CodeGen/X86/complex-fca.ll +++ b/test/CodeGen/X86/complex-fca.ll @@ -1,5 +1,8 @@ ; RUN: llc < %s -march=x86 | grep mov | count 2 +; Skip this on Windows as there is no ccosl and sret behaves differently. +; XFAIL: pc-win32 + define void @ccosl({ x86_fp80, x86_fp80 }* noalias sret %agg.result, { x86_fp80, x86_fp80 } %z) nounwind { entry: %z8 = extractvalue { x86_fp80, x86_fp80 } %z, 0 diff --git a/test/CodeGen/X86/constant-pool-remat-0.ll b/test/CodeGen/X86/constant-pool-remat-0.ll index 4be14d2128ef..4a0110896ced 100644 --- a/test/CodeGen/X86/constant-pool-remat-0.ll +++ b/test/CodeGen/X86/constant-pool-remat-0.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s ; RUN: llc < %s -mtriple=x86_64-linux -regalloc=greedy | FileCheck %s ; RUN: llc < %s -march=x86 -mattr=+sse2 | FileCheck %s diff --git a/test/CodeGen/X86/convert-2-addr-3-addr-inc64.ll b/test/CodeGen/X86/convert-2-addr-3-addr-inc64.ll index 064ee364d14e..74a7240c8190 100644 --- a/test/CodeGen/X86/convert-2-addr-3-addr-inc64.ll +++ b/test/CodeGen/X86/convert-2-addr-3-addr-inc64.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -mtriple=x86_64-linux -o /dev/null -stats 2>&1 | FileCheck %s -check-prefix=STATS ; RUN: llc < %s -mtriple=x86_64-win32 -o /dev/null -stats 2>&1 | FileCheck %s -check-prefix=STATS ; STATS: 9 asm-printer diff --git a/test/CodeGen/X86/crash.ll b/test/CodeGen/X86/crash.ll index 276d0db9a4f3..6d2196206e7c 100644 --- a/test/CodeGen/X86/crash.ll +++ b/test/CodeGen/X86/crash.ll @@ -431,7 +431,7 @@ return: ; preds = %entry ; uitofp expands to an FCMOV instruction which splits the basic block. ; Make sure the live range of %AL isn't split. @.str = private unnamed_addr constant { [1 x i8], [63 x i8] } zeroinitializer, align 32 -define void @pr13188(i64* nocapture %this) uwtable ssp address_safety align 2 { +define void @pr13188(i64* nocapture %this) uwtable ssp sanitize_address align 2 { entry: %x7 = load i64* %this, align 8 %sub = add i64 %x7, -1 diff --git a/test/CodeGen/X86/cvtv2f32.ll b/test/CodeGen/X86/cvtv2f32.ll index 466b09606786..d11bb9ee3e75 100644 --- a/test/CodeGen/X86/cvtv2f32.ll +++ b/test/CodeGen/X86/cvtv2f32.ll @@ -1,3 +1,7 @@ +; A bug fix in the DAGCombiner made this test fail, so marking as xfail +; until this can be investigated further. +; XFAIL: * + ; RUN: llc < %s -mtriple=i686-linux-pc -mcpu=corei7 | FileCheck %s define <2 x float> @foo(i32 %x, i32 %y, <2 x float> %v) { diff --git a/test/CodeGen/X86/dagcombine-cse.ll b/test/CodeGen/X86/dagcombine-cse.ll index af69531246cf..75d3d93ddb89 100644 --- a/test/CodeGen/X86/dagcombine-cse.ll +++ b/test/CodeGen/X86/dagcombine-cse.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -mattr=+sse2 -mtriple=i386-apple-darwin -stats 2>&1 | grep asm-printer | grep 14 define i32 @t(i8* %ref_frame_ptr, i32 %ref_frame_stride, i32 %idxX, i32 %idxY) nounwind { diff --git a/test/CodeGen/X86/dagcombine_unsafe_math.ll b/test/CodeGen/X86/dagcombine_unsafe_math.ll new file mode 100644 index 000000000000..592cf1bec2e5 --- /dev/null +++ b/test/CodeGen/X86/dagcombine_unsafe_math.ll @@ -0,0 +1,56 @@ +; RUN: llc < %s -enable-unsafe-fp-math -mtriple=x86_64-apple-darwin -mcpu=corei7-avx | FileCheck %s + + +; rdar://13126763 +; Expression "x + x*x" was mistakenly transformed into "x * 3.0f". + +define float @test1(float %x) { + %t1 = fmul fast float %x, %x + %t2 = fadd fast float %t1, %x + ret float %t2 +; CHECK: test1 +; CHECK: vaddss +} + +; (x + x) + x => x * 3.0 +define float @test2(float %x) { + %t1 = fadd fast float %x, %x + %t2 = fadd fast float %t1, %x + ret float %t2 +; CHECK: .long 1077936128 +; CHECK: test2 +; CHECK: vmulss LCPI1_0(%rip), %xmm0, %xmm0 +} + +; x + (x + x) => x * 3.0 +define float @test3(float %x) { + %t1 = fadd fast float %x, %x + %t2 = fadd fast float %t1, %x + ret float %t2 +; CHECK: .long 1077936128 +; CHECK: test3 +; CHECK: vmulss LCPI2_0(%rip), %xmm0, %xmm0 +} + +; (y + x) + x != x * 3.0 +define float @test4(float %x, float %y) { + %t1 = fadd fast float %x, %y + %t2 = fadd fast float %t1, %x + ret float %t2 +; CHECK: test4 +; CHECK: vaddss +} + +; rdar://13445387 +; "x + x + x => 3.0 * x" should be disabled after legalization because +; Instruction-Selection dosen't know how to handle "3.0" +; +define float @test5() { + %mul.i.i151 = fmul <4 x float> zeroinitializer, zeroinitializer + %vecext.i8.i152 = extractelement <4 x float> %mul.i.i151, i32 1 + %vecext1.i9.i153 = extractelement <4 x float> %mul.i.i151, i32 0 + %add.i10.i154 = fadd float %vecext1.i9.i153, %vecext.i8.i152 + %vecext.i7.i155 = extractelement <4 x float> %mul.i.i151, i32 2 + %add.i.i156 = fadd float %vecext.i7.i155, %add.i10.i154 + ret float %add.i.i156 +} diff --git a/test/CodeGen/X86/dbg-at-specficiation.ll b/test/CodeGen/X86/dbg-at-specficiation.ll index aa5e6efede27..48b8202bd5fa 100644 --- a/test/CodeGen/X86/dbg-at-specficiation.ll +++ b/test/CodeGen/X86/dbg-at-specficiation.ll @@ -17,4 +17,4 @@ !7 = metadata !{i32 720897, null, metadata !"", null, i32 0, i64 320, i64 32, i32 0, i32 0, metadata !8, metadata !9, i32 0, i32 0} ; [ DW_TAG_array_type ] !8 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !9 = metadata !{metadata !10} -!10 = metadata !{i32 720929, i64 0, i64 9} ; [ DW_TAG_subrange_type ] +!10 = metadata !{i32 720929, i64 0, i64 10} ; [ DW_TAG_subrange_type ] diff --git a/test/CodeGen/X86/dbg-byval-parameter.ll b/test/CodeGen/X86/dbg-byval-parameter.ll index 5e5577620d97..aca06a27a1df 100644 --- a/test/CodeGen/X86/dbg-byval-parameter.ll +++ b/test/CodeGen/X86/dbg-byval-parameter.ll @@ -25,21 +25,25 @@ return: ; preds = %entry declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone -!0 = metadata !{i32 524545, metadata !1, metadata !"my_r0", metadata !2, i32 11, metadata !7} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 11, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"b2.c", metadata !"/tmp/", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"b2.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!llvm.dbg.cu = !{!3} + +!0 = metadata !{i32 786689, metadata !1, metadata !"my_r0", metadata !2, i32 11, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 11, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, double (%struct.Rect*)* @foo, null, null, null, i32 0} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !19} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 1, metadata !2, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, null, null, metadata !18, null, metadata !""} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !19, metadata !2, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6, metadata !7} -!6 = metadata !{i32 524324, metadata !2, metadata !"double", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 524307, metadata !2, metadata !"Rect", metadata !2, i32 6, i64 256, i64 64, i64 0, i32 0, null, metadata !8, i32 0, null} ; [ DW_TAG_structure_type ] +!6 = metadata !{i32 786468, metadata !19, metadata !2, metadata !"double", i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786451, metadata !19, metadata !2, metadata !"Rect", i32 6, i64 256, i64 64, i64 0, i32 0, null, metadata !8, i32 0, null} ; [ DW_TAG_structure_type ] !8 = metadata !{metadata !9, metadata !14} -!9 = metadata !{i32 524301, metadata !7, metadata !"P1", metadata !2, i32 7, i64 128, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] -!10 = metadata !{i32 524307, metadata !2, metadata !"Pt", metadata !2, i32 1, i64 128, i64 64, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_structure_type ] +!9 = metadata !{i32 786445, metadata !19, metadata !7, metadata !"P1", i32 7, i64 128, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] +!10 = metadata !{i32 786451, metadata !19, metadata !2, metadata !"Pt", i32 1, i64 128, i64 64, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_structure_type ] !11 = metadata !{metadata !12, metadata !13} -!12 = metadata !{i32 524301, metadata !10, metadata !"x", metadata !2, i32 2, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] -!13 = metadata !{i32 524301, metadata !10, metadata !"y", metadata !2, i32 3, i64 64, i64 64, i64 64, i32 0, metadata !6} ; [ DW_TAG_member ] -!14 = metadata !{i32 524301, metadata !7, metadata !"P2", metadata !2, i32 8, i64 128, i64 64, i64 128, i32 0, metadata !10} ; [ DW_TAG_member ] +!12 = metadata !{i32 786445, metadata !19, metadata !10, metadata !"x", i32 2, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] +!13 = metadata !{i32 786445, metadata !19, metadata !10, metadata !"y", i32 3, i64 64, i64 64, i64 64, i32 0, metadata !6} ; [ DW_TAG_member ] +!14 = metadata !{i32 786445, metadata !19, metadata !7, metadata !"P2", i32 8, i64 128, i64 64, i64 128, i32 0, metadata !10} ; [ DW_TAG_member ] !15 = metadata !{i32 11, i32 0, metadata !1, null} !16 = metadata !{i32 12, i32 0, metadata !17, null} -!17 = metadata !{i32 524299, metadata !1, i32 11, i32 0} ; [ DW_TAG_lexical_block ] +!17 = metadata !{i32 786443, metadata !2, metadata !1, i32 11, i32 0} ; [ DW_TAG_lexical_block ] +!18 = metadata !{metadata !1} +!19 = metadata !{metadata !"b2.c", metadata !"/tmp/"} diff --git a/test/CodeGen/X86/dbg-const-int.ll b/test/CodeGen/X86/dbg-const-int.ll index bfc96f17ec9b..aabc2068068d 100644 --- a/test/CodeGen/X86/dbg-const-int.ll +++ b/test/CodeGen/X86/dbg-const-int.ll @@ -13,17 +13,18 @@ entry: declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!llvm.dbg.sp = !{!1} -!llvm.dbg.lv.foo = !{!6} -!0 = metadata !{i32 589841, i32 0, i32 12, metadata !"a.c", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 132191)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"", metadata !2, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, i32 ()* @foo, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"a.c", metadata !"/private/tmp", metadata !0} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589845, 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 ] +!0 = metadata !{i32 786449, i32 12, metadata !2, metadata !"clang version 3.0 (trunk 132191)", i1 true, metadata !"", i32 0, null, null, metadata !11, null, null} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"", metadata !2, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, i32 ()* @foo, null, null, metadata !12, i32 0} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !13} ; [ 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 589860, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 590080, metadata !7, metadata !"i", metadata !2, i32 2, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!7 = metadata !{i32 589835, metadata !1, i32 1, i32 11, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] +!5 = metadata !{i32 786468, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786688, metadata !7, metadata !"i", metadata !2, i32 2, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!7 = metadata !{i32 786443, metadata !2, metadata !1, i32 1, i32 11, i32 0} ; [ DW_TAG_lexical_block ] !8 = metadata !{i32 42} !9 = metadata !{i32 2, i32 12, metadata !7, null} !10 = metadata !{i32 3, i32 2, metadata !7, null} +!11 = metadata !{metadata !1} +!12 = metadata !{metadata !6} +!13 = metadata !{metadata !"a.c", metadata !"/private/tmp"} diff --git a/test/CodeGen/X86/dbg-const.ll b/test/CodeGen/X86/dbg-const.ll index 5a51eb88b895..a9b8f1fdc4f3 100644 --- a/test/CodeGen/X86/dbg-const.ll +++ b/test/CodeGen/X86/dbg-const.ll @@ -16,19 +16,21 @@ entry: declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone declare i32 @bar() nounwind readnone -!llvm.dbg.sp = !{!0} -!llvm.dbg.lv.foobar = !{!6} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foobar", metadata !"foobar", metadata !"foobar", metadata !1, i32 12, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 ()* @foobar} -!1 = metadata !{i32 524329, metadata !"mu.c", metadata !"/private/tmp", metadata !2} -!2 = metadata !{i32 524305, i32 0, i32 12, metadata !"mu.c", metadata !"/private/tmp", metadata !"clang version 2.9 (trunk 114183)", i1 true, i1 true, metadata !"", i32 0} -!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} +!0 = metadata !{i32 786478, metadata !1, metadata !"foobar", metadata !"foobar", metadata !"foobar", metadata !1, i32 12, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 ()* @foobar, null, null, metadata !14, i32 0} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !15} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 12, metadata !1, metadata !"clang version 2.9 (trunk 114183)", i1 true, metadata !"", i32 0, null, null, metadata !13, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} !4 = metadata !{metadata !5} -!5 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} -!6 = metadata !{i32 524544, metadata !7, metadata !"j", metadata !1, i32 15, metadata !5} -!7 = metadata !{i32 524299, metadata !0, i32 12, i32 52, metadata !1, i32 0} +!5 = metadata !{i32 786468, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} +!6 = metadata !{i32 786688, metadata !7, metadata !"j", metadata !1, i32 15, metadata !5, i32 0, null} +!7 = metadata !{i32 786443, metadata !1, metadata !0, i32 12, i32 52, i32 0} ; [ DW_TAG_lexical_block ] !8 = metadata !{i32 42} !9 = metadata !{i32 15, i32 12, metadata !7, null} !10 = metadata !{i32 23, i32 3, metadata !7, null} !11 = metadata !{i32 17, i32 3, metadata !7, null} !12 = metadata !{i32 18, i32 3, metadata !7, null} +!13 = metadata !{metadata !0} +!14 = metadata !{metadata !6} +!15 = metadata !{metadata !"mu.c", metadata !"/private/tmp"} diff --git a/test/CodeGen/X86/dbg-declare-arg.ll b/test/CodeGen/X86/dbg-declare-arg.ll index 367c1ef36c60..f7e0c91cdff2 100644 --- a/test/CodeGen/X86/dbg-declare-arg.ll +++ b/test/CodeGen/X86/dbg-declare-arg.ll @@ -69,55 +69,57 @@ entry: ret void, !dbg !48 } -!llvm.dbg.sp = !{!0, !10, !14, !19, !22, !25} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"~A", metadata !"~A", metadata !"", metadata !3, i32 2, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 786478, metadata !"", i32 0, metadata !1, metadata !"~A", metadata !"~A", metadata !3, i32 2, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null} ; [ DW_TAG_subprogram ] !1 = metadata !{i32 589826, metadata !2, metadata !"A", metadata !3, i32 2, i64 128, i64 32, i32 0, i32 0, null, metadata !4, i32 0, null, null} ; [ DW_TAG_class_type ] -!2 = metadata !{i32 589841, i32 0, i32 4, metadata !"a.cc", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 130127)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589865, metadata !"a.cc", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 4, metadata !3, metadata !"clang version 3.0 (trunk 130127)", i1 false, metadata !"", i32 0, null, null, metadata !50, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786473, metadata !51} ; [ DW_TAG_file_type ] !4 = metadata !{metadata !5, metadata !7, metadata !8, metadata !9, metadata !0, metadata !10, metadata !14} -!5 = metadata !{i32 589837, metadata !3, metadata !"x", metadata !3, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] -!6 = metadata !{i32 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 589837, metadata !3, metadata !"y", metadata !3, i32 2, i64 32, i64 32, i64 32, i32 0, metadata !6} ; [ DW_TAG_member ] -!8 = metadata !{i32 589837, metadata !3, metadata !"z", metadata !3, i32 2, i64 32, i64 32, i64 64, i32 0, metadata !6} ; [ DW_TAG_member ] -!9 = metadata !{i32 589837, metadata !3, metadata !"o", metadata !3, i32 2, i64 32, i64 32, i64 96, i32 0, metadata !6} ; [ DW_TAG_member ] -!10 = metadata !{i32 589870, i32 0, metadata !1, metadata !"A", metadata !"A", metadata !"", metadata !3, i32 2, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 589845, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{i32 786445, metadata !3, metadata !"x", metadata !3, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] +!6 = metadata !{i32 786468, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786445, metadata !3, metadata !"y", metadata !3, i32 2, i64 32, i64 32, i64 32, i32 0, metadata !6} ; [ DW_TAG_member ] +!8 = metadata !{i32 786445, metadata !3, metadata !"z", metadata !3, i32 2, i64 32, i64 32, i64 64, i32 0, metadata !6} ; [ DW_TAG_member ] +!9 = metadata !{i32 786445, metadata !3, metadata !"o", metadata !3, i32 2, i64 32, i64 32, i64 96, i32 0, metadata !6} ; [ DW_TAG_member ] +!10 = metadata !{i32 786478, metadata !"", i32 0, metadata !1, metadata !"A", metadata !"A", metadata !3, i32 2, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 786453, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !12 = metadata !{null, metadata !13} -!13 = metadata !{i32 589839, metadata !2, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !1} ; [ DW_TAG_pointer_type ] -!14 = metadata !{i32 589870, i32 0, metadata !1, metadata !"A", metadata !"A", metadata !"", metadata !3, i32 2, metadata !15, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null} ; [ DW_TAG_subprogram ] -!15 = metadata !{i32 589845, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !16, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!13 = metadata !{i32 786447, metadata !2, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !1} ; [ DW_TAG_pointer_type ] +!14 = metadata !{i32 786478, metadata !"", i32 0, metadata !1, metadata !"A", metadata !"A", metadata !3, i32 2, metadata !15, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null} ; [ DW_TAG_subprogram ] +!15 = metadata !{i32 786453, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !16, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !16 = metadata !{null, metadata !13, metadata !17} !17 = metadata !{i32 589840, metadata !2, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !18} ; [ DW_TAG_reference_type ] -!18 = metadata !{i32 589862, metadata !2, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !1} ; [ DW_TAG_const_type ] -!19 = metadata !{i32 589870, i32 0, metadata !3, metadata !"foo", metadata !"foo", metadata !"_Z3fooi", metadata !3, i32 4, metadata !20, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%class.A*, i32)* @_Z3fooi, null, null} ; [ DW_TAG_subprogram ] -!20 = metadata !{i32 589845, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !21, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!18 = metadata !{i32 786470, metadata !2, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !1} ; [ DW_TAG_const_type ] +!19 = metadata !{i32 786478, metadata !"_Z3fooi", i32 0, metadata !3, metadata !"foo", metadata !"foo", metadata !3, i32 4, metadata !20, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%class.A*, i32)* @_Z3fooi, null, null} ; [ DW_TAG_subprogram ] +!20 = metadata !{i32 786453, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !21, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !21 = metadata !{metadata !1} -!22 = metadata !{i32 589870, i32 0, metadata !3, metadata !"~A", metadata !"~A", metadata !"_ZN1AD1Ev", metadata !3, i32 2, metadata !23, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%class.A*)* @_ZN1AD1Ev, null, null} ; [ DW_TAG_subprogram ] -!23 = metadata !{i32 589845, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !24, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!22 = metadata !{i32 786478, metadata !"_ZN1AD1Ev", i32 0, metadata !3, metadata !"~A", metadata !"~A", metadata !3, i32 2, metadata !23, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%class.A*)* @_ZN1AD1Ev, null, null} ; [ DW_TAG_subprogram ] +!23 = metadata !{i32 786453, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !24, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !24 = metadata !{null} -!25 = metadata !{i32 589870, i32 0, metadata !3, metadata !"~A", metadata !"~A", metadata !"_ZN1AD2Ev", metadata !3, i32 2, metadata !23, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%class.A*)* @_ZN1AD2Ev, null, null} ; [ DW_TAG_subprogram ] -!26 = metadata !{i32 590081, metadata !19, metadata !"i", metadata !3, i32 16777220, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] +!25 = metadata !{i32 786478, metadata !"_ZN1AD2Ev", i32 0, metadata !3, metadata !"~A", metadata !"~A", metadata !3, i32 2, metadata !23, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%class.A*)* @_ZN1AD2Ev, null, null} ; [ DW_TAG_subprogram ] +!26 = metadata !{i32 786689, metadata !19, metadata !"i", metadata !3, i32 16777220, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] !27 = metadata !{i32 4, i32 11, metadata !19, null} -!28 = metadata !{i32 590080, metadata !29, metadata !"j", metadata !3, i32 5, metadata !6, i32 0} ; [ DW_TAG_auto_variable ] -!29 = metadata !{i32 589835, metadata !19, i32 4, i32 14, metadata !3, i32 0} ; [ DW_TAG_lexical_block ] +!28 = metadata !{i32 786688, metadata !29, metadata !"j", metadata !3, i32 5, metadata !6, i32 0, null} ; [ DW_TAG_auto_variable ] +!29 = metadata !{i32 786443, metadata !19, i32 4, i32 14, metadata !3, i32 0} ; [ DW_TAG_lexical_block ] !30 = metadata !{i32 5, i32 7, metadata !29, null} !31 = metadata !{i32 5, i32 12, metadata !29, null} !32 = metadata !{i32 6, i32 3, metadata !29, null} !33 = metadata !{i32 7, i32 5, metadata !34, null} -!34 = metadata !{i32 589835, metadata !29, i32 6, i32 16, metadata !3, i32 1} ; [ DW_TAG_lexical_block ] +!34 = metadata !{i32 786443, metadata !29, i32 6, i32 16, metadata !3, i32 1} ; [ DW_TAG_lexical_block ] !35 = metadata !{i32 8, i32 3, metadata !34, null} !36 = metadata !{i32 9, i32 9, metadata !29, null} -!37 = metadata !{i32 590080, metadata !29, metadata !"my_a", metadata !3, i32 9, metadata !38, i32 0} ; [ DW_TAG_auto_variable ] +!37 = metadata !{i32 786688, metadata !29, metadata !"my_a", metadata !3, i32 9, metadata !38, i32 0, null} ; [ DW_TAG_auto_variable ] !38 = metadata !{i32 589840, metadata !2, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !1} ; [ DW_TAG_reference_type ] !39 = metadata !{i32 9, i32 5, metadata !29, null} !40 = metadata !{i32 10, i32 3, metadata !29, null} !41 = metadata !{i32 11, i32 3, metadata !29, null} !42 = metadata !{i32 12, i32 1, metadata !29, null} -!43 = metadata !{i32 590081, metadata !22, metadata !"this", metadata !3, i32 16777218, metadata !13, i32 64} ; [ DW_TAG_arg_variable ] +!43 = metadata !{i32 786689, metadata !22, metadata !"this", metadata !3, i32 16777218, metadata !13, i32 64, null} ; [ DW_TAG_arg_variable ] !44 = metadata !{i32 2, i32 47, metadata !22, null} !45 = metadata !{i32 2, i32 61, metadata !22, null} -!46 = metadata !{i32 590081, metadata !25, metadata !"this", metadata !3, i32 16777218, metadata !13, i32 64} ; [ DW_TAG_arg_variable ] +!46 = metadata !{i32 786689, metadata !25, metadata !"this", metadata !3, i32 16777218, metadata !13, i32 64, null} ; [ DW_TAG_arg_variable ] !47 = metadata !{i32 2, i32 47, metadata !25, null} !48 = metadata !{i32 2, i32 54, metadata !49, null} -!49 = metadata !{i32 589835, metadata !25, i32 2, i32 52, metadata !3, i32 2} ; [ DW_TAG_lexical_block ] +!49 = metadata !{i32 786443, metadata !25, i32 2, i32 52, metadata !3, i32 2} ; [ DW_TAG_lexical_block ] +!50 = metadata !{metadata !0, metadata !10, metadata !14, metadata !19, metadata !22, metadata !25} +!51 = metadata !{metadata !"a.cc", metadata !"/private/tmp"} diff --git a/test/CodeGen/X86/dbg-declare.ll b/test/CodeGen/X86/dbg-declare.ll index 5d4cedc5c4e3..6ac397ac42e1 100644 --- a/test/CodeGen/X86/dbg-declare.ll +++ b/test/CodeGen/X86/dbg-declare.ll @@ -29,12 +29,10 @@ declare void @llvm.stackrestore(i8*) nounwind !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"20020104-2.c", metadata !"/Volumes/Sandbox/llvm", metadata !"clang version 3.1 (trunk 153698)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"", metadata !6, i32 6, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32*)* @foo, null, null, metadata !12} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 786449, i32 12, metadata !6, metadata !"clang version 3.1 (trunk 153698)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"foo", metadata !"foo", metadata !"", metadata !6, i32 6, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32*)* @foo, null, null, metadata !12} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !"20020104-2.c", metadata !"/Volumes/Sandbox/llvm", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9, metadata !10} @@ -51,7 +49,7 @@ declare void @llvm.stackrestore(i8*) nounwind !19 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 0, i64 8, i32 0, i32 0, metadata !20, metadata !21, i32 0, i32 0} ; [ DW_TAG_array_type ] !20 = metadata !{i32 786468, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] !21 = metadata !{metadata !22} -!22 = metadata !{i32 786465, i64 1, i64 0} ; [ DW_TAG_subrange_type ] +!22 = metadata !{i32 786465, i64 0, i64 -1} ; [ DW_TAG_subrange_type ] !23 = metadata !{i32 7, i32 8, metadata !17, null} !24 = metadata !{i32 9, i32 1, metadata !17, null} !25 = metadata !{i32 8, i32 3, metadata !17, null} diff --git a/test/CodeGen/X86/dbg-file-name.ll b/test/CodeGen/X86/dbg-file-name.ll index adf985461055..1bd3d77522a3 100644 --- a/test/CodeGen/X86/dbg-file-name.ll +++ b/test/CodeGen/X86/dbg-file-name.ll @@ -9,11 +9,13 @@ define i32 @main() nounwind { ret i32 0 } -!llvm.dbg.sp = !{ !6} +!llvm.dbg.cu = !{!2} -!1 = metadata !{i32 589865, metadata !"simple.c", metadata !"/Users/manav/one/two", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 1, metadata !"simple.c", metadata !"/Users/manav/one/two", metadata !"LLVM build 00", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!5 = metadata !{i32 589860, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 9, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null} ; [ DW_TAG_subroutine_type ] +!1 = metadata !{i32 786473, metadata !10} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !10, i32 1, metadata !"LLVM build 00", i1 true, i1 false, metadata !"", i32 0, null, null, metadata !9, null} ; [ DW_TAG_compile_unit ] +!5 = metadata !{i32 786468, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 9, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, null, i32 0} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !5} +!9 = metadata !{metadata !6} +!10 = metadata !{metadata !"simple.c", metadata !"/Users/manav/one/two"} diff --git a/test/CodeGen/X86/dbg-i128-const.ll b/test/CodeGen/X86/dbg-i128-const.ll index bd96d9195d02..17d645757d99 100644 --- a/test/CodeGen/X86/dbg-i128-const.ll +++ b/test/CodeGen/X86/dbg-i128-const.ll @@ -12,15 +12,20 @@ entry: declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone +!llvm.dbg.cu = !{!5} + !0 = metadata !{i128 42 } -!1 = metadata !{i32 524544, metadata !2, metadata !"MAX", metadata !4, i32 29, metadata !8} ; [ DW_TAG_auto_variable ] -!2 = metadata !{i32 524299, metadata !3, i32 26, i32 0} ; [ DW_TAG_lexical_block ] -!3 = metadata !{i32 524334, i32 0, metadata !4, metadata !"__foo", metadata !"__foo", metadata !"__foo", metadata !4, i32 26, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!4 = metadata !{i32 524329, metadata !"foo.c", metadata !"/tmp", metadata !5} ; [ DW_TAG_file_type ] -!5 = metadata !{i32 524305, i32 0, i32 1, metadata !"foo.c", metadata !"/tmp", metadata !"clang", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!6 = metadata !{i32 524309, metadata !4, metadata !"", metadata !4, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ] +!1 = metadata !{i32 786688, metadata !2, metadata !"MAX", metadata !4, i32 29, metadata !8, i32 0, null} ; [ DW_TAG_auto_variable ] +!2 = metadata !{i32 786443, metadata !4, metadata !3, i32 26, i32 0, i32 0} ; [ DW_TAG_lexical_block ] +!3 = metadata !{i32 786478, metadata !4, metadata !"__foo", metadata !"__foo", metadata !"__foo", metadata !4, i32 26, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i1 false, i128 (i128, i128)* @__foo, null, null, null, i32 26} ; [ DW_TAG_subprogram ] +!4 = metadata !{i32 786473, metadata !13} ; [ DW_TAG_file_type ] +!5 = metadata !{i32 786449, i32 1, metadata !4, metadata !"clang", i1 true, metadata !"", i32 0, null, null, metadata !12, null, metadata !""} ; [ DW_TAG_compile_unit ] +!6 = metadata !{i32 786453, metadata !13, metadata !4, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ] !7 = metadata !{metadata !8, metadata !8, metadata !8} -!8 = metadata !{i32 524310, metadata !4, metadata !"ti_int", metadata !9, i32 78, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_typedef ] -!9 = metadata !{i32 524329, metadata !"myint.h", metadata !"/tmp", metadata !5} ; [ DW_TAG_file_type ] -!10 = metadata !{i32 524324, metadata !4, metadata !"", metadata !4, i32 0, i64 128, i64 128, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 786454, metadata !14, metadata !4, metadata !"ti_int", i32 78, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_typedef ] +!9 = metadata !{i32 786473, metadata !14} ; [ DW_TAG_file_type ] +!10 = metadata !{i32 786468, metadata !13, metadata !4, metadata !"", i32 0, i64 128, i64 128, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !11 = metadata !{i32 29, i32 0, metadata !2, null} +!12 = metadata !{metadata !3} +!13 = metadata !{metadata !"foo.c", metadata !"/tmp"} +!14 = metadata !{metadata !"myint.h", metadata !"/tmp"} diff --git a/test/CodeGen/X86/dbg-large-unsigned-const.ll b/test/CodeGen/X86/dbg-large-unsigned-const.ll index fc295c679445..ff16318efcec 100644 --- a/test/CodeGen/X86/dbg-large-unsigned-const.ll +++ b/test/CodeGen/X86/dbg-large-unsigned-const.ll @@ -26,36 +26,36 @@ entry: declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!llvm.dbg.sp = !{!1, !6} -!llvm.dbg.lv._Z3iseRKxS0_ = !{!7, !11} -!llvm.dbg.lv._Z2fnx = !{!12} +!29 = metadata !{metadata !1, metadata !6} +!30 = metadata !{metadata !7, metadata !11} +!31 = metadata !{metadata !12} -!0 = metadata !{i32 655377, i32 0, i32 4, metadata !"lli.cc", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 135593)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 655406, i32 0, metadata !2, metadata !"ise", metadata !"ise", metadata !"_Z3iseRKxS0_", metadata !2, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i1 (i64*, i64*)* @_Z3iseRKxS0_, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 655401, metadata !"lli.cc", metadata !"/private/tmp", metadata !0} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 655381, 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 ] +!0 = metadata !{i32 786449, i32 4, metadata !2, metadata !"clang version 3.0 (trunk 135593)", i1 true, metadata !"", i32 0, null, null, metadata !29, null, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786478, metadata !"_Z3iseRKxS0_", i32 0, metadata !2, metadata !"ise", metadata !"ise", metadata !2, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i1 (i64*, i64*)* @_Z3iseRKxS0_, null, null, metadata !30, i32 2} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !"lli.cc", metadata !"/private/tmp", 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 655396, metadata !0, metadata !"bool", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 655406, i32 0, metadata !2, metadata !"fn", metadata !"fn", metadata !"_Z2fnx", metadata !2, i32 6, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i1 (i64)* @_Z2fnx, null, null} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 655617, metadata !1, metadata !"LHS", metadata !2, i32 16777218, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] -!8 = metadata !{i32 655376, metadata !0, null, null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_reference_type ] -!9 = metadata !{i32 655398, metadata !0, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_const_type ] -!10 = metadata !{i32 655396, metadata !0, metadata !"long long int", null, i32 0, i64 64, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!11 = metadata !{i32 655617, metadata !1, metadata !"RHS", metadata !2, i32 33554434, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] -!12 = metadata !{i32 655617, metadata !6, metadata !"a", metadata !2, i32 16777222, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!5 = metadata !{i32 786468, metadata !0, metadata !"bool", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !"_Z2fnx", i32 0, metadata !2, metadata !"fn", metadata !"fn", metadata !2, i32 6, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i1 (i64)* @_Z2fnx, null, null, metadata !31, i32 6} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786689, metadata !1, metadata !"LHS", metadata !2, i32 16777218, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!8 = metadata !{i32 786448, metadata !0, null, null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_reference_type ] +!9 = metadata !{i32 786470, metadata !0, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_const_type ] +!10 = metadata !{i32 786468, metadata !0, metadata !"long long int", null, i32 0, i64 64, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!11 = metadata !{i32 786689, metadata !1, metadata !"RHS", metadata !2, i32 33554434, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!12 = metadata !{i32 786689, metadata !6, metadata !"a", metadata !2, i32 16777222, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !13 = metadata !{i32 2, i32 27, metadata !1, null} !14 = metadata !{i32 2, i32 49, metadata !1, null} !15 = metadata !{i32 3, i32 3, metadata !16, null} -!16 = metadata !{i32 655371, metadata !1, i32 2, i32 54, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] +!16 = metadata !{i32 786443, metadata !2, metadata !1, i32 2, i32 54, i32 0} ; [ DW_TAG_lexical_block ] !17 = metadata !{metadata !"long long", metadata !18} !18 = metadata !{metadata !"omnipotent char", metadata !19} !19 = metadata !{metadata !"Simple C/C++ TBAA", null} !20 = metadata !{i32 6, i32 19, metadata !6, null} -!21 = metadata !{i32 655617, metadata !1, metadata !"LHS", metadata !2, i32 16777218, metadata !8, i32 0, metadata !22} ; [ DW_TAG_arg_variable ] +!21 = metadata !{i32 786689, metadata !1, metadata !"LHS", metadata !2, i32 16777218, metadata !8, i32 0, metadata !22} ; [ DW_TAG_arg_variable ] !22 = metadata !{i32 7, i32 10, metadata !23, null} -!23 = metadata !{i32 655371, metadata !6, i32 6, i32 22, metadata !2, i32 1} ; [ DW_TAG_lexical_block ] +!23 = metadata !{i32 786443, metadata !2, metadata !6, i32 6, i32 22, i32 1} ; [ DW_TAG_lexical_block ] !24 = metadata !{i32 2, i32 27, metadata !1, metadata !22} !25 = metadata !{i64 9223372036854775807} -!26 = metadata !{i32 655617, metadata !1, metadata !"RHS", metadata !2, i32 33554434, metadata !8, i32 0, metadata !22} ; [ DW_TAG_arg_variable ] +!26 = metadata !{i32 786689, metadata !1, metadata !"RHS", metadata !2, i32 33554434, metadata !8, i32 0, metadata !22} ; [ DW_TAG_arg_variable ] !27 = metadata !{i32 2, i32 49, metadata !1, metadata !22} !28 = metadata !{i32 3, i32 3, metadata !16, metadata !22} diff --git a/test/CodeGen/X86/dbg-merge-loc-entry.ll b/test/CodeGen/X86/dbg-merge-loc-entry.ll index d1e349f79d6f..baad6c0b60e6 100644 --- a/test/CodeGen/X86/dbg-merge-loc-entry.ll +++ b/test/CodeGen/X86/dbg-merge-loc-entry.ll @@ -43,33 +43,36 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone declare %0 @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone -!llvm.dbg.sp = !{!0, !9} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"__udivmodti4", metadata !"__udivmodti4", metadata !"", metadata !1, i32 879, metadata !3, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"foobar.c", metadata !"/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 1, metadata !"foobar.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"__udivmodti4", metadata !"__udivmodti4", metadata !"", metadata !1, i32 879, metadata !3, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, null, null, null, null, i32 879} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !29} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 1, metadata !1, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, metadata !"", i32 0, null, null, metadata !28, null, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !29, metadata !1, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] !4 = metadata !{metadata !5, metadata !5, metadata !5, metadata !8} -!5 = metadata !{i32 589846, metadata !6, metadata !"UTItype", metadata !6, i32 166, i64 0, i64 0, i64 0, i32 0, metadata !7} ; [ DW_TAG_typedef ] -!6 = metadata !{i32 589865, metadata !"foobar.h", metadata !"/tmp", metadata !2} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 589860, metadata !1, metadata !"", metadata !1, i32 0, i64 128, i64 128, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!8 = metadata !{i32 589839, metadata !1, metadata !"", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !5} ; [ DW_TAG_pointer_type ] -!9 = metadata !{i32 589870, i32 0, metadata !1, metadata !"__divti3", metadata !"__divti3", metadata !"__divti3", metadata !1, i32 1094, metadata !10, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i128 (i128, i128)* @__divti3} ; [ DW_TAG_subprogram ] -!10 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{i32 786454, metadata !30, metadata !6, metadata !"UTItype", i32 166, i64 0, i64 0, i64 0, i32 0, metadata !7} ; [ DW_TAG_typedef ] +!6 = metadata !{i32 786473, metadata !30} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786468, metadata !29, metadata !1, metadata !"", i32 0, i64 128, i64 128, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 786447, metadata !29, metadata !1, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !5} ; [ DW_TAG_pointer_type ] +!9 = metadata !{i32 786478, metadata !1, metadata !"__divti3", metadata !"__divti3", metadata !"__divti3", metadata !1, i32 1094, metadata !10, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i128 (i128, i128)* @__divti3, null, null, null, i32 1094} ; [ DW_TAG_subprogram ] +!10 = metadata !{i32 786453, metadata !29, metadata !1, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_subroutine_type ] !11 = metadata !{metadata !12, metadata !12, metadata !12} -!12 = metadata !{i32 589846, metadata !6, metadata !"TItype", metadata !6, i32 160, i64 0, i64 0, i64 0, i32 0, metadata !13} ; [ DW_TAG_typedef ] -!13 = metadata !{i32 589860, metadata !1, metadata !"", metadata !1, i32 0, i64 128, i64 128, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!14 = metadata !{i32 590081, metadata !9, metadata !"u", metadata !1, i32 1093, metadata !12, i32 0} ; [ DW_TAG_arg_variable ] +!12 = metadata !{i32 786454, metadata !30, metadata !6, metadata !"TItype", i32 160, i64 0, i64 0, i64 0, i32 0, metadata !13} ; [ DW_TAG_typedef ] +!13 = metadata !{i32 786468, metadata !29, metadata !1, metadata !"", i32 0, i64 128, i64 128, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786689, metadata !9, metadata !"u", metadata !1, i32 1093, metadata !12, i32 0, null} ; [ DW_TAG_arg_variable ] !15 = metadata !{i32 1093, i32 0, metadata !9, null} !16 = metadata !{i64 0} -!17 = metadata !{i32 590080, metadata !18, metadata !"c", metadata !1, i32 1095, metadata !19, i32 0} ; [ DW_TAG_auto_variable ] -!18 = metadata !{i32 589835, metadata !9, i32 1094, i32 0, metadata !1, i32 13} ; [ DW_TAG_lexical_block ] -!19 = metadata !{i32 589846, metadata !6, metadata !"word_type", metadata !6, i32 424, i64 0, i64 0, i64 0, i32 0, metadata !20} ; [ DW_TAG_typedef ] -!20 = metadata !{i32 589860, metadata !1, metadata !"long int", metadata !1, i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!17 = metadata !{i32 786688, metadata !18, metadata !"c", metadata !1, i32 1095, metadata !19, i32 0, null} ; [ DW_TAG_auto_variable ] +!18 = metadata !{i32 786443, metadata !1, metadata !9, i32 1094, i32 0, i32 13} ; [ DW_TAG_lexical_block ] +!19 = metadata !{i32 786454, metadata !30, metadata !6, metadata !"word_type", i32 424, i64 0, i64 0, i64 0, i32 0, metadata !20} ; [ DW_TAG_typedef ] +!20 = metadata !{i32 786468, metadata !29, metadata !1, metadata !"long int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !21 = metadata !{i32 1095, i32 0, metadata !18, null} !22 = metadata !{i32 1103, i32 0, metadata !18, null} !23 = metadata !{i32 1104, i32 0, metadata !18, null} !24 = metadata !{i32 1003, i32 0, metadata !25, metadata !26} -!25 = metadata !{i32 589835, metadata !0, i32 879, i32 0, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!25 = metadata !{i32 786443, metadata !1, metadata !0, i32 879, i32 0, i32 0} ; [ DW_TAG_lexical_block ] !26 = metadata !{i32 1107, i32 0, metadata !18, null} !27 = metadata !{i32 1111, i32 0, metadata !18, null} +!28 = metadata !{metadata !0, metadata !9} +!29 = metadata !{metadata !"foobar.c", metadata !"/tmp"} +!30 = metadata !{metadata !"foobar.h", metadata !"/tmp"} diff --git a/test/CodeGen/X86/dbg-prolog-end.ll b/test/CodeGen/X86/dbg-prolog-end.ll index 81303bb3d2ba..26bac2e08286 100644 --- a/test/CodeGen/X86/dbg-prolog-end.ll +++ b/test/CodeGen/X86/dbg-prolog-end.ll @@ -33,23 +33,23 @@ entry: } !llvm.dbg.cu = !{!0} -!llvm.dbg.sp = !{!1, !6} +!18 = metadata !{metadata !1, metadata !6} -!0 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/a.c", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 131100)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"", metadata !2, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 (i32)* @foo, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"/tmp/a.c", metadata !"/private/tmp", metadata !0} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589845, 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 ] +!0 = metadata !{i32 786449, i32 12, metadata !2, metadata !"clang version 3.0 (trunk 131100)", i1 false, metadata !"", i32 0, null, null, metadata !18, null, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"", metadata !2, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 (i32)* @foo, null, null, null, i32 1} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !"/tmp/a.c", metadata !"/private/tmp", 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 589860, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589870, i32 0, metadata !2, metadata !"main", metadata !"main", metadata !"", metadata !2, i32 7, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @main, null, null} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 590081, metadata !1, metadata !"i", metadata !2, i32 16777217, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] +!5 = metadata !{i32 786468, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !2, metadata !"main", metadata !"main", metadata !"", metadata !2, i32 7, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @main, null, null, null, i32 7} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786689, metadata !1, metadata !"i", metadata !2, i32 16777217, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] !8 = metadata !{i32 1, i32 13, metadata !1, null} -!9 = metadata !{i32 590080, metadata !10, metadata !"j", metadata !2, i32 2, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!10 = metadata !{i32 589835, metadata !1, i32 1, i32 16, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] +!9 = metadata !{i32 786688, metadata !10, metadata !"j", metadata !2, i32 2, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!10 = metadata !{i32 786443, metadata !2, metadata !1, i32 1, i32 16, i32 0} ; [ DW_TAG_lexical_block ] !11 = metadata !{i32 2, i32 6, metadata !10, null} !12 = metadata !{i32 2, i32 11, metadata !10, null} !13 = metadata !{i32 3, i32 2, metadata !10, null} !14 = metadata !{i32 4, i32 2, metadata !10, null} !15 = metadata !{i32 5, i32 2, metadata !10, null} !16 = metadata !{i32 8, i32 2, metadata !17, null} -!17 = metadata !{i32 589835, metadata !6, i32 7, i32 12, metadata !2, i32 1} ; [ DW_TAG_lexical_block ] +!17 = metadata !{i32 786443, metadata !2, metadata !6, i32 7, i32 12, i32 1} ; [ DW_TAG_lexical_block ] diff --git a/test/CodeGen/X86/dbg-subrange.ll b/test/CodeGen/X86/dbg-subrange.ll index 788910c7fe72..6090185dc10e 100644 --- a/test/CodeGen/X86/dbg-subrange.ll +++ b/test/CodeGen/X86/dbg-subrange.ll @@ -14,24 +14,21 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"small.c", metadata !"/private/tmp", metadata !"clang version 3.1 (trunk 144833)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !11} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"bar", metadata !"bar", metadata !"", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void ()* @bar, null, null, metadata !9} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 786449, i32 12, metadata !6, metadata !"clang version 3.1 (trunk 144833)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !11, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 720942, metadata !6, metadata !"bar", metadata !"bar", metadata !"", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void ()* @bar, null, null, metadata !9} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 720937, metadata !"small.c", metadata !"/private/tmp", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null} !9 = metadata !{metadata !10} !10 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!11 = metadata !{metadata !12} -!12 = metadata !{metadata !13} -!13 = metadata !{i32 720948, i32 0, null, metadata !"s", metadata !"s", metadata !"", metadata !6, i32 2, metadata !14, i32 0, i32 1, [4294967296 x i8]* @s} ; [ DW_TAG_variable ] +!11 = metadata !{metadata !13} +!13 = metadata !{i32 720948, i32 0, null, metadata !"s", metadata !"s", metadata !"", metadata !6, i32 2, metadata !14, i32 0, i32 1, [4294967296 x i8]* @s, null} ; [ DW_TAG_variable ] !14 = metadata !{i32 720897, null, metadata !"", null, i32 0, i64 34359738368, i64 8, i32 0, i32 0, metadata !15, metadata !16, i32 0, i32 0} ; [ DW_TAG_array_type ] !15 = metadata !{i32 720932, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] !16 = metadata !{metadata !17} -!17 = metadata !{i32 720929, i64 0, i64 4294967295} ; [ DW_TAG_subrange_type ] +!17 = metadata !{i32 720929, i64 0, i64 4294967296} ; [ DW_TAG_subrange_type ] !18 = metadata !{i32 5, i32 3, metadata !19, null} -!19 = metadata !{i32 720907, metadata !5, i32 4, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!19 = metadata !{i32 786443, metadata !5, i32 4, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] !20 = metadata !{i32 6, i32 1, metadata !19, null} diff --git a/test/CodeGen/X86/dbg-value-dag-combine.ll b/test/CodeGen/X86/dbg-value-dag-combine.ll index b115bf475c42..fcbf64f42378 100644 --- a/test/CodeGen/X86/dbg-value-dag-combine.ll +++ b/test/CodeGen/X86/dbg-value-dag-combine.ll @@ -23,26 +23,25 @@ entry: store i32 %tmp3, i32 addrspace(1)* %arrayidx, align 4, !dbg !16 ret void, !dbg !17 } -!llvm.dbg.sp = !{!0} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata -!"__OpenCL_test_kernel", metadata !"__OpenCL_test_kernel", metadata -!"__OpenCL_test_kernel", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"OCL6368.tmp.cl", metadata !"E:\5CUsers\5Cmvillmow.AMD\5CAppData\5CLocal\5CTemp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 1, metadata !"OCL6368.tmp.cl", metadata !"E:\5CUsers\5Cmvillmow.AMD\5CAppData\5CLocal\5CTemp", metadata !"clc", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"__OpenCL_test_kernel", metadata !"__OpenCL_test_kernel", metadata !"__OpenCL_test_kernel", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, null} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !19} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 1, metadata !1, metadata !"clc", i1 false, metadata !"", i32 0, null, null, metadata !18, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !4 = metadata !{null, metadata !5} -!5 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !6} ; [ DW_TAG_pointer_type ] -!6 = metadata !{i32 589860, metadata !2, metadata !"unsigned int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 590081, metadata !0, metadata !"ip", metadata !1, i32 1, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] +!5 = metadata !{i32 786447, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !6} ; [ DW_TAG_pointer_type ] +!6 = metadata !{i32 786468, metadata !2, metadata !"unsigned int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786689, metadata !0, metadata !"ip", metadata !1, i32 1, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] !8 = metadata !{i32 1, i32 42, metadata !0, null} -!9 = metadata !{i32 590080, metadata !10, metadata !"gid", metadata !1, i32 3, metadata !6, i32 0} ; [ DW_TAG_auto_variable ] -!10 = metadata !{i32 589835, metadata !0, i32 2, i32 1, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!9 = metadata !{i32 786688, metadata !10, metadata !"gid", metadata !1, i32 3, metadata !6, i32 0, null} ; [ DW_TAG_auto_variable ] +!10 = metadata !{i32 786443, metadata !0, i32 2, i32 1, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] !11 = metadata !{i32 3, i32 41, metadata !10, null} !12 = metadata !{i32 0} -!13 = metadata !{i32 590080, metadata !10, metadata !"idx", metadata !1, i32 4, metadata !6, i32 0} ; [ DW_TAG_auto_variable ] +!13 = metadata !{i32 786688, metadata !10, metadata !"idx", metadata !1, i32 4, metadata !6, i32 0, null} ; [ DW_TAG_auto_variable ] !14 = metadata !{i32 4, i32 20, metadata !10, null} !15 = metadata !{i32 5, i32 15, metadata !10, null} !16 = metadata !{i32 6, i32 18, metadata !10, null} !17 = metadata !{i32 7, i32 1, metadata !0, null} - +!18 = metadata !{metadata !0} +!19 = metadata !{metadata !"OCL6368.tmp.cl", metadata !"E:\5CUsers\5Cmvillmow.AMD\5CAppData\5CLocal\5CTemp"} diff --git a/test/CodeGen/X86/dbg-value-inlined-parameter.ll b/test/CodeGen/X86/dbg-value-inlined-parameter.ll deleted file mode 100644 index d248a4130355..000000000000 --- a/test/CodeGen/X86/dbg-value-inlined-parameter.ll +++ /dev/null @@ -1,87 +0,0 @@ -; RUN: llc -mtriple=x86_64-apple-darwin < %s | FileCheck %s -; RUN: llc -mtriple=x86_64-apple-darwin -regalloc=basic < %s | FileCheck %s - -;CHECK: DW_TAG_inlined_subroutine -;CHECK-NEXT: DW_AT_abstract_origin -;CHECK-NEXT: DW_AT_low_pc -;CHECK-NEXT: DW_AT_high_pc -;CHECK-NEXT: DW_AT_call_file -;CHECK-NEXT: DW_AT_call_line -;CHECK-NEXT: DW_TAG_formal_parameter -;CHECK-NEXT: Lstring11-Lsection_str ## DW_AT_name - -%struct.S1 = type { float*, i32 } - -@p = common global %struct.S1 zeroinitializer, align 8 - -define i32 @foo(%struct.S1* nocapture %sp, i32 %nums) nounwind optsize ssp { -entry: - tail call void @llvm.dbg.value(metadata !{%struct.S1* %sp}, i64 0, metadata !9), !dbg !20 - tail call void @llvm.dbg.value(metadata !{i32 %nums}, i64 0, metadata !18), !dbg !21 - %tmp2 = getelementptr inbounds %struct.S1* %sp, i64 0, i32 1, !dbg !22 - store i32 %nums, i32* %tmp2, align 4, !dbg !22, !tbaa !24 - %call = tail call float* @bar(i32 %nums) nounwind optsize, !dbg !27 - %tmp5 = getelementptr inbounds %struct.S1* %sp, i64 0, i32 0, !dbg !27 - store float* %call, float** %tmp5, align 8, !dbg !27, !tbaa !28 - %cmp = icmp ne float* %call, null, !dbg !29 - %cond = zext i1 %cmp to i32, !dbg !29 - ret i32 %cond, !dbg !29 -} - -declare float* @bar(i32) optsize - -define void @foobar() nounwind optsize ssp { -entry: - tail call void @llvm.dbg.value(metadata !30, i64 0, metadata !9) nounwind, !dbg !31 - tail call void @llvm.dbg.value(metadata !34, i64 0, metadata !18) nounwind, !dbg !35 - store i32 1, i32* getelementptr inbounds (%struct.S1* @p, i64 0, i32 1), align 8, !dbg !36, !tbaa !24 - %call.i = tail call float* @bar(i32 1) nounwind optsize, !dbg !37 - store float* %call.i, float** getelementptr inbounds (%struct.S1* @p, i64 0, i32 0), align 8, !dbg !37, !tbaa !28 - ret void, !dbg !38 -} - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0, !6} -!llvm.dbg.lv.foo = !{!9, !18} -!llvm.dbg.gv = !{!19} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 8, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (%struct.S1*, i32)* @foo} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"nm2.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"nm2.c", metadata !"/private/tmp", metadata !"clang version 2.9 (trunk 125693)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, 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 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foobar", metadata !"foobar", metadata !"", metadata !1, i32 15, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, void ()* @foobar} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] -!8 = metadata !{null} -!9 = metadata !{i32 590081, metadata !0, metadata !"sp", metadata !1, i32 7, metadata !10, i32 0} ; [ DW_TAG_arg_variable ] -!10 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] -!11 = metadata !{i32 589846, metadata !2, metadata !"S1", metadata !1, i32 4, i64 0, i64 0, i64 0, i32 0, metadata !12} ; [ DW_TAG_typedef ] -!12 = metadata !{i32 589843, metadata !2, metadata !"S1", metadata !1, i32 1, i64 128, i64 64, i32 0, i32 0, i32 0, metadata !13, i32 0, i32 0} ; [ DW_TAG_structure_type ] -!13 = metadata !{metadata !14, metadata !17} -!14 = metadata !{i32 589837, metadata !1, metadata !"m", metadata !1, i32 2, i64 64, i64 64, i64 0, i32 0, metadata !15} ; [ DW_TAG_member ] -!15 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] -!16 = metadata !{i32 589860, metadata !2, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!17 = metadata !{i32 589837, metadata !1, metadata !"nums", metadata !1, i32 3, i64 32, i64 32, i64 64, i32 0, metadata !5} ; [ DW_TAG_member ] -!18 = metadata !{i32 590081, metadata !0, metadata !"nums", metadata !1, i32 7, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 589876, i32 0, metadata !2, metadata !"p", metadata !"p", metadata !"", metadata !1, i32 14, metadata !11, i32 0, i32 1, %struct.S1* @p} ; [ DW_TAG_variable ] -!20 = metadata !{i32 7, i32 13, metadata !0, null} -!21 = metadata !{i32 7, i32 21, metadata !0, null} -!22 = metadata !{i32 9, i32 3, metadata !23, null} -!23 = metadata !{i32 589835, metadata !0, i32 8, i32 1, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!24 = metadata !{metadata !"int", metadata !25} -!25 = metadata !{metadata !"omnipotent char", metadata !26} -!26 = metadata !{metadata !"Simple C/C++ TBAA", null} -!27 = metadata !{i32 10, i32 3, metadata !23, null} -!28 = metadata !{metadata !"any pointer", metadata !25} -!29 = metadata !{i32 11, i32 3, metadata !23, null} -!30 = metadata !{%struct.S1* @p} -!31 = metadata !{i32 7, i32 13, metadata !0, metadata !32} -!32 = metadata !{i32 16, i32 3, metadata !33, null} -!33 = metadata !{i32 589835, metadata !6, i32 15, i32 15, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] -!34 = metadata !{i32 1} -!35 = metadata !{i32 7, i32 21, metadata !0, metadata !32} -!36 = metadata !{i32 9, i32 3, metadata !23, metadata !32} -!37 = metadata !{i32 10, i32 3, metadata !23, metadata !32} -!38 = metadata !{i32 17, i32 1, metadata !33, null} diff --git a/test/CodeGen/X86/dbg-value-isel.ll b/test/CodeGen/X86/dbg-value-isel.ll index f1101e61f0fe..55be3b1f222b 100644 --- a/test/CodeGen/X86/dbg-value-isel.ll +++ b/test/CodeGen/X86/dbg-value-isel.ll @@ -78,25 +78,26 @@ declare <4 x i32> @__amdil_get_global_id_int() nounwind declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"__OpenCL_nbt02_kernel", metadata !"__OpenCL_nbt02_kernel", metadata !"__OpenCL_nbt02_kernel", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"OCLlLwTXZ.cl", metadata !"/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 1, metadata !"OCLlLwTXZ.cl", metadata !"/tmp", metadata !"clc", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"__OpenCL_nbt02_kernel", metadata !"__OpenCL_nbt02_kernel", metadata !"__OpenCL_nbt02_kernel", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, null} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !20, i32 1, metadata !"clc", i1 false, metadata !"", i32 0, null, null, metadata !19, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !20, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !4 = metadata !{null, metadata !5} -!5 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !6} ; [ DW_TAG_pointer_type ] -!6 = metadata !{i32 589846, metadata !2, metadata !"uint", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !7} ; [ DW_TAG_typedef ] -!7 = metadata !{i32 589860, metadata !2, metadata !"unsigned int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!8 = metadata !{i32 590081, metadata !0, metadata !"ip", metadata !1, i32 1, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] +!5 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !6} ; [ DW_TAG_pointer_type ] +!6 = metadata !{i32 589846, metadata !20, metadata !2, metadata !"uint", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !7} ; [ DW_TAG_typedef ] +!7 = metadata !{i32 786468, null, metadata !2, metadata !"unsigned int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 786689, metadata !0, metadata !"ip", metadata !1, i32 1, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] !9 = metadata !{i32 1, i32 32, metadata !0, null} -!10 = metadata !{i32 590080, metadata !11, metadata !"tid", metadata !1, i32 3, metadata !6, i32 0} ; [ DW_TAG_auto_variable ] -!11 = metadata !{i32 589835, metadata !0, i32 2, i32 1, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] +!10 = metadata !{i32 786688, metadata !11, metadata !"tid", metadata !1, i32 3, metadata !6, i32 0, null} ; [ DW_TAG_auto_variable ] +!11 = metadata !{i32 786443, metadata !0, i32 2, i32 1, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] !12 = metadata !{i32 5, i32 24, metadata !11, null} -!13 = metadata !{i32 590080, metadata !11, metadata !"gid", metadata !1, i32 3, metadata !6, i32 0} ; [ DW_TAG_auto_variable ] +!13 = metadata !{i32 786688, metadata !11, metadata !"gid", metadata !1, i32 3, metadata !6, i32 0, null} ; [ DW_TAG_auto_variable ] !14 = metadata !{i32 6, i32 25, metadata !11, null} -!15 = metadata !{i32 590080, metadata !11, metadata !"lsz", metadata !1, i32 3, metadata !6, i32 0} ; [ DW_TAG_auto_variable ] +!15 = metadata !{i32 786688, metadata !11, metadata !"lsz", metadata !1, i32 3, metadata !6, i32 0, null} ; [ DW_TAG_auto_variable ] !16 = metadata !{i32 7, i32 26, metadata !11, null} !17 = metadata !{i32 9, i32 24, metadata !11, null} !18 = metadata !{i32 10, i32 1, metadata !0, null} - +!19 = metadata !{metadata !0} +!20 = metadata !{metadata !"OCLlLwTXZ.cl", metadata !"/tmp"} diff --git a/test/CodeGen/X86/dbg-value-location.ll b/test/CodeGen/X86/dbg-value-location.ll index 05e29ecff03f..2a1916f26c97 100644 --- a/test/CodeGen/X86/dbg-value-location.ll +++ b/test/CodeGen/X86/dbg-value-location.ll @@ -45,26 +45,30 @@ declare hidden fastcc i32 @bar2(i32) nounwind optsize ssp declare hidden fastcc i32 @bar3(i32) nounwind optsize ssp declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0, !6, !7, !8} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 19510, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i64, i8*, i32)* @foo} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/f.c", metadata !"/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"f.i", metadata !"/tmp", metadata !"clang version 2.9 (trunk 124753)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"foo", metadata !"foo", metadata !"", i32 19510, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i64, i8*, i32)* @foo, null, null, null, i32 19510} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !26} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !27, i32 12, metadata !"clang version 2.9 (trunk 124753)", i1 true, metadata !"", i32 0, null, null, metadata !24, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, 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 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 589870, i32 0, metadata !1, metadata !"bar3", metadata !"bar3", metadata !"", metadata !1, i32 14827, metadata !3, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @bar3} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 589870, i32 0, metadata !1, metadata !"bar2", metadata !"bar2", metadata !"", metadata !1, i32 15397, metadata !3, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @bar2} ; [ DW_TAG_subprogram ] -!8 = metadata !{i32 589870, i32 0, metadata !1, metadata !"bar", metadata !"bar", metadata !"", metadata !1, i32 12382, metadata !9, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i32*)* @bar} ; [ DW_TAG_subprogram ] -!9 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !10, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{i32 786468, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"bar3", metadata !"bar3", metadata !"", i32 14827, metadata !3, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @bar3} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"bar2", metadata !"bar2", metadata !"", i32 15397, metadata !3, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32)* @bar2} ; [ DW_TAG_subprogram ] +!8 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"bar", metadata !"bar", metadata !"", i32 12382, metadata !9, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (i32, i32*)* @bar} ; [ DW_TAG_subprogram ] +!9 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !10, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !10 = metadata !{metadata !11} -!11 = metadata !{i32 589860, metadata !2, metadata !"unsigned char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 8} ; [ DW_TAG_base_type ] -!12 = metadata !{i32 590081, metadata !0, metadata !"var", metadata !1, i32 19509, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] +!11 = metadata !{i32 786468, metadata !2, metadata !"unsigned char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 8} ; [ DW_TAG_base_type ] +!12 = metadata !{i32 786689, metadata !0, metadata !"var", metadata !1, i32 19509, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] !13 = metadata !{i32 19509, i32 20, metadata !0, null} !14 = metadata !{i32 18091, i32 2, metadata !15, metadata !17} -!15 = metadata !{i32 589835, metadata !16, i32 18086, i32 1, metadata !1, i32 748} ; [ DW_TAG_lexical_block ] -!16 = metadata !{i32 589870, i32 0, metadata !1, metadata !"foo_bar", metadata !"foo_bar", metadata !"", metadata !1, i32 18086, metadata !3, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, null} ; [ DW_TAG_subprogram ] +!15 = metadata !{i32 786443, metadata !1, metadata !16, i32 18086, i32 1, i32 748} ; [ DW_TAG_lexical_block ] +!16 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"foo_bar", metadata !"foo_bar", metadata !"", i32 18086, metadata !3, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, null} ; [ DW_TAG_subprogram ] !17 = metadata !{i32 19514, i32 2, metadata !18, null} -!18 = metadata !{i32 589835, metadata !0, i32 19510, i32 1, metadata !1, i32 99} ; [ DW_TAG_lexical_block ] +!18 = metadata !{i32 786443, metadata !1, metadata !0, i32 19510, i32 1, i32 99} ; [ DW_TAG_lexical_block ] !22 = metadata !{i32 18094, i32 2, metadata !15, metadata !17} !23 = metadata !{i32 19524, i32 1, metadata !18, null} +!24 = metadata !{metadata !0, metadata !6, metadata !7, metadata !8} +!25 = metadata !{i32 786473, metadata !27} ; [ DW_TAG_file_type ] +!26 = metadata !{metadata !"/tmp/f.c", metadata !"/tmp"} +!27 = metadata !{metadata !"f.i", metadata !"/tmp"} diff --git a/test/CodeGen/X86/dbg-value-range.ll b/test/CodeGen/X86/dbg-value-range.ll index 6b16865ba9ee..6766dbe9edb0 100644 --- a/test/CodeGen/X86/dbg-value-range.ll +++ b/test/CodeGen/X86/dbg-value-range.ll @@ -17,22 +17,21 @@ declare i32 @foo(...) declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0} -!llvm.dbg.lv.bar = !{!6, !11} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"bar", metadata !"bar", metadata !"", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (%struct.a*)* @bar} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"bar.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"bar.c", metadata !"/private/tmp", metadata !"clang version 2.9 (trunk 122997)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"bar", metadata !"bar", metadata !"", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (%struct.a*)* @bar, null, null, metadata !21, i32 0} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !22} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !22, i32 12, metadata !"clang version 2.9 (trunk 122997)", i1 true, metadata !"", i32 0, null, null, metadata !20, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, 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 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 590081, metadata !0, metadata !"b", metadata !1, i32 5, metadata !7, i32 0} ; [ DW_TAG_arg_variable ] -!7 = metadata !{i32 589839, metadata !2, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] -!8 = metadata !{i32 589843, metadata !2, metadata !"a", metadata !1, i32 1, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !9, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!5 = metadata !{i32 786468, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786689, metadata !0, metadata !"b", metadata !1, i32 5, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!7 = metadata !{i32 786447, metadata !2, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] +!8 = metadata !{i32 786451, metadata !2, metadata !"a", metadata !1, i32 1, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !9, i32 0, i32 0} ; [ DW_TAG_structure_type ] !9 = metadata !{metadata !10} -!10 = metadata !{i32 589837, metadata !1, metadata !"c", metadata !1, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !5} ; [ DW_TAG_member ] -!11 = metadata !{i32 590080, metadata !12, metadata !"x", metadata !1, i32 6, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!12 = metadata !{i32 589835, metadata !0, i32 5, i32 22, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!10 = metadata !{i32 786445, metadata !1, metadata !"c", metadata !1, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !5} ; [ DW_TAG_member ] +!11 = metadata !{i32 786688, metadata !12, metadata !"x", metadata !1, i32 6, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!12 = metadata !{i32 786443, metadata !22, metadata !0, i32 5, i32 22, i32 0} ; [ DW_TAG_lexical_block ] !13 = metadata !{i32 5, i32 19, metadata !0, null} !14 = metadata !{i32 6, i32 14, metadata !12, null} !15 = metadata !{metadata !"int", metadata !16} @@ -40,6 +39,9 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !17 = metadata !{metadata !"Simple C/C++ TBAA", null} !18 = metadata !{i32 7, i32 2, metadata !12, null} !19 = metadata !{i32 8, i32 2, metadata !12, null} +!20 = metadata !{metadata !0} +!21 = metadata !{metadata !6, metadata !11} +!22 = metadata !{metadata !"bar.c", metadata !"/private/tmp"} ; Check that variable bar:b value range is appropriately trucated in debug info. ; The variable is in %rdi which is clobbered by 'movl %ebx, %edi' diff --git a/test/CodeGen/X86/divide-by-constant.ll b/test/CodeGen/X86/divide-by-constant.ll index 8e7c13d8efa9..9669d97cb7fa 100644 --- a/test/CodeGen/X86/divide-by-constant.ll +++ b/test/CodeGen/X86/divide-by-constant.ll @@ -56,9 +56,9 @@ entry: %div = sdiv i16 %x, 10 ret i16 %div ; CHECK: test6: -; CHECK: imull $26215, %eax, %eax -; CHECK: shrl $31, %ecx -; CHECK: sarl $18, %eax +; CHECK: imull $26215, %eax, %ecx +; CHECK: sarl $18, %ecx +; CHECK: shrl $15, %eax } define i32 @test7(i32 %x) nounwind { diff --git a/test/CodeGen/X86/dwarf-comp-dir.ll b/test/CodeGen/X86/dwarf-comp-dir.ll index c64752c9522b..3bc2957963eb 100644 --- a/test/CodeGen/X86/dwarf-comp-dir.ll +++ b/test/CodeGen/X86/dwarf-comp-dir.ll @@ -1,14 +1,16 @@ ; RUN: llc %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"empty.c", metadata !"/home/nlewycky", metadata !"clang version 3.1 (trunk 143523)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !1} ; [ DW_TAG_compile_unit ] +!0 = metadata !{i32 720913, metadata !4, i32 12, metadata !"clang version 3.1 (trunk 143523)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !1} ; [ DW_TAG_compile_unit ] !1 = metadata !{metadata !2} !2 = metadata !{i32 0} +!3 = metadata !{i32 786473, metadata !4} ; [ DW_TAG_file_type ] +!4 = metadata !{metadata !"empty.c", metadata !"/home/nlewycky"} ; The important part of the following check is that dir = #0. ; Dir Mod Time File Len File Name diff --git a/test/CodeGen/X86/dynamic-allocas-VLAs.ll b/test/CodeGen/X86/dynamic-allocas-VLAs.ll index c5e47facf346..9405f76cbed0 100644 --- a/test/CodeGen/X86/dynamic-allocas-VLAs.ll +++ b/test/CodeGen/X86/dynamic-allocas-VLAs.ll @@ -103,7 +103,7 @@ entry: declare void @t4_helper(i32*, i32*, <8 x float>*) -; Dynamic realignment + Spill +; Spilling an AVX register shouldn't cause dynamic realignment define i32 @t5(float* nocapture %f) nounwind uwtable ssp { entry: %a = alloca i32, align 4 @@ -116,21 +116,15 @@ entry: ret i32 %add ; CHECK: _t5 -; CHECK: pushq %rbp -; CHECK: movq %rsp, %rbp -; CHECK: andq $-32, %rsp ; CHECK: subq ${{[0-9]+}}, %rsp ; ; CHECK: vmovaps (%rdi), [[AVXREG:%ymm[0-9]+]] -; CHECK: vmovaps [[AVXREG]], (%rsp) +; CHECK: vmovups [[AVXREG]], (%rsp) ; CHECK: leaq {{[0-9]+}}(%rsp), %rdi ; CHECK: callq _t5_helper1 -; CHECK: vmovaps (%rsp), %ymm0 +; CHECK: vmovups (%rsp), %ymm0 ; CHECK: callq _t5_helper2 ; CHECK: movl {{[0-9]+}}(%rsp), %eax -; -; CHECK: movq %rbp, %rsp -; CHECK: popq %rbp } declare void @t5_helper1(i32*) diff --git a/test/CodeGen/X86/early-ifcvt-crash.ll b/test/CodeGen/X86/early-ifcvt-crash.ll index c8280269689d..d9580503e91e 100644 --- a/test/CodeGen/X86/early-ifcvt-crash.ll +++ b/test/CodeGen/X86/early-ifcvt-crash.ll @@ -1,5 +1,7 @@ ; RUN: llc < %s -x86-early-ifcvt -verify-machineinstrs ; RUN: llc < %s -x86-early-ifcvt -stress-early-ifcvt -verify-machineinstrs +; CPU without a scheduling model: +; RUN: llc < %s -x86-early-ifcvt -mcpu=pentium3 -verify-machineinstrs ; ; Run these tests with and without -stress-early-ifcvt to exercise heuristics. ; diff --git a/test/CodeGen/X86/early-ifcvt.ll b/test/CodeGen/X86/early-ifcvt.ll index 2e1852d3e3ae..2606bd28d5fc 100644 --- a/test/CodeGen/X86/early-ifcvt.ll +++ b/test/CodeGen/X86/early-ifcvt.ll @@ -142,3 +142,34 @@ save_state_and_return: } declare void @BZ2_bz__AssertH__fail() + +; Make sure we don't speculate on div/idiv instructions +; CHECK: test_idiv +; CHECK-NOT: cmov +define i32 @test_idiv(i32 %a, i32 %b) nounwind uwtable readnone ssp { + %1 = icmp eq i32 %b, 0 + br i1 %1, label %4, label %2 + +; <label>:2 ; preds = %0 + %3 = sdiv i32 %a, %b + br label %4 + +; <label>:4 ; preds = %0, %2 + %5 = phi i32 [ %3, %2 ], [ %a, %0 ] + ret i32 %5 +} + +; CHECK: test_div +; CHECK-NOT: cmov +define i32 @test_div(i32 %a, i32 %b) nounwind uwtable readnone ssp { + %1 = icmp eq i32 %b, 0 + br i1 %1, label %4, label %2 + +; <label>:2 ; preds = %0 + %3 = udiv i32 %a, %b + br label %4 + +; <label>:4 ; preds = %0, %2 + %5 = phi i32 [ %3, %2 ], [ %a, %0 ] + ret i32 %5 +} diff --git a/test/CodeGen/X86/fast-isel-args-fail.ll b/test/CodeGen/X86/fast-isel-args-fail.ll new file mode 100644 index 000000000000..e748e1cad1fd --- /dev/null +++ b/test/CodeGen/X86/fast-isel-args-fail.ll @@ -0,0 +1,23 @@ +; RUN: llc < %s -fast-isel -verify-machineinstrs -mtriple=x86_64-apple-darwin10 +; RUN: llc < %s -fast-isel -verify-machineinstrs -mtriple=x86_64-pc-win32 | FileCheck %s -check-prefix=WIN32 +; RUN: llc < %s -fast-isel -verify-machineinstrs -mtriple=x86_64-pc-win64 | FileCheck %s -check-prefix=WIN64 +; Requires: Asserts + +; Previously, this would cause an assert. +define i31 @t1(i31 %a, i31 %b, i31 %c) { +entry: + %add = add nsw i31 %b, %a + %add1 = add nsw i31 %add, %c + ret i31 %add1 +} + +; We don't handle the Windows CC, yet. +define i32 @foo(i32* %p) { +entry: +; WIN32: foo +; WIN32: movl (%rcx), %eax +; WIN64: foo +; WIN64: movl (%rdi), %eax + %0 = load i32* %p, align 4 + ret i32 %0 +} diff --git a/test/CodeGen/X86/fast-isel-args.ll b/test/CodeGen/X86/fast-isel-args.ll new file mode 100644 index 000000000000..0f3626565e7d --- /dev/null +++ b/test/CodeGen/X86/fast-isel-args.ll @@ -0,0 +1,25 @@ +; RUN: llc < %s -fast-isel -fast-isel-abort -fast-isel-abort-args -verify-machineinstrs -mtriple=x86_64-apple-darwin10 + +; Just make sure these don't abort when lowering the arguments. +define i32 @t1(i32 %a, i32 %b, i32 %c) { +entry: + %add = add nsw i32 %b, %a + %add1 = add nsw i32 %add, %c + ret i32 %add1 +} + +define i64 @t2(i64 %a, i64 %b, i64 %c) { +entry: + %add = add nsw i64 %b, %a + %add1 = add nsw i64 %add, %c + ret i64 %add1 +} + +define i64 @t3(i32 %a, i64 %b, i32 %c) { +entry: + %conv = sext i32 %a to i64 + %add = add nsw i64 %conv, %b + %conv1 = sext i32 %c to i64 + %add2 = add nsw i64 %add, %conv1 + ret i64 %add2 +} diff --git a/test/CodeGen/X86/fast-isel-constant.ll b/test/CodeGen/X86/fast-isel-constant.ll new file mode 100644 index 000000000000..6f9240ac4700 --- /dev/null +++ b/test/CodeGen/X86/fast-isel-constant.ll @@ -0,0 +1,24 @@ +; RUN: llc < %s -march=x86-64 -O0 | FileCheck %s +; Make sure fast-isel doesn't reset the materialised constant map +; across an intrinsic call. + +; CHECK: movl $100000 +; CHECK-NOT: movl $100000 +define i1 @test1(i32 %v1, i32 %v2, i32* %X) nounwind { +entry: + %a = shl i32 100000, %v1 + %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %a, i32 %v2) + %ext = extractvalue {i32, i1} %t, 0 + %sum = shl i32 100000, %ext + %obit = extractvalue {i32, i1} %t, 1 + br i1 %obit, label %overflow, label %normal + +normal: + store i32 %sum, i32* %X + br label %overflow + +overflow: + ret i1 false +} + +declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) diff --git a/test/CodeGen/X86/fast-isel-expect.ll b/test/CodeGen/X86/fast-isel-expect.ll new file mode 100644 index 000000000000..c4be7f364f30 --- /dev/null +++ b/test/CodeGen/X86/fast-isel-expect.ll @@ -0,0 +1,21 @@ +; RUN: llc < %s -O0 -march=x86 | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@glbl = extern_weak constant i8 + +declare i64 @llvm.expect.i64(i64, i64) + +define void @test() { +; CHECK: movl $glbl + %tmp = call i64 @llvm.expect.i64(i64 zext (i1 icmp eq (i8* @glbl, i8* null) to i64), i64 0) + %tmp2 = icmp ne i64 %tmp, 0 + br i1 %tmp2, label %bb1, label %bb2 + +bb1: + unreachable + +bb2: + unreachable +} diff --git a/test/CodeGen/X86/fast-isel-x86-64.ll b/test/CodeGen/X86/fast-isel-x86-64.ll index cdfaf7f4c134..ad1520ef8194 100644 --- a/test/CodeGen/X86/fast-isel-x86-64.ll +++ b/test/CodeGen/X86/fast-isel-x86-64.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -mattr=-avx -fast-isel -O0 -regalloc=fast -asm-verbose=0 -fast-isel-abort | FileCheck %s -; RUN: llc < %s -mattr=+avx -fast-isel -O0 -regalloc=fast -asm-verbose=0 -fast-isel-abort | FileCheck %s --check-prefix=AVX +; RUN: llc < %s -mattr=-avx -fast-isel -mcpu=core2 -O0 -regalloc=fast -asm-verbose=0 -fast-isel-abort | FileCheck %s +; RUN: llc < %s -mattr=+avx -fast-isel -mcpu=core2 -O0 -regalloc=fast -asm-verbose=0 -fast-isel-abort | FileCheck %s --check-prefix=AVX target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" diff --git a/test/CodeGen/X86/float-asmprint.ll b/test/CodeGen/X86/float-asmprint.ll new file mode 100644 index 000000000000..4aeae7fe0469 --- /dev/null +++ b/test/CodeGen/X86/float-asmprint.ll @@ -0,0 +1,40 @@ +; RUN: llc -mtriple=x86_64-none-linux < %s | FileCheck %s + +; Check that all current floating-point types are correctly emitted to assembly +; on a little-endian target. + +@var128 = global fp128 0xL00000000000000008000000000000000, align 16 +@varppc128 = global ppc_fp128 0xM80000000000000000000000000000000, align 16 +@var80 = global x86_fp80 0xK80000000000000000000, align 16 +@var64 = global double -0.0, align 8 +@var32 = global float -0.0, align 4 +@var16 = global half -0.0, align 2 + +; CHECK: var128: +; CHECK-NEXT: .quad 0 # fp128 -0 +; CHECK-NEXT: .quad -9223372036854775808 +; CHECK-NEXT: .size + +; CHECK: varppc128: +; CHECK-NEXT: .quad 0 # ppc_fp128 -0 +; CHECK-NEXT: .quad -9223372036854775808 +; CHECK-NEXT: .size + +; CHECK: var80: +; CHECK-NEXT: .quad 0 # x86_fp80 -0 +; CHECK-NEXT: .short 32768 +; CHECK-NEXT: .zero 6 +; CHECK-NEXT: .size + +; CHECK: var64: +; CHECK-NEXT: .quad -9223372036854775808 # double -0 +; CHECK-NEXT: .size + +; CHECK: var32: +; CHECK-NEXT: .long 2147483648 # float -0 +; CHECK-NEXT: .size + +; CHECK: var16: +; CHECK-NEXT: .short 32768 # half -0 +; CHECK-NEXT: .size + diff --git a/test/CodeGen/X86/fma4-intrinsics-x86_64.ll b/test/CodeGen/X86/fma4-intrinsics-x86_64.ll index 2fe1ecd40e0c..7a1a9ae46147 100644 --- a/test/CodeGen/X86/fma4-intrinsics-x86_64.ll +++ b/test/CodeGen/X86/fma4-intrinsics-x86_64.ll @@ -63,6 +63,16 @@ define < 4 x float > @test_x86_fma_vfmadd_ps_load2(< 4 x float > %a0, < 4 x floa } declare < 4 x float > @llvm.x86.fma.vfmadd.ps(< 4 x float >, < 4 x float >, < 4 x float >) nounwind readnone +; To test execution dependency +define < 4 x float > @test_x86_fma_vfmadd_ps_load3(< 4 x float >* %a0, < 4 x float >* %a1, < 4 x float > %a2) { + ; CHECK: vmovaps + ; CHECK: vfmaddps %{{.*}}, (%{{.*}}) + %x = load <4 x float>* %a0 + %y = load <4 x float>* %a1 + %res = call < 4 x float > @llvm.x86.fma.vfmadd.ps(< 4 x float > %x, < 4 x float > %y, < 4 x float > %a2) ; <i64> [#uses=1] + ret < 4 x float > %res +} + define < 2 x double > @test_x86_fma_vfmadd_pd(< 2 x double > %a0, < 2 x double > %a1, < 2 x double > %a2) { ; CHECK: vfmaddpd %res = call < 2 x double > @llvm.x86.fma.vfmadd.pd(< 2 x double > %a0, < 2 x double > %a1, < 2 x double > %a2) ; <i64> [#uses=1] @@ -82,6 +92,16 @@ define < 2 x double > @test_x86_fma_vfmadd_pd_load2(< 2 x double > %a0, < 2 x do } declare < 2 x double > @llvm.x86.fma.vfmadd.pd(< 2 x double >, < 2 x double >, < 2 x double >) nounwind readnone +; To test execution dependency +define < 2 x double > @test_x86_fma_vfmadd_pd_load3(< 2 x double >* %a0, < 2 x double >* %a1, < 2 x double > %a2) { + ; CHECK: vmovapd + ; CHECK: vfmaddpd %{{.*}}, (%{{.*}}) + %x = load <2 x double>* %a0 + %y = load <2 x double>* %a1 + %res = call < 2 x double > @llvm.x86.fma.vfmadd.pd(< 2 x double > %x, < 2 x double > %y, < 2 x double > %a2) ; <i64> [#uses=1] + ret < 2 x double > %res +} + define < 8 x float > @test_x86_fma_vfmadd_ps_256(< 8 x float > %a0, < 8 x float > %a1, < 8 x float > %a2) { ; CHECK: vfmaddps ; CHECK: ymm diff --git a/test/CodeGen/X86/fold-call.ll b/test/CodeGen/X86/fold-call.ll index 603e9ad66caa..35327faa6486 100644 --- a/test/CodeGen/X86/fold-call.ll +++ b/test/CodeGen/X86/fold-call.ll @@ -1,10 +1,27 @@ -; RUN: llc < %s -march=x86 | not grep mov -; RUN: llc < %s -march=x86-64 | not grep mov +; RUN: llc < %s -march=x86 | FileCheck %s +; RUN: llc < %s -march=x86-64 | FileCheck %s -declare void @bar() +; CHECK: test1 +; CHECK-NOT: mov -define void @foo(i32 %i0, i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, void()* %arg) nounwind { +declare void @bar() +define void @test1(i32 %i0, i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, void()* %arg) nounwind { call void @bar() call void %arg() ret void } + +; PR14739 +; CHECK: test2 +; CHECK: mov{{.*}} $0, ([[REGISTER:%[a-z]+]]) +; CHECK-NOT: jmp{{.*}} *([[REGISTER]]) + +%struct.X = type { void ()* } +define void @test2(%struct.X* nocapture %x) { +entry: + %f = getelementptr inbounds %struct.X* %x, i64 0, i32 0 + %0 = load void ()** %f + store void ()* null, void ()** %f + tail call void %0() + ret void +} diff --git a/test/CodeGen/X86/fold-load-vec.ll b/test/CodeGen/X86/fold-load-vec.ll new file mode 100644 index 000000000000..c1756d5e2e1a --- /dev/null +++ b/test/CodeGen/X86/fold-load-vec.ll @@ -0,0 +1,39 @@ +; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mattr=+sse41 | FileCheck %s + +; rdar://12721174 +; We should not fold movss into pshufd since pshufd expects m128 while movss +; loads from m32. +define void @sample_test(<4 x float>* %source, <2 x float>* %dest) nounwind { +; CHECK: sample_test +; CHECK: movss +; CHECK: pshufd +entry: + %source.addr = alloca <4 x float>*, align 8 + %dest.addr = alloca <2 x float>*, align 8 + %tmp = alloca <2 x float>, align 8 + store <4 x float>* %source, <4 x float>** %source.addr, align 8 + store <2 x float>* %dest, <2 x float>** %dest.addr, align 8 + store <2 x float> zeroinitializer, <2 x float>* %tmp, align 8 + %0 = load <4 x float>** %source.addr, align 8 + %arrayidx = getelementptr inbounds <4 x float>* %0, i64 0 + %1 = load <4 x float>* %arrayidx, align 16 + %2 = extractelement <4 x float> %1, i32 0 + %3 = load <2 x float>* %tmp, align 8 + %4 = insertelement <2 x float> %3, float %2, i32 1 + store <2 x float> %4, <2 x float>* %tmp, align 8 + %5 = load <2 x float>* %tmp, align 8 + %6 = load <2 x float>** %dest.addr, align 8 + %arrayidx1 = getelementptr inbounds <2 x float>* %6, i64 0 + store <2 x float> %5, <2 x float>* %arrayidx1, align 8 + %7 = load <2 x float>** %dest.addr, align 8 + %arrayidx2 = getelementptr inbounds <2 x float>* %7, i64 0 + %8 = load <2 x float>* %arrayidx2, align 8 + %vecext = extractelement <2 x float> %8, i32 0 + %9 = load <2 x float>** %dest.addr, align 8 + %arrayidx3 = getelementptr inbounds <2 x float>* %9, i64 0 + %10 = load <2 x float>* %arrayidx3, align 8 + %vecext4 = extractelement <2 x float> %10, i32 1 + call void @ext(float %vecext, float %vecext4) + ret void +} +declare void @ext(float, float) diff --git a/test/CodeGen/X86/fold-pcmpeqd-2.ll b/test/CodeGen/X86/fold-pcmpeqd-2.ll index 9cf4607cf5b2..2bde76efd2ae 100644 --- a/test/CodeGen/X86/fold-pcmpeqd-2.ll +++ b/test/CodeGen/X86/fold-pcmpeqd-2.ll @@ -43,21 +43,21 @@ forbody: ; preds = %forcond %mul171.i = fmul <4 x float> %add167.i, %sub140.i ; <<4 x float>> [#uses=1] %add172.i = fadd <4 x float> %mul171.i, < float 0x3FF0000A40000000, float 0x3FF0000A40000000, float 0x3FF0000A40000000, float 0x3FF0000A40000000 > ; <<4 x float>> [#uses=1] %bitcast176.i = bitcast <4 x float> %add172.i to <4 x i32> ; <<4 x i32>> [#uses=1] - %andnps178.i = and <4 x i32> %bitcast176.i, zeroinitializer ; <<4 x i32>> [#uses=1] + %andnps178.i = add <4 x i32> %bitcast176.i, <i32 1, i32 1, i32 1, i32 1> ; <<4 x i32>> [#uses=1] %bitcast179.i = bitcast <4 x i32> %andnps178.i to <4 x float> ; <<4 x float>> [#uses=1] %mul186.i = fmul <4 x float> %bitcast179.i, zeroinitializer ; <<4 x float>> [#uses=1] %bitcast190.i = bitcast <4 x float> %mul186.i to <4 x i32> ; <<4 x i32>> [#uses=1] - %andnps192.i = and <4 x i32> %bitcast190.i, zeroinitializer ; <<4 x i32>> [#uses=1] + %andnps192.i = add <4 x i32> %bitcast190.i, <i32 1, i32 1, i32 1, i32 1> ; <<4 x i32>> [#uses=1] %xorps.i = xor <4 x i32> zeroinitializer, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] - %orps203.i = or <4 x i32> %andnps192.i, %xorps.i ; <<4 x i32>> [#uses=1] + %orps203.i = add <4 x i32> %andnps192.i, %xorps.i ; <<4 x i32>> [#uses=1] %bitcast204.i = bitcast <4 x i32> %orps203.i to <4 x float> ; <<4 x float>> [#uses=1] %mul310 = fmul <4 x float> %bitcast204.i104, zeroinitializer ; <<4 x float>> [#uses=2] %mul313 = fmul <4 x float> %bitcast204.i, zeroinitializer ; <<4 x float>> [#uses=1] %cmpunord.i11 = call <4 x float> @llvm.x86.sse.cmp.ps(<4 x float> zeroinitializer, <4 x float> zeroinitializer, i8 3) nounwind ; <<4 x float>> [#uses=1] %bitcast6.i13 = bitcast <4 x float> %cmpunord.i11 to <4 x i32> ; <<4 x i32>> [#uses=2] - %andps.i14 = and <4 x i32> zeroinitializer, %bitcast6.i13 ; <<4 x i32>> [#uses=1] + %andps.i14 = add <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %bitcast6.i13 ; <<4 x i32>> [#uses=1] %not.i16 = xor <4 x i32> %bitcast6.i13, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] - %andnps.i17 = and <4 x i32> zeroinitializer, %not.i16 ; <<4 x i32>> [#uses=1] + %andnps.i17 = add <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %not.i16 ; <<4 x i32>> [#uses=1] %orps.i18 = or <4 x i32> %andnps.i17, %andps.i14 ; <<4 x i32>> [#uses=1] %bitcast17.i19 = bitcast <4 x i32> %orps.i18 to <4 x float> ; <<4 x float>> [#uses=1] %tmp83 = call <4 x float> @llvm.x86.sse.min.ps(<4 x float> %mul310, <4 x float> zeroinitializer) nounwind ; <<4 x float>> [#uses=1] diff --git a/test/CodeGen/X86/fold-vex.ll b/test/CodeGen/X86/fold-vex.ll new file mode 100644 index 000000000000..2bb5b441c7c0 --- /dev/null +++ b/test/CodeGen/X86/fold-vex.ll @@ -0,0 +1,16 @@ +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=corei7-avx | FileCheck %s + +;CHECK: @test +; No need to load from memory. The operand will be loaded as part of th AND instr. +;CHECK-NOT: vmovaps +;CHECK: vandps +;CHECK: ret + +define void @test1(<8 x i32>* %p0, <8 x i32> %in1) nounwind { +entry: + %in0 = load <8 x i32>* %p0, align 2 + %a = and <8 x i32> %in0, %in1 + store <8 x i32> %a, <8 x i32>* undef + ret void +} + diff --git a/test/CodeGen/X86/fp-fast.ll b/test/CodeGen/X86/fp-fast.ll index d70aa7d79f00..287504801d04 100644 --- a/test/CodeGen/X86/fp-fast.ll +++ b/test/CodeGen/X86/fp-fast.ll @@ -38,7 +38,7 @@ define float @test3(float %a) { ; CHECK: test4 define float @test4(float %a) { ; CHECK-NOT: fma -; CHECK-NOT mul +; CHECK-NOT: mul ; CHECK-NOT: add ; CHECK: ret %t1 = fmul float %a, 0.0 diff --git a/test/CodeGen/X86/fp-load-trunc.ll b/test/CodeGen/X86/fp-load-trunc.ll index 2ae65c97d97a..a973befdafe7 100644 --- a/test/CodeGen/X86/fp-load-trunc.ll +++ b/test/CodeGen/X86/fp-load-trunc.ll @@ -49,8 +49,8 @@ define <8 x float> @test4(<8 x double>* %p) nounwind { ; CHECK: movlhps ; CHECK: ret ; AVX: test4 -; AVX: vcvtpd2psy {{[0-9]*}}(%{{.*}}) -; AVX: vcvtpd2psy {{[0-9]*}}(%{{.*}}) +; AVX: vcvtpd2psy +; AVX: vcvtpd2psy ; AVX: vinsertf128 ; AVX: ret %x = load <8 x double>* %p diff --git a/test/CodeGen/X86/handle-move.ll b/test/CodeGen/X86/handle-move.ll index e9f7a962e20d..ba96275569b3 100644 --- a/test/CodeGen/X86/handle-move.ll +++ b/test/CodeGen/X86/handle-move.ll @@ -16,7 +16,7 @@ ; DL: [0B,16r:0)[128r,144r:2)[144r,144d:1) 0@0B-phi 1@144r 2@128r ; --> [0B,16r:0)[128r,180r:2)[180r,180d:1) 0@0B-phi 1@180r 2@128r ; -define i32 @f1(i32 %a, i32 %b, i32 %c, i32 %d) nounwind uwtable readnone ssp { +define i32 @f1(i32 %a, i32 %b, i32 %c) nounwind uwtable readnone ssp { entry: %y = add i32 %c, 1 %x = udiv i32 %b, %a @@ -50,7 +50,7 @@ entry: ; %vreg5: [16r,112r:0) 0@16r ; --> [16r,120r:0) 0@16r ; -define i32 @f3(i32 %a, i32 %b, i32 %c, i32 %d) nounwind uwtable readnone ssp { +define i32 @f3(i32 %a, i32 %b) nounwind uwtable readnone ssp { entry: %y = sub i32 %a, %b %x = add i32 %a, %b diff --git a/test/CodeGen/X86/hipe-cc.ll b/test/CodeGen/X86/hipe-cc.ll new file mode 100644 index 000000000000..76d17a09d54e --- /dev/null +++ b/test/CodeGen/X86/hipe-cc.ll @@ -0,0 +1,77 @@ +; RUN: llc < %s -tailcallopt -code-model=medium -stack-alignment=4 -mtriple=i686-linux-gnu -mcpu=pentium | FileCheck %s + +; Check the HiPE calling convention works (x86-32) + +define void @zap(i32 %a, i32 %b) nounwind { +entry: + ; CHECK: movl 40(%esp), %eax + ; CHECK-NEXT: movl 44(%esp), %edx + ; CHECK-NEXT: movl $8, %ecx + ; CHECK-NEXT: calll addfour + %0 = call cc 11 {i32, i32, i32} @addfour(i32 undef, i32 undef, i32 %a, i32 %b, i32 8) + %res = extractvalue {i32, i32, i32} %0, 2 + + ; CHECK: movl %eax, 16(%esp) + ; CHECK-NEXT: movl $2, 12(%esp) + ; CHECK-NEXT: movl $1, 8(%esp) + ; CHECK: calll foo + tail call void @foo(i32 undef, i32 undef, i32 1, i32 2, i32 %res) nounwind + ret void +} + +define cc 11 {i32, i32, i32} @addfour(i32 %hp, i32 %p, i32 %x, i32 %y, i32 %z) nounwind { +entry: + ; CHECK: addl %edx, %eax + ; CHECK-NEXT: addl %ecx, %eax + %0 = add i32 %x, %y + %1 = add i32 %0, %z + + ; CHECK: ret + %res = insertvalue {i32, i32, i32} undef, i32 %1, 2 + ret {i32, i32, i32} %res +} + +define cc 11 void @foo(i32 %hp, i32 %p, i32 %arg0, i32 %arg1, i32 %arg2) nounwind { +entry: + ; CHECK: movl %esi, 16(%esp) + ; CHECK-NEXT: movl %ebp, 12(%esp) + ; CHECK-NEXT: movl %eax, 8(%esp) + ; CHECK-NEXT: movl %edx, 4(%esp) + ; CHECK-NEXT: movl %ecx, (%esp) + %hp_var = alloca i32 + %p_var = alloca i32 + %arg0_var = alloca i32 + %arg1_var = alloca i32 + %arg2_var = alloca i32 + store i32 %hp, i32* %hp_var + store i32 %p, i32* %p_var + store i32 %arg0, i32* %arg0_var + store i32 %arg1, i32* %arg1_var + store i32 %arg2, i32* %arg2_var + + ; CHECK: movl 4(%esp), %edx + ; CHECK-NEXT: movl 8(%esp), %eax + ; CHECK-NEXT: movl 12(%esp), %ebp + ; CHECK-NEXT: movl 16(%esp), %esi + %0 = load i32* %hp_var + %1 = load i32* %p_var + %2 = load i32* %arg0_var + %3 = load i32* %arg1_var + %4 = load i32* %arg2_var + ; CHECK: jmp bar + tail call cc 11 void @bar(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) nounwind + ret void +} + +define cc 11 void @baz() nounwind { + %tmp_clos = load i32* @clos + %tmp_clos2 = inttoptr i32 %tmp_clos to i32* + %indirect_call = bitcast i32* %tmp_clos2 to void (i32, i32, i32)* + ; CHECK: movl $42, %eax + ; CHECK-NEXT: jmpl *clos + tail call cc 11 void %indirect_call(i32 undef, i32 undef, i32 42) nounwind + ret void +} + +@clos = external constant i32 +declare cc 11 void @bar(i32, i32, i32, i32, i32) diff --git a/test/CodeGen/X86/hipe-cc64.ll b/test/CodeGen/X86/hipe-cc64.ll new file mode 100644 index 000000000000..5dbb5a25cbeb --- /dev/null +++ b/test/CodeGen/X86/hipe-cc64.ll @@ -0,0 +1,87 @@ +; RUN: llc < %s -tailcallopt -code-model=medium -stack-alignment=8 -mtriple=x86_64-linux-gnu -mcpu=opteron | FileCheck %s + +; Check the HiPE calling convention works (x86-64) + +define void @zap(i64 %a, i64 %b) nounwind { +entry: + ; CHECK: movq %rsi, %rax + ; CHECK-NEXT: movq %rdi, %rsi + ; CHECK-NEXT: movq %rax, %rdx + ; CHECK-NEXT: movl $8, %ecx + ; CHECK-NEXT: movl $9, %r8d + ; CHECK-NEXT: callq addfour + %0 = call cc 11 {i64, i64, i64} @addfour(i64 undef, i64 undef, i64 %a, i64 %b, i64 8, i64 9) + %res = extractvalue {i64, i64, i64} %0, 2 + + ; CHECK: movl $1, %edx + ; CHECK-NEXT: movl $2, %ecx + ; CHECK-NEXT: movl $3, %r8d + ; CHECK-NEXT: movq %rax, %r9 + ; CHECK: callq foo + tail call void @foo(i64 undef, i64 undef, i64 1, i64 2, i64 3, i64 %res) nounwind + ret void +} + +define cc 11 {i64, i64, i64} @addfour(i64 %hp, i64 %p, i64 %x, i64 %y, i64 %z, i64 %w) nounwind { +entry: + ; CHECK: leaq (%rsi,%rdx), %rax + ; CHECK-NEXT: addq %rcx, %rax + ; CHECK-NEXT: addq %r8, %rax + %0 = add i64 %x, %y + %1 = add i64 %0, %z + %2 = add i64 %1, %w + + ; CHECK: ret + %res = insertvalue {i64, i64, i64} undef, i64 %2, 2 + ret {i64, i64, i64} %res +} + +define cc 11 void @foo(i64 %hp, i64 %p, i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3) nounwind { +entry: + ; CHECK: movq %r15, 40(%rsp) + ; CHECK-NEXT: movq %rbp, 32(%rsp) + ; CHECK-NEXT: movq %rsi, 24(%rsp) + ; CHECK-NEXT: movq %rdx, 16(%rsp) + ; CHECK-NEXT: movq %rcx, 8(%rsp) + ; CHECK-NEXT: movq %r8, (%rsp) + %hp_var = alloca i64 + %p_var = alloca i64 + %arg0_var = alloca i64 + %arg1_var = alloca i64 + %arg2_var = alloca i64 + %arg3_var = alloca i64 + store i64 %hp, i64* %hp_var + store i64 %p, i64* %p_var + store i64 %arg0, i64* %arg0_var + store i64 %arg1, i64* %arg1_var + store i64 %arg2, i64* %arg2_var + store i64 %arg3, i64* %arg3_var + + ; CHECK: movq 8(%rsp), %rcx + ; CHECK-NEXT: movq 16(%rsp), %rdx + ; CHECK-NEXT: movq 24(%rsp), %rsi + ; CHECK-NEXT: movq 32(%rsp), %rbp + ; CHECK-NEXT: movq 40(%rsp), %r15 + %0 = load i64* %hp_var + %1 = load i64* %p_var + %2 = load i64* %arg0_var + %3 = load i64* %arg1_var + %4 = load i64* %arg2_var + %5 = load i64* %arg3_var + ; CHECK: jmp bar + tail call cc 11 void @bar(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5) nounwind + ret void +} + +define cc 11 void @baz() nounwind { + %tmp_clos = load i64* @clos + %tmp_clos2 = inttoptr i64 %tmp_clos to i64* + %indirect_call = bitcast i64* %tmp_clos2 to void (i64, i64, i64)* + ; CHECK: movl $42, %esi + ; CHECK-NEXT: jmpq *(%rax) + tail call cc 11 void %indirect_call(i64 undef, i64 undef, i64 42) nounwind + ret void +} + +@clos = external constant i64 +declare cc 11 void @bar(i64, i64, i64, i64, i64, i64) diff --git a/test/CodeGen/X86/hipe-prologue.ll b/test/CodeGen/X86/hipe-prologue.ll new file mode 100644 index 000000000000..ff3c5c803c90 --- /dev/null +++ b/test/CodeGen/X86/hipe-prologue.ll @@ -0,0 +1,67 @@ +; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux +; RUN: llc < %s -mtriple=x86_64-linux-gnu -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux + +; The HiPE compiler (i.e., the native code compiler of the Erlang/OTP system) +; adds a custom assembly prologue in order to efficiently manipulate the stack +; at runtime. + +; Just to prevent the alloca from being optimized away. +declare void @dummy_use(i32*, i32) + +define {i32, i32} @test_basic(i32 %hp, i32 %p) { + ; X32-Linux: test_basic: + ; X32-Linux-NOT: calll inc_stack_0 + + ; X64-Linux: test_basic: + ; X64-Linux-NOT: callq inc_stack_0 + + %mem = alloca i32, i32 10 + call void @dummy_use (i32* %mem, i32 10) + %1 = insertvalue {i32, i32} undef, i32 %hp, 0 + %2 = insertvalue {i32, i32} %1, i32 %p, 1 + ret {i32, i32} %1 +} + +define cc 11 {i32, i32} @test_basic_hipecc(i32 %hp, i32 %p) { + ; X32-Linux: test_basic_hipecc: + ; X32-Linux: leal -156(%esp), %ebx + ; X32-Linux-NEXT: cmpl 76(%ebp), %ebx + ; X32-Linux-NEXT: jb .LBB1_1 + + ; X32-Linux: ret + + ; X32-Linux: .LBB1_1: + ; X32-Linux-NEXT: calll inc_stack_0 + + ; X64-Linux: test_basic_hipecc: + ; X64-Linux: leaq -232(%rsp), %r14 + ; X64-Linux-NEXT: cmpq 144(%rbp), %r14 + ; X64-Linux-NEXT: jb .LBB1_1 + + ; X64-Linux: ret + + ; X64-Linux: .LBB1_1: + ; X64-Linux-NEXT: callq inc_stack_0 + + %mem = alloca i32, i32 10 + call void @dummy_use (i32* %mem, i32 10) + %1 = insertvalue {i32, i32} undef, i32 %hp, 0 + %2 = insertvalue {i32, i32} %1, i32 %p, 1 + ret {i32, i32} %2 +} + +define cc 11 {i32,i32,i32} @test_nocall_hipecc(i32 %hp,i32 %p,i32 %x,i32 %y) { + ; X32-Linux: test_nocall_hipecc: + ; X32-Linux-NOT: calll inc_stack_0 + + ; X64-Linux: test_nocall_hipecc: + ; X64-Linux-NOT: callq inc_stack_0 + + %1 = add i32 %x, %y + %2 = mul i32 42, %1 + %3 = sub i32 24, %2 + %4 = insertvalue {i32, i32, i32} undef, i32 %hp, 0 + %5 = insertvalue {i32, i32, i32} %4, i32 %p, 1 + %6 = insertvalue {i32, i32, i32} %5, i32 %p, 2 + ret {i32, i32, i32} %6 +} diff --git a/test/CodeGen/X86/hoist-invariant-load.ll b/test/CodeGen/X86/hoist-invariant-load.ll index 74ecd045b3d5..34191e3f9a31 100644 --- a/test/CodeGen/X86/hoist-invariant-load.ll +++ b/test/CodeGen/X86/hoist-invariant-load.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -stats -O2 2>&1 | grep "1 machine-licm" target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" diff --git a/test/CodeGen/X86/imul-lea-2.ll b/test/CodeGen/X86/imul-lea-2.ll index 1cb54b37b0e1..7b79d0678bee 100644 --- a/test/CodeGen/X86/imul-lea-2.ll +++ b/test/CodeGen/X86/imul-lea-2.ll @@ -1,15 +1,19 @@ -; RUN: llc < %s -march=x86-64 | grep lea | count 3 -; RUN: llc < %s -march=x86-64 | grep shl | count 1 -; RUN: llc < %s -march=x86-64 | not grep imul +; RUN: llc < %s -march=x86-64 | FileCheck %s + +; CHECK-NOT: imul define i64 @t1(i64 %a) nounwind readnone { entry: - %0 = mul i64 %a, 81 ; <i64> [#uses=1] - ret i64 %0 + %0 = mul i64 %a, 81 +; CHECK: lea +; CHECK: lea + ret i64 %0 } define i64 @t2(i64 %a) nounwind readnone { entry: - %0 = mul i64 %a, 40 ; <i64> [#uses=1] - ret i64 %0 + %0 = mul i64 %a, 40 +; CHECK: shl +; CHECK: lea + ret i64 %0 } diff --git a/test/CodeGen/X86/imul-lea.ll b/test/CodeGen/X86/imul-lea.ll index 4e8e2af0f2fe..d55ece7996ed 100644 --- a/test/CodeGen/X86/imul-lea.ll +++ b/test/CodeGen/X86/imul-lea.ll @@ -1,10 +1,12 @@ -; RUN: llc < %s -march=x86 | grep lea +; RUN: llc < %s -march=x86 | FileCheck %s declare i32 @foo() define i32 @test() { - %tmp.0 = tail call i32 @foo( ) ; <i32> [#uses=1] - %tmp.1 = mul i32 %tmp.0, 9 ; <i32> [#uses=1] - ret i32 %tmp.1 + %tmp.0 = tail call i32 @foo( ) + %tmp.1 = mul i32 %tmp.0, 9 +; CHECK-NOT: mul +; CHECK: lea + ret i32 %tmp.1 } diff --git a/test/CodeGen/X86/imul64-lea.ll b/test/CodeGen/X86/imul64-lea.ll new file mode 100644 index 000000000000..047c129ddb33 --- /dev/null +++ b/test/CodeGen/X86/imul64-lea.ll @@ -0,0 +1,25 @@ +; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 | FileCheck %s + +; Test that 64-bit LEAs are generated for both LP64 and ILP32 in 64-bit mode. +declare i64 @foo64() + +define i64 @test64() { + %tmp.0 = tail call i64 @foo64( ) + %tmp.1 = mul i64 %tmp.0, 9 +; CHECK-NOT: mul +; CHECK: leaq + ret i64 %tmp.1 +} + +; Test that 32-bit LEAs are generated for both LP64 and ILP32 in 64-bit mode. +declare i32 @foo32() + +define i32 @test32() { + %tmp.0 = tail call i32 @foo32( ) + %tmp.1 = mul i32 %tmp.0, 9 +; CHECK-NOT: mul +; CHECK: leal + ret i32 %tmp.1 +} + diff --git a/test/CodeGen/X86/insertelement-copytoregs.ll b/test/CodeGen/X86/insertelement-copytoregs.ll index 34a29ca7d939..88ff4dafad7d 100644 --- a/test/CodeGen/X86/insertelement-copytoregs.ll +++ b/test/CodeGen/X86/insertelement-copytoregs.ll @@ -1,4 +1,5 @@ -; RUN: llc < %s -march=x86-64 | grep -v IMPLICIT_DEF +; RUN: llc < %s -march=x86-64 | FileCheck %s +; CHECK-NOT: IMPLICIT_DEF define void @foo(<2 x float>* %p) { %t = insertelement <2 x float> undef, float 0.0, i32 0 diff --git a/test/CodeGen/X86/lea-2.ll b/test/CodeGen/X86/lea-2.ll index 43f69b0c6e93..21128096e6e7 100644 --- a/test/CodeGen/X86/lea-2.ll +++ b/test/CodeGen/X86/lea-2.ll @@ -1,13 +1,15 @@ -; RUN: llc < %s -march=x86 -x86-asm-syntax=intel | \ -; RUN: grep "lea EAX, DWORD PTR \[... + 4\*... - 5\]" -; RUN: llc < %s -march=x86 -x86-asm-syntax=intel | \ -; RUN: not grep add +; RUN: llc < %s -march=x86 -x86-asm-syntax=intel | FileCheck %s define i32 @test1(i32 %A, i32 %B) { - %tmp1 = shl i32 %A, 2 ; <i32> [#uses=1] - %tmp3 = add i32 %B, -5 ; <i32> [#uses=1] - %tmp4 = add i32 %tmp3, %tmp1 ; <i32> [#uses=1] - ret i32 %tmp4 + %tmp1 = shl i32 %A, 2 + %tmp3 = add i32 %B, -5 + %tmp4 = add i32 %tmp3, %tmp1 +; The above computation of %tmp4 should match a single lea, without using +; actual add instructions. +; CHECK-NOT: add +; CHECK: lea {{[A-Z]+}}, DWORD PTR [{{[A-Z]+}} + 4*{{[A-Z]+}} - 5] + + ret i32 %tmp4 } diff --git a/test/CodeGen/X86/lea-4.ll b/test/CodeGen/X86/lea-4.ll index 2171204c01d1..cef47264a583 100644 --- a/test/CodeGen/X86/lea-4.ll +++ b/test/CodeGen/X86/lea-4.ll @@ -1,19 +1,21 @@ -; RUN: llc < %s -march=x86-64 | grep lea | count 2 +; RUN: llc < %s -march=x86-64 | FileCheck %s define zeroext i16 @t1(i32 %on_off) nounwind { entry: - %0 = sub i32 %on_off, 1 - %1 = mul i32 %0, 2 - %2 = trunc i32 %1 to i16 - %3 = zext i16 %2 to i32 - %4 = trunc i32 %3 to i16 - ret i16 %4 + %0 = sub i32 %on_off, 1 + %1 = mul i32 %0, 2 + %2 = trunc i32 %1 to i16 + %3 = zext i16 %2 to i32 + %4 = trunc i32 %3 to i16 +; CHECK: lea + ret i16 %4 } define i32 @t2(i32 %on_off) nounwind { entry: - %0 = sub i32 %on_off, 1 - %1 = mul i32 %0, 2 - %2 = and i32 %1, 65535 - ret i32 %2 + %0 = sub i32 %on_off, 1 + %1 = mul i32 %0, 2 + %2 = and i32 %1, 65535 +; CHECK: lea + ret i32 %2 } diff --git a/test/CodeGen/X86/legalize-shift-64.ll b/test/CodeGen/X86/legalize-shift-64.ll index c9f2fc27dbff..71ef2d3152f8 100644 --- a/test/CodeGen/X86/legalize-shift-64.ll +++ b/test/CodeGen/X86/legalize-shift-64.ll @@ -54,3 +54,14 @@ define i64 @test4(i64 %xx, i32 %test) nounwind { ; CHECK: orl %esi, %eax ; CHECK: sarl %cl, %edx } + +; PR14668 +define <2 x i64> @test5(<2 x i64> %A, <2 x i64> %B) { + %shl = shl <2 x i64> %A, %B + ret <2 x i64> %shl +; CHECK: test5 +; CHECK: shl +; CHECK: shldl +; CHECK: shl +; CHECK: shldl +} diff --git a/test/CodeGen/X86/licm-nested.ll b/test/CodeGen/X86/licm-nested.ll index c3f991d7a9b0..66074fb3682c 100644 --- a/test/CodeGen/X86/licm-nested.ll +++ b/test/CodeGen/X86/licm-nested.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc -mtriple=x86_64-apple-darwin -march=x86-64 < %s -o /dev/null -stats -info-output-file - | grep "hoisted out of loops" | grep 3 ; MachineLICM should be able to hoist the symbolic addresses out of diff --git a/test/CodeGen/X86/lit.local.cfg b/test/CodeGen/X86/lit.local.cfg index a8ad0f1a28b2..9d285bf4e238 100644 --- a/test/CodeGen/X86/lit.local.cfg +++ b/test/CodeGen/X86/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'X86' in targets: diff --git a/test/CodeGen/X86/memcpy-2.ll b/test/CodeGen/X86/memcpy-2.ll index eae2e708349c..630c0ed1a33c 100644 --- a/test/CodeGen/X86/memcpy-2.ll +++ b/test/CodeGen/X86/memcpy-2.ll @@ -1,4 +1,5 @@ -; RUN: llc < %s -mattr=+sse2 -mtriple=i686-apple-darwin -mcpu=core2 | FileCheck %s -check-prefix=SSE2 +; RUN: llc < %s -mattr=+sse2 -mtriple=i686-apple-darwin -mcpu=core2 | FileCheck %s -check-prefix=SSE2-Darwin +; RUN: llc < %s -mattr=+sse2 -mtriple=i686-pc-mingw32 -mcpu=core2 | FileCheck %s -check-prefix=SSE2-Mingw32 ; RUN: llc < %s -mattr=+sse,-sse2 -mtriple=i686-apple-darwin -mcpu=core2 | FileCheck %s -check-prefix=SSE1 ; RUN: llc < %s -mattr=-sse -mtriple=i686-apple-darwin -mcpu=core2 | FileCheck %s -check-prefix=NOSSE ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core2 | FileCheck %s -check-prefix=X86-64 @@ -8,19 +9,26 @@ define void @t1(i32 %argc, i8** %argv) nounwind { entry: -; SSE2: t1: -; SSE2: movaps _.str, %xmm0 -; SSE2: movaps %xmm0 -; SSE2: movb $0 -; SSE2: movl $0 -; SSE2: movl $0 +; SSE2-Darwin: t1: +; SSE2-Darwin: movsd _.str+16, %xmm0 +; SSE2-Darwin: movsd %xmm0, 16(%esp) +; SSE2-Darwin: movaps _.str, %xmm0 +; SSE2-Darwin: movaps %xmm0 +; SSE2-Darwin: movb $0, 24(%esp) + +; SSE2-Mingw32: t1: +; SSE2-Mingw32: movsd _.str+16, %xmm0 +; SSE2-Mingw32: movsd %xmm0, 16(%esp) +; SSE2-Mingw32: movaps _.str, %xmm0 +; SSE2-Mingw32: movups %xmm0 +; SSE2-Mingw32: movb $0, 24(%esp) ; SSE1: t1: ; SSE1: movaps _.str, %xmm0 ; SSE1: movaps %xmm0 -; SSE1: movb $0 -; SSE1: movl $0 -; SSE1: movl $0 +; SSE1: movb $0, 24(%esp) +; SSE1: movl $0, 20(%esp) +; SSE1: movl $0, 16(%esp) ; NOSSE: t1: ; NOSSE: movb $0 @@ -47,9 +55,13 @@ entry: define void @t2(%struct.s0* nocapture %a, %struct.s0* nocapture %b) nounwind ssp { entry: -; SSE2: t2: -; SSE2: movaps (%eax), %xmm0 -; SSE2: movaps %xmm0, (%eax) +; SSE2-Darwin: t2: +; SSE2-Darwin: movaps (%eax), %xmm0 +; SSE2-Darwin: movaps %xmm0, (%eax) + +; SSE2-Mingw32: t2: +; SSE2-Mingw32: movaps (%eax), %xmm0 +; SSE2-Mingw32: movaps %xmm0, (%eax) ; SSE1: t2: ; SSE1: movaps (%eax), %xmm0 @@ -78,11 +90,17 @@ entry: define void @t3(%struct.s0* nocapture %a, %struct.s0* nocapture %b) nounwind ssp { entry: -; SSE2: t3: -; SSE2: movsd (%eax), %xmm0 -; SSE2: movsd 8(%eax), %xmm1 -; SSE2: movsd %xmm1, 8(%eax) -; SSE2: movsd %xmm0, (%eax) +; SSE2-Darwin: t3: +; SSE2-Darwin: movsd (%eax), %xmm0 +; SSE2-Darwin: movsd 8(%eax), %xmm1 +; SSE2-Darwin: movsd %xmm1, 8(%eax) +; SSE2-Darwin: movsd %xmm0, (%eax) + +; SSE2-Mingw32: t3: +; SSE2-Mingw32: movsd (%eax), %xmm0 +; SSE2-Mingw32: movsd 8(%eax), %xmm1 +; SSE2-Mingw32: movsd %xmm1, 8(%eax) +; SSE2-Mingw32: movsd %xmm0, (%eax) ; SSE1: t3: ; SSE1: movl @@ -121,15 +139,25 @@ entry: define void @t4() nounwind { entry: -; SSE2: t4: -; SSE2: movw $120 -; SSE2: movl $2021161080 -; SSE2: movl $2021161080 -; SSE2: movl $2021161080 -; SSE2: movl $2021161080 -; SSE2: movl $2021161080 -; SSE2: movl $2021161080 -; SSE2: movl $2021161080 +; SSE2-Darwin: t4: +; SSE2-Darwin: movw $120 +; SSE2-Darwin: movl $2021161080 +; SSE2-Darwin: movl $2021161080 +; SSE2-Darwin: movl $2021161080 +; SSE2-Darwin: movl $2021161080 +; SSE2-Darwin: movl $2021161080 +; SSE2-Darwin: movl $2021161080 +; SSE2-Darwin: movl $2021161080 + +; SSE2-Mingw32: t4: +; SSE2-Mingw32: movw $120 +; SSE2-Mingw32: movl $2021161080 +; SSE2-Mingw32: movl $2021161080 +; SSE2-Mingw32: movl $2021161080 +; SSE2-Mingw32: movl $2021161080 +; SSE2-Mingw32: movl $2021161080 +; SSE2-Mingw32: movl $2021161080 +; SSE2-Mingw32: movl $2021161080 ; SSE1: t4: ; SSE1: movw $120 diff --git a/test/CodeGen/X86/memcpy.ll b/test/CodeGen/X86/memcpy.ll index 39c7fbafd4c7..3372a4adc5ee 100644 --- a/test/CodeGen/X86/memcpy.ll +++ b/test/CodeGen/X86/memcpy.ll @@ -87,8 +87,34 @@ entry: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %C, i8* getelementptr inbounds ([30 x i8]* @.str, i64 0, i64 0), i64 16, i32 1, i1 false) ret void +; DARWIN: test5: ; DARWIN: movabsq $7016996765293437281 ; DARWIN: movabsq $7016996765293437184 } +; PR14896 +@.str2 = private unnamed_addr constant [2 x i8] c"x\00", align 1 + +define void @test6() nounwind uwtable { +entry: +; DARWIN: test6 +; DARWIN: movw $0, 8 +; DARWIN: movq $120, 0 + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* null, i8* getelementptr inbounds ([2 x i8]* @.str2, i64 0, i64 0), i64 10, i32 1, i1 false) + ret void +} + +define void @PR15348(i8* %a, i8* %b) { +; Ensure that alignment of '0' in an @llvm.memcpy intrinsic results in +; unaligned loads and stores. +; LINUX: PR15348 +; LINUX: movb +; LINUX: movb +; LINUX: movq +; LINUX: movq +; LINUX: movq +; LINUX: movq + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 17, i32 0, i1 false) + ret void +} diff --git a/test/CodeGen/X86/memset-sse-stack-realignment.ll b/test/CodeGen/X86/memset-sse-stack-realignment.ll new file mode 100644 index 000000000000..df9de5dfaf22 --- /dev/null +++ b/test/CodeGen/X86/memset-sse-stack-realignment.ll @@ -0,0 +1,77 @@ +; Make sure that we realign the stack. Mingw32 uses 4 byte stack alignment, we +; need 16 bytes for SSE and 32 bytes for AVX. + +; RUN: llc < %s -mtriple=i386-pc-mingw32 -mcpu=pentium2 | FileCheck %s -check-prefix=NOSSE +; RUN: llc < %s -mtriple=i386-pc-mingw32 -mcpu=pentium3 | FileCheck %s -check-prefix=SSE1 +; RUN: llc < %s -mtriple=i386-pc-mingw32 -mcpu=yonah | FileCheck %s -check-prefix=SSE2 +; RUN: llc < %s -mtriple=i386-pc-mingw32 -mcpu=corei7-avx | FileCheck %s -check-prefix=AVX1 +; RUN: llc < %s -mtriple=i386-pc-mingw32 -mcpu=core-avx2 | FileCheck %s -check-prefix=AVX2 + +define void @test1(i32 %t) nounwind { + %tmp1210 = alloca i8, i32 32, align 4 + call void @llvm.memset.p0i8.i64(i8* %tmp1210, i8 0, i64 32, i32 4, i1 false) + %x = alloca i8, i32 %t + call void @dummy(i8* %x) + ret void + +; NOSSE: test1: +; NOSSE-NOT: and +; NOSSE: movl $0 + +; SSE1: test1: +; SSE1: andl $-16 +; SSE1: movl %esp, %esi +; SSE1: movaps + +; SSE2: test1: +; SSE2: andl $-16 +; SSE2: movl %esp, %esi +; SSE2: movaps + +; AVX1: test1: +; AVX1: andl $-32 +; AVX1: movl %esp, %esi +; AVX1: vmovaps %ymm + +; AVX2: test1: +; AVX2: andl $-32 +; AVX2: movl %esp, %esi +; AVX2: vmovaps %ymm + +} + +define void @test2(i32 %t) nounwind { + %tmp1210 = alloca i8, i32 16, align 4 + call void @llvm.memset.p0i8.i64(i8* %tmp1210, i8 0, i64 16, i32 4, i1 false) + %x = alloca i8, i32 %t + call void @dummy(i8* %x) + ret void + +; NOSSE: test2: +; NOSSE-NOT: and +; NOSSE: movl $0 + +; SSE1: test2: +; SSE1: andl $-16 +; SSE1: movl %esp, %esi +; SSE1: movaps + +; SSE2: test2: +; SSE2: andl $-16 +; SSE2: movl %esp, %esi +; SSE2: movaps + +; AVX1: test2: +; AVX1: andl $-16 +; AVX1: movl %esp, %esi +; AVX1: vmovaps %xmm + +; AVX2: test2: +; AVX2: andl $-16 +; AVX2: movl %esp, %esi +; AVX2: vmovaps %xmm +} + +declare void @dummy(i8*) + +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind diff --git a/test/CodeGen/X86/memset.ll b/test/CodeGen/X86/memset.ll index 72b3e0fa3d51..0d479f0abe7b 100644 --- a/test/CodeGen/X86/memset.ll +++ b/test/CodeGen/X86/memset.ll @@ -1,5 +1,6 @@ -; RUN: llc < %s -march=x86 -mattr=-sse -mtriple=i686-apple-darwin8.8.0 | grep mov | count 9 -; RUN: llc < %s -march=x86 -mattr=+sse -mtriple=i686-apple-darwin8.8.0 | grep mov | count 3 +; RUN: llc < %s -march=x86 -mcpu=pentium2 -mtriple=i686-apple-darwin8.8.0 | FileCheck %s --check-prefix=X86 +; RUN: llc < %s -march=x86 -mcpu=pentium3 -mtriple=i686-apple-darwin8.8.0 | FileCheck %s --check-prefix=XMM +; RUN: llc < %s -march=x86 -mcpu=bdver1 -mtriple=i686-apple-darwin8.8.0 | FileCheck %s --check-prefix=YMM %struct.x = type { i16, i16 } @@ -8,7 +9,30 @@ entry: %up_mvd = alloca [8 x %struct.x] ; <[8 x %struct.x]*> [#uses=2] %up_mvd116 = getelementptr [8 x %struct.x]* %up_mvd, i32 0, i32 0 ; <%struct.x*> [#uses=1] %tmp110117 = bitcast [8 x %struct.x]* %up_mvd to i8* ; <i8*> [#uses=1] + call void @llvm.memset.p0i8.i64(i8* %tmp110117, i8 0, i64 32, i32 8, i1 false) +; X86: movl $0, +; X86: movl $0, +; X86: movl $0, +; X86: movl $0, +; X86: movl $0, +; X86: movl $0, +; X86: movl $0, +; X86: movl $0, +; X86-NOT: movl $0, +; X86: ret + +; XMM: xorps %xmm{{[0-9]+}}, [[Z:%xmm[0-9]+]] +; XMM: movaps [[Z]], +; XMM: movaps [[Z]], +; XMM-NOT: movaps +; XMM: ret + +; YMM: vxorps %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, [[Z:%ymm[0-9]+]] +; YMM: vmovaps [[Z]], +; YMM-NOT: movaps +; YMM: ret + call void @foo( %struct.x* %up_mvd116 ) nounwind ret void } @@ -16,3 +40,16 @@ entry: declare void @foo(%struct.x*) declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind + +define void @PR15348(i8* %a) { +; Ensure that alignment of '0' in an @llvm.memset intrinsic results in +; unaligned loads and stores. +; XMM: PR15348 +; XMM: movb $0, +; XMM: movl $0, +; XMM: movl $0, +; XMM: movl $0, +; XMM: movl $0, + call void @llvm.memset.p0i8.i64(i8* %a, i8 0, i64 17, i32 0, i1 false) + ret void +} diff --git a/test/CodeGen/X86/memset64-on-x86-32.ll b/test/CodeGen/X86/memset64-on-x86-32.ll index e20fce172f27..8cfa032797f7 100644 --- a/test/CodeGen/X86/memset64-on-x86-32.ll +++ b/test/CodeGen/X86/memset64-on-x86-32.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -mtriple=i386-apple-darwin -mcpu=nehalem | grep movups | count 5 ; RUN: llc < %s -mtriple=i386-apple-darwin -mcpu=core2 | grep movl | count 20 +; RUN: llc < %s -mtriple=i386-pc-mingw32 -mcpu=core2 | grep movl | count 20 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core2 | grep movq | count 10 define void @bork() nounwind { diff --git a/test/CodeGen/X86/misched-crash.ll b/test/CodeGen/X86/misched-crash.ll new file mode 100644 index 000000000000..7644ee070878 --- /dev/null +++ b/test/CodeGen/X86/misched-crash.ll @@ -0,0 +1,40 @@ +; RUN: llc < %s -enable-misched -verify-misched +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10" + +; This function contains a cmp instruction with two users. +; Hoisting the last use requires trimming the EFLAGS live range to the second. +define void @rdar13353090(i8* %plane, i64 %_x1, i64 %_x2) { +entry: + %cmp = icmp ult i64 %_x1, %_x2 + %cond = select i1 %cmp, i64 %_x1, i64 %_x2 + %cond10 = select i1 %cmp, i64 %_x2, i64 %_x1 + %0 = load i64* null, align 8 + %cmp16 = icmp ult i64 %cond, %0 + %cmp23 = icmp ugt i64 %cond10, 0 + br i1 %cmp16, label %land.lhs.true21, label %return + +land.lhs.true21: ; preds = %entry + %sub = add i64 %0, -1 + br i1 %cmp23, label %if.then24, label %return + +if.then24: ; preds = %land.lhs.true21 + %cmp16.i = icmp ult i64 %cond, %sub + %cond20.i = select i1 %cmp16.i, i64 %cond, i64 %sub + %add21.i = add i64 0, %cond20.i + br label %for.body34.i + +for.body34.i: ; preds = %for.inc39.i, %if.then24 + %index.178.i = phi i64 [ %add21.i, %if.then24 ], [ %inc41.i, %for.inc39.i ] + %arrayidx35.i = getelementptr inbounds i8* %plane, i64 %index.178.i + %1 = load i8* %arrayidx35.i, align 1 + %tobool36.i = icmp eq i8 %1, 0 + br i1 %tobool36.i, label %for.inc39.i, label %return + +for.inc39.i: ; preds = %for.body34.i + %inc41.i = add i64 %index.178.i, 1 + br i1 undef, label %return, label %for.body34.i + +return: ; preds = %for.inc39.i, %for.body34.i, %land.lhs.true21, %entry + ret void +} diff --git a/test/CodeGen/X86/misched-ilp.ll b/test/CodeGen/X86/misched-ilp.ll index c6cedb7be871..4ca296ca92e5 100644 --- a/test/CodeGen/X86/misched-ilp.ll +++ b/test/CodeGen/X86/misched-ilp.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -mtriple=x86_64-apple-macosx -mcpu=core2 -enable-misched -misched=ilpmax | FileCheck -check-prefix=MAX %s -; RUN: llc < %s -mtriple=x86_64-apple-macosx -mcpu=core2 -enable-misched -misched=ilpmin | FileCheck -check-prefix=MIN %s +; RUN: llc < %s -mtriple=x86_64-apple-macosx -mcpu=nocona -enable-misched -misched=ilpmax | FileCheck -check-prefix=MAX %s +; RUN: llc < %s -mtriple=x86_64-apple-macosx -mcpu=nocona -enable-misched -misched=ilpmin | FileCheck -check-prefix=MIN %s ; ; Basic verification of the ScheduleDAGILP metric. ; diff --git a/test/CodeGen/X86/misched-matmul.ll b/test/CodeGen/X86/misched-matmul.ll new file mode 100644 index 000000000000..0f6e442b1a8d --- /dev/null +++ b/test/CodeGen/X86/misched-matmul.ll @@ -0,0 +1,228 @@ +; REQUIRES: asserts +; RUN: llc < %s -march=x86-64 -mcpu=core2 -pre-RA-sched=source -enable-misched -stats 2>&1 | FileCheck %s +; +; Verify that register pressure heuristics are working in MachineScheduler. +; +; When we enable subtree scheduling heuristics on X86, we may need a +; flag to disable it for this test case. +; +; CHECK: @wrap_mul4 +; CHECK: 30 regalloc - Number of spills inserted + +define void @wrap_mul4(double* nocapture %Out, [4 x double]* nocapture %A, [4 x double]* nocapture %B) #0 { +entry: + %arrayidx1.i = getelementptr inbounds [4 x double]* %A, i64 0, i64 0 + %0 = load double* %arrayidx1.i, align 8, !tbaa !0 + %arrayidx3.i = getelementptr inbounds [4 x double]* %B, i64 0, i64 0 + %1 = load double* %arrayidx3.i, align 8, !tbaa !0 + %mul.i = fmul double %0, %1 + %arrayidx5.i = getelementptr inbounds [4 x double]* %A, i64 0, i64 1 + %2 = load double* %arrayidx5.i, align 8, !tbaa !0 + %arrayidx7.i = getelementptr inbounds [4 x double]* %B, i64 1, i64 0 + %3 = load double* %arrayidx7.i, align 8, !tbaa !0 + %mul8.i = fmul double %2, %3 + %add.i = fadd double %mul.i, %mul8.i + %arrayidx10.i = getelementptr inbounds [4 x double]* %A, i64 0, i64 2 + %4 = load double* %arrayidx10.i, align 8, !tbaa !0 + %arrayidx12.i = getelementptr inbounds [4 x double]* %B, i64 2, i64 0 + %5 = load double* %arrayidx12.i, align 8, !tbaa !0 + %mul13.i = fmul double %4, %5 + %add14.i = fadd double %add.i, %mul13.i + %arrayidx16.i = getelementptr inbounds [4 x double]* %A, i64 0, i64 3 + %6 = load double* %arrayidx16.i, align 8, !tbaa !0 + %arrayidx18.i = getelementptr inbounds [4 x double]* %B, i64 3, i64 0 + %7 = load double* %arrayidx18.i, align 8, !tbaa !0 + %mul19.i = fmul double %6, %7 + %add20.i = fadd double %add14.i, %mul19.i + %arrayidx25.i = getelementptr inbounds [4 x double]* %B, i64 0, i64 1 + %8 = load double* %arrayidx25.i, align 8, !tbaa !0 + %mul26.i = fmul double %0, %8 + %arrayidx30.i = getelementptr inbounds [4 x double]* %B, i64 1, i64 1 + %9 = load double* %arrayidx30.i, align 8, !tbaa !0 + %mul31.i = fmul double %2, %9 + %add32.i = fadd double %mul26.i, %mul31.i + %arrayidx36.i = getelementptr inbounds [4 x double]* %B, i64 2, i64 1 + %10 = load double* %arrayidx36.i, align 8, !tbaa !0 + %mul37.i = fmul double %4, %10 + %add38.i = fadd double %add32.i, %mul37.i + %arrayidx42.i = getelementptr inbounds [4 x double]* %B, i64 3, i64 1 + %11 = load double* %arrayidx42.i, align 8, !tbaa !0 + %mul43.i = fmul double %6, %11 + %add44.i = fadd double %add38.i, %mul43.i + %arrayidx49.i = getelementptr inbounds [4 x double]* %B, i64 0, i64 2 + %12 = load double* %arrayidx49.i, align 8, !tbaa !0 + %mul50.i = fmul double %0, %12 + %arrayidx54.i = getelementptr inbounds [4 x double]* %B, i64 1, i64 2 + %13 = load double* %arrayidx54.i, align 8, !tbaa !0 + %mul55.i = fmul double %2, %13 + %add56.i = fadd double %mul50.i, %mul55.i + %arrayidx60.i = getelementptr inbounds [4 x double]* %B, i64 2, i64 2 + %14 = load double* %arrayidx60.i, align 8, !tbaa !0 + %mul61.i = fmul double %4, %14 + %add62.i = fadd double %add56.i, %mul61.i + %arrayidx66.i = getelementptr inbounds [4 x double]* %B, i64 3, i64 2 + %15 = load double* %arrayidx66.i, align 8, !tbaa !0 + %mul67.i = fmul double %6, %15 + %add68.i = fadd double %add62.i, %mul67.i + %arrayidx73.i = getelementptr inbounds [4 x double]* %B, i64 0, i64 3 + %16 = load double* %arrayidx73.i, align 8, !tbaa !0 + %mul74.i = fmul double %0, %16 + %arrayidx78.i = getelementptr inbounds [4 x double]* %B, i64 1, i64 3 + %17 = load double* %arrayidx78.i, align 8, !tbaa !0 + %mul79.i = fmul double %2, %17 + %add80.i = fadd double %mul74.i, %mul79.i + %arrayidx84.i = getelementptr inbounds [4 x double]* %B, i64 2, i64 3 + %18 = load double* %arrayidx84.i, align 8, !tbaa !0 + %mul85.i = fmul double %4, %18 + %add86.i = fadd double %add80.i, %mul85.i + %arrayidx90.i = getelementptr inbounds [4 x double]* %B, i64 3, i64 3 + %19 = load double* %arrayidx90.i, align 8, !tbaa !0 + %mul91.i = fmul double %6, %19 + %add92.i = fadd double %add86.i, %mul91.i + %arrayidx95.i = getelementptr inbounds [4 x double]* %A, i64 1, i64 0 + %20 = load double* %arrayidx95.i, align 8, !tbaa !0 + %mul98.i = fmul double %1, %20 + %arrayidx100.i = getelementptr inbounds [4 x double]* %A, i64 1, i64 1 + %21 = load double* %arrayidx100.i, align 8, !tbaa !0 + %mul103.i = fmul double %3, %21 + %add104.i = fadd double %mul98.i, %mul103.i + %arrayidx106.i = getelementptr inbounds [4 x double]* %A, i64 1, i64 2 + %22 = load double* %arrayidx106.i, align 8, !tbaa !0 + %mul109.i = fmul double %5, %22 + %add110.i = fadd double %add104.i, %mul109.i + %arrayidx112.i = getelementptr inbounds [4 x double]* %A, i64 1, i64 3 + %23 = load double* %arrayidx112.i, align 8, !tbaa !0 + %mul115.i = fmul double %7, %23 + %add116.i = fadd double %add110.i, %mul115.i + %mul122.i = fmul double %8, %20 + %mul127.i = fmul double %9, %21 + %add128.i = fadd double %mul122.i, %mul127.i + %mul133.i = fmul double %10, %22 + %add134.i = fadd double %add128.i, %mul133.i + %mul139.i = fmul double %11, %23 + %add140.i = fadd double %add134.i, %mul139.i + %mul146.i = fmul double %12, %20 + %mul151.i = fmul double %13, %21 + %add152.i = fadd double %mul146.i, %mul151.i + %mul157.i = fmul double %14, %22 + %add158.i = fadd double %add152.i, %mul157.i + %mul163.i = fmul double %15, %23 + %add164.i = fadd double %add158.i, %mul163.i + %mul170.i = fmul double %16, %20 + %mul175.i = fmul double %17, %21 + %add176.i = fadd double %mul170.i, %mul175.i + %mul181.i = fmul double %18, %22 + %add182.i = fadd double %add176.i, %mul181.i + %mul187.i = fmul double %19, %23 + %add188.i = fadd double %add182.i, %mul187.i + %arrayidx191.i = getelementptr inbounds [4 x double]* %A, i64 2, i64 0 + %24 = load double* %arrayidx191.i, align 8, !tbaa !0 + %mul194.i = fmul double %1, %24 + %arrayidx196.i = getelementptr inbounds [4 x double]* %A, i64 2, i64 1 + %25 = load double* %arrayidx196.i, align 8, !tbaa !0 + %mul199.i = fmul double %3, %25 + %add200.i = fadd double %mul194.i, %mul199.i + %arrayidx202.i = getelementptr inbounds [4 x double]* %A, i64 2, i64 2 + %26 = load double* %arrayidx202.i, align 8, !tbaa !0 + %mul205.i = fmul double %5, %26 + %add206.i = fadd double %add200.i, %mul205.i + %arrayidx208.i = getelementptr inbounds [4 x double]* %A, i64 2, i64 3 + %27 = load double* %arrayidx208.i, align 8, !tbaa !0 + %mul211.i = fmul double %7, %27 + %add212.i = fadd double %add206.i, %mul211.i + %mul218.i = fmul double %8, %24 + %mul223.i = fmul double %9, %25 + %add224.i = fadd double %mul218.i, %mul223.i + %mul229.i = fmul double %10, %26 + %add230.i = fadd double %add224.i, %mul229.i + %mul235.i = fmul double %11, %27 + %add236.i = fadd double %add230.i, %mul235.i + %mul242.i = fmul double %12, %24 + %mul247.i = fmul double %13, %25 + %add248.i = fadd double %mul242.i, %mul247.i + %mul253.i = fmul double %14, %26 + %add254.i = fadd double %add248.i, %mul253.i + %mul259.i = fmul double %15, %27 + %add260.i = fadd double %add254.i, %mul259.i + %mul266.i = fmul double %16, %24 + %mul271.i = fmul double %17, %25 + %add272.i = fadd double %mul266.i, %mul271.i + %mul277.i = fmul double %18, %26 + %add278.i = fadd double %add272.i, %mul277.i + %mul283.i = fmul double %19, %27 + %add284.i = fadd double %add278.i, %mul283.i + %arrayidx287.i = getelementptr inbounds [4 x double]* %A, i64 3, i64 0 + %28 = load double* %arrayidx287.i, align 8, !tbaa !0 + %mul290.i = fmul double %1, %28 + %arrayidx292.i = getelementptr inbounds [4 x double]* %A, i64 3, i64 1 + %29 = load double* %arrayidx292.i, align 8, !tbaa !0 + %mul295.i = fmul double %3, %29 + %add296.i = fadd double %mul290.i, %mul295.i + %arrayidx298.i = getelementptr inbounds [4 x double]* %A, i64 3, i64 2 + %30 = load double* %arrayidx298.i, align 8, !tbaa !0 + %mul301.i = fmul double %5, %30 + %add302.i = fadd double %add296.i, %mul301.i + %arrayidx304.i = getelementptr inbounds [4 x double]* %A, i64 3, i64 3 + %31 = load double* %arrayidx304.i, align 8, !tbaa !0 + %mul307.i = fmul double %7, %31 + %add308.i = fadd double %add302.i, %mul307.i + %mul314.i = fmul double %8, %28 + %mul319.i = fmul double %9, %29 + %add320.i = fadd double %mul314.i, %mul319.i + %mul325.i = fmul double %10, %30 + %add326.i = fadd double %add320.i, %mul325.i + %mul331.i = fmul double %11, %31 + %add332.i = fadd double %add326.i, %mul331.i + %mul338.i = fmul double %12, %28 + %mul343.i = fmul double %13, %29 + %add344.i = fadd double %mul338.i, %mul343.i + %mul349.i = fmul double %14, %30 + %add350.i = fadd double %add344.i, %mul349.i + %mul355.i = fmul double %15, %31 + %add356.i = fadd double %add350.i, %mul355.i + %mul362.i = fmul double %16, %28 + %mul367.i = fmul double %17, %29 + %add368.i = fadd double %mul362.i, %mul367.i + %mul373.i = fmul double %18, %30 + %add374.i = fadd double %add368.i, %mul373.i + %mul379.i = fmul double %19, %31 + %add380.i = fadd double %add374.i, %mul379.i + store double %add20.i, double* %Out, align 8 + %Res.i.sroa.1.8.idx2 = getelementptr inbounds double* %Out, i64 1 + store double %add44.i, double* %Res.i.sroa.1.8.idx2, align 8 + %Res.i.sroa.2.16.idx4 = getelementptr inbounds double* %Out, i64 2 + store double %add68.i, double* %Res.i.sroa.2.16.idx4, align 8 + %Res.i.sroa.3.24.idx6 = getelementptr inbounds double* %Out, i64 3 + store double %add92.i, double* %Res.i.sroa.3.24.idx6, align 8 + %Res.i.sroa.4.32.idx8 = getelementptr inbounds double* %Out, i64 4 + store double %add116.i, double* %Res.i.sroa.4.32.idx8, align 8 + %Res.i.sroa.5.40.idx10 = getelementptr inbounds double* %Out, i64 5 + store double %add140.i, double* %Res.i.sroa.5.40.idx10, align 8 + %Res.i.sroa.6.48.idx12 = getelementptr inbounds double* %Out, i64 6 + store double %add164.i, double* %Res.i.sroa.6.48.idx12, align 8 + %Res.i.sroa.7.56.idx14 = getelementptr inbounds double* %Out, i64 7 + store double %add188.i, double* %Res.i.sroa.7.56.idx14, align 8 + %Res.i.sroa.8.64.idx16 = getelementptr inbounds double* %Out, i64 8 + store double %add212.i, double* %Res.i.sroa.8.64.idx16, align 8 + %Res.i.sroa.9.72.idx18 = getelementptr inbounds double* %Out, i64 9 + store double %add236.i, double* %Res.i.sroa.9.72.idx18, align 8 + %Res.i.sroa.10.80.idx20 = getelementptr inbounds double* %Out, i64 10 + store double %add260.i, double* %Res.i.sroa.10.80.idx20, align 8 + %Res.i.sroa.11.88.idx22 = getelementptr inbounds double* %Out, i64 11 + store double %add284.i, double* %Res.i.sroa.11.88.idx22, align 8 + %Res.i.sroa.12.96.idx24 = getelementptr inbounds double* %Out, i64 12 + store double %add308.i, double* %Res.i.sroa.12.96.idx24, align 8 + %Res.i.sroa.13.104.idx26 = getelementptr inbounds double* %Out, i64 13 + store double %add332.i, double* %Res.i.sroa.13.104.idx26, align 8 + %Res.i.sroa.14.112.idx28 = getelementptr inbounds double* %Out, i64 14 + store double %add356.i, double* %Res.i.sroa.14.112.idx28, align 8 + %Res.i.sroa.15.120.idx30 = getelementptr inbounds double* %Out, i64 15 + store double %add380.i, double* %Res.i.sroa.15.120.idx30, align 8 + ret void +} + +attributes #0 = { noinline nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!0 = metadata !{metadata !"double", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/X86/misched-matrix.ll b/test/CodeGen/X86/misched-matrix.ll new file mode 100644 index 000000000000..f5566e5e5de9 --- /dev/null +++ b/test/CodeGen/X86/misched-matrix.ll @@ -0,0 +1,195 @@ +; RUN: llc < %s -march=x86-64 -mcpu=core2 -pre-RA-sched=source -enable-misched \ +; RUN: -misched-topdown -verify-machineinstrs \ +; RUN: | FileCheck %s -check-prefix=TOPDOWN +; RUN: llc < %s -march=x86-64 -mcpu=core2 -pre-RA-sched=source -enable-misched \ +; RUN: -misched=ilpmin -verify-machineinstrs \ +; RUN: | FileCheck %s -check-prefix=ILPMIN +; RUN: llc < %s -march=x86-64 -mcpu=core2 -pre-RA-sched=source -enable-misched \ +; RUN: -misched=ilpmax -verify-machineinstrs \ +; RUN: | FileCheck %s -check-prefix=ILPMAX +; +; Verify that the MI scheduler minimizes register pressure for a +; uniform set of bottom-up subtrees (unrolled matrix multiply). +; +; For current top-down heuristics, ensure that some folded imulls have +; been reordered with the stores. This tests the scheduler's cheap +; alias analysis ability (that doesn't require any AliasAnalysis pass). +; +; TOPDOWN: %for.body +; TOPDOWN: movl %{{.*}}, ( +; TOPDOWN: imull {{[0-9]*}}( +; TOPDOWN: movl %{{.*}}, 4( +; TOPDOWN: imull {{[0-9]*}}( +; TOPDOWN: movl %{{.*}}, 8( +; TOPDOWN: movl %{{.*}}, 12( +; TOPDOWN: %for.end +; +; For -misched=ilpmin, verify that each expression subtree is +; scheduled independently, and that the imull/adds are interleaved. +; +; ILPMIN: %for.body +; ILPMIN: movl %{{.*}}, ( +; ILPMIN: imull +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: movl %{{.*}}, 4( +; ILPMIN: imull +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: movl %{{.*}}, 8( +; ILPMIN: imull +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: imull +; ILPMIN: addl +; ILPMIN: movl %{{.*}}, 12( +; ILPMIN: %for.end +; +; For -misched=ilpmax, verify that each expression subtree is +; scheduled independently, and that the imull/adds are clustered. +; +; ILPMAX: %for.body +; ILPMAX: movl %{{.*}}, ( +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: addl +; ILPMAX: addl +; ILPMAX: addl +; ILPMAX: movl %{{.*}}, 4( +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: addl +; ILPMAX: addl +; ILPMAX: addl +; ILPMAX: movl %{{.*}}, 8( +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: imull +; ILPMAX: addl +; ILPMAX: addl +; ILPMAX: addl +; ILPMAX: movl %{{.*}}, 12( +; ILPMAX: %for.end + +define void @mmult([4 x i32]* noalias nocapture %m1, [4 x i32]* noalias nocapture %m2, +[4 x i32]* noalias nocapture %m3) nounwind uwtable ssp { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx8 = getelementptr inbounds [4 x i32]* %m1, i64 %indvars.iv, i64 0 + %tmp = load i32* %arrayidx8, align 4, !tbaa !0 + %arrayidx12 = getelementptr inbounds [4 x i32]* %m2, i64 0, i64 0 + %tmp1 = load i32* %arrayidx12, align 4, !tbaa !0 + %arrayidx8.1 = getelementptr inbounds [4 x i32]* %m1, i64 %indvars.iv, i64 1 + %tmp2 = load i32* %arrayidx8.1, align 4, !tbaa !0 + %arrayidx12.1 = getelementptr inbounds [4 x i32]* %m2, i64 1, i64 0 + %tmp3 = load i32* %arrayidx12.1, align 4, !tbaa !0 + %arrayidx8.2 = getelementptr inbounds [4 x i32]* %m1, i64 %indvars.iv, i64 2 + %tmp4 = load i32* %arrayidx8.2, align 4, !tbaa !0 + %arrayidx12.2 = getelementptr inbounds [4 x i32]* %m2, i64 2, i64 0 + %tmp5 = load i32* %arrayidx12.2, align 4, !tbaa !0 + %arrayidx8.3 = getelementptr inbounds [4 x i32]* %m1, i64 %indvars.iv, i64 3 + %tmp6 = load i32* %arrayidx8.3, align 4, !tbaa !0 + %arrayidx12.3 = getelementptr inbounds [4 x i32]* %m2, i64 3, i64 0 + %tmp8 = load i32* %arrayidx8, align 4, !tbaa !0 + %arrayidx12.137 = getelementptr inbounds [4 x i32]* %m2, i64 0, i64 1 + %tmp9 = load i32* %arrayidx12.137, align 4, !tbaa !0 + %tmp10 = load i32* %arrayidx8.1, align 4, !tbaa !0 + %arrayidx12.1.1 = getelementptr inbounds [4 x i32]* %m2, i64 1, i64 1 + %tmp11 = load i32* %arrayidx12.1.1, align 4, !tbaa !0 + %tmp12 = load i32* %arrayidx8.2, align 4, !tbaa !0 + %arrayidx12.2.1 = getelementptr inbounds [4 x i32]* %m2, i64 2, i64 1 + %tmp13 = load i32* %arrayidx12.2.1, align 4, !tbaa !0 + %tmp14 = load i32* %arrayidx8.3, align 4, !tbaa !0 + %arrayidx12.3.1 = getelementptr inbounds [4 x i32]* %m2, i64 3, i64 1 + %tmp15 = load i32* %arrayidx12.3.1, align 4, !tbaa !0 + %tmp16 = load i32* %arrayidx8, align 4, !tbaa !0 + %arrayidx12.239 = getelementptr inbounds [4 x i32]* %m2, i64 0, i64 2 + %tmp17 = load i32* %arrayidx12.239, align 4, !tbaa !0 + %tmp18 = load i32* %arrayidx8.1, align 4, !tbaa !0 + %arrayidx12.1.2 = getelementptr inbounds [4 x i32]* %m2, i64 1, i64 2 + %tmp19 = load i32* %arrayidx12.1.2, align 4, !tbaa !0 + %tmp20 = load i32* %arrayidx8.2, align 4, !tbaa !0 + %arrayidx12.2.2 = getelementptr inbounds [4 x i32]* %m2, i64 2, i64 2 + %tmp21 = load i32* %arrayidx12.2.2, align 4, !tbaa !0 + %tmp22 = load i32* %arrayidx8.3, align 4, !tbaa !0 + %arrayidx12.3.2 = getelementptr inbounds [4 x i32]* %m2, i64 3, i64 2 + %tmp23 = load i32* %arrayidx12.3.2, align 4, !tbaa !0 + %tmp24 = load i32* %arrayidx8, align 4, !tbaa !0 + %arrayidx12.341 = getelementptr inbounds [4 x i32]* %m2, i64 0, i64 3 + %tmp25 = load i32* %arrayidx12.341, align 4, !tbaa !0 + %tmp26 = load i32* %arrayidx8.1, align 4, !tbaa !0 + %arrayidx12.1.3 = getelementptr inbounds [4 x i32]* %m2, i64 1, i64 3 + %tmp27 = load i32* %arrayidx12.1.3, align 4, !tbaa !0 + %tmp28 = load i32* %arrayidx8.2, align 4, !tbaa !0 + %arrayidx12.2.3 = getelementptr inbounds [4 x i32]* %m2, i64 2, i64 3 + %tmp29 = load i32* %arrayidx12.2.3, align 4, !tbaa !0 + %tmp30 = load i32* %arrayidx8.3, align 4, !tbaa !0 + %arrayidx12.3.3 = getelementptr inbounds [4 x i32]* %m2, i64 3, i64 3 + %tmp31 = load i32* %arrayidx12.3.3, align 4, !tbaa !0 + %tmp7 = load i32* %arrayidx12.3, align 4, !tbaa !0 + %mul = mul nsw i32 %tmp1, %tmp + %mul.1 = mul nsw i32 %tmp3, %tmp2 + %mul.2 = mul nsw i32 %tmp5, %tmp4 + %mul.3 = mul nsw i32 %tmp7, %tmp6 + %mul.138 = mul nsw i32 %tmp9, %tmp8 + %mul.1.1 = mul nsw i32 %tmp11, %tmp10 + %mul.2.1 = mul nsw i32 %tmp13, %tmp12 + %mul.3.1 = mul nsw i32 %tmp15, %tmp14 + %mul.240 = mul nsw i32 %tmp17, %tmp16 + %mul.1.2 = mul nsw i32 %tmp19, %tmp18 + %mul.2.2 = mul nsw i32 %tmp21, %tmp20 + %mul.3.2 = mul nsw i32 %tmp23, %tmp22 + %mul.342 = mul nsw i32 %tmp25, %tmp24 + %mul.1.3 = mul nsw i32 %tmp27, %tmp26 + %mul.2.3 = mul nsw i32 %tmp29, %tmp28 + %mul.3.3 = mul nsw i32 %tmp31, %tmp30 + %add.1 = add nsw i32 %mul.1, %mul + %add.2 = add nsw i32 %mul.2, %add.1 + %add.3 = add nsw i32 %mul.3, %add.2 + %add.1.1 = add nsw i32 %mul.1.1, %mul.138 + %add.2.1 = add nsw i32 %mul.2.1, %add.1.1 + %add.3.1 = add nsw i32 %mul.3.1, %add.2.1 + %add.1.2 = add nsw i32 %mul.1.2, %mul.240 + %add.2.2 = add nsw i32 %mul.2.2, %add.1.2 + %add.3.2 = add nsw i32 %mul.3.2, %add.2.2 + %add.1.3 = add nsw i32 %mul.1.3, %mul.342 + %add.2.3 = add nsw i32 %mul.2.3, %add.1.3 + %add.3.3 = add nsw i32 %mul.3.3, %add.2.3 + %arrayidx16 = getelementptr inbounds [4 x i32]* %m3, i64 %indvars.iv, i64 0 + store i32 %add.3, i32* %arrayidx16, align 4, !tbaa !0 + %arrayidx16.1 = getelementptr inbounds [4 x i32]* %m3, i64 %indvars.iv, i64 1 + store i32 %add.3.1, i32* %arrayidx16.1, align 4, !tbaa !0 + %arrayidx16.2 = getelementptr inbounds [4 x i32]* %m3, i64 %indvars.iv, i64 2 + store i32 %add.3.2, i32* %arrayidx16.2, align 4, !tbaa !0 + %arrayidx16.3 = getelementptr inbounds [4 x i32]* %m3, i64 %indvars.iv, i64 3 + store i32 %add.3.3, i32* %arrayidx16.3, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 4 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/X86/misched-new.ll b/test/CodeGen/X86/misched-new.ll index cec04b534fba..89e45b7cfc21 100644 --- a/test/CodeGen/X86/misched-new.ll +++ b/test/CodeGen/X86/misched-new.ll @@ -1,6 +1,9 @@ ; RUN: llc < %s -march=x86-64 -mcpu=core2 -x86-early-ifcvt -enable-misched \ ; RUN: -misched=shuffle -misched-bottomup -verify-machineinstrs \ ; RUN: | FileCheck %s +; RUN: llc < %s -march=x86-64 -mcpu=core2 -x86-early-ifcvt -enable-misched \ +; RUN: -misched=shuffle -misched-topdown -verify-machineinstrs \ +; RUN: | FileCheck %s --check-prefix TOPDOWN ; REQUIRES: asserts ; ; Interesting MachineScheduler cases. @@ -51,3 +54,56 @@ if.end: ; preds = %if.then, %entry } declare void @bar(i32,i32) + +; Test that the DAG builder can handle an undef vreg on ExitSU. +; CHECK: hasundef +; CHECK: call + +%t0 = type { i32, i32, i8 } +%t6 = type { i32 (...)**, %t7* } +%t7 = type { i32 (...)** } + +define void @hasundef() unnamed_addr uwtable ssp align 2 { + %1 = alloca %t0, align 8 + br i1 undef, label %3, label %2 + +; <label>:2 ; preds = %0 + unreachable + +; <label>:3 ; preds = %0 + br i1 undef, label %4, label %5 + +; <label>:4 ; preds = %3 + call void undef(%t6* undef, %t0* %1) + unreachable + +; <label>:5 ; preds = %3 + ret void +} + +; Test top-down subregister liveness tracking. Self-verification +; catches any pressure set underflow. +; rdar://12797931. +; +; TOPDOWN: @testSubregTracking +; TOPDOWN: divb +; TOPDOWN: movzbl %al +; TOPDOWN: ret +define void @testSubregTracking() nounwind uwtable ssp align 2 { + %tmp = load i8* undef, align 1 + %tmp6 = sub i8 0, %tmp + %tmp7 = load i8* undef, align 1 + %tmp8 = udiv i8 %tmp6, %tmp7 + %tmp9 = zext i8 %tmp8 to i64 + %tmp10 = load i8* undef, align 1 + %tmp11 = zext i8 %tmp10 to i64 + %tmp12 = mul i64 %tmp11, %tmp9 + %tmp13 = urem i8 %tmp6, %tmp7 + %tmp14 = zext i8 %tmp13 to i32 + %tmp15 = add nsw i32 %tmp14, 0 + %tmp16 = add i32 %tmp15, 0 + store i32 %tmp16, i32* undef, align 4 + %tmp17 = add i64 0, %tmp12 + store i64 %tmp17, i64* undef, align 8 + ret void +} diff --git a/test/CodeGen/X86/movgs.ll b/test/CodeGen/X86/movgs.ll index 65ee7b1d8e00..bb42734833dd 100644 --- a/test/CodeGen/X86/movgs.ll +++ b/test/CodeGen/X86/movgs.ll @@ -1,6 +1,6 @@ -; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu -mattr=sse41 | FileCheck %s --check-prefix=X32 -; RUN: llc < %s -mtriple=x86_64-linux -mattr=sse41 | FileCheck %s --check-prefix=X64 -; RUN: llc < %s -mtriple=x86_64-win32 -mattr=sse41 | FileCheck %s --check-prefix=X64 +; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu -mcpu=penryn -mattr=sse41 | FileCheck %s --check-prefix=X32 +; RUN: llc < %s -mtriple=x86_64-linux -mcpu=penryn -mattr=sse41 | FileCheck %s --check-prefix=X64 +; RUN: llc < %s -mtriple=x86_64-win32 -mcpu=penryn -mattr=sse41 | FileCheck %s --check-prefix=X64 define i32 @test1() nounwind readonly { entry: diff --git a/test/CodeGen/X86/ms-inline-asm.ll b/test/CodeGen/X86/ms-inline-asm.ll index 24d28adda894..5048a93ad302 100644 --- a/test/CodeGen/X86/ms-inline-asm.ll +++ b/test/CodeGen/X86/ms-inline-asm.ll @@ -1,10 +1,11 @@ -; RUN: llc < %s -march=x86 | FileCheck %s +; RUN: llc < %s -march=x86 -mcpu=core2 | FileCheck %s define i32 @t1() nounwind { entry: %0 = tail call i32 asm sideeffect inteldialect "mov eax, $1\0A\09mov $0, eax", "=r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32 1) nounwind ret i32 %0 ; CHECK: t1 +; CHECK: movl %esp, %ebp ; CHECK: {{## InlineAsm Start|#APP}} ; CHECK: .intel_syntax ; CHECK: mov eax, ecx @@ -18,6 +19,7 @@ entry: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind ret void ; CHECK: t2 +; CHECK: movl %esp, %ebp ; CHECK: {{## InlineAsm Start|#APP}} ; CHECK: .intel_syntax ; CHECK: mov eax, 1 @@ -32,6 +34,7 @@ entry: call void asm sideeffect inteldialect "mov eax, DWORD PTR [$0]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %V.addr) nounwind ret void ; CHECK: t3 +; CHECK: movl %esp, %ebp ; CHECK: {{## InlineAsm Start|#APP}} ; CHECK: .intel_syntax ; CHECK: mov eax, DWORD PTR {{[[esp]}} @@ -53,6 +56,7 @@ entry: %0 = load i32* %b1, align 4 ret i32 %0 ; CHECK: t18 +; CHECK: movl %esp, %ebp ; CHECK: {{## InlineAsm Start|#APP}} ; CHECK: .intel_syntax ; CHECK: lea ebx, foo @@ -61,3 +65,46 @@ entry: ; CHECK: .att_syntax ; CHECK: {{## InlineAsm End|#NO_APP}} } + +define void @t19_helper() nounwind { +entry: + ret void +} + +define void @t19() nounwind { +entry: + call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(void ()* @t19_helper) nounwind + ret void +; CHECK: t19: +; CHECK: movl %esp, %ebp +; CHECK: movl ${{_?}}t19_helper, %eax +; CHECK: {{## InlineAsm Start|#APP}} +; CHECK: .intel_syntax +; CHECK: call eax +; CHECK: .att_syntax +; CHECK: {{## InlineAsm End|#NO_APP}} +} + +@results = global [2 x i32] [i32 3, i32 2], align 4 + +define i32* @t30() nounwind ssp { +entry: + %res = alloca i32*, align 4 + call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @results) nounwind + call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %res) nounwind + %0 = load i32** %res, align 4 + ret i32* %0 +; CHECK: t30: +; CHECK: movl %esp, %ebp +; CHECK: {{## InlineAsm Start|#APP}} +; CHECK: .intel_syntax +; CHECK: lea edi, dword ptr [{{_?}}results] +; CHECK: .att_syntax +; CHECK: {{## InlineAsm End|#NO_APP}} +; CHECK: {{## InlineAsm Start|#APP}} +; CHECK: .intel_syntax +; CHECK: mov dword ptr [esi], edi +; CHECK: .att_syntax +; CHECK: {{## InlineAsm End|#NO_APP}} +; CHECK: movl (%esi), %eax +} diff --git a/test/CodeGen/X86/multiple-loop-post-inc.ll b/test/CodeGen/X86/multiple-loop-post-inc.ll index 9f7d036cf141..29b9f34464f0 100644 --- a/test/CodeGen/X86/multiple-loop-post-inc.ll +++ b/test/CodeGen/X86/multiple-loop-post-inc.ll @@ -1,4 +1,4 @@ -; RUN: llc -asm-verbose=false -disable-branch-fold -disable-code-place -disable-tail-duplicate -march=x86-64 -mcpu=nehalem < %s | FileCheck %s +; RUN: llc -asm-verbose=false -disable-branch-fold -disable-block-placement -disable-tail-duplicate -march=x86-64 -mcpu=nehalem < %s | FileCheck %s ; rdar://7236213 ; ; The scheduler's 2-address hack has been disabled, so there is diff --git a/test/CodeGen/X86/no-cmov.ll b/test/CodeGen/X86/no-cmov.ll new file mode 100644 index 000000000000..62d73b0732e7 --- /dev/null +++ b/test/CodeGen/X86/no-cmov.ll @@ -0,0 +1,11 @@ +; RUN: llc -march=x86 -mcpu=i486 < %s | FileCheck %s + +define i32 @test1(i32 %g, i32* %j) { + %tobool = icmp eq i32 %g, 0 + %cmp = load i32* %j, align 4 + %retval.0 = select i1 %tobool, i32 1, i32 %cmp + ret i32 %retval.0 + +; CHECK: test1: +; CHECK-NOT: cmov +} diff --git a/test/CodeGen/X86/phi-immediate-factoring.ll b/test/CodeGen/X86/phi-immediate-factoring.ll index 476bb1099831..6425ef0e8376 100644 --- a/test/CodeGen/X86/phi-immediate-factoring.ll +++ b/test/CodeGen/X86/phi-immediate-factoring.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -stats 2>&1 | grep "Number of blocks eliminated" | grep 6 ; PR1296 diff --git a/test/CodeGen/X86/pmovsx-inreg.ll b/test/CodeGen/X86/pmovsx-inreg.ll new file mode 100644 index 000000000000..d8c27f25043a --- /dev/null +++ b/test/CodeGen/X86/pmovsx-inreg.ll @@ -0,0 +1,176 @@ +; RUN: llc < %s -march=x86-64 -mcpu=penryn | FileCheck -check-prefix=SSE41 %s +; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx | FileCheck -check-prefix=AVX1 %s +; RUN: llc < %s -march=x86-64 -mcpu=core-avx2 | FileCheck -check-prefix=AVX2 %s + +; PR14887 +; These tests inject a store into the chain to test the inreg versions of pmovsx + +define void @test1(<2 x i8>* %in, <2 x i64>* %out) nounwind { + %wide.load35 = load <2 x i8>* %in, align 1 + %sext = sext <2 x i8> %wide.load35 to <2 x i64> + store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8 + store <2 x i64> %sext, <2 x i64>* %out, align 8 + ret void + +; SSE41: test1: +; SSE41: pmovsxbq + +; AVX1: test1: +; AVX1: vpmovsxbq + +; AVX2: test1: +; AVX2: vpmovsxbq +} + +define void @test2(<4 x i8>* %in, <4 x i64>* %out) nounwind { + %wide.load35 = load <4 x i8>* %in, align 1 + %sext = sext <4 x i8> %wide.load35 to <4 x i64> + store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8 + store <4 x i64> %sext, <4 x i64>* %out, align 8 + ret void + +; AVX2: test2: +; AVX2: vpmovsxbq +} + +define void @test3(<4 x i8>* %in, <4 x i32>* %out) nounwind { + %wide.load35 = load <4 x i8>* %in, align 1 + %sext = sext <4 x i8> %wide.load35 to <4 x i32> + store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8 + store <4 x i32> %sext, <4 x i32>* %out, align 8 + ret void + +; SSE41: test3: +; SSE41: pmovsxbd + +; AVX1: test3: +; AVX1: vpmovsxbd + +; AVX2: test3: +; AVX2: vpmovsxbd +} + +define void @test4(<8 x i8>* %in, <8 x i32>* %out) nounwind { + %wide.load35 = load <8 x i8>* %in, align 1 + %sext = sext <8 x i8> %wide.load35 to <8 x i32> + store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8 + store <8 x i32> %sext, <8 x i32>* %out, align 8 + ret void + +; AVX2: test4: +; AVX2: vpmovsxbd +} + +define void @test5(<8 x i8>* %in, <8 x i16>* %out) nounwind { + %wide.load35 = load <8 x i8>* %in, align 1 + %sext = sext <8 x i8> %wide.load35 to <8 x i16> + store <8 x i16> zeroinitializer, <8 x i16>* undef, align 8 + store <8 x i16> %sext, <8 x i16>* %out, align 8 + ret void + +; SSE41: test5: +; SSE41: pmovsxbw + +; AVX1: test5: +; AVX1: vpmovsxbw + +; AVX2: test5: +; AVX2: vpmovsxbw +} + +define void @test6(<16 x i8>* %in, <16 x i16>* %out) nounwind { + %wide.load35 = load <16 x i8>* %in, align 1 + %sext = sext <16 x i8> %wide.load35 to <16 x i16> + store <16 x i16> zeroinitializer, <16 x i16>* undef, align 8 + store <16 x i16> %sext, <16 x i16>* %out, align 8 + ret void + +; AVX2: test6: +; FIXME: v16i8 -> v16i16 is scalarized. +; AVX2-NOT: pmovsx +} + +define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind { + %wide.load35 = load <2 x i16>* %in, align 1 + %sext = sext <2 x i16> %wide.load35 to <2 x i64> + store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8 + store <2 x i64> %sext, <2 x i64>* %out, align 8 + ret void + + +; SSE41: test7: +; SSE41: pmovsxwq + +; AVX1: test7: +; AVX1: vpmovsxwq + +; AVX2: test7: +; AVX2: vpmovsxwq +} + +define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind { + %wide.load35 = load <4 x i16>* %in, align 1 + %sext = sext <4 x i16> %wide.load35 to <4 x i64> + store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8 + store <4 x i64> %sext, <4 x i64>* %out, align 8 + ret void + +; AVX2: test8: +; AVX2: vpmovsxwq +} + +define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind { + %wide.load35 = load <4 x i16>* %in, align 1 + %sext = sext <4 x i16> %wide.load35 to <4 x i32> + store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8 + store <4 x i32> %sext, <4 x i32>* %out, align 8 + ret void + +; SSE41: test9: +; SSE41: pmovsxwd + +; AVX1: test9: +; AVX1: vpmovsxwd + +; AVX2: test9: +; AVX2: vpmovsxwd +} + +define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind { + %wide.load35 = load <8 x i16>* %in, align 1 + %sext = sext <8 x i16> %wide.load35 to <8 x i32> + store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8 + store <8 x i32> %sext, <8 x i32>* %out, align 8 + ret void + +; AVX2: test10: +; AVX2: vpmovsxwd +} + +define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind { + %wide.load35 = load <2 x i32>* %in, align 1 + %sext = sext <2 x i32> %wide.load35 to <2 x i64> + store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8 + store <2 x i64> %sext, <2 x i64>* %out, align 8 + ret void + +; SSE41: test11: +; SSE41: pmovsxdq + +; AVX1: test11: +; AVX1: vpmovsxdq + +; AVX2: test11: +; AVX2: vpmovsxdq +} + +define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind { + %wide.load35 = load <4 x i32>* %in, align 1 + %sext = sext <4 x i32> %wide.load35 to <4 x i64> + store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8 + store <4 x i64> %sext, <4 x i64>* %out, align 8 + ret void + +; AVX2: test12: +; AVX2: vpmovsxdq +} diff --git a/test/CodeGen/X86/pointer-vector.ll b/test/CodeGen/X86/pointer-vector.ll index 58423d195964..0ee99875264f 100644 --- a/test/CodeGen/X86/pointer-vector.ll +++ b/test/CodeGen/X86/pointer-vector.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -mtriple=i686-linux -mcpu=corei7 | FileCheck %s -; RUN: opt -instsimplify %s -disable-output +; RUN: opt -instsimplify -disable-output < %s ;CHECK: SHUFF0 define <8 x i32*> @SHUFF0(<4 x i32*> %ptrv) nounwind { diff --git a/test/CodeGen/X86/pr10475.ll b/test/CodeGen/X86/pr10475.ll new file mode 100644 index 000000000000..3efc39ee9f1f --- /dev/null +++ b/test/CodeGen/X86/pr10475.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=corei7-avx + +; No check in a crash test + +define void @autogen_262380_1000() { +BB: + br label %CF79 + +CF79: ; preds = %CF79, %BB + br i1 undef, label %CF79, label %CF84.critedge.critedge + +CF84.critedge.critedge: ; preds = %CF79 + %L35 = load <8 x i32>* undef + br label %CF85 + +CF85: ; preds = %CF85, %CF84.critedge.critedge + br i1 undef, label %CF85, label %CF86 + +CF86: ; preds = %CF86, %CF85 + %B61 = sub <8 x i32> %L35, zeroinitializer + %S64 = icmp ne <8 x i32> %B61, zeroinitializer + %E73 = extractelement <8 x i1> %S64, i32 6 + br i1 %E73, label %CF86, label %CF87 + +CF87: ; preds = %CF87, %CF86 + br i1 undef, label %CF87, label %CF88 + +CF88: ; preds = %CF87 + ret void +} diff --git a/test/CodeGen/X86/pr10499.ll b/test/CodeGen/X86/pr10499.ll new file mode 100644 index 000000000000..f9cc747e49a8 --- /dev/null +++ b/test/CodeGen/X86/pr10499.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=corei7-avx -mattr=-sse2 + +; No check as PR10499 is a crashing bug. + +define void @autogen_24438_500() { +BB: + %I = insertelement <8 x i32> undef, i32 -1, i32 4 + %BC = bitcast <8 x i32> %I to <8 x float> + br label %CF + +CF: ; preds = %CF, %BB + %ZE = fpext <8 x float> %BC to <8 x double> + br label %CF +} diff --git a/test/CodeGen/X86/pr10523.ll b/test/CodeGen/X86/pr10523.ll new file mode 100644 index 000000000000..7191d6949c18 --- /dev/null +++ b/test/CodeGen/X86/pr10523.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -march=x86-64 -mattr=+sse2,+sse41 + +; No check in a crash test + +define void @autogen_129334_5000() { +BB: + %I74 = insertelement <32 x i32> undef, i32 undef, i32 15 + %I105 = insertelement <32 x i32> undef, i32 undef, i32 14 + %Shuff292 = shufflevector <32 x i32> %I74, <32 x i32> undef, <32 x i32> <i32 undef, i32 12, i32 14, i32 16, i32 undef, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30, i32 undef, i32 34, i32 36, i32 38, i32 40, i32 42, i32 44, i32 46, i32 48, i32 50, i32 undef, i32 54, i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 2, i32 4, i32 6, i32 8> + %Shuff302 = shufflevector <32 x i32> %Shuff292, <32 x i32> undef, <32 x i32> <i32 27, i32 29, i32 undef, i32 33, i32 undef, i32 37, i32 39, i32 undef, i32 undef, i32 undef, i32 47, i32 undef, i32 51, i32 53, i32 55, i32 57, i32 undef, i32 undef, i32 63, i32 1, i32 undef, i32 undef, i32 undef, i32 9, i32 11, i32 13, i32 undef, i32 17, i32 19, i32 21, i32 23, i32 undef> + %I326 = insertelement <32 x i32> undef, i32 undef, i32 15 + %B338 = sub <32 x i32> zeroinitializer, %I105 + %FC339 = sitofp <32 x i32> %I326 to <32 x double> + %S341 = icmp ne <32 x i32> %B338, undef + %E376 = extractelement <32 x i1> %S341, i32 0 + %Shuff419 = shufflevector <32 x i32> undef, <32 x i32> %Shuff302, <32 x i32> <i32 undef, i32 44, i32 46, i32 48, i32 50, i32 52, i32 undef, i32 56, i32 58, i32 60, i32 62, i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 12, i32 14, i32 undef, i32 undef, i32 20, i32 22, i32 undef, i32 26, i32 28, i32 undef, i32 32, i32 34, i32 36, i32 38, i32 40> + ret void +} diff --git a/test/CodeGen/X86/pr10524.ll b/test/CodeGen/X86/pr10524.ll new file mode 100644 index 000000000000..ed3e7c528052 --- /dev/null +++ b/test/CodeGen/X86/pr10524.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -march=x86-64 -mattr=+sse2,+sse41 + +; No check in a crash test + +define void @autogen_178513_5000() { +BB: + %Shuff22 = shufflevector <2 x i32> undef, <2 x i32> zeroinitializer, <2 x i32> <i32 3, i32 1> + %B26 = sub <2 x i32> %Shuff22, zeroinitializer + %S79 = icmp eq <2 x i32> %B26, zeroinitializer + %B269 = urem <2 x i1> zeroinitializer, %S79 + %Se335 = sext <2 x i1> %B269 to <2 x i8> + store <2 x i8> %Se335, <2 x i8>* undef + ret void +} diff --git a/test/CodeGen/X86/pr10525.ll b/test/CodeGen/X86/pr10525.ll new file mode 100644 index 000000000000..342c1d63e192 --- /dev/null +++ b/test/CodeGen/X86/pr10525.ll @@ -0,0 +1,13 @@ +; RUN: llc < %s -march=x86-64 -mattr=+sse2,+sse41 + +; No check in a crash test + +define void @autogen_163411_5000() { +BB: + %L = load <2 x i64>* undef + %Shuff11 = shufflevector <2 x i64> %L, <2 x i64> %L, <2 x i32> <i32 2, i32 0> + %I51 = insertelement <2 x i64> undef, i64 undef, i32 0 + %Shuff152 = shufflevector <2 x i64> %I51, <2 x i64> %Shuff11, <2 x i32> <i32 1, i32 3> + store <2 x i64> %Shuff152, <2 x i64>* undef + ret void +} diff --git a/test/CodeGen/X86/pr10526.ll b/test/CodeGen/X86/pr10526.ll new file mode 100644 index 000000000000..6963fe515898 --- /dev/null +++ b/test/CodeGen/X86/pr10526.ll @@ -0,0 +1,13 @@ +; RUN: llc < %s -march=x86-64 -mattr=+sse2,+sse41 + +; No check in a crash test + +define void @autogen_142660_5000() { +BB: + %Shuff49 = shufflevector <8 x i32> zeroinitializer, <8 x i32> undef, <8 x i32> <i32 2, i32 4, i32 undef, i32 8, i32 10, i32 12, i32 14, i32 0> + %B85 = sub <8 x i32> %Shuff49, zeroinitializer + %S242 = icmp eq <8 x i32> zeroinitializer, %B85 + %FC284 = uitofp <8 x i1> %S242 to <8 x float> + store <8 x float> %FC284, <8 x float>* undef + ret void +} diff --git a/test/CodeGen/X86/pr11998.ll b/test/CodeGen/X86/pr11998.ll new file mode 100644 index 000000000000..1baf07924d39 --- /dev/null +++ b/test/CodeGen/X86/pr11998.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -mcpu=corei7-avx -march=x86-64 -mattr=+avx + +define void @autogen_51367_5000(i8) { +BB: + %B = srem i8 55, %0 + %B9 = shl i8 %B, %B + br label %CF + +CF: ; preds = %CF, %BB + br i1 undef, label %CF, label %CF403 + +CF403: ; preds = %CF403, %CF + %S44 = icmp eq i8 %B9, %0 + br i1 %S44, label %CF403, label %CF405 + +CF405: ; preds = %CF405, %CF403 + br label %CF405 +} diff --git a/test/CodeGen/X86/pr14314.ll b/test/CodeGen/X86/pr14314.ll index 5388a4b01b65..0832702244e5 100644 --- a/test/CodeGen/X86/pr14314.ll +++ b/test/CodeGen/X86/pr14314.ll @@ -5,9 +5,9 @@ entry: %0 = atomicrmw sub i64* %a, i64 %b seq_cst ret i64 %0 ; CHECK: atomicSub -; movl %eax, %ebx -; subl {{%[a-z]+}}, %ebx -; movl %edx, %ecx -; sbbl {{%[a-z]+}}, %ecx +; CHECK: movl %eax, %ebx +; CHECK: subl {{%[a-z]+}}, %ebx +; CHECK: movl %edx, %ecx +; CHECK: sbbl {{%[a-z]+}}, %ecx ; CHECK: ret } diff --git a/test/CodeGen/X86/pr14562.ll b/test/CodeGen/X86/pr14562.ll new file mode 100644 index 000000000000..e66f1752a30f --- /dev/null +++ b/test/CodeGen/X86/pr14562.ll @@ -0,0 +1,15 @@ +; RUN: llc < %s -march=x86 | FileCheck %s + +@temp1 = global i64 -77129852189294865, align 8 + +define void @foo() nounwind { + %x = load i64* @temp1, align 8 + %s = shl i64 %x, 32 + %t = trunc i64 %s to i32 + %z = zext i32 %t to i64 + store i64 %z, i64* @temp1, align 8 +; CHECK: movl $0, {{_?}}temp1+4 +; CHECK: movl $0, {{_?}}temp1 + ret void +} + diff --git a/test/CodeGen/X86/pr15267.ll b/test/CodeGen/X86/pr15267.ll new file mode 100644 index 000000000000..c8aaf327a7dd --- /dev/null +++ b/test/CodeGen/X86/pr15267.ll @@ -0,0 +1,66 @@ +; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=corei7-avx | FileCheck %s + +define <4 x i3> @test1(<4 x i3>* %in) nounwind { + %ret = load <4 x i3>* %in, align 1 + ret <4 x i3> %ret +} + +; CHECK: test1 +; CHECK: movzwl +; CHECK: shrl $3 +; CHECK: andl $7 +; CHECK: andl $7 +; CHECK: vmovd +; CHECK: pinsrd $1 +; CHECK: shrl $6 +; CHECK: andl $7 +; CHECK: pinsrd $2 +; CHECK: shrl $9 +; CHECK: andl $7 +; CHECK: pinsrd $3 +; CHECK: ret + +define <4 x i1> @test2(<4 x i1>* %in) nounwind { + %ret = load <4 x i1>* %in, align 1 + ret <4 x i1> %ret +} + +; CHECK: test2 +; CHECK: movzbl +; CHECK: shrl +; CHECK: andl $1 +; CHECK: andl $1 +; CHECK: vmovd +; CHECK: pinsrd $1 +; CHECK: shrl $2 +; CHECK: andl $1 +; CHECK: pinsrd $2 +; CHECK: shrl $3 +; CHECK: andl $1 +; CHECK: pinsrd $3 +; CHECK: ret + +define <4 x i64> @test3(<4 x i1>* %in) nounwind { + %wide.load35 = load <4 x i1>* %in, align 1 + %sext = sext <4 x i1> %wide.load35 to <4 x i64> + ret <4 x i64> %sext +} + +; CHECK: test3 +; CHECK: movzbl +; CHECK: shrl +; CHECK: andl $1 +; CHECK: andl $1 +; CHECK: vmovd +; CHECK: pinsrd $1 +; CHECK: shrl $2 +; CHECK: andl $1 +; CHECK: pinsrd $2 +; CHECK: shrl $3 +; CHECK: andl $1 +; CHECK: pinsrd $3 +; CHECK: pslld +; CHECK: psrad +; CHECK: pmovsxdq +; CHECK: pmovsxdq +; CHECK: ret diff --git a/test/CodeGen/X86/pr15296.ll b/test/CodeGen/X86/pr15296.ll new file mode 100644 index 000000000000..1187d80cdf75 --- /dev/null +++ b/test/CodeGen/X86/pr15296.ll @@ -0,0 +1,46 @@ +; RUN: llc < %s -mtriple=i686-pc-linux -mcpu=corei7-avx | FileCheck %s + +define <8 x i32> @shiftInput___vyuunu(<8 x i32> %input, i32 %shiftval, <8 x i32> %__mask) nounwind { +allocas: + %smear.0 = insertelement <8 x i32> undef, i32 %shiftval, i32 0 + %smear.1 = insertelement <8 x i32> %smear.0, i32 %shiftval, i32 1 + %smear.2 = insertelement <8 x i32> %smear.1, i32 %shiftval, i32 2 + %smear.3 = insertelement <8 x i32> %smear.2, i32 %shiftval, i32 3 + %smear.4 = insertelement <8 x i32> %smear.3, i32 %shiftval, i32 4 + %smear.5 = insertelement <8 x i32> %smear.4, i32 %shiftval, i32 5 + %smear.6 = insertelement <8 x i32> %smear.5, i32 %shiftval, i32 6 + %smear.7 = insertelement <8 x i32> %smear.6, i32 %shiftval, i32 7 + %bitop = lshr <8 x i32> %input, %smear.7 + ret <8 x i32> %bitop +} + +; CHECK: shiftInput___vyuunu +; CHECK: psrld +; CHECK: psrld +; CHECK: ret + +define <8 x i32> @shiftInput___canonical(<8 x i32> %input, i32 %shiftval, <8 x i32> %__mask) nounwind { +allocas: + %smear.0 = insertelement <8 x i32> undef, i32 %shiftval, i32 0 + %smear.7 = shufflevector <8 x i32> %smear.0, <8 x i32> undef, <8 x i32> zeroinitializer + %bitop = lshr <8 x i32> %input, %smear.7 + ret <8 x i32> %bitop +} + +; CHECK: shiftInput___canonical +; CHECK: psrld +; CHECK: psrld +; CHECK: ret + +define <4 x i64> @shiftInput___64in32bitmode(<4 x i64> %input, i64 %shiftval, <4 x i64> %__mask) nounwind { +allocas: + %smear.0 = insertelement <4 x i64> undef, i64 %shiftval, i32 0 + %smear.7 = shufflevector <4 x i64> %smear.0, <4 x i64> undef, <4 x i32> zeroinitializer + %bitop = lshr <4 x i64> %input, %smear.7 + ret <4 x i64> %bitop +} + +; CHECK: shiftInput___64in32bitmode +; CHECK: psrlq +; CHECK: psrlq +; CHECK: ret diff --git a/test/CodeGen/X86/pr15309.ll b/test/CodeGen/X86/pr15309.ll new file mode 100644 index 000000000000..6dbbc72a7b7a --- /dev/null +++ b/test/CodeGen/X86/pr15309.ll @@ -0,0 +1,15 @@ +; RUN: llc < %s -mtriple=i686-linux-pc -mcpu=corei7 | FileCheck %s + +define void @test_convert_float2_ulong2(<2 x i64>* nocapture %src, <2 x float>* nocapture %dest) noinline { +L.entry: + %0 = getelementptr <2 x i64>* %src, i32 10 + %1 = load <2 x i64>* %0, align 16 + %2 = uitofp <2 x i64> %1 to <2 x float> + %3 = getelementptr <2 x float>* %dest, i32 10 + store <2 x float> %2, <2 x float>* %3, align 8 + ret void +} + +; CHECK: test_convert_float2_ulong2 +; CHECK-NOT: cvtpd2ps +; CHECK: ret diff --git a/test/CodeGen/X86/pr3522.ll b/test/CodeGen/X86/pr3522.ll index d8f37781fc6e..9f8dc0370668 100644 --- a/test/CodeGen/X86/pr3522.ll +++ b/test/CodeGen/X86/pr3522.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -stats 2>&1 | not grep "instructions sunk" ; PR3522 diff --git a/test/CodeGen/X86/pre-ra-sched.ll b/test/CodeGen/X86/pre-ra-sched.ll new file mode 100644 index 000000000000..b792ffa09fb9 --- /dev/null +++ b/test/CodeGen/X86/pre-ra-sched.ll @@ -0,0 +1,56 @@ +; RUN: llc < %s -mtriple=x86_64-apple-macosx -debug-only=pre-RA-sched \ +; RUN: 2>&1 | FileCheck %s +; REQUIRES: asserts +; +; rdar:13279013: pre-RA-sched should not check all interferences and +; repush them on the ready queue after scheduling each instruction. +; +; CHECK: *** List Scheduling +; CHECK: Interfering reg EFLAGS +; CHECK: Repushing +; CHECK: Repushing +; CHECK: Repushing +; CHECK-NOT: Repushing +; CHECK: *** Final schedule +define i32 @test(i8* %pin) #0 { + %g0 = getelementptr inbounds i8* %pin, i64 0 + %l0 = load i8* %g0, align 1 + + %g1a = getelementptr inbounds i8* %pin, i64 1 + %l1a = load i8* %g1a, align 1 + %z1a = zext i8 %l1a to i32 + %g1b = getelementptr inbounds i8* %pin, i64 2 + %l1b = load i8* %g1b, align 1 + %z1b = zext i8 %l1b to i32 + %c1 = icmp ne i8 %l0, 0 + %x1 = xor i32 %z1a, %z1b + %s1 = select i1 %c1, i32 %z1a, i32 %x1 + + %g2a = getelementptr inbounds i8* %pin, i64 3 + %l2a = load i8* %g2a, align 1 + %z2a = zext i8 %l2a to i32 + %g2b = getelementptr inbounds i8* %pin, i64 4 + %l2b = load i8* %g2b, align 1 + %z2b = zext i8 %l2b to i32 + %x2 = xor i32 %z2a, %z2b + %s2 = select i1 %c1, i32 %z2a, i32 %x2 + + %g3a = getelementptr inbounds i8* %pin, i64 5 + %l3a = load i8* %g3a, align 1 + %z3a = zext i8 %l3a to i32 + %g3b = getelementptr inbounds i8* %pin, i64 6 + %l3b = load i8* %g3b, align 1 + %z3b = zext i8 %l3b to i32 + %x3 = xor i32 %z3a, %z3b + %s3 = select i1 %c1, i32 %z3a, i32 %x3 + + %c3 = icmp ne i8 %l1a, 0 + %c4 = icmp ne i8 %l2a, 0 + + %s4 = select i1 %c3, i32 %s1, i32 %s2 + %s5 = select i1 %c4, i32 %s4, i32 %s3 + + ret i32 %s5 +} + +attributes #0 = { nounwind ssp uwtable } diff --git a/test/CodeGen/X86/prefetch.ll b/test/CodeGen/X86/prefetch.ll index ec2f302b1499..efb51913c5c1 100644 --- a/test/CodeGen/X86/prefetch.ll +++ b/test/CodeGen/X86/prefetch.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -march=x86 -mattr=+sse | FileCheck %s ; RUN: llc < %s -march=x86 -mattr=+avx | FileCheck %s +; RUN: llc < %s -march=x86 -mattr=+sse -mattr=+prfchw | FileCheck %s -check-prefix=PRFCHW ; rdar://10538297 @@ -9,10 +10,12 @@ entry: ; CHECK: prefetcht1 ; CHECK: prefetcht0 ; CHECK: prefetchnta +; PRFCHW: prefetchw tail call void @llvm.prefetch( i8* %ptr, i32 0, i32 1, i32 1 ) tail call void @llvm.prefetch( i8* %ptr, i32 0, i32 2, i32 1 ) tail call void @llvm.prefetch( i8* %ptr, i32 0, i32 3, i32 1 ) tail call void @llvm.prefetch( i8* %ptr, i32 0, i32 0, i32 1 ) + tail call void @llvm.prefetch( i8* %ptr, i32 1, i32 3, i32 1 ) ret void } diff --git a/test/CodeGen/X86/psubus.ll b/test/CodeGen/X86/psubus.ll new file mode 100644 index 000000000000..aff4afbd2e35 --- /dev/null +++ b/test/CodeGen/X86/psubus.ll @@ -0,0 +1,340 @@ +; RUN: llc -mcpu=core2 < %s | FileCheck %s -check-prefix=SSE2 +; RUN: llc -mcpu=corei7-avx < %s | FileCheck %s -check-prefix=AVX1 +; RUN: llc -mcpu=core-avx2 < %s | FileCheck %s -check-prefix=AVX2 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +define void @test1(i16* nocapture %head) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds i16* %head, i64 %index + %1 = bitcast i16* %0 to <8 x i16>* + %2 = load <8 x i16>* %1, align 2 + %3 = icmp slt <8 x i16> %2, zeroinitializer + %4 = xor <8 x i16> %2, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768> + %5 = select <8 x i1> %3, <8 x i16> %4, <8 x i16> zeroinitializer + store <8 x i16> %5, <8 x i16>* %1, align 2 + %index.next = add i64 %index, 8 + %6 = icmp eq i64 %index.next, 16384 + br i1 %6, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: @test1 +; SSE2: psubusw LCPI0_0(%rip), %xmm0 + +; AVX1: @test1 +; AVX1: vpsubusw LCPI0_0(%rip), %xmm0, %xmm0 + +; AVX2: @test1 +; AVX2: vpsubusw LCPI0_0(%rip), %xmm0, %xmm0 +} + +define void @test2(i16* nocapture %head) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds i16* %head, i64 %index + %1 = bitcast i16* %0 to <8 x i16>* + %2 = load <8 x i16>* %1, align 2 + %3 = icmp ugt <8 x i16> %2, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766> + %4 = add <8 x i16> %2, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767> + %5 = select <8 x i1> %3, <8 x i16> %4, <8 x i16> zeroinitializer + store <8 x i16> %5, <8 x i16>* %1, align 2 + %index.next = add i64 %index, 8 + %6 = icmp eq i64 %index.next, 16384 + br i1 %6, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: @test2 +; SSE2: psubusw LCPI1_0(%rip), %xmm0 + +; AVX1: @test2 +; AVX1: vpsubusw LCPI1_0(%rip), %xmm0, %xmm0 + +; AVX2: @test2 +; AVX2: vpsubusw LCPI1_0(%rip), %xmm0, %xmm0 +} + +define void @test3(i16* nocapture %head, i16 zeroext %w) nounwind { +vector.ph: + %0 = insertelement <8 x i16> undef, i16 %w, i32 0 + %broadcast15 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %1 = getelementptr inbounds i16* %head, i64 %index + %2 = bitcast i16* %1 to <8 x i16>* + %3 = load <8 x i16>* %2, align 2 + %4 = icmp ult <8 x i16> %3, %broadcast15 + %5 = sub <8 x i16> %3, %broadcast15 + %6 = select <8 x i1> %4, <8 x i16> zeroinitializer, <8 x i16> %5 + store <8 x i16> %6, <8 x i16>* %2, align 2 + %index.next = add i64 %index, 8 + %7 = icmp eq i64 %index.next, 16384 + br i1 %7, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: @test3 +; SSE2: psubusw %xmm0, %xmm1 + +; AVX1: @test3 +; AVX1: vpsubusw %xmm0, %xmm1, %xmm1 + +; AVX2: @test3 +; AVX2: vpsubusw %xmm0, %xmm1, %xmm1 +} + +define void @test4(i8* nocapture %head) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds i8* %head, i64 %index + %1 = bitcast i8* %0 to <16 x i8>* + %2 = load <16 x i8>* %1, align 1 + %3 = icmp slt <16 x i8> %2, zeroinitializer + %4 = xor <16 x i8> %2, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128> + %5 = select <16 x i1> %3, <16 x i8> %4, <16 x i8> zeroinitializer + store <16 x i8> %5, <16 x i8>* %1, align 1 + %index.next = add i64 %index, 16 + %6 = icmp eq i64 %index.next, 16384 + br i1 %6, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: @test4 +; SSE2: psubusb LCPI3_0(%rip), %xmm0 + +; AVX1: @test4 +; AVX1: vpsubusb LCPI3_0(%rip), %xmm0, %xmm0 + +; AVX2: @test4 +; AVX2: vpsubusb LCPI3_0(%rip), %xmm0, %xmm0 +} + +define void @test5(i8* nocapture %head) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds i8* %head, i64 %index + %1 = bitcast i8* %0 to <16 x i8>* + %2 = load <16 x i8>* %1, align 1 + %3 = icmp ugt <16 x i8> %2, <i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126> + %4 = add <16 x i8> %2, <i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127> + %5 = select <16 x i1> %3, <16 x i8> %4, <16 x i8> zeroinitializer + store <16 x i8> %5, <16 x i8>* %1, align 1 + %index.next = add i64 %index, 16 + %6 = icmp eq i64 %index.next, 16384 + br i1 %6, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: @test5 +; SSE2: psubusb LCPI4_0(%rip), %xmm0 + +; AVX1: @test5 +; AVX1: vpsubusb LCPI4_0(%rip), %xmm0, %xmm0 + +; AVX2: @test5 +; AVX2: vpsubusb LCPI4_0(%rip), %xmm0, %xmm0 +} + +define void @test6(i8* nocapture %head, i8 zeroext %w) nounwind { +vector.ph: + %0 = insertelement <16 x i8> undef, i8 %w, i32 0 + %broadcast15 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> zeroinitializer + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %1 = getelementptr inbounds i8* %head, i64 %index + %2 = bitcast i8* %1 to <16 x i8>* + %3 = load <16 x i8>* %2, align 1 + %4 = icmp ult <16 x i8> %3, %broadcast15 + %5 = sub <16 x i8> %3, %broadcast15 + %6 = select <16 x i1> %4, <16 x i8> zeroinitializer, <16 x i8> %5 + store <16 x i8> %6, <16 x i8>* %2, align 1 + %index.next = add i64 %index, 16 + %7 = icmp eq i64 %index.next, 16384 + br i1 %7, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: @test6 +; SSE2: psubusb %xmm0, %xmm1 + +; AVX1: @test6 +; AVX1: vpsubusb %xmm0, %xmm1, %xmm1 + +; AVX2: @test6 +; AVX2: vpsubusb %xmm0, %xmm1, %xmm1 +} + +define void @test7(i16* nocapture %head) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds i16* %head, i64 %index + %1 = bitcast i16* %0 to <16 x i16>* + %2 = load <16 x i16>* %1, align 2 + %3 = icmp slt <16 x i16> %2, zeroinitializer + %4 = xor <16 x i16> %2, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768> + %5 = select <16 x i1> %3, <16 x i16> %4, <16 x i16> zeroinitializer + store <16 x i16> %5, <16 x i16>* %1, align 2 + %index.next = add i64 %index, 8 + %6 = icmp eq i64 %index.next, 16384 + br i1 %6, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: @test7 +; AVX2: vpsubusw LCPI6_0(%rip), %ymm0, %ymm0 +} + +define void @test8(i16* nocapture %head) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds i16* %head, i64 %index + %1 = bitcast i16* %0 to <16 x i16>* + %2 = load <16 x i16>* %1, align 2 + %3 = icmp ugt <16 x i16> %2, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766> + %4 = add <16 x i16> %2, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767> + %5 = select <16 x i1> %3, <16 x i16> %4, <16 x i16> zeroinitializer + store <16 x i16> %5, <16 x i16>* %1, align 2 + %index.next = add i64 %index, 8 + %6 = icmp eq i64 %index.next, 16384 + br i1 %6, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: @test8 +; AVX2: vpsubusw LCPI7_0(%rip), %ymm0, %ymm0 +} + +define void @test9(i16* nocapture %head, i16 zeroext %w) nounwind { +vector.ph: + %0 = insertelement <16 x i16> undef, i16 %w, i32 0 + %broadcast15 = shufflevector <16 x i16> %0, <16 x i16> undef, <16 x i32> zeroinitializer + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %1 = getelementptr inbounds i16* %head, i64 %index + %2 = bitcast i16* %1 to <16 x i16>* + %3 = load <16 x i16>* %2, align 2 + %4 = icmp ult <16 x i16> %3, %broadcast15 + %5 = sub <16 x i16> %3, %broadcast15 + %6 = select <16 x i1> %4, <16 x i16> zeroinitializer, <16 x i16> %5 + store <16 x i16> %6, <16 x i16>* %2, align 2 + %index.next = add i64 %index, 8 + %7 = icmp eq i64 %index.next, 16384 + br i1 %7, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + + +; AVX2: @test9 +; AVX2: vpsubusw %ymm0, %ymm1, %ymm1 +} + +define void @test10(i8* nocapture %head) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds i8* %head, i64 %index + %1 = bitcast i8* %0 to <32 x i8>* + %2 = load <32 x i8>* %1, align 1 + %3 = icmp slt <32 x i8> %2, zeroinitializer + %4 = xor <32 x i8> %2, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128> + %5 = select <32 x i1> %3, <32 x i8> %4, <32 x i8> zeroinitializer + store <32 x i8> %5, <32 x i8>* %1, align 1 + %index.next = add i64 %index, 16 + %6 = icmp eq i64 %index.next, 16384 + br i1 %6, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + + +; AVX2: @test10 +; AVX2: vpsubusb LCPI9_0(%rip), %ymm0, %ymm0 +} + +define void @test11(i8* nocapture %head) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %0 = getelementptr inbounds i8* %head, i64 %index + %1 = bitcast i8* %0 to <32 x i8>* + %2 = load <32 x i8>* %1, align 1 + %3 = icmp ugt <32 x i8> %2, <i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126> + %4 = add <32 x i8> %2, <i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127> + %5 = select <32 x i1> %3, <32 x i8> %4, <32 x i8> zeroinitializer + store <32 x i8> %5, <32 x i8>* %1, align 1 + %index.next = add i64 %index, 16 + %6 = icmp eq i64 %index.next, 16384 + br i1 %6, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: @test11 +; AVX2: vpsubusb LCPI10_0(%rip), %ymm0, %ymm0 +} + +define void @test12(i8* nocapture %head, i8 zeroext %w) nounwind { +vector.ph: + %0 = insertelement <32 x i8> undef, i8 %w, i32 0 + %broadcast15 = shufflevector <32 x i8> %0, <32 x i8> undef, <32 x i32> zeroinitializer + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %1 = getelementptr inbounds i8* %head, i64 %index + %2 = bitcast i8* %1 to <32 x i8>* + %3 = load <32 x i8>* %2, align 1 + %4 = icmp ult <32 x i8> %3, %broadcast15 + %5 = sub <32 x i8> %3, %broadcast15 + %6 = select <32 x i1> %4, <32 x i8> zeroinitializer, <32 x i8> %5 + store <32 x i8> %6, <32 x i8>* %2, align 1 + %index.next = add i64 %index, 16 + %7 = icmp eq i64 %index.next, 16384 + br i1 %7, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: @test12 +; AVX2: vpsubusb %ymm0, %ymm1, %ymm1 +} diff --git a/test/CodeGen/X86/rdrand.ll b/test/CodeGen/X86/rdrand.ll index e2224a619676..98f407776381 100644 --- a/test/CodeGen/X86/rdrand.ll +++ b/test/CodeGen/X86/rdrand.ll @@ -39,7 +39,7 @@ define i32 @_rdrand64_step(i64* %random_val) { %isvalid = extractvalue {i64, i32} %call, 1 ret i32 %isvalid ; CHECK: _rdrand64_step: -; CHECK: rdrandq %r[[T1:[[a-z]+]] +; CHECK: rdrandq %r[[T1:[a-z]+]] ; CHECK: movq %r[[T1]], (%r[[A0]]) ; CHECK: movl $1, %eax ; CHECK: cmovael %e[[T1]], %eax diff --git a/test/CodeGen/X86/rdseed.ll b/test/CodeGen/X86/rdseed.ll new file mode 100644 index 000000000000..35de7ebf7430 --- /dev/null +++ b/test/CodeGen/X86/rdseed.ll @@ -0,0 +1,48 @@ +; RUN: llc < %s -march=x86-64 -mcpu=core-avx-i -mattr=+rdseed | FileCheck %s + +declare {i16, i32} @llvm.x86.rdseed.16() +declare {i32, i32} @llvm.x86.rdseed.32() +declare {i64, i32} @llvm.x86.rdseed.64() + +define i32 @_rdseed16_step(i16* %random_val) { + %call = call {i16, i32} @llvm.x86.rdseed.16() + %randval = extractvalue {i16, i32} %call, 0 + store i16 %randval, i16* %random_val + %isvalid = extractvalue {i16, i32} %call, 1 + ret i32 %isvalid +; CHECK: _rdseed16_step: +; CHECK: rdseedw %ax +; CHECK: movw %ax, (%r[[A0:di|cx]]) +; CHECK: movzwl %ax, %ecx +; CHECK: movl $1, %eax +; CHECK: cmovael %ecx, %eax +; CHECK: ret +} + +define i32 @_rdseed32_step(i32* %random_val) { + %call = call {i32, i32} @llvm.x86.rdseed.32() + %randval = extractvalue {i32, i32} %call, 0 + store i32 %randval, i32* %random_val + %isvalid = extractvalue {i32, i32} %call, 1 + ret i32 %isvalid +; CHECK: _rdseed32_step: +; CHECK: rdseedl %e[[T0:[a-z]+]] +; CHECK: movl %e[[T0]], (%r[[A0]]) +; CHECK: movl $1, %eax +; CHECK: cmovael %e[[T0]], %eax +; CHECK: ret +} + +define i32 @_rdseed64_step(i64* %random_val) { + %call = call {i64, i32} @llvm.x86.rdseed.64() + %randval = extractvalue {i64, i32} %call, 0 + store i64 %randval, i64* %random_val + %isvalid = extractvalue {i64, i32} %call, 1 + ret i32 %isvalid +; CHECK: _rdseed64_step: +; CHECK: rdseedq %r[[T1:[a-z]+]] +; CHECK: movq %r[[T1]], (%r[[A0]]) +; CHECK: movl $1, %eax +; CHECK: cmovael %e[[T1]], %eax +; CHECK: ret +} diff --git a/test/CodeGen/X86/regpressure.ll b/test/CodeGen/X86/regpressure.ll index 52d7b56f182e..1f756bee8a9d 100644 --- a/test/CodeGen/X86/regpressure.ll +++ b/test/CodeGen/X86/regpressure.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ;; Both functions in this testcase should codegen to the same function, and ;; neither of them should require spilling anything to the stack. diff --git a/test/CodeGen/X86/ret-mmx.ll b/test/CodeGen/X86/ret-mmx.ll index 865e147a4a24..778e4722cd95 100644 --- a/test/CodeGen/X86/ret-mmx.ll +++ b/test/CodeGen/X86/ret-mmx.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=x86_64-apple-darwin11 -mattr=+mmx,+sse2 | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-apple-darwin11 -mcpu=core2 -mattr=+mmx,+sse2 | FileCheck %s ; rdar://6602459 @g_v1di = external global <1 x i64> diff --git a/test/CodeGen/X86/rip-rel-lea.ll b/test/CodeGen/X86/rip-rel-lea.ll new file mode 100644 index 000000000000..71dacf60caa1 --- /dev/null +++ b/test/CodeGen/X86/rip-rel-lea.ll @@ -0,0 +1,16 @@ +; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -relocation-model=pic | FileCheck %s -check-prefix=PIC64 +; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic | FileCheck %s -check-prefix=PICX32 +; RUN: llc < %s -mtriple=i686-pc-linux-gnu -relocation-model=pic | FileCheck %s -check-prefix=PIC32 + +; Use %rip-relative addressing even in static mode on x86-64, because +; it has a smaller encoding. + +@a = internal global double 3.4 +define double* @foo() nounwind { + %a = getelementptr double* @a, i64 0 + ret double* %a + +; PIC64: leaq a(%rip) +; PICX32: leal a(%rip) +; PIC32: leal a@GOTOFF(%eax) +} diff --git a/test/CodeGen/X86/sandybridge-loads.ll b/test/CodeGen/X86/sandybridge-loads.ll new file mode 100644 index 000000000000..5a23cf136d85 --- /dev/null +++ b/test/CodeGen/X86/sandybridge-loads.ll @@ -0,0 +1,39 @@ +; RUN: llc -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -o - < %s | FileCheck %s + +;CHECK: wideloads +;CHECK: vmovaps +;CHECK: vinsertf128 +;CHECK: vmovaps +;CHECK-NOT: vinsertf128 +;CHECK: ret + +define void @wideloads(<8 x float>* %a, <8 x float>* %b, <8 x float>* %c) nounwind uwtable noinline ssp { + %v0 = load <8 x float>* %a, align 16 ; <---- unaligned! + %v1 = load <8 x float>* %b, align 32 ; <---- aligned! + %m0 = fcmp olt <8 x float> %v1, %v0 + %v2 = load <8 x float>* %c, align 32 ; <---- aligned! + %m1 = fcmp olt <8 x float> %v2, %v0 + %mand = and <8 x i1> %m1, %m0 + %r = zext <8 x i1> %mand to <8 x i32> + store <8 x i32> %r, <8 x i32>* undef, align 32 + ret void +} + +; CHECK: widestores +; loads: +; CHECK: vmovaps +; CHECK: vmovaps +; stores: +; CHECK: vmovaps +; CHECK: vextractf128 +; CHECK: vmovaps +;CHECK: ret + +define void @widestores(<8 x float>* %a, <8 x float>* %b, <8 x float>* %c) nounwind uwtable noinline ssp { + %v0 = load <8 x float>* %a, align 32 + %v1 = load <8 x float>* %b, align 32 + store <8 x float> %v0, <8 x float>* %b, align 32 ; <--- aligned + store <8 x float> %v1, <8 x float>* %a, align 16 ; <--- unaligned + ret void +} + diff --git a/test/CodeGen/X86/select.ll b/test/CodeGen/X86/select.ll index 3bec3acdbf76..09ca07b31a10 100644 --- a/test/CodeGen/X86/select.ll +++ b/test/CodeGen/X86/select.ll @@ -282,7 +282,7 @@ define i32 @test13(i32 %a, i32 %b) nounwind { ; ATOM: test13: ; ATOM: cmpl ; ATOM-NEXT: sbbl -; ATOM-NEXT: ret +; ATOM: ret } define i32 @test14(i32 %a, i32 %b) nounwind { @@ -299,7 +299,7 @@ define i32 @test14(i32 %a, i32 %b) nounwind { ; ATOM: cmpl ; ATOM-NEXT: sbbl ; ATOM-NEXT: notl -; ATOM-NEXT: ret +; ATOM: ret } ; rdar://10961709 diff --git a/test/CodeGen/X86/sext-load.ll b/test/CodeGen/X86/sext-load.ll index c9b39d3a489e..58c93229a2c0 100644 --- a/test/CodeGen/X86/sext-load.ll +++ b/test/CodeGen/X86/sext-load.ll @@ -1,9 +1,30 @@ -; RUN: llc < %s -march=x86 | grep movsbl +; RUN: llc < %s -march=x86 | FileCheck %s -define i32 @foo(i32 %X) nounwind { +; When doing sign extension, use the sext-load lowering to take advantage of +; x86's sign extension during loads. +; +; CHECK: test1: +; CHECK: movsbl {{.*}}, %eax +; CHECK-NEXT: ret +define i32 @test1(i32 %X) nounwind { entry: %tmp12 = trunc i32 %X to i8 ; <i8> [#uses=1] %tmp123 = sext i8 %tmp12 to i32 ; <i32> [#uses=1] ret i32 %tmp123 } +; When using a sextload representation, ensure that the sign extension is +; preserved even when removing shifted-out low bits. +; +; CHECK: test2: +; CHECK: movswl {{.*}}, %eax +; CHECK-NEXT: ret +define i32 @test2({i16, [6 x i8]}* %this) { +entry: + %b48 = getelementptr inbounds { i16, [6 x i8] }* %this, i32 0, i32 1 + %cast = bitcast [6 x i8]* %b48 to i48* + %bf.load = load i48* %cast, align 2 + %bf.ashr = ashr i48 %bf.load, 32 + %bf.cast = trunc i48 %bf.ashr to i32 + ret i32 %bf.cast +} diff --git a/test/CodeGen/X86/sibcall.ll b/test/CodeGen/X86/sibcall.ll index 2af355905dc3..ceb79ea927a1 100644 --- a/test/CodeGen/X86/sibcall.ll +++ b/test/CodeGen/X86/sibcall.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -mtriple=i686-linux -mattr=+sse2 -asm-verbose=false | FileCheck %s -check-prefix=32 -; RUN: llc < %s -mtriple=x86_64-linux -mattr=+sse2 -asm-verbose=false | FileCheck %s -check-prefix=64 +; RUN: llc < %s -mtriple=i686-linux -mcpu=core2 -mattr=+sse2 -asm-verbose=false | FileCheck %s -check-prefix=32 +; RUN: llc < %s -mtriple=x86_64-linux -mcpu=core2 -mattr=+sse2 -asm-verbose=false | FileCheck %s -check-prefix=64 define void @t1(i32 %x) nounwind ssp { entry: diff --git a/test/CodeGen/X86/sincos-opt.ll b/test/CodeGen/X86/sincos-opt.ll new file mode 100644 index 000000000000..f364d1fc2dc8 --- /dev/null +++ b/test/CodeGen/X86/sincos-opt.ll @@ -0,0 +1,66 @@ +; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9.0 -mcpu=core2 | FileCheck %s --check-prefix=OSX_SINCOS +; RUN: llc < %s -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core2 | FileCheck %s --check-prefix=OSX_NOOPT +; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mcpu=core2 -enable-unsafe-fp-math | FileCheck %s --check-prefix=GNU_SINCOS + +; Combine sin / cos into a single call. +; rdar://13087969 + +define float @test1(float %x) nounwind { +entry: +; GNU_SINCOS: test1: +; GNU_SINCOS: callq sincosf +; GNU_SINCOS: movss 4(%rsp), %xmm0 +; GNU_SINCOS: addss (%rsp), %xmm0 + +; OSX_SINCOS: test1: +; OSX_SINCOS: callq ___sincosf_stret +; OSX_SINCOS: addss %xmm1, %xmm0 + +; OSX_NOOPT: test1 +; OSX_NOOPT: callq _cosf +; OSX_NOOPT: callq _sinf + %call = tail call float @sinf(float %x) nounwind readnone + %call1 = tail call float @cosf(float %x) nounwind readnone + %add = fadd float %call, %call1 + ret float %add +} + +define double @test2(double %x) nounwind { +entry: +; GNU_SINCOS: test2: +; GNU_SINCOS: callq sincos +; GNU_SINCOS: movsd 16(%rsp), %xmm0 +; GNU_SINCOS: addsd 8(%rsp), %xmm0 + +; OSX_SINCOS: test2: +; OSX_SINCOS: callq ___sincos_stret +; OSX_SINCOS: addsd %xmm1, %xmm0 + +; OSX_NOOPT: test2 +; OSX_NOOPT: callq _cos +; OSX_NOOPT: callq _sin + %call = tail call double @sin(double %x) nounwind readnone + %call1 = tail call double @cos(double %x) nounwind readnone + %add = fadd double %call, %call1 + ret double %add +} + +define x86_fp80 @test3(x86_fp80 %x) nounwind { +entry: +; GNU_SINCOS: test3: +; GNU_SINCOS: callq sinl +; GNU_SINCOS: callq cosl +; GNU_SINCOS: ret + %call = tail call x86_fp80 @sinl(x86_fp80 %x) nounwind + %call1 = tail call x86_fp80 @cosl(x86_fp80 %x) nounwind + %add = fadd x86_fp80 %call, %call1 + ret x86_fp80 %add +} + +declare float @sinf(float) readonly +declare double @sin(double) readonly +declare float @cosf(float) readonly +declare double @cos(double) readonly + +declare x86_fp80 @sinl(x86_fp80) +declare x86_fp80 @cosl(x86_fp80) diff --git a/test/CodeGen/X86/sink-hoist.ll b/test/CodeGen/X86/sink-hoist.ll index 649cd61ab78c..2aca5b897d35 100644 --- a/test/CodeGen/X86/sink-hoist.ll +++ b/test/CodeGen/X86/sink-hoist.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86-64 -asm-verbose=false -mtriple=x86_64-unknown-linux-gnu -mcpu=nehalem -post-RA-scheduler=true | FileCheck %s +; RUN: llc < %s -march=x86-64 -asm-verbose=false -mtriple=x86_64-unknown-linux-gnu -mcpu=nehalem -post-RA-scheduler=true -schedmodel=false | FileCheck %s ; Currently, floating-point selects are lowered to CFG triangles. ; This means that one side of the select is always unconditionally diff --git a/test/CodeGen/X86/sse-align-2.ll b/test/CodeGen/X86/sse-align-2.ll index 102c3fb06cd7..22cd7723068c 100644 --- a/test/CodeGen/X86/sse-align-2.ll +++ b/test/CodeGen/X86/sse-align-2.ll @@ -1,12 +1,21 @@ -; RUN: llc < %s -march=x86-64 | grep movup | count 2 +; RUN: llc < %s -march=x86-64 -mcpu=penryn | FileCheck %s define <4 x float> @foo(<4 x float>* %p, <4 x float> %x) nounwind { %t = load <4 x float>* %p, align 4 %z = fmul <4 x float> %t, %x ret <4 x float> %z } + +; CHECK: foo: +; CHECK: movups +; CHECK: ret + define <2 x double> @bar(<2 x double>* %p, <2 x double> %x) nounwind { %t = load <2 x double>* %p, align 8 %z = fmul <2 x double> %t, %x ret <2 x double> %z } + +; CHECK: bar: +; CHECK: movupd +; CHECK: ret diff --git a/test/CodeGen/X86/sse-domains.ll b/test/CodeGen/X86/sse-domains.ll index c99287bdfb9f..168959a5d653 100644 --- a/test/CodeGen/X86/sse-domains.ll +++ b/test/CodeGen/X86/sse-domains.ll @@ -55,10 +55,10 @@ while.end: ; instructions, they are still dependent on themselves. ; CHECK: xorps [[XMM1:%xmm[0-9]+]] ; CHECK: , [[XMM1]] -; CHECK: cvtsi2ss %{{.*}}, [[XMM1]] +; CHECK: cvtsi2ssl %{{.*}}, [[XMM1]] ; CHECK: xorps [[XMM2:%xmm[0-9]+]] ; CHECK: , [[XMM2]] -; CHECK: cvtsi2ss %{{.*}}, [[XMM2]] +; CHECK: cvtsi2ssl %{{.*}}, [[XMM2]] ; define float @f2(i32 %m) nounwind uwtable readnone ssp { entry: diff --git a/test/CodeGen/X86/sse2-blend.ll b/test/CodeGen/X86/sse2-blend.ll index 2f4317bf294c..30a0fbe7d6de 100644 --- a/test/CodeGen/X86/sse2-blend.ll +++ b/test/CodeGen/X86/sse2-blend.ll @@ -28,33 +28,29 @@ define void@vsel_i32(<4 x i32>* %v1, <4 x i32>* %v2) { ; Without forcing instructions, fall back to the preferred PS domain. ; CHECK: vsel_i64 -; CHECK: xorps -; CHECK: andps ; CHECK: andnps ; CHECK: orps ; CHECK: ret -define void@vsel_i64(<4 x i64>* %v1, <4 x i64>* %v2) { - %A = load <4 x i64>* %v1 - %B = load <4 x i64>* %v2 - %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x i64> %A, <4 x i64> %B - store <4 x i64 > %vsel, <4 x i64>* %v1 +define void@vsel_i64(<2 x i64>* %v1, <2 x i64>* %v2) { + %A = load <2 x i64>* %v1 + %B = load <2 x i64>* %v2 + %vsel = select <2 x i1> <i1 true, i1 false>, <2 x i64> %A, <2 x i64> %B + store <2 x i64 > %vsel, <2 x i64>* %v1 ret void } ; Without forcing instructions, fall back to the preferred PS domain. ; CHECK: vsel_double -; CHECK: xorps -; CHECK: andps ; CHECK: andnps ; CHECK: orps ; CHECK: ret -define void@vsel_double(<4 x double>* %v1, <4 x double>* %v2) { - %A = load <4 x double>* %v1 - %B = load <4 x double>* %v2 - %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x double> %A, <4 x double> %B - store <4 x double > %vsel, <4 x double>* %v1 +define void@vsel_double(<2 x double>* %v1, <2 x double>* %v2) { + %A = load <2 x double>* %v1 + %B = load <2 x double>* %v2 + %vsel = select <2 x i1> <i1 true, i1 false>, <2 x double> %A, <2 x double> %B + store <2 x double > %vsel, <2 x double>* %v1 ret void } diff --git a/test/CodeGen/X86/sse2-mul.ll b/test/CodeGen/X86/sse2-mul.ll new file mode 100644 index 000000000000..0466d60ec301 --- /dev/null +++ b/test/CodeGen/X86/sse2-mul.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -march=x86-64 -mcpu=core2 | FileCheck %s + +define <4 x i32> @test1(<4 x i32> %x, <4 x i32> %y) { + %m = mul <4 x i32> %x, %y + ret <4 x i32> %m +; CHECK: test1: +; CHECK: pshufd $49 +; CHECK: pmuludq +; CHECK: pshufd $49 +; CHECK: pmuludq +; CHECK: shufps $-120 +; CHECK: pshufd $-40 +; CHECK: ret +} diff --git a/test/CodeGen/X86/stack-align-memcpy.ll b/test/CodeGen/X86/stack-align-memcpy.ll new file mode 100644 index 000000000000..74945e5bb1bd --- /dev/null +++ b/test/CodeGen/X86/stack-align-memcpy.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -force-align-stack -mtriple i386-apple-darwin -mcpu=i486 | FileCheck %s + +%struct.foo = type { [88 x i8] } + +; PR15249 +; We can't use rep;movsl here because it clobbers the base pointer in %esi. +define void @test1(%struct.foo* nocapture %x, i32 %y) nounwind { + %dynalloc = alloca i8, i32 %y, align 1 + call void @bar(i8* %dynalloc, %struct.foo* align 4 byval %x) + ret void + +; CHECK: test1: +; CHECK: andl $-16, %esp +; CHECK: movl %esp, %esi +; CHECK-NOT: rep;movsl +} + +declare void @bar(i8* nocapture, %struct.foo* align 4 byval) nounwind diff --git a/test/CodeGen/X86/stack-protector.ll b/test/CodeGen/X86/stack-protector.ll index c07511443bce..1e9ca1d2c24d 100644 --- a/test/CodeGen/X86/stack-protector.ll +++ b/test/CodeGen/X86/stack-protector.ll @@ -1,28 +1,3141 @@ -; RUN: llc -mtriple=i386-pc-linux-gnu < %s -o - | grep %gs: -; RUN: llc -mtriple=x86_64-pc-linux-gnu < %s -o - | grep %fs: -; RUN: llc -code-model=kernel -mtriple=x86_64-pc-linux-gnu < %s -o - | grep %gs: -; RUN: llc -mtriple=x86_64-apple-darwin < %s -o - | grep "__stack_chk_guard" -; RUN: llc -mtriple=x86_64-apple-darwin < %s -o - | grep "__stack_chk_fail" +; RUN: llc -mtriple=i386-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-I386 %s +; RUN: llc -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-X64 %s +; RUN: llc -code-model=kernel -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-KERNEL-X64 %s +; RUN: llc -mtriple=x86_64-apple-darwin < %s -o - | FileCheck --check-prefix=DARWIN-X64 %s -@"\01LC" = internal constant [11 x i8] c"buf == %s\0A\00" ; <[11 x i8]*> [#uses=1] +%struct.foo = type { [16 x i8] } +%struct.foo.0 = type { [4 x i8] } +%struct.pair = type { i32, i32 } +%struct.nest = type { %struct.pair, %struct.pair } +%struct.vec = type { <4 x i32> } +%class.A = type { [2 x i8] } +%struct.deep = type { %union.anon } +%union.anon = type { %struct.anon } +%struct.anon = type { %struct.anon.0 } +%struct.anon.0 = type { %union.anon.1 } +%union.anon.1 = type { [2 x i8] } +%struct.small = type { i8 } -define void @test(i8* %a) nounwind ssp { +@.str = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 + +; test1a: array of [16 x i8] +; no ssp attribute +; Requires no protector. +define void @test1a(i8* %a) nounwind uwtable { +entry: +; LINUX-I386: test1a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test1a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test1a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test1a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + %buf = alloca [16 x i8], align 16 + store i8* %a, i8** %a.addr, align 8 + %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %arraydecay1 = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) + ret void +} + +; test1b: array of [16 x i8] +; ssp attribute +; Requires protector. +define void @test1b(i8* %a) nounwind uwtable ssp { +entry: +; LINUX-I386: test1b: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test1b: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test1b: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test1b: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %buf = alloca [16 x i8], align 16 + store i8* %a, i8** %a.addr, align 8 + %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %arraydecay1 = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) + ret void +} + +; test1c: array of [16 x i8] +; sspstrong attribute +; Requires protector. +define void @test1c(i8* %a) nounwind uwtable sspstrong { +entry: +; LINUX-I386: test1c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test1c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test1c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test1c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %buf = alloca [16 x i8], align 16 + store i8* %a, i8** %a.addr, align 8 + %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %arraydecay1 = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) + ret void +} + +; test1d: array of [16 x i8] +; sspreq attribute +; Requires protector. +define void @test1d(i8* %a) nounwind uwtable sspreq { +entry: +; LINUX-I386: test1d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test1d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test1d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test1d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %buf = alloca [16 x i8], align 16 + store i8* %a, i8** %a.addr, align 8 + %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %arraydecay1 = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) + ret void +} + +; test2a: struct { [16 x i8] } +; no ssp attribute +; Requires no protector. +define void @test2a(i8* %a) nounwind uwtable { +entry: +; LINUX-I386: test2a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test2a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test2a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test2a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + %b = alloca %struct.foo, align 1 + store i8* %a, i8** %a.addr, align 8 + %buf = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 + %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %buf1 = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 + %arraydecay2 = getelementptr inbounds [16 x i8]* %buf1, i32 0, i32 0 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) + ret void +} + +; test2b: struct { [16 x i8] } +; ssp attribute +; Requires protector. +define void @test2b(i8* %a) nounwind uwtable ssp { +entry: +; LINUX-I386: test2b: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test2b: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test2b: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test2b: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %b = alloca %struct.foo, align 1 + store i8* %a, i8** %a.addr, align 8 + %buf = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 + %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %buf1 = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 + %arraydecay2 = getelementptr inbounds [16 x i8]* %buf1, i32 0, i32 0 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) + ret void +} + +; test2c: struct { [16 x i8] } +; sspstrong attribute +; Requires protector. +define void @test2c(i8* %a) nounwind uwtable sspstrong { +entry: +; LINUX-I386: test2c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test2c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test2c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test2c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %b = alloca %struct.foo, align 1 + store i8* %a, i8** %a.addr, align 8 + %buf = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 + %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %buf1 = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 + %arraydecay2 = getelementptr inbounds [16 x i8]* %buf1, i32 0, i32 0 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) + ret void +} + +; test2d: struct { [16 x i8] } +; sspreq attribute +; Requires protector. +define void @test2d(i8* %a) nounwind uwtable sspreq { +entry: +; LINUX-I386: test2d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test2d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test2d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test2d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %b = alloca %struct.foo, align 1 + store i8* %a, i8** %a.addr, align 8 + %buf = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 + %arraydecay = getelementptr inbounds [16 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %buf1 = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 + %arraydecay2 = getelementptr inbounds [16 x i8]* %buf1, i32 0, i32 0 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) + ret void +} + +; test3a: array of [4 x i8] +; no ssp attribute +; Requires no protector. +define void @test3a(i8* %a) nounwind uwtable { +entry: +; LINUX-I386: test3a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test3a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test3a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test3a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + %buf = alloca [4 x i8], align 1 + store i8* %a, i8** %a.addr, align 8 + %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %arraydecay1 = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) + ret void +} + +; test3b: array [4 x i8] +; ssp attribute +; Requires no protector. +define void @test3b(i8* %a) nounwind uwtable ssp { +entry: +; LINUX-I386: test3b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test3b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test3b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test3b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + %buf = alloca [4 x i8], align 1 + store i8* %a, i8** %a.addr, align 8 + %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %arraydecay1 = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) + ret void +} + +; test3c: array of [4 x i8] +; sspstrong attribute +; Requires protector. +define void @test3c(i8* %a) nounwind uwtable sspstrong { +entry: +; LINUX-I386: test3c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test3c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test3c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test3c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %buf = alloca [4 x i8], align 1 + store i8* %a, i8** %a.addr, align 8 + %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %arraydecay1 = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) + ret void +} + +; test3d: array of [4 x i8] +; sspreq attribute +; Requires protector. +define void @test3d(i8* %a) nounwind uwtable sspreq { +entry: +; LINUX-I386: test3d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test3d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test3d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test3d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %buf = alloca [4 x i8], align 1 + store i8* %a, i8** %a.addr, align 8 + %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %arraydecay1 = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) + ret void +} + +; test4a: struct { [4 x i8] } +; no ssp attribute +; Requires no protector. +define void @test4a(i8* %a) nounwind uwtable { +entry: +; LINUX-I386: test4a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test4a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test4a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test4a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + %b = alloca %struct.foo.0, align 1 + store i8* %a, i8** %a.addr, align 8 + %buf = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0 + %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %buf1 = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0 + %arraydecay2 = getelementptr inbounds [4 x i8]* %buf1, i32 0, i32 0 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) + ret void +} + +; test4b: struct { [4 x i8] } +; ssp attribute +; Requires no protector. +define void @test4b(i8* %a) nounwind uwtable ssp { +entry: +; LINUX-I386: test4b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test4b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test4b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test4b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + %b = alloca %struct.foo.0, align 1 + store i8* %a, i8** %a.addr, align 8 + %buf = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0 + %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %buf1 = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0 + %arraydecay2 = getelementptr inbounds [4 x i8]* %buf1, i32 0, i32 0 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) + ret void +} + +; test4c: struct { [4 x i8] } +; sspstrong attribute +; Requires protector. +define void @test4c(i8* %a) nounwind uwtable sspstrong { +entry: +; LINUX-I386: test4c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test4c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test4c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test4c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %b = alloca %struct.foo.0, align 1 + store i8* %a, i8** %a.addr, align 8 + %buf = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0 + %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %buf1 = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0 + %arraydecay2 = getelementptr inbounds [4 x i8]* %buf1, i32 0, i32 0 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) + ret void +} + +; test4d: struct { [4 x i8] } +; sspreq attribute +; Requires protector. +define void @test4d(i8* %a) nounwind uwtable sspreq { +entry: +; LINUX-I386: test4d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test4d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test4d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test4d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + %b = alloca %struct.foo.0, align 1 + store i8* %a, i8** %a.addr, align 8 + %buf = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0 + %arraydecay = getelementptr inbounds [4 x i8]* %buf, i32 0, i32 0 + %0 = load i8** %a.addr, align 8 + %call = call i8* @strcpy(i8* %arraydecay, i8* %0) + %buf1 = getelementptr inbounds %struct.foo.0* %b, i32 0, i32 0 + %arraydecay2 = getelementptr inbounds [4 x i8]* %buf1, i32 0, i32 0 + %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) + ret void +} + +; test5a: no arrays / no nested arrays +; no ssp attribute +; Requires no protector. +define void @test5a(i8* %a) nounwind uwtable { +entry: +; LINUX-I386: test5a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test5a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test5a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test5a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + store i8* %a, i8** %a.addr, align 8 + %0 = load i8** %a.addr, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %0) + ret void +} + +; test5b: no arrays / no nested arrays +; ssp attribute +; Requires no protector. +define void @test5b(i8* %a) nounwind uwtable ssp { +entry: +; LINUX-I386: test5b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test5b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test5b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test5b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + store i8* %a, i8** %a.addr, align 8 + %0 = load i8** %a.addr, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %0) + ret void +} + +; test5c: no arrays / no nested arrays +; sspstrong attribute +; Requires no protector. +define void @test5c(i8* %a) nounwind uwtable sspstrong { +entry: +; LINUX-I386: test5c: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test5c: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test5c: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test5c: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a.addr = alloca i8*, align 8 + store i8* %a, i8** %a.addr, align 8 + %0 = load i8** %a.addr, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %0) + ret void +} + +; test5d: no arrays / no nested arrays +; sspreq attribute +; Requires protector. +define void @test5d(i8* %a) nounwind uwtable sspreq { +entry: +; LINUX-I386: test5d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test5d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test5d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test5d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a.addr = alloca i8*, align 8 + store i8* %a, i8** %a.addr, align 8 + %0 = load i8** %a.addr, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i8* %0) + ret void +} + +; test6a: Address-of local taken (j = &a) +; no ssp attribute +; Requires no protector. +define void @test6a() nounwind uwtable { +entry: +; LINUX-I386: test6a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test6a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test6a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test6a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %retval = alloca i32, align 4 + %a = alloca i32, align 4 + %j = alloca i32*, align 8 + store i32 0, i32* %retval + %0 = load i32* %a, align 4 + %add = add nsw i32 %0, 1 + store i32 %add, i32* %a, align 4 + store i32* %a, i32** %j, align 8 + ret void +} + +; test6b: Address-of local taken (j = &a) +; ssp attribute +; Requires no protector. +define void @test6b() nounwind uwtable ssp { +entry: +; LINUX-I386: test6b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test6b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test6b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test6b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %retval = alloca i32, align 4 + %a = alloca i32, align 4 + %j = alloca i32*, align 8 + store i32 0, i32* %retval + %0 = load i32* %a, align 4 + %add = add nsw i32 %0, 1 + store i32 %add, i32* %a, align 4 + store i32* %a, i32** %j, align 8 + ret void +} + +; test6c: Address-of local taken (j = &a) +; sspstrong attribute +; Requires protector. +define void @test6c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test6c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test6c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test6c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test6c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %retval = alloca i32, align 4 + %a = alloca i32, align 4 + %j = alloca i32*, align 8 + store i32 0, i32* %retval + %0 = load i32* %a, align 4 + %add = add nsw i32 %0, 1 + store i32 %add, i32* %a, align 4 + store i32* %a, i32** %j, align 8 + ret void +} + +; test6d: Address-of local taken (j = &a) +; sspreq attribute +; Requires protector. +define void @test6d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test6d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test6d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test6d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test6d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %retval = alloca i32, align 4 + %a = alloca i32, align 4 + %j = alloca i32*, align 8 + store i32 0, i32* %retval + %0 = load i32* %a, align 4 + %add = add nsw i32 %0, 1 + store i32 %add, i32* %a, align 4 + store i32* %a, i32** %j, align 8 + ret void +} + +; test7a: PtrToInt Cast +; no ssp attribute +; Requires no protector. +define void @test7a() nounwind uwtable readnone { +entry: +; LINUX-I386: test7a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test7a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test7a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test7a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + %0 = ptrtoint i32* %a to i64 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0) + ret void +} + +; test7b: PtrToInt Cast +; ssp attribute +; Requires no protector. +define void @test7b() nounwind uwtable readnone ssp { +entry: +; LINUX-I386: test7b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test7b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test7b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test7b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + %0 = ptrtoint i32* %a to i64 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0) + ret void +} + +; test7c: PtrToInt Cast +; sspstrong attribute +; Requires protector. +define void @test7c() nounwind uwtable readnone sspstrong { +entry: +; LINUX-I386: test7c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test7c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test7c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test7c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + %0 = ptrtoint i32* %a to i64 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0) + ret void +} + +; test7d: PtrToInt Cast +; sspreq attribute +; Requires protector. +define void @test7d() nounwind uwtable readnone sspreq { +entry: +; LINUX-I386: test7d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test7d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test7d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test7d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + %0 = ptrtoint i32* %a to i64 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0) + ret void +} + +; test8a: Passing addr-of to function call +; no ssp attribute +; Requires no protector. +define void @test8a() nounwind uwtable { +entry: +; LINUX-I386: test8a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test8a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test8a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test8a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %b = alloca i32, align 4 + call void @funcall(i32* %b) nounwind + ret void +} + +; test8b: Passing addr-of to function call +; ssp attribute +; Requires no protector. +define void @test8b() nounwind uwtable ssp { +entry: +; LINUX-I386: test8b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test8b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test8b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test8b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %b = alloca i32, align 4 + call void @funcall(i32* %b) nounwind + ret void +} + +; test8c: Passing addr-of to function call +; sspstrong attribute +; Requires protector. +define void @test8c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test8c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test8c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test8c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test8c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %b = alloca i32, align 4 + call void @funcall(i32* %b) nounwind + ret void +} + +; test8d: Passing addr-of to function call +; sspreq attribute +; Requires protector. +define void @test8d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test8d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test8d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test8d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test8d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %b = alloca i32, align 4 + call void @funcall(i32* %b) nounwind + ret void +} + +; test9a: Addr-of in select instruction +; no ssp attribute +; Requires no protector. +define void @test9a() nounwind uwtable { +entry: +; LINUX-I386: test9a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test9a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test9a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test9a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %x = alloca double, align 8 + %call = call double @testi_aux() nounwind + store double %call, double* %x, align 8 + %cmp2 = fcmp ogt double %call, 0.000000e+00 + %y.1 = select i1 %cmp2, double* %x, double* null + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double* %y.1) + ret void +} + +; test9b: Addr-of in select instruction +; ssp attribute +; Requires no protector. +define void @test9b() nounwind uwtable ssp { +entry: +; LINUX-I386: test9b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test9b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test9b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test9b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %x = alloca double, align 8 + %call = call double @testi_aux() nounwind + store double %call, double* %x, align 8 + %cmp2 = fcmp ogt double %call, 0.000000e+00 + %y.1 = select i1 %cmp2, double* %x, double* null + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double* %y.1) + ret void +} + +; test9c: Addr-of in select instruction +; sspstrong attribute +; Requires protector. +define void @test9c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test9c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test9c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test9c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test9c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %x = alloca double, align 8 + %call = call double @testi_aux() nounwind + store double %call, double* %x, align 8 + %cmp2 = fcmp ogt double %call, 0.000000e+00 + %y.1 = select i1 %cmp2, double* %x, double* null + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double* %y.1) + ret void +} + +; test9d: Addr-of in select instruction +; sspreq attribute +; Requires protector. +define void @test9d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test9d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test9d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test9d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test9d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %x = alloca double, align 8 + %call = call double @testi_aux() nounwind + store double %call, double* %x, align 8 + %cmp2 = fcmp ogt double %call, 0.000000e+00 + %y.1 = select i1 %cmp2, double* %x, double* null + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double* %y.1) + ret void +} + +; test10a: Addr-of in phi instruction +; no ssp attribute +; Requires no protector. +define void @test10a() nounwind uwtable { +entry: +; LINUX-I386: test10a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test10a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test10a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test10a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %x = alloca double, align 8 + %call = call double @testi_aux() nounwind + store double %call, double* %x, align 8 + %cmp = fcmp ogt double %call, 3.140000e+00 + br i1 %cmp, label %if.then, label %if.else + +if.then: ; preds = %entry + %call1 = call double @testi_aux() nounwind + store double %call1, double* %x, align 8 + br label %if.end4 + +if.else: ; preds = %entry + %cmp2 = fcmp ogt double %call, 1.000000e+00 + br i1 %cmp2, label %if.then3, label %if.end4 + +if.then3: ; preds = %if.else + br label %if.end4 + +if.end4: ; preds = %if.else, %if.then3, %if.then + %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ] + %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), double* %y.0) nounwind + ret void +} + +; test10b: Addr-of in phi instruction +; ssp attribute +; Requires no protector. +define void @test10b() nounwind uwtable ssp { +entry: +; LINUX-I386: test10b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test10b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test10b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test10b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %x = alloca double, align 8 + %call = call double @testi_aux() nounwind + store double %call, double* %x, align 8 + %cmp = fcmp ogt double %call, 3.140000e+00 + br i1 %cmp, label %if.then, label %if.else + +if.then: ; preds = %entry + %call1 = call double @testi_aux() nounwind + store double %call1, double* %x, align 8 + br label %if.end4 + +if.else: ; preds = %entry + %cmp2 = fcmp ogt double %call, 1.000000e+00 + br i1 %cmp2, label %if.then3, label %if.end4 + +if.then3: ; preds = %if.else + br label %if.end4 + +if.end4: ; preds = %if.else, %if.then3, %if.then + %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ] + %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), double* %y.0) nounwind + ret void +} + +; test10c: Addr-of in phi instruction +; sspstrong attribute +; Requires protector. +define void @test10c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test10c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test10c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test10c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test10c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %x = alloca double, align 8 + %call = call double @testi_aux() nounwind + store double %call, double* %x, align 8 + %cmp = fcmp ogt double %call, 3.140000e+00 + br i1 %cmp, label %if.then, label %if.else + +if.then: ; preds = %entry + %call1 = call double @testi_aux() nounwind + store double %call1, double* %x, align 8 + br label %if.end4 + +if.else: ; preds = %entry + %cmp2 = fcmp ogt double %call, 1.000000e+00 + br i1 %cmp2, label %if.then3, label %if.end4 + +if.then3: ; preds = %if.else + br label %if.end4 + +if.end4: ; preds = %if.else, %if.then3, %if.then + %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ] + %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), double* %y.0) nounwind + ret void +} + +; test10d: Addr-of in phi instruction +; sspreq attribute +; Requires protector. +define void @test10d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test10d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test10d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test10d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test10d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %x = alloca double, align 8 + %call = call double @testi_aux() nounwind + store double %call, double* %x, align 8 + %cmp = fcmp ogt double %call, 3.140000e+00 + br i1 %cmp, label %if.then, label %if.else + +if.then: ; preds = %entry + %call1 = call double @testi_aux() nounwind + store double %call1, double* %x, align 8 + br label %if.end4 + +if.else: ; preds = %entry + %cmp2 = fcmp ogt double %call, 1.000000e+00 + br i1 %cmp2, label %if.then3, label %if.end4 + +if.then3: ; preds = %if.else + br label %if.end4 + +if.end4: ; preds = %if.else, %if.then3, %if.then + %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ] + %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), double* %y.0) nounwind + ret void +} + +; test11a: Addr-of struct element. (GEP followed by store). +; no ssp attribute +; Requires no protector. +define void @test11a() nounwind uwtable { +entry: +; LINUX-I386: test11a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test11a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test11a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test11a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.pair, align 4 + %b = alloca i32*, align 8 + %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1 + store i32* %y, i32** %b, align 8 + %0 = load i32** %b, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32* %0) + ret void +} + +; test11b: Addr-of struct element. (GEP followed by store). +; ssp attribute +; Requires no protector. +define void @test11b() nounwind uwtable ssp { +entry: +; LINUX-I386: test11b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test11b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test11b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test11b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.pair, align 4 + %b = alloca i32*, align 8 + %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1 + store i32* %y, i32** %b, align 8 + %0 = load i32** %b, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32* %0) + ret void +} + +; test11c: Addr-of struct element. (GEP followed by store). +; sspstrong attribute +; Requires protector. +define void @test11c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test11c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test11c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test11c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test11c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.pair, align 4 + %b = alloca i32*, align 8 + %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1 + store i32* %y, i32** %b, align 8 + %0 = load i32** %b, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32* %0) + ret void +} + +; test11d: Addr-of struct element. (GEP followed by store). +; sspreq attribute +; Requires protector. +define void @test11d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test11d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test11d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test11d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test11d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.pair, align 4 + %b = alloca i32*, align 8 + %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1 + store i32* %y, i32** %b, align 8 + %0 = load i32** %b, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32* %0) + ret void +} + +; test12a: Addr-of struct element, GEP followed by ptrtoint. +; no ssp attribute +; Requires no protector. +define void @test12a() nounwind uwtable { +entry: +; LINUX-I386: test12a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test12a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test12a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test12a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.pair, align 4 + %b = alloca i32*, align 8 + %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1 + %0 = ptrtoint i32* %y to i64 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0) + ret void +} + +; test12b: Addr-of struct element, GEP followed by ptrtoint. +; ssp attribute +; Requires no protector. +define void @test12b() nounwind uwtable ssp { +entry: +; LINUX-I386: test12b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test12b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test12b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test12b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.pair, align 4 + %b = alloca i32*, align 8 + %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1 + %0 = ptrtoint i32* %y to i64 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0) + ret void +} + +; test12c: Addr-of struct element, GEP followed by ptrtoint. +; sspstrong attribute +; Requires protector. +define void @test12c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test12c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test12c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test12c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test12c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.pair, align 4 + %b = alloca i32*, align 8 + %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1 + %0 = ptrtoint i32* %y to i64 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0) + ret void +} + +; test12d: Addr-of struct element, GEP followed by ptrtoint. +; sspreq attribute +; Requires protector. +define void @test12d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test12d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test12d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test12d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test12d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.pair, align 4 + %b = alloca i32*, align 8 + %y = getelementptr inbounds %struct.pair* %c, i32 0, i32 1 + %0 = ptrtoint i32* %y to i64 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i64 %0) + ret void +} + +; test13a: Addr-of struct element, GEP followed by callinst. +; no ssp attribute +; Requires no protector. +define void @test13a() nounwind uwtable { +entry: +; LINUX-I386: test13a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test13a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test13a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test13a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.pair, align 4 + %y = getelementptr inbounds %struct.pair* %c, i64 0, i32 1 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %y) nounwind + ret void +} + +; test13b: Addr-of struct element, GEP followed by callinst. +; ssp attribute +; Requires no protector. +define void @test13b() nounwind uwtable ssp { +entry: +; LINUX-I386: test13b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test13b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test13b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test13b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.pair, align 4 + %y = getelementptr inbounds %struct.pair* %c, i64 0, i32 1 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %y) nounwind + ret void +} + +; test13c: Addr-of struct element, GEP followed by callinst. +; sspstrong attribute +; Requires protector. +define void @test13c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test13c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test13c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test13c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test13c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.pair, align 4 + %y = getelementptr inbounds %struct.pair* %c, i64 0, i32 1 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %y) nounwind + ret void +} + +; test13d: Addr-of struct element, GEP followed by callinst. +; sspreq attribute +; Requires protector. +define void @test13d() nounwind uwtable sspreq { entry: - %a_addr = alloca i8* ; <i8**> [#uses=2] - %buf = alloca [8 x i8] ; <[8 x i8]*> [#uses=2] - %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] - store i8* %a, i8** %a_addr - %buf1 = bitcast [8 x i8]* %buf to i8* ; <i8*> [#uses=1] - %0 = load i8** %a_addr, align 4 ; <i8*> [#uses=1] - %1 = call i8* @strcpy(i8* %buf1, i8* %0) nounwind ; <i8*> [#uses=0] - %buf2 = bitcast [8 x i8]* %buf to i8* ; <i8*> [#uses=1] - %2 = call i32 (i8*, ...)* @printf(i8* getelementptr ([11 x i8]* @"\01LC", i32 0, i32 0), i8* %buf2) nounwind ; <i32> [#uses=0] - br label %return +; LINUX-I386: test13d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test13d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail -return: ; preds = %entry - ret void +; LINUX-KERNEL-X64: test13d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test13d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.pair, align 4 + %y = getelementptr inbounds %struct.pair* %c, i64 0, i32 1 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %y) nounwind + ret void } -declare i8* @strcpy(i8*, i8*) nounwind +; test14a: Addr-of a local, optimized into a GEP (e.g., &a - 12) +; no ssp attribute +; Requires no protector. +define void @test14a() nounwind uwtable { +entry: +; LINUX-I386: test14a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test14a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test14a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test14a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + %add.ptr5 = getelementptr inbounds i32* %a, i64 -12 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) nounwind + ret void +} + +; test14b: Addr-of a local, optimized into a GEP (e.g., &a - 12) +; ssp attribute +; Requires no protector. +define void @test14b() nounwind uwtable ssp { +entry: +; LINUX-I386: test14b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test14b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test14b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test14b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + %add.ptr5 = getelementptr inbounds i32* %a, i64 -12 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) nounwind + ret void +} + +; test14c: Addr-of a local, optimized into a GEP (e.g., &a - 12) +; sspstrong attribute +; Requires protector. +define void @test14c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test14c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test14c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test14c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test14c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + %add.ptr5 = getelementptr inbounds i32* %a, i64 -12 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) nounwind + ret void +} + +; test14d: Addr-of a local, optimized into a GEP (e.g., &a - 12) +; sspreq attribute +; Requires protector. +define void @test14d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test14d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test14d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test14d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test14d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + %add.ptr5 = getelementptr inbounds i32* %a, i64 -12 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) nounwind + ret void +} + +; test15a: Addr-of a local cast to a ptr of a different type +; (e.g., int a; ... ; float *b = &a;) +; no ssp attribute +; Requires no protector. +define void @test15a() nounwind uwtable { +entry: +; LINUX-I386: test15a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test15a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test15a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test15a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + %b = alloca float*, align 8 + store i32 0, i32* %a, align 4 + %0 = bitcast i32* %a to float* + store float* %0, float** %b, align 8 + %1 = load float** %b, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), float* %1) + ret void +} + +; test15b: Addr-of a local cast to a ptr of a different type +; (e.g., int a; ... ; float *b = &a;) +; ssp attribute +; Requires no protector. +define void @test15b() nounwind uwtable ssp { +entry: +; LINUX-I386: test15b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test15b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test15b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test15b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + %b = alloca float*, align 8 + store i32 0, i32* %a, align 4 + %0 = bitcast i32* %a to float* + store float* %0, float** %b, align 8 + %1 = load float** %b, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), float* %1) + ret void +} + +; test15c: Addr-of a local cast to a ptr of a different type +; (e.g., int a; ... ; float *b = &a;) +; sspstrong attribute +; Requires protector. +define void @test15c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test15c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test15c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test15c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test15c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + %b = alloca float*, align 8 + store i32 0, i32* %a, align 4 + %0 = bitcast i32* %a to float* + store float* %0, float** %b, align 8 + %1 = load float** %b, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), float* %1) + ret void +} + +; test15d: Addr-of a local cast to a ptr of a different type +; (e.g., int a; ... ; float *b = &a;) +; sspreq attribute +; Requires protector. +define void @test15d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test15d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test15d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test15d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test15d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + %b = alloca float*, align 8 + store i32 0, i32* %a, align 4 + %0 = bitcast i32* %a to float* + store float* %0, float** %b, align 8 + %1 = load float** %b, align 8 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), float* %1) + ret void +} + +; test16a: Addr-of a local cast to a ptr of a different type (optimized) +; (e.g., int a; ... ; float *b = &a;) +; no ssp attribute +; Requires no protector. +define void @test16a() nounwind uwtable { +entry: +; LINUX-I386: test16a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test16a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test16a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test16a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + store i32 0, i32* %a, align 4 + %0 = bitcast i32* %a to float* + call void @funfloat(float* %0) nounwind + ret void +} + +; test16b: Addr-of a local cast to a ptr of a different type (optimized) +; (e.g., int a; ... ; float *b = &a;) +; ssp attribute +; Requires no protector. +define void @test16b() nounwind uwtable ssp { +entry: +; LINUX-I386: test16b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test16b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test16b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test16b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + store i32 0, i32* %a, align 4 + %0 = bitcast i32* %a to float* + call void @funfloat(float* %0) nounwind + ret void +} + +; test16c: Addr-of a local cast to a ptr of a different type (optimized) +; (e.g., int a; ... ; float *b = &a;) +; sspstrong attribute +; Requires protector. +define void @test16c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test16c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test16c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test16c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test16c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + store i32 0, i32* %a, align 4 + %0 = bitcast i32* %a to float* + call void @funfloat(float* %0) nounwind + ret void +} + +; test16d: Addr-of a local cast to a ptr of a different type (optimized) +; (e.g., int a; ... ; float *b = &a;) +; sspreq attribute +; Requires protector. +define void @test16d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test16d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test16d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test16d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test16d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + store i32 0, i32* %a, align 4 + %0 = bitcast i32* %a to float* + call void @funfloat(float* %0) nounwind + ret void +} + +; test17a: Addr-of a vector nested in a struct +; no ssp attribute +; Requires no protector. +define void @test17a() nounwind uwtable { +entry: +; LINUX-I386: test17a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test17a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test17a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test17a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.vec, align 16 + %y = getelementptr inbounds %struct.vec* %c, i64 0, i32 0 + %add.ptr = getelementptr inbounds <4 x i32>* %y, i64 -12 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) nounwind + ret void +} + +; test17b: Addr-of a vector nested in a struct +; ssp attribute +; Requires no protector. +define void @test17b() nounwind uwtable ssp { +entry: +; LINUX-I386: test17b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test17b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test17b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test17b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.vec, align 16 + %y = getelementptr inbounds %struct.vec* %c, i64 0, i32 0 + %add.ptr = getelementptr inbounds <4 x i32>* %y, i64 -12 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) nounwind + ret void +} + +; test17c: Addr-of a vector nested in a struct +; sspstrong attribute +; Requires protector. +define void @test17c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test17c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test17c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test17c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test17c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.vec, align 16 + %y = getelementptr inbounds %struct.vec* %c, i64 0, i32 0 + %add.ptr = getelementptr inbounds <4 x i32>* %y, i64 -12 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) nounwind + ret void +} + +; test17d: Addr-of a vector nested in a struct +; sspreq attribute +; Requires protector. +define void @test17d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test17d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test17d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test17d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test17d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.vec, align 16 + %y = getelementptr inbounds %struct.vec* %c, i64 0, i32 0 + %add.ptr = getelementptr inbounds <4 x i32>* %y, i64 -12 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) nounwind + ret void +} + +; test18a: Addr-of a variable passed into an invoke instruction. +; no ssp attribute +; Requires no protector. +define i32 @test18a() uwtable { +entry: +; LINUX-I386: test18a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test18a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test18a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test18a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + store i32 0, i32* %a, align 4 + invoke void @_Z3exceptPi(i32* %a) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i32 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + ret i32 0 +} + +; test18b: Addr-of a variable passed into an invoke instruction. +; ssp attribute +; Requires no protector. +define i32 @test18b() uwtable ssp { +entry: +; LINUX-I386: test18b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test18b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test18b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test18b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + store i32 0, i32* %a, align 4 + invoke void @_Z3exceptPi(i32* %a) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i32 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + ret i32 0 +} + +; test18c: Addr-of a variable passed into an invoke instruction. +; sspstrong attribute +; Requires protector. +define i32 @test18c() uwtable sspstrong { +entry: +; LINUX-I386: test18c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test18c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test18c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test18c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + store i32 0, i32* %a, align 4 + invoke void @_Z3exceptPi(i32* %a) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i32 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + ret i32 0 +} + +; test18d: Addr-of a variable passed into an invoke instruction. +; sspreq attribute +; Requires protector. +define i32 @test18d() uwtable sspreq { +entry: +; LINUX-I386: test18d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test18d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test18d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test18d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + store i32 0, i32* %a, align 4 + invoke void @_Z3exceptPi(i32* %a) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i32 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + ret i32 0 +} + +; test19a: Addr-of a struct element passed into an invoke instruction. +; (GEP followed by an invoke) +; no ssp attribute +; Requires no protector. +define i32 @test19a() uwtable { +entry: +; LINUX-I386: test19a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test19a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test19a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test19a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.pair, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + %a = getelementptr inbounds %struct.pair* %c, i32 0, i32 0 + store i32 0, i32* %a, align 4 + %a1 = getelementptr inbounds %struct.pair* %c, i32 0, i32 0 + invoke void @_Z3exceptPi(i32* %a1) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i32 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + ret i32 0 +} + +; test19b: Addr-of a struct element passed into an invoke instruction. +; (GEP followed by an invoke) +; ssp attribute +; Requires no protector. +define i32 @test19b() uwtable ssp { +entry: +; LINUX-I386: test19b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test19b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test19b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test19b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.pair, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + %a = getelementptr inbounds %struct.pair* %c, i32 0, i32 0 + store i32 0, i32* %a, align 4 + %a1 = getelementptr inbounds %struct.pair* %c, i32 0, i32 0 + invoke void @_Z3exceptPi(i32* %a1) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i32 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + ret i32 0 +} + +; test19c: Addr-of a struct element passed into an invoke instruction. +; (GEP followed by an invoke) +; sspstrong attribute +; Requires protector. +define i32 @test19c() uwtable sspstrong { +entry: +; LINUX-I386: test19c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test19c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test19c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test19c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.pair, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + %a = getelementptr inbounds %struct.pair* %c, i32 0, i32 0 + store i32 0, i32* %a, align 4 + %a1 = getelementptr inbounds %struct.pair* %c, i32 0, i32 0 + invoke void @_Z3exceptPi(i32* %a1) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i32 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + ret i32 0 +} + +; test19d: Addr-of a struct element passed into an invoke instruction. +; (GEP followed by an invoke) +; sspreq attribute +; Requires protector. +define i32 @test19d() uwtable sspreq { +entry: +; LINUX-I386: test19d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test19d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test19d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test19d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %c = alloca %struct.pair, align 4 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + %a = getelementptr inbounds %struct.pair* %c, i32 0, i32 0 + store i32 0, i32* %a, align 4 + %a1 = getelementptr inbounds %struct.pair* %c, i32 0, i32 0 + invoke void @_Z3exceptPi(i32* %a1) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i32 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null + ret i32 0 +} + +; test20a: Addr-of a pointer +; no ssp attribute +; Requires no protector. +define void @test20a() nounwind uwtable { +entry: +; LINUX-I386: test20a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test20a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test20a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test20a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32*, align 8 + %b = alloca i32**, align 8 + %call = call i32* @getp() + store i32* %call, i32** %a, align 8 + store i32** %a, i32*** %b, align 8 + %0 = load i32*** %b, align 8 + call void @funcall2(i32** %0) + ret void +} + +; test20b: Addr-of a pointer +; ssp attribute +; Requires no protector. +define void @test20b() nounwind uwtable ssp { +entry: +; LINUX-I386: test20b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test20b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test20b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test20b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32*, align 8 + %b = alloca i32**, align 8 + %call = call i32* @getp() + store i32* %call, i32** %a, align 8 + store i32** %a, i32*** %b, align 8 + %0 = load i32*** %b, align 8 + call void @funcall2(i32** %0) + ret void +} + +; test20c: Addr-of a pointer +; sspstrong attribute +; Requires protector. +define void @test20c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test20c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test20c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test20c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test20c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32*, align 8 + %b = alloca i32**, align 8 + %call = call i32* @getp() + store i32* %call, i32** %a, align 8 + store i32** %a, i32*** %b, align 8 + %0 = load i32*** %b, align 8 + call void @funcall2(i32** %0) + ret void +} + +; test20d: Addr-of a pointer +; sspreq attribute +; Requires protector. +define void @test20d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test20d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test20d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test20d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test20d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32*, align 8 + %b = alloca i32**, align 8 + %call = call i32* @getp() + store i32* %call, i32** %a, align 8 + store i32** %a, i32*** %b, align 8 + %0 = load i32*** %b, align 8 + call void @funcall2(i32** %0) + ret void +} + +; test21a: Addr-of a casted pointer +; no ssp attribute +; Requires no protector. +define void @test21a() nounwind uwtable { +entry: +; LINUX-I386: test21a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test21a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test21a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test21a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32*, align 8 + %b = alloca float**, align 8 + %call = call i32* @getp() + store i32* %call, i32** %a, align 8 + %0 = bitcast i32** %a to float** + store float** %0, float*** %b, align 8 + %1 = load float*** %b, align 8 + call void @funfloat2(float** %1) + ret void +} + +; test21b: Addr-of a casted pointer +; ssp attribute +; Requires no protector. +define void @test21b() nounwind uwtable ssp { +entry: +; LINUX-I386: test21b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test21b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test21b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test21b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca i32*, align 8 + %b = alloca float**, align 8 + %call = call i32* @getp() + store i32* %call, i32** %a, align 8 + %0 = bitcast i32** %a to float** + store float** %0, float*** %b, align 8 + %1 = load float*** %b, align 8 + call void @funfloat2(float** %1) + ret void +} + +; test21c: Addr-of a casted pointer +; sspstrong attribute +; Requires protector. +define void @test21c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test21c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test21c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test21c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test21c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32*, align 8 + %b = alloca float**, align 8 + %call = call i32* @getp() + store i32* %call, i32** %a, align 8 + %0 = bitcast i32** %a to float** + store float** %0, float*** %b, align 8 + %1 = load float*** %b, align 8 + call void @funfloat2(float** %1) + ret void +} + +; test21d: Addr-of a casted pointer +; sspreq attribute +; Requires protector. +define void @test21d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test21d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test21d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test21d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test21d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca i32*, align 8 + %b = alloca float**, align 8 + %call = call i32* @getp() + store i32* %call, i32** %a, align 8 + %0 = bitcast i32** %a to float** + store float** %0, float*** %b, align 8 + %1 = load float*** %b, align 8 + call void @funfloat2(float** %1) + ret void +} + +; test22a: [2 x i8] in a class +; no ssp attribute +; Requires no protector. +define signext i8 @test22a() nounwind uwtable { +entry: +; LINUX-I386: test22a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test22a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test22a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test22a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca %class.A, align 1 + %array = getelementptr inbounds %class.A* %a, i32 0, i32 0 + %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0 + %0 = load i8* %arrayidx, align 1 + ret i8 %0 +} + +; test22b: [2 x i8] in a class +; ssp attribute +; Requires no protector. +define signext i8 @test22b() nounwind uwtable ssp { +entry: +; LINUX-I386: test22b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test22b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test22b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test22b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca %class.A, align 1 + %array = getelementptr inbounds %class.A* %a, i32 0, i32 0 + %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0 + %0 = load i8* %arrayidx, align 1 + ret i8 %0 +} + +; test22c: [2 x i8] in a class +; sspstrong attribute +; Requires protector. +define signext i8 @test22c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test22c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test22c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test22c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test22c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca %class.A, align 1 + %array = getelementptr inbounds %class.A* %a, i32 0, i32 0 + %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0 + %0 = load i8* %arrayidx, align 1 + ret i8 %0 +} + +; test22d: [2 x i8] in a class +; sspreq attribute +; Requires protector. +define signext i8 @test22d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test22d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test22d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test22d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test22d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca %class.A, align 1 + %array = getelementptr inbounds %class.A* %a, i32 0, i32 0 + %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0 + %0 = load i8* %arrayidx, align 1 + ret i8 %0 +} + +; test23a: [2 x i8] nested in several layers of structs and unions +; no ssp attribute +; Requires no protector. +define signext i8 @test23a() nounwind uwtable { +entry: +; LINUX-I386: test23a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test23a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test23a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test23a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %x = alloca %struct.deep, align 1 + %b = getelementptr inbounds %struct.deep* %x, i32 0, i32 0 + %c = bitcast %union.anon* %b to %struct.anon* + %d = getelementptr inbounds %struct.anon* %c, i32 0, i32 0 + %e = getelementptr inbounds %struct.anon.0* %d, i32 0, i32 0 + %array = bitcast %union.anon.1* %e to [2 x i8]* + %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0 + %0 = load i8* %arrayidx, align 1 + ret i8 %0 +} + +; test23b: [2 x i8] nested in several layers of structs and unions +; ssp attribute +; Requires no protector. +define signext i8 @test23b() nounwind uwtable ssp { +entry: +; LINUX-I386: test23b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test23b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test23b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test23b: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %x = alloca %struct.deep, align 1 + %b = getelementptr inbounds %struct.deep* %x, i32 0, i32 0 + %c = bitcast %union.anon* %b to %struct.anon* + %d = getelementptr inbounds %struct.anon* %c, i32 0, i32 0 + %e = getelementptr inbounds %struct.anon.0* %d, i32 0, i32 0 + %array = bitcast %union.anon.1* %e to [2 x i8]* + %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0 + %0 = load i8* %arrayidx, align 1 + ret i8 %0 +} + +; test23c: [2 x i8] nested in several layers of structs and unions +; sspstrong attribute +; Requires protector. +define signext i8 @test23c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test23c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test23c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test23c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test23c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %x = alloca %struct.deep, align 1 + %b = getelementptr inbounds %struct.deep* %x, i32 0, i32 0 + %c = bitcast %union.anon* %b to %struct.anon* + %d = getelementptr inbounds %struct.anon* %c, i32 0, i32 0 + %e = getelementptr inbounds %struct.anon.0* %d, i32 0, i32 0 + %array = bitcast %union.anon.1* %e to [2 x i8]* + %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0 + %0 = load i8* %arrayidx, align 1 + ret i8 %0 +} + +; test23d: [2 x i8] nested in several layers of structs and unions +; sspreq attribute +; Requires protector. +define signext i8 @test23d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test23d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test23d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test23d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test23d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %x = alloca %struct.deep, align 1 + %b = getelementptr inbounds %struct.deep* %x, i32 0, i32 0 + %c = bitcast %union.anon* %b to %struct.anon* + %d = getelementptr inbounds %struct.anon* %c, i32 0, i32 0 + %e = getelementptr inbounds %struct.anon.0* %d, i32 0, i32 0 + %array = bitcast %union.anon.1* %e to [2 x i8]* + %arrayidx = getelementptr inbounds [2 x i8]* %array, i32 0, i64 0 + %0 = load i8* %arrayidx, align 1 + ret i8 %0 +} + +; test24a: Variable sized alloca +; no ssp attribute +; Requires no protector. +define void @test24a(i32 %n) nounwind uwtable { +entry: +; LINUX-I386: test24a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test24a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test24a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test24a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %n.addr = alloca i32, align 4 + %a = alloca i32*, align 8 + store i32 %n, i32* %n.addr, align 4 + %0 = load i32* %n.addr, align 4 + %conv = sext i32 %0 to i64 + %1 = alloca i8, i64 %conv + %2 = bitcast i8* %1 to i32* + store i32* %2, i32** %a, align 8 + ret void +} + +; test24b: Variable sized alloca +; ssp attribute +; Requires protector. +define void @test24b(i32 %n) nounwind uwtable ssp { +entry: +; LINUX-I386: test24b: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test24b: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test24b: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test24b: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %n.addr = alloca i32, align 4 + %a = alloca i32*, align 8 + store i32 %n, i32* %n.addr, align 4 + %0 = load i32* %n.addr, align 4 + %conv = sext i32 %0 to i64 + %1 = alloca i8, i64 %conv + %2 = bitcast i8* %1 to i32* + store i32* %2, i32** %a, align 8 + ret void +} + +; test24c: Variable sized alloca +; sspstrong attribute +; Requires protector. +define void @test24c(i32 %n) nounwind uwtable sspstrong { +entry: +; LINUX-I386: test24c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test24c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test24c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test24c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %n.addr = alloca i32, align 4 + %a = alloca i32*, align 8 + store i32 %n, i32* %n.addr, align 4 + %0 = load i32* %n.addr, align 4 + %conv = sext i32 %0 to i64 + %1 = alloca i8, i64 %conv + %2 = bitcast i8* %1 to i32* + store i32* %2, i32** %a, align 8 + ret void +} + +; test24d: Variable sized alloca +; sspreq attribute +; Requires protector. +define void @test24d(i32 %n) nounwind uwtable sspreq { +entry: +; LINUX-I386: test24d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test24d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test24d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test24d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %n.addr = alloca i32, align 4 + %a = alloca i32*, align 8 + store i32 %n, i32* %n.addr, align 4 + %0 = load i32* %n.addr, align 4 + %conv = sext i32 %0 to i64 + %1 = alloca i8, i64 %conv + %2 = bitcast i8* %1 to i32* + store i32* %2, i32** %a, align 8 + ret void +} + +; test25a: array of [4 x i32] +; no ssp attribute +; Requires no protector. +define i32 @test25a() nounwind uwtable { +entry: +; LINUX-I386: test25a: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test25a: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test25a: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test25a: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %a = alloca [4 x i32], align 16 + %arrayidx = getelementptr inbounds [4 x i32]* %a, i32 0, i64 0 + %0 = load i32* %arrayidx, align 4 + ret i32 %0 +} + +; test25b: array of [4 x i32] +; ssp attribute +; Requires no protector, except for Darwin which _does_ require a protector. +define i32 @test25b() nounwind uwtable ssp { +entry: +; LINUX-I386: test25b: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test25b: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test25b: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test25b: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca [4 x i32], align 16 + %arrayidx = getelementptr inbounds [4 x i32]* %a, i32 0, i64 0 + %0 = load i32* %arrayidx, align 4 + ret i32 %0 +} + +; test25c: array of [4 x i32] +; sspstrong attribute +; Requires protector. +define i32 @test25c() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test25c: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test25c: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test25c: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test25c: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca [4 x i32], align 16 + %arrayidx = getelementptr inbounds [4 x i32]* %a, i32 0, i64 0 + %0 = load i32* %arrayidx, align 4 + ret i32 %0 +} + +; test25d: array of [4 x i32] +; sspreq attribute +; Requires protector. +define i32 @test25d() nounwind uwtable sspreq { +entry: +; LINUX-I386: test25d: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test25d: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test25d: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test25d: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %a = alloca [4 x i32], align 16 + %arrayidx = getelementptr inbounds [4 x i32]* %a, i32 0, i64 0 + %0 = load i32* %arrayidx, align 4 + ret i32 %0 +} + +; test26: Nested structure, no arrays, no address-of expressions. +; Verify that the resulting gep-of-gep does not incorrectly trigger +; a stack protector. +; ssptrong attribute +; Requires no protector. +define void @test26() nounwind uwtable sspstrong { +entry: +; LINUX-I386: test26: +; LINUX-I386-NOT: calll __stack_chk_fail +; LINUX-I386: .cfi_endproc + +; LINUX-X64: test26: +; LINUX-X64-NOT: callq __stack_chk_fail +; LINUX-X64: .cfi_endproc + +; LINUX-KERNEL-X64: test26: +; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail +; LINUX-KERNEL-X64: .cfi_endproc + +; DARWIN-X64: test26: +; DARWIN-X64-NOT: callq ___stack_chk_fail +; DARWIN-X64: .cfi_endproc + %c = alloca %struct.nest, align 4 + %b = getelementptr inbounds %struct.nest* %c, i32 0, i32 1 + %_a = getelementptr inbounds %struct.pair* %b, i32 0, i32 0 + %0 = load i32* %_a, align 4 + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %0) + ret void +} + +; test27: Address-of a structure taken in a function with a loop where +; the alloca is an incoming value to a PHI node and a use of that PHI +; node is also an incoming value. +; Verify that the address-of analysis does not get stuck in infinite +; recursion when chasing the alloca through the PHI nodes. +; Requires protector. +define i32 @test27(i32 %arg) nounwind uwtable sspstrong { +bb: +; LINUX-I386: test27: +; LINUX-I386: mov{{l|q}} %gs: +; LINUX-I386: calll __stack_chk_fail + +; LINUX-X64: test27: +; LINUX-X64: mov{{l|q}} %fs: +; LINUX-X64: callq __stack_chk_fail + +; LINUX-KERNEL-X64: test27: +; LINUX-KERNEL-X64: mov{{l|q}} %gs: +; LINUX-KERNEL-X64: callq __stack_chk_fail + +; DARWIN-X64: test27: +; DARWIN-X64: mov{{l|q}} ___stack_chk_guard +; DARWIN-X64: callq ___stack_chk_fail + %tmp = alloca %struct.small*, align 8 + %tmp1 = call i32 (...)* @dummy(%struct.small** %tmp) nounwind + %tmp2 = load %struct.small** %tmp, align 8 + %tmp3 = ptrtoint %struct.small* %tmp2 to i64 + %tmp4 = trunc i64 %tmp3 to i32 + %tmp5 = icmp sgt i32 %tmp4, 0 + br i1 %tmp5, label %bb6, label %bb21 + +bb6: ; preds = %bb17, %bb + %tmp7 = phi %struct.small* [ %tmp19, %bb17 ], [ %tmp2, %bb ] + %tmp8 = phi i64 [ %tmp20, %bb17 ], [ 1, %bb ] + %tmp9 = phi i32 [ %tmp14, %bb17 ], [ %tmp1, %bb ] + %tmp10 = getelementptr inbounds %struct.small* %tmp7, i64 0, i32 0 + %tmp11 = load i8* %tmp10, align 1 + %tmp12 = icmp eq i8 %tmp11, 1 + %tmp13 = add nsw i32 %tmp9, 8 + %tmp14 = select i1 %tmp12, i32 %tmp13, i32 %tmp9 + %tmp15 = trunc i64 %tmp8 to i32 + %tmp16 = icmp eq i32 %tmp15, %tmp4 + br i1 %tmp16, label %bb21, label %bb17 + +bb17: ; preds = %bb6 + %tmp18 = getelementptr inbounds %struct.small** %tmp, i64 %tmp8 + %tmp19 = load %struct.small** %tmp18, align 8 + %tmp20 = add i64 %tmp8, 1 + br label %bb6 + +bb21: ; preds = %bb6, %bb + %tmp22 = phi i32 [ %tmp1, %bb ], [ %tmp14, %bb6 ] + %tmp23 = call i32 (...)* @dummy(i32 %tmp22) nounwind + ret i32 undef +} -declare i32 @printf(i8*, ...) nounwind +declare double @testi_aux() +declare i8* @strcpy(i8*, i8*) +declare i32 @printf(i8*, ...) +declare void @funcall(i32*) +declare void @funcall2(i32**) +declare void @funfloat(float*) +declare void @funfloat2(float**) +declare void @_Z3exceptPi(i32*) +declare i32 @__gxx_personality_v0(...) +declare i32* @getp() +declare i32 @dummy(...) diff --git a/test/CodeGen/X86/stack-update-frame-opcode.ll b/test/CodeGen/X86/stack-update-frame-opcode.ll new file mode 100644 index 000000000000..9a5a2421233d --- /dev/null +++ b/test/CodeGen/X86/stack-update-frame-opcode.ll @@ -0,0 +1,31 @@ +; RUN: llc -mtriple=x86_64-pc-linux -mcpu=corei7 < %s | FileCheck -check-prefix=CORE_LP64 %s +; RUN: llc -mtriple=x86_64-pc-linux -mcpu=atom < %s | FileCheck -check-prefix=ATOM_LP64 %s +; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -mcpu=corei7 < %s | FileCheck -check-prefix=CORE_ILP32 %s +; RUN: llc -mtriple=x86_64-pc-linux-gnux32 -mcpu=atom < %s | FileCheck -check-prefix=ATOM_ILP32 %s + +define i32 @bar(i32 %a) nounwind { +entry: + %arr = alloca [400 x i32], align 16 + +; There is a 2x2 variation matrix here: +; Atoms use LEA to update the SP. Opcode bitness depends on data model. +; Cores use sub/add to update the SP. Opcode bitness depends on data model. + +; CORE_LP64: subq $1608 +; CORE_ILP32: subl $1608 +; ATOM_LP64: leaq -1608 +; ATOM_ILP32: leal -1608 + + %arraydecay = getelementptr inbounds [400 x i32]* %arr, i64 0, i64 0 + %call = call i32 @foo(i32 %a, i32* %arraydecay) nounwind + ret i32 %call + +; CORE_LP64: addq $1608 +; CORE_ILP32: addl $1608 +; ATOM_LP64: leaq 1608 +; ATOM_ILP32: leal 1608 + +} + +declare i32 @foo(i32, i32*) + diff --git a/test/CodeGen/X86/store_op_load_fold.ll b/test/CodeGen/X86/store_op_load_fold.ll index 6e47eb397d1d..070cccdb87dd 100644 --- a/test/CodeGen/X86/store_op_load_fold.ll +++ b/test/CodeGen/X86/store_op_load_fold.ll @@ -1,13 +1,30 @@ -; RUN: llc < %s -march=x86 | not grep mov +; RUN: llc < %s -mtriple=i686-darwin | FileCheck %s ; ; Test the add and load are folded into the store instruction. @X = internal global i16 0 ; <i16*> [#uses=2] define void @foo() nounwind { +; CHECK: foo: +; CHECK-NOT: mov +; CHECK: add +; CHECK-NEXT: ret %tmp.0 = load i16* @X ; <i16> [#uses=1] %tmp.3 = add i16 %tmp.0, 329 ; <i16> [#uses=1] store i16 %tmp.3, i16* @X ret void } +; rdar://12838504 +%struct.S2 = type { i64, i16, [2 x i8], i8, [3 x i8], [7 x i8], i8, [8 x i8] } +@s2 = external global %struct.S2, align 16 +define void @test2() nounwind uwtable ssp { +; CHECK: test2: +; CHECK: mov +; CHECK-NEXT: and +; CHECK-NEXT: ret + %bf.load35 = load i56* bitcast ([7 x i8]* getelementptr inbounds (%struct.S2* @s2, i32 0, i32 5) to i56*), align 16 + %bf.clear36 = and i56 %bf.load35, -1125895611875329 + store i56 %bf.clear36, i56* bitcast ([7 x i8]* getelementptr inbounds (%struct.S2* @s2, i32 0, i32 5) to i56*), align 16 + ret void +} diff --git a/test/CodeGen/X86/subtarget-feature-change.ll b/test/CodeGen/X86/subtarget-feature-change.ll new file mode 100644 index 000000000000..cd677294c669 --- /dev/null +++ b/test/CodeGen/X86/subtarget-feature-change.ll @@ -0,0 +1,66 @@ +; RUN: llc < %s -march=x86-64 | FileCheck %s + +; This should not generate SSE instructions: +; +; CHECK: without.sse: +; CHECK: flds +; CHECK: fmuls +; CHECK: fstps +define void @without.sse(float* nocapture %a, float* nocapture %b, float* nocapture %c, i32 %n) #0 { +entry: + %cmp9 = icmp sgt i32 %n, 0 + br i1 %cmp9, label %for.body, label %for.end + +for.body: + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %b, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %arrayidx2 = getelementptr inbounds float* %c, i64 %indvars.iv + %1 = load float* %arrayidx2, align 4, !tbaa !0 + %mul = fmul float %0, %1 + %arrayidx4 = getelementptr inbounds float* %a, i64 %indvars.iv + store float %mul, float* %arrayidx4, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: + ret void +} + +; This should generate SSE instructions: +; +; CHECK: with.sse +; CHECK: movss +; CHECK: mulss +; CHECK: movss +define void @with.sse(float* nocapture %a, float* nocapture %b, float* nocapture %c, i32 %n) #1 { +entry: + %cmp9 = icmp sgt i32 %n, 0 + br i1 %cmp9, label %for.body, label %for.end + +for.body: + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %b, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %arrayidx2 = getelementptr inbounds float* %c, i64 %indvars.iv + %1 = load float* %arrayidx2, align 4, !tbaa !0 + %mul = fmul float %0, %1 + %arrayidx4 = getelementptr inbounds float* %a, i64 %indvars.iv + store float %mul, float* %arrayidx4, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: + ret void +} + +attributes #0 = { nounwind optsize ssp uwtable "target-cpu"="core2" "target-features"="-sse4a,-avx2,-xop,-fma4,-bmi2,-3dnow,-3dnowa,-pclmul,-sse,-avx,-sse41,-ssse3,+mmx,-rtm,-sse42,-lzcnt,-f16c,-popcnt,-bmi,-aes,-fma,-rdrand,-sse2,-sse3" } +attributes #1 = { nounwind optsize ssp uwtable "target-cpu"="core2" "target-features"="-sse4a,-avx2,-xop,-fma4,-bmi2,-3dnow,-3dnowa,-pclmul,+sse,-avx,-sse41,+ssse3,+mmx,-rtm,-sse42,-lzcnt,-f16c,-popcnt,-bmi,-aes,-fma,-rdrand,+sse2,+sse3" } + +!0 = metadata !{metadata !"float", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/CodeGen/X86/tailcall-fastisel.ll b/test/CodeGen/X86/tailcall-fastisel.ll index 7f92af4dca9f..842ed25439f8 100644 --- a/test/CodeGen/X86/tailcall-fastisel.ll +++ b/test/CodeGen/X86/tailcall-fastisel.ll @@ -1,12 +1,11 @@ -; RUN: llc < %s -march=x86-64 -tailcallopt -fast-isel | not grep TAILCALL - -; Fast-isel shouldn't attempt to cope with tail calls. +; RUN: llc < %s -mtriple=x86_64-apple-darwin -tailcallopt -fast-isel -fast-isel-abort | FileCheck %s %0 = type { i64, i32, i8* } define fastcc i8* @"visit_array_aux<`Reference>"(%0 %arg, i32 %arg1) nounwind { fail: ; preds = %entry %tmp20 = tail call fastcc i8* @"visit_array_aux<`Reference>"(%0 %arg, i32 undef) ; <i8*> [#uses=1] +; CHECK: jmp "_visit_array_aux<`Reference>" ## TAILCALL ret i8* %tmp20 } diff --git a/test/CodeGen/X86/tailcall-structret.ll b/test/CodeGen/X86/tailcall-structret.ll index d8be4b2e2dfd..dcfefe86704e 100644 --- a/test/CodeGen/X86/tailcall-structret.ll +++ b/test/CodeGen/X86/tailcall-structret.ll @@ -1,6 +1,7 @@ -; RUN: llc < %s -march=x86 -tailcallopt | grep TAILCALL +; RUN: llc < %s -mtriple=i686-unknown-linux -tailcallopt | FileCheck %s define fastcc { { i8*, i8* }*, i8*} @init({ { i8*, i8* }*, i8*}, i32) { entry: %2 = tail call fastcc { { i8*, i8* }*, i8* } @init({ { i8*, i8*}*, i8*} %0, i32 %1) ret { { i8*, i8* }*, i8*} %2 +; CHECK: jmp init } diff --git a/test/CodeGen/X86/tailcallbyval.ll b/test/CodeGen/X86/tailcallbyval.ll index 118eee6ba6cd..9a0b57c138c2 100644 --- a/test/CodeGen/X86/tailcallbyval.ll +++ b/test/CodeGen/X86/tailcallbyval.ll @@ -1,5 +1,4 @@ -; RUN: llc < %s -march=x86 -tailcallopt | grep TAILCALL -; RUN: llc < %s -march=x86 -tailcallopt | grep "movl[[:space:]]*4(%esp), %eax" | count 1 +; RUN: llc < %s -mtriple=i686-unknown-linux -tailcallopt | FileCheck %s %struct.s = type {i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } @@ -9,10 +8,14 @@ entry: %tmp2 = getelementptr %struct.s* %a, i32 0, i32 0 %tmp3 = load i32* %tmp2 ret i32 %tmp3 +; CHECK: tailcallee +; CHECK: movl 4(%esp), %eax } define fastcc i32 @tailcaller(%struct.s* byval %a) nounwind { entry: %tmp4 = tail call fastcc i32 @tailcallee(%struct.s* byval %a ) ret i32 %tmp4 +; CHECK: tailcaller +; CHECK: jmp tailcallee } diff --git a/test/CodeGen/X86/tailcallfp.ll b/test/CodeGen/X86/tailcallfp.ll index c0b609ac956e..22a7930ba877 100644 --- a/test/CodeGen/X86/tailcallfp.ll +++ b/test/CodeGen/X86/tailcallfp.ll @@ -1,5 +1,6 @@ -; RUN: llc < %s -march=x86 -x86-asm-syntax=intel -tailcallopt | not grep call +; RUN: llc < %s -march=x86 -tailcallopt | FileCheck %s define fastcc i32 @bar(i32 %X, i32(double, i32) *%FP) { %Y = tail call fastcc i32 %FP(double 0.0, i32 %X) ret i32 %Y +; CHECK: jmpl } diff --git a/test/CodeGen/X86/tailcallpic1.ll b/test/CodeGen/X86/tailcallpic1.ll index 60e3be5c50fd..ff590a1fd3e9 100644 --- a/test/CodeGen/X86/tailcallpic1.ll +++ b/test/CodeGen/X86/tailcallpic1.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -tailcallopt -mtriple=i686-pc-linux-gnu -relocation-model=pic | grep TAILCALL +; RUN: llc < %s -tailcallopt -mtriple=i686-pc-linux-gnu -relocation-model=pic | FileCheck %s define protected fastcc i32 @tailcallee(i32 %a1, i32 %a2, i32 %a3, i32 %a4) { entry: @@ -9,4 +9,5 @@ define fastcc i32 @tailcaller(i32 %in1, i32 %in2) { entry: %tmp11 = tail call fastcc i32 @tailcallee( i32 %in1, i32 %in2, i32 %in1, i32 %in2 ) ; <i32> [#uses=1] ret i32 %tmp11 +; CHECK: jmp tailcallee } diff --git a/test/CodeGen/X86/tailcallpic2.ll b/test/CodeGen/X86/tailcallpic2.ll index eaa76312396c..1b6bdb769861 100644 --- a/test/CodeGen/X86/tailcallpic2.ll +++ b/test/CodeGen/X86/tailcallpic2.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -tailcallopt -mtriple=i686-pc-linux-gnu -relocation-model=pic | grep -v TAILCALL +; RUN: llc < %s -tailcallopt -mtriple=i686-pc-linux-gnu -relocation-model=pic | FileCheck %s define fastcc i32 @tailcallee(i32 %a1, i32 %a2, i32 %a3, i32 %a4) { entry: @@ -9,4 +9,7 @@ define fastcc i32 @tailcaller(i32 %in1, i32 %in2) { entry: %tmp11 = tail call fastcc i32 @tailcallee( i32 %in1, i32 %in2, i32 %in1, i32 %in2 ) ; <i32> [#uses=1] ret i32 %tmp11 +; CHECK: movl tailcallee@GOT +; CHECK: jmpl } + diff --git a/test/CodeGen/X86/thiscall-struct-return.ll b/test/CodeGen/X86/thiscall-struct-return.ll deleted file mode 100644 index 0507cb890cd2..000000000000 --- a/test/CodeGen/X86/thiscall-struct-return.ll +++ /dev/null @@ -1,47 +0,0 @@ -; RUN: llc < %s -mtriple=i386-PC-Win32 | FileCheck %s - -%class.C = type { i8 } -%struct.S = type { i32 } -%struct.M = type { i32, i32 } - -declare void @_ZN1CC1Ev(%class.C* %this) unnamed_addr nounwind align 2 -declare x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* noalias sret %agg.result, %class.C* %this) nounwind align 2 -declare x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* noalias sret %agg.result, %class.C* %this) nounwind align 2 - -define void @testv() nounwind { -; CHECK: testv: -; CHECK: leal 16(%esp), %esi -; CHECK-NEXT: movl %esi, (%esp) -; CHECK-NEXT: calll _ZN1CC1Ev -; CHECK: leal 8(%esp), %eax -; CHECK-NEXT: movl %esi, %ecx -; CHECK-NEXT: calll _ZNK1C5SmallEv -entry: - %c = alloca %class.C, align 1 - %tmp = alloca %struct.S, align 4 - call void @_ZN1CC1Ev(%class.C* %c) - ; This call should put the return structure as a pointer - ; into EAX instead of returning directly in EAX. The this - ; pointer should go into ECX - call x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* sret %tmp, %class.C* %c) - ret void -} - -define void @test2v() nounwind { -; CHECK: test2v: -; CHECK: leal 16(%esp), %esi -; CHECK-NEXT: movl %esi, (%esp) -; CHECK-NEXT: calll _ZN1CC1Ev -; CHECK: leal 8(%esp), %eax -; CHECK-NEXT: movl %esi, %ecx -; CHECK-NEXT: calll _ZNK1C6MediumEv -entry: - %c = alloca %class.C, align 1 - %tmp = alloca %struct.M, align 4 - call void @_ZN1CC1Ev(%class.C* %c) - ; This call should put the return structure as a pointer - ; into EAX instead of returning directly in EAX/EDX. The this - ; pointer should go into ECX - call x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* sret %tmp, %class.C* %c) - ret void -} diff --git a/test/CodeGen/X86/tls.ll b/test/CodeGen/X86/tls.ll index e8a79bfa6ee3..8cdecd81bff5 100644 --- a/test/CodeGen/X86/tls.ll +++ b/test/CodeGen/X86/tls.ll @@ -22,13 +22,13 @@ define i32 @f1() { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: movl _i1@SECREL(%eax), %eax +; X32_WIN-NEXT: movl _i1@SECREL32(%eax), %eax ; X32_WIN-NEXT: ret ; X64_WIN: f1: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: movl i1@SECREL(%rax), %eax +; X64_WIN-NEXT: movl i1@SECREL32(%rax), %eax ; X64_WIN-NEXT: ret entry: @@ -49,13 +49,13 @@ define i32* @f2() { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: leal _i1@SECREL(%eax), %eax +; X32_WIN-NEXT: leal _i1@SECREL32(%eax), %eax ; X32_WIN-NEXT: ret ; X64_WIN: f2: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: leaq i1@SECREL(%rax), %rax +; X64_WIN-NEXT: leaq i1@SECREL32(%rax), %rax ; X64_WIN-NEXT: ret entry: @@ -75,13 +75,13 @@ define i32 @f3() nounwind { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: movl _i2@SECREL(%eax), %eax +; X32_WIN-NEXT: movl _i2@SECREL32(%eax), %eax ; X32_WIN-NEXT: ret ; X64_WIN: f3: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: movl i2@SECREL(%rax), %eax +; X64_WIN-NEXT: movl i2@SECREL32(%rax), %eax ; X64_WIN-NEXT: ret entry: @@ -102,13 +102,13 @@ define i32* @f4() { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: leal _i2@SECREL(%eax), %eax +; X32_WIN-NEXT: leal _i2@SECREL32(%eax), %eax ; X32_WIN-NEXT: ret ; X64_WIN: f4: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: leaq i2@SECREL(%rax), %rax +; X64_WIN-NEXT: leaq i2@SECREL32(%rax), %rax ; X64_WIN-NEXT: ret entry: @@ -126,13 +126,13 @@ define i32 @f5() nounwind { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: movl _i3@SECREL(%eax), %eax +; X32_WIN-NEXT: movl _i3@SECREL32(%eax), %eax ; X32_WIN-NEXT: ret ; X64_WIN: f5: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: movl i3@SECREL(%rax), %eax +; X64_WIN-NEXT: movl i3@SECREL32(%rax), %eax ; X64_WIN-NEXT: ret entry: @@ -153,13 +153,13 @@ define i32* @f6() { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: leal _i3@SECREL(%eax), %eax +; X32_WIN-NEXT: leal _i3@SECREL32(%eax), %eax ; X32_WIN-NEXT: ret ; X64_WIN: f6: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: leaq i3@SECREL(%rax), %rax +; X64_WIN-NEXT: leaq i3@SECREL32(%rax), %rax ; X64_WIN-NEXT: ret entry: @@ -234,14 +234,14 @@ define i16 @f11() { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: movzwl _s1@SECREL(%eax), %eax +; X32_WIN-NEXT: movzwl _s1@SECREL32(%eax), %eax ; X32_WIN-NEXT: # kill ; X32_WIN-NEXT: ret ; X64_WIN: f11: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: movzwl s1@SECREL(%rax), %eax +; X64_WIN-NEXT: movzwl s1@SECREL32(%rax), %eax ; X64_WIN-NEXT: # kill ; X64_WIN-NEXT: ret @@ -261,13 +261,13 @@ define i32 @f12() { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: movswl _s1@SECREL(%eax), %eax +; X32_WIN-NEXT: movswl _s1@SECREL32(%eax), %eax ; X32_WIN-NEXT: ret ; X64_WIN: f12: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: movswl s1@SECREL(%rax), %eax +; X64_WIN-NEXT: movswl s1@SECREL32(%rax), %eax ; X64_WIN-NEXT: ret entry: @@ -287,13 +287,13 @@ define i8 @f13() { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: movb _b1@SECREL(%eax), %al +; X32_WIN-NEXT: movb _b1@SECREL32(%eax), %al ; X32_WIN-NEXT: ret ; X64_WIN: f13: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: movb b1@SECREL(%rax), %al +; X64_WIN-NEXT: movb b1@SECREL32(%rax), %al ; X64_WIN-NEXT: ret entry: @@ -312,13 +312,13 @@ define i32 @f14() { ; X32_WIN: movl __tls_index, %eax ; X32_WIN-NEXT: movl %fs:__tls_array, %ecx ; X32_WIN-NEXT: movl (%ecx,%eax,4), %eax -; X32_WIN-NEXT: movsbl _b1@SECREL(%eax), %eax +; X32_WIN-NEXT: movsbl _b1@SECREL32(%eax), %eax ; X32_WIN-NEXT: ret ; X64_WIN: f14: ; X64_WIN: movl _tls_index(%rip), %eax ; X64_WIN-NEXT: movq %gs:88, %rcx ; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax -; X64_WIN-NEXT: movsbl b1@SECREL(%rax), %eax +; X64_WIN-NEXT: movsbl b1@SECREL32(%rax), %eax ; X64_WIN-NEXT: ret entry: diff --git a/test/CodeGen/X86/twoaddr-coalesce-2.ll b/test/CodeGen/X86/twoaddr-coalesce-2.ll index af6d47af7a0f..cbcde0655597 100644 --- a/test/CodeGen/X86/twoaddr-coalesce-2.ll +++ b/test/CodeGen/X86/twoaddr-coalesce-2.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -mattr=+sse2 -mcpu=penryn -stats 2>&1 | \ ; RUN: grep "twoaddrinstr" | grep "Number of instructions aggressively commuted" ; rdar://6480363 diff --git a/test/CodeGen/X86/twoaddr-pass-sink.ll b/test/CodeGen/X86/twoaddr-pass-sink.ll index 513c304e3bf8..9ca280627afe 100644 --- a/test/CodeGen/X86/twoaddr-pass-sink.ll +++ b/test/CodeGen/X86/twoaddr-pass-sink.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -mattr=+sse2 -stats 2>&1 | grep "Number of 3-address instructions sunk" define void @t2(<2 x i64>* %vDct, <2 x i64>* %vYp, i8* %skiplist, <2 x i64> %a1) nounwind { diff --git a/test/CodeGen/X86/unknown-location.ll b/test/CodeGen/X86/unknown-location.ll index b89c4738af12..e02e3b54752b 100644 --- a/test/CodeGen/X86/unknown-location.ll +++ b/test/CodeGen/X86/unknown-location.ll @@ -18,12 +18,16 @@ entry: ret i32 %c, !dbg !8 } -!0 = metadata !{i32 524545, metadata !1, metadata !"x", metadata !2, i32 1, metadata !6} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 1, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"test.c", metadata !"/dir", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 12, metadata !"test.c", metadata !".", metadata !"producer", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!llvm.dbg.cu = !{!3} + +!0 = metadata !{i32 786689, metadata !1, metadata !"x", metadata !2, i32 1, metadata !6} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 1, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32, i32, i32, i32)* @foo, null, null, null, i32 1} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !10} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, metadata !10, i32 12, metadata !"producer", i1 false, metadata !"", i32 0, null, null, metadata !9, null, metadata !""} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6} -!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 524299, metadata !1, i32 1, i32 30} ; [ DW_TAG_lexical_block ] +!6 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786443, metadata !1, i32 1, i32 30} ; [ DW_TAG_lexical_block ] !8 = metadata !{i32 4, i32 3, metadata !7, null} +!9 = metadata !{metadata !1} +!10 = metadata !{metadata !"test.c", metadata !"/dir"} diff --git a/test/CodeGen/X86/v8i1-masks.ll b/test/CodeGen/X86/v8i1-masks.ll new file mode 100644 index 000000000000..8cbfb5d7243a --- /dev/null +++ b/test/CodeGen/X86/v8i1-masks.ll @@ -0,0 +1,39 @@ +; RUN: llc -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -o - < %s | FileCheck %s + +;CHECK: and_masks +;CHECK: vmovaps +;CHECK: vcmpltp +;CHECK: vcmpltp +;CHECK: vandps +;CHECK: vandps +;CHECK: vmovaps +;CHECK: ret + +define void @and_masks(<8 x float>* %a, <8 x float>* %b, <8 x float>* %c) nounwind uwtable noinline ssp { + %v0 = load <8 x float>* %a, align 16 + %v1 = load <8 x float>* %b, align 16 + %m0 = fcmp olt <8 x float> %v1, %v0 + %v2 = load <8 x float>* %c, align 16 + %m1 = fcmp olt <8 x float> %v2, %v0 + %mand = and <8 x i1> %m1, %m0 + %r = zext <8 x i1> %mand to <8 x i32> + store <8 x i32> %r, <8 x i32>* undef, align 32 + ret void +} + +;CHECK: neg_mask +;CHECK: vcmpltps +;CHECK: vxorps +;CHECK: vandps +;CHECK: vmovaps +;CHECK: ret +define void @neg_masks(<8 x float>* %a, <8 x float>* %b, <8 x float>* %c) nounwind uwtable noinline ssp { + %v0 = load <8 x float>* %a, align 16 + %v1 = load <8 x float>* %b, align 16 + %m0 = fcmp olt <8 x float> %v1, %v0 + %mand = xor <8 x i1> %m0, <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1> + %r = zext <8 x i1> %mand to <8 x i32> + store <8 x i32> %r, <8 x i32>* undef, align 32 + ret void +} + diff --git a/test/CodeGen/X86/vec_align_i256.ll b/test/CodeGen/X86/vec_align_i256.ll new file mode 100644 index 000000000000..078bcb1544d3 --- /dev/null +++ b/test/CodeGen/X86/vec_align_i256.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -mcpu=corei7-avx | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "i686-apple-darwin8" + +; Make sure that we are not generating a movaps because the vector is aligned to 1. +;CHECK: @foo +;CHECK: xor +;CHECK-NEXT: vmovups +;CHECK-NEXT: ret +define void @foo() { + store <16 x i16> zeroinitializer, <16 x i16>* undef, align 1 + ret void +} diff --git a/test/CodeGen/X86/vec_compare.ll b/test/CodeGen/X86/vec_compare.ll index 367dd27f3076..b6d91a3f770e 100644 --- a/test/CodeGen/X86/vec_compare.ll +++ b/test/CodeGen/X86/vec_compare.ll @@ -41,3 +41,27 @@ define <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind { %D = sext <4 x i1> %C to <4 x i32> ret <4 x i32> %D } + +define <2 x i64> @test5(<2 x i64> %A, <2 x i64> %B) nounwind { +; CHECK: test5: +; CHECK: pcmpeqd +; CHECK: pshufd $-79 +; CHECK: pand +; CHECK: ret + %C = icmp eq <2 x i64> %A, %B + %D = sext <2 x i1> %C to <2 x i64> + ret <2 x i64> %D +} + +define <2 x i64> @test6(<2 x i64> %A, <2 x i64> %B) nounwind { +; CHECK: test6: +; CHECK: pcmpeqd +; CHECK: pshufd $-79 +; CHECK: pand +; CHECK: pcmpeqd +; CHECK: pxor +; CHECK: ret + %C = icmp ne <2 x i64> %A, %B + %D = sext <2 x i1> %C to <2 x i64> + ret <2 x i64> %D +} diff --git a/test/CodeGen/X86/vec_floor.ll b/test/CodeGen/X86/vec_floor.ll index 5e0160bd2856..4db68bd18223 100644 --- a/test/CodeGen/X86/vec_floor.ll +++ b/test/CodeGen/X86/vec_floor.ll @@ -36,3 +36,147 @@ define <8 x float> @floor_v8f32(<8 x float> %p) ret <8 x float> %t } declare <8 x float> @llvm.floor.v8f32(<8 x float> %p) + +define <2 x double> @ceil_v2f64(<2 x double> %p) +{ + ; CHECK: ceil_v2f64 + ; CHECK: vroundpd + %t = call <2 x double> @llvm.ceil.v2f64(<2 x double> %p) + ret <2 x double> %t +} +declare <2 x double> @llvm.ceil.v2f64(<2 x double> %p) + +define <4 x float> @ceil_v4f32(<4 x float> %p) +{ + ; CHECK: ceil_v4f32 + ; CHECK: vroundps + %t = call <4 x float> @llvm.ceil.v4f32(<4 x float> %p) + ret <4 x float> %t +} +declare <4 x float> @llvm.ceil.v4f32(<4 x float> %p) + +define <4 x double> @ceil_v4f64(<4 x double> %p) +{ + ; CHECK: ceil_v4f64 + ; CHECK: vroundpd + %t = call <4 x double> @llvm.ceil.v4f64(<4 x double> %p) + ret <4 x double> %t +} +declare <4 x double> @llvm.ceil.v4f64(<4 x double> %p) + +define <8 x float> @ceil_v8f32(<8 x float> %p) +{ + ; CHECK: ceil_v8f32 + ; CHECK: vroundps + %t = call <8 x float> @llvm.ceil.v8f32(<8 x float> %p) + ret <8 x float> %t +} +declare <8 x float> @llvm.ceil.v8f32(<8 x float> %p) + +define <2 x double> @trunc_v2f64(<2 x double> %p) +{ + ; CHECK: trunc_v2f64 + ; CHECK: vroundpd + %t = call <2 x double> @llvm.trunc.v2f64(<2 x double> %p) + ret <2 x double> %t +} +declare <2 x double> @llvm.trunc.v2f64(<2 x double> %p) + +define <4 x float> @trunc_v4f32(<4 x float> %p) +{ + ; CHECK: trunc_v4f32 + ; CHECK: vroundps + %t = call <4 x float> @llvm.trunc.v4f32(<4 x float> %p) + ret <4 x float> %t +} +declare <4 x float> @llvm.trunc.v4f32(<4 x float> %p) + +define <4 x double> @trunc_v4f64(<4 x double> %p) +{ + ; CHECK: trunc_v4f64 + ; CHECK: vroundpd + %t = call <4 x double> @llvm.trunc.v4f64(<4 x double> %p) + ret <4 x double> %t +} +declare <4 x double> @llvm.trunc.v4f64(<4 x double> %p) + +define <8 x float> @trunc_v8f32(<8 x float> %p) +{ + ; CHECK: trunc_v8f32 + ; CHECK: vroundps + %t = call <8 x float> @llvm.trunc.v8f32(<8 x float> %p) + ret <8 x float> %t +} +declare <8 x float> @llvm.trunc.v8f32(<8 x float> %p) + +define <2 x double> @rint_v2f64(<2 x double> %p) +{ + ; CHECK: rint_v2f64 + ; CHECK: vroundpd + %t = call <2 x double> @llvm.rint.v2f64(<2 x double> %p) + ret <2 x double> %t +} +declare <2 x double> @llvm.rint.v2f64(<2 x double> %p) + +define <4 x float> @rint_v4f32(<4 x float> %p) +{ + ; CHECK: rint_v4f32 + ; CHECK: vroundps + %t = call <4 x float> @llvm.rint.v4f32(<4 x float> %p) + ret <4 x float> %t +} +declare <4 x float> @llvm.rint.v4f32(<4 x float> %p) + +define <4 x double> @rint_v4f64(<4 x double> %p) +{ + ; CHECK: rint_v4f64 + ; CHECK: vroundpd + %t = call <4 x double> @llvm.rint.v4f64(<4 x double> %p) + ret <4 x double> %t +} +declare <4 x double> @llvm.rint.v4f64(<4 x double> %p) + +define <8 x float> @rint_v8f32(<8 x float> %p) +{ + ; CHECK: rint_v8f32 + ; CHECK: vroundps + %t = call <8 x float> @llvm.rint.v8f32(<8 x float> %p) + ret <8 x float> %t +} +declare <8 x float> @llvm.rint.v8f32(<8 x float> %p) + +define <2 x double> @nearbyint_v2f64(<2 x double> %p) +{ + ; CHECK: nearbyint_v2f64 + ; CHECK: vroundpd + %t = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %p) + ret <2 x double> %t +} +declare <2 x double> @llvm.nearbyint.v2f64(<2 x double> %p) + +define <4 x float> @nearbyint_v4f32(<4 x float> %p) +{ + ; CHECK: nearbyint_v4f32 + ; CHECK: vroundps + %t = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %p) + ret <4 x float> %t +} +declare <4 x float> @llvm.nearbyint.v4f32(<4 x float> %p) + +define <4 x double> @nearbyint_v4f64(<4 x double> %p) +{ + ; CHECK: nearbyint_v4f64 + ; CHECK: vroundpd + %t = call <4 x double> @llvm.nearbyint.v4f64(<4 x double> %p) + ret <4 x double> %t +} +declare <4 x double> @llvm.nearbyint.v4f64(<4 x double> %p) + +define <8 x float> @nearbyint_v8f32(<8 x float> %p) +{ + ; CHECK: nearbyint_v8f32 + ; CHECK: vroundps + %t = call <8 x float> @llvm.nearbyint.v8f32(<8 x float> %p) + ret <8 x float> %t +} +declare <8 x float> @llvm.nearbyint.v8f32(<8 x float> %p) diff --git a/test/CodeGen/X86/vec_fpext.ll b/test/CodeGen/X86/vec_fpext.ll index dc0464ff9e0f..863712ff48b3 100644 --- a/test/CodeGen/X86/vec_fpext.ll +++ b/test/CodeGen/X86/vec_fpext.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -march=x86 -mattr=+sse41,-avx | FileCheck %s -; RUN: llc < %s -march=x86 -mattr=+avx | FileCheck --check-prefix=AVX %s +; RUN: llc < %s -march=x86 -mcpu=corei7-avx | FileCheck --check-prefix=AVX %s ; PR11674 define void @fpext_frommem(<2 x float>* %in, <2 x double>* %out) { @@ -29,8 +29,8 @@ entry: ; CHECK: cvtps2pd 8(%{{.+}}), %xmm{{[0-9]+}} ; CHECK: cvtps2pd 16(%{{.+}}), %xmm{{[0-9]+}} ; CHECK: cvtps2pd 24(%{{.+}}), %xmm{{[0-9]+}} -; AVX: vcvtps2pd (%{{.+}}), %ymm{{[0-9]+}} ; AVX: vcvtps2pd 16(%{{.+}}), %ymm{{[0-9]+}} +; AVX: vcvtps2pd (%{{.+}}), %ymm{{[0-9]+}} %0 = load <8 x float>* %in %1 = fpext <8 x float> %0 to <8 x double> store <8 x double> %1, <8 x double>* %out, align 1 diff --git a/test/CodeGen/X86/vec_insert-6.ll b/test/CodeGen/X86/vec_insert-6.ll index 2a4864a48a25..4583e1925e59 100644 --- a/test/CodeGen/X86/vec_insert-6.ll +++ b/test/CodeGen/X86/vec_insert-6.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86 -mattr=+sse2 -mcpu=penryn | grep pslldq ; RUN: llc < %s -march=x86 -mattr=+sse2 -mcpu=penryn -mtriple=i686-apple-darwin9 -o /dev/null -stats -info-output-file - | grep asm-printer | grep 6 diff --git a/test/CodeGen/X86/vec_sdiv_to_shift.ll b/test/CodeGen/X86/vec_sdiv_to_shift.ll new file mode 100644 index 000000000000..349868a87f53 --- /dev/null +++ b/test/CodeGen/X86/vec_sdiv_to_shift.ll @@ -0,0 +1,72 @@ +; RUN: llc < %s -march=x86-64 -mcpu=penryn -mattr=+avx2 | FileCheck %s + + +define <8 x i16> @sdiv_vec8x16(<8 x i16> %var) { +entry: +; CHECK: sdiv_vec8x16 +; CHECK: psraw $15 +; CHECK: vpsrlw $11 +; CHECK: vpaddw +; CHECK: vpsraw $5 +; CHECK: ret + %0 = sdiv <8 x i16> %var, <i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32> + ret <8 x i16> %0 +} + +define <4 x i32> @sdiv_zero(<4 x i32> %var) { +entry: +; CHECK: sdiv_zero +; CHECK-NOT: sra +; CHECK: ret + %0 = sdiv <4 x i32> %var, <i32 0, i32 0, i32 0, i32 0> + ret <4 x i32> %0 +} + +define <4 x i32> @sdiv_vec4x32(<4 x i32> %var) { +entry: +; CHECK: sdiv_vec4x32 +; CHECK: vpsrad $31 +; CHECK: vpsrld $28 +; CHECK: vpaddd +; CHECK: vpsrad $4 +; CHECK: ret +%0 = sdiv <4 x i32> %var, <i32 16, i32 16, i32 16, i32 16> +ret <4 x i32> %0 +} + +define <4 x i32> @sdiv_negative(<4 x i32> %var) { +entry: +; CHECK: sdiv_negative +; CHECK: vpsrad $31 +; CHECK: vpsrld $28 +; CHECK: vpaddd +; CHECK: vpsrad $4 +; CHECK: vpsubd +; CHECK: ret +%0 = sdiv <4 x i32> %var, <i32 -16, i32 -16, i32 -16, i32 -16> +ret <4 x i32> %0 +} + +define <8 x i32> @sdiv8x32(<8 x i32> %var) { +entry: +; CHECK: sdiv8x32 +; CHECK: vpsrad $31 +; CHECK: vpsrld $26 +; CHECK: vpaddd +; CHECK: vpsrad $6 +; CHECK: ret +%0 = sdiv <8 x i32> %var, <i32 64, i32 64, i32 64, i32 64, i32 64, i32 64, i32 64, i32 64> +ret <8 x i32> %0 +} + +define <16 x i16> @sdiv16x16(<16 x i16> %var) { +entry: +; CHECK: sdiv16x16 +; CHECK: vpsraw $15 +; CHECK: vpsrlw $14 +; CHECK: vpaddw +; CHECK: vpsraw $2 +; CHECK: ret + %a0 = sdiv <16 x i16> %var, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4> + ret <16 x i16> %a0 +} diff --git a/test/CodeGen/X86/vec_shuffle-19.ll b/test/CodeGen/X86/vec_shuffle-19.ll index b26f920e5e23..48db8de0d936 100644 --- a/test/CodeGen/X86/vec_shuffle-19.ll +++ b/test/CodeGen/X86/vec_shuffle-19.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -o /dev/null -march=x86 -mcpu=penryn -mattr=+sse2 -mtriple=i686-apple-darwin9 -stats -info-output-file - | grep asm-printer | grep 4 ; PR2485 diff --git a/test/CodeGen/X86/vec_shuffle-20.ll b/test/CodeGen/X86/vec_shuffle-20.ll index 976cd1835b40..5a2c4449456b 100644 --- a/test/CodeGen/X86/vec_shuffle-20.ll +++ b/test/CodeGen/X86/vec_shuffle-20.ll @@ -1,4 +1,5 @@ -; RUN: llc < %s -o /dev/null -march=x86 -mcpu=corei7 -mtriple=i686-apple-darwin9 -stats -info-output-file - | grep asm-printer | grep 3 +; REQUIRES: asserts +; RUN: llc < %s -o /dev/null -march=x86 -mcpu=corei7 -mtriple=i686-apple-darwin9 -stats -info-output-file - | grep asm-printer | grep 2 define <4 x float> @func(<4 x float> %fp0, <4 x float> %fp1) nounwind { entry: diff --git a/test/CodeGen/X86/vec_splat-2.ll b/test/CodeGen/X86/vec_splat-2.ll index f105de4d977d..5c668b7e5a5b 100644 --- a/test/CodeGen/X86/vec_splat-2.ll +++ b/test/CodeGen/X86/vec_splat-2.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=x86 -mcpu=penryn -mattr=+sse2 | grep pshufd | count 1 +; RUN: llc < %s -march=x86 -mcpu=pentium4 -mattr=+sse2 | FileCheck %s define void @test(<2 x i64>* %P, i8 %x) nounwind { %tmp = insertelement <16 x i8> zeroinitializer, i8 %x, i32 0 ; <<16 x i8>> [#uses=1] @@ -23,4 +23,11 @@ define void @test(<2 x i64>* %P, i8 %x) nounwind { %tmp73.upgrd.1 = bitcast <16 x i8> %tmp73 to <2 x i64> ; <<2 x i64>> [#uses=1] store <2 x i64> %tmp73.upgrd.1, <2 x i64>* %P ret void + +; CHECK: test: +; CHECK-NOT: pshufd +; CHECK: punpcklbw +; CHECK: punpcklbw +; CHECK: pshufd $0 +; CHECK-NOT: pshufd } diff --git a/test/CodeGen/X86/vec_splat-3.ll b/test/CodeGen/X86/vec_splat-3.ll index feacc42406df..cf0ecf40554d 100644 --- a/test/CodeGen/X86/vec_splat-3.ll +++ b/test/CodeGen/X86/vec_splat-3.ll @@ -1,55 +1,230 @@ -; RUN: llc < %s -march=x86 -mcpu=penryn -mattr=sse41 -o %t -; RUN: grep punpcklwd %t | count 4 -; RUN: grep punpckhwd %t | count 4 -; RUN: grep "pshufd" %t | count 8 +; RUN: llc <%s -march=x86 -mcpu=penryn -mattr=sse41 | FileCheck %s ; Splat test for v8i16 -; Should generate with pshufd with masks $0, $85, $170, $255 (each mask is used twice) define <8 x i16> @shuf_8i16_0(<8 x i16> %T0, <8 x i16> %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> < i32 0, i32 undef, i32 undef, i32 0, i32 undef, i32 undef, i32 undef , i32 undef > + %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> <i32 0, i32 undef, i32 undef, i32 0, i32 undef, i32 undef, i32 undef, i32 undef> ret <8 x i16> %tmp6 + +; CHECK: shuf_8i16_0: +; CHECK: pshuflw $0 } define <8 x i16> @shuf_8i16_1(<8 x i16> %T0, <8 x i16> %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> < i32 1, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef , i32 undef > + %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> <i32 1, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> ret <8 x i16> %tmp6 + +; CHECK: shuf_8i16_1: +; CHECK: pshuflw $5 } define <8 x i16> @shuf_8i16_2(<8 x i16> %T0, <8 x i16> %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> < i32 2, i32 undef, i32 undef, i32 2, i32 undef, i32 2, i32 undef , i32 undef > + %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> <i32 2, i32 undef, i32 undef, i32 2, i32 undef, i32 2, i32 undef, i32 undef> ret <8 x i16> %tmp6 + +; CHECK: shuf_8i16_2: +; CHECK: punpcklwd +; CHECK-NEXT: pshufd $-86 } define <8 x i16> @shuf_8i16_3(<8 x i16> %T0, <8 x i16> %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> < i32 3, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef , i32 undef > + %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> <i32 3, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> ret <8 x i16> %tmp6 + +; CHECK: shuf_8i16_3: +; CHECK: pshuflw $15 } define <8 x i16> @shuf_8i16_4(<8 x i16> %T0, <8 x i16> %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> < i32 4, i32 undef, i32 undef, i32 undef, i32 4, i32 undef, i32 undef , i32 undef > + %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> <i32 4, i32 undef, i32 undef, i32 undef, i32 4, i32 undef, i32 undef, i32 undef> ret <8 x i16> %tmp6 + +; CHECK: shuf_8i16_4: +; CHECK: movhlps } define <8 x i16> @shuf_8i16_5(<8 x i16> %T0, <8 x i16> %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> < i32 5, i32 undef, i32 undef, i32 5, i32 undef, i32 undef, i32 undef , i32 undef > + %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> <i32 5, i32 undef, i32 undef, i32 5, i32 undef, i32 undef, i32 undef, i32 undef> ret <8 x i16> %tmp6 + +; CHECK: shuf_8i16_5: +; CHECK: punpckhwd +; CHECK-NEXT: pshufd $85 } define <8 x i16> @shuf_8i16_6(<8 x i16> %T0, <8 x i16> %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> < i32 6, i32 6, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef , i32 undef > + %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> <i32 6, i32 6, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> ret <8 x i16> %tmp6 -} +; CHECK: shuf_8i16_6: +; CHECK: punpckhwd +; CHECK-NEXT: pshufd $-86 +} define <8 x i16> @shuf_8i16_7(<8 x i16> %T0, <8 x i16> %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> < i32 7, i32 undef, i32 undef, i32 7, i32 undef, i32 undef, i32 undef , i32 undef > + %tmp6 = shufflevector <8 x i16> %T0, <8 x i16> %T1, <8 x i32> <i32 7, i32 undef, i32 undef, i32 7, i32 undef, i32 undef, i32 undef, i32 undef> ret <8 x i16> %tmp6 + +; CHECK: shuf_8i16_7: +; CHECK: punpckhwd +; CHECK-NEXT: pshufd $-1 +} + +; Splat test for v16i8 +define <16 x i8> @shuf_16i8_8(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 0, i32 undef, i32 undef, i32 0, i32 undef, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_8: +; CHECK: punpcklbw +; CHECK-NEXT: punpcklbw +; CHECK-NEXT: pshufd $0 +} + +define <16 x i8> @shuf_16i8_9(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 1, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef > + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_9: +; CHECK: punpcklbw +; CHECK-NEXT: punpcklbw +; CHECK-NEXT: pshufd $85 +} + +define <16 x i8> @shuf_16i8_10(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 2, i32 undef, i32 undef, i32 2, i32 undef, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_10: +; CHECK: punpcklbw +; CHECK-NEXT: punpcklbw +; CHECK-NEXT: pshufd $-86 +} + +define <16 x i8> @shuf_16i8_11(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 3, i32 undef, i32 undef, i32 3, i32 undef, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_11: +; CHECK: punpcklbw +; CHECK-NEXT: punpcklbw +; CHECK-NEXT: pshufd $-1 +} + + +define <16 x i8> @shuf_16i8_12(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 4, i32 undef, i32 undef, i32 undef, i32 4, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef > + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_12: +; CHECK: pshufd $5 +} + +define <16 x i8> @shuf_16i8_13(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 5, i32 undef, i32 undef, i32 5, i32 undef, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_13: +; CHECK: punpcklbw +; CHECK-NEXT: punpckhbw +; CHECK-NEXT: pshufd $85 +} + +define <16 x i8> @shuf_16i8_14(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 6, i32 undef, i32 undef, i32 6, i32 undef, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_14: +; CHECK: punpcklbw +; CHECK-NEXT: punpckhbw +; CHECK-NEXT: pshufd $-86 +} + +define <16 x i8> @shuf_16i8_15(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 7, i32 undef, i32 undef, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef > + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_15: +; CHECK: punpcklbw +; CHECK-NEXT: punpckhbw +; CHECK-NEXT: pshufd $-1 +} + +define <16 x i8> @shuf_16i8_16(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 8, i32 undef, i32 undef, i32 8, i32 undef, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_16: +; CHECK: punpckhbw +; CHECK-NEXT: punpcklbw +; CHECK-NEXT: pshufd $0 +} + +define <16 x i8> @shuf_16i8_17(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 9, i32 undef, i32 undef, i32 9, i32 undef, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_17: +; CHECK: punpckhbw +; CHECK-NEXT: punpcklbw +; CHECK-NEXT: pshufd $85 +} + +define <16 x i8> @shuf_16i8_18(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 10, i32 undef, i32 undef, i32 10, i32 undef, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_18: +; CHECK: punpckhbw +; CHECK-NEXT: punpcklbw +; CHECK-NEXT: pshufd $-86 +} + +define <16 x i8> @shuf_16i8_19(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 11, i32 undef, i32 undef, i32 11, i32 undef, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_19: +; CHECK: punpckhbw +; CHECK-NEXT: punpcklbw +; CHECK-NEXT: pshufd $-1 +} + +define <16 x i8> @shuf_16i8_20(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 12, i32 undef, i32 undef, i32 12, i32 undef, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_20: +; CHECK: punpckhbw +; CHECK-NEXT: punpckhbw +; CHECK-NEXT: pshufd $0 +} + +define <16 x i8> @shuf_16i8_21(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 13, i32 undef, i32 undef, i32 13, i32 undef, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_21: +; CHECK: punpckhbw +; CHECK-NEXT: punpckhbw +; CHECK-NEXT: pshufd $85 +} + +define <16 x i8> @shuf_16i8_22(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 14, i32 undef, i32 undef, i32 14, i32 undef, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_22: +; CHECK: punpckhbw +; CHECK-NEXT: punpckhbw +; CHECK-NEXT: pshufd $-86 +} + +define <16 x i8> @shuf_16i8_23(<16 x i8> %T0, <16 x i8> %T1) nounwind readnone { + %tmp6 = shufflevector <16 x i8> %T0, <16 x i8> %T1, <16 x i32> <i32 15, i32 undef, i32 undef, i32 15, i32 undef, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15> + ret <16 x i8> %tmp6 + +; CHECK: shuf_16i8_23: +; CHECK: punpckhbw +; CHECK-NEXT: punpckhbw +; CHECK-NEXT: pshufd $-1 } diff --git a/test/CodeGen/X86/vec_splat-4.ll b/test/CodeGen/X86/vec_splat-4.ll deleted file mode 100644 index 374acfa4e094..000000000000 --- a/test/CodeGen/X86/vec_splat-4.ll +++ /dev/null @@ -1,104 +0,0 @@ -; RUN: llc < %s -march=x86 -mcpu=penryn -mattr=sse41 -o %t -; RUN: grep punpcklbw %t | count 16 -; RUN: grep punpckhbw %t | count 16 -; RUN: grep "pshufd" %t | count 16 - -; Should generate with pshufd with masks $0, $85, $170, $255 (each mask is used 4 times) - -; Splat test for v16i8 -define <16 x i8 > @shuf_16i8_0(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 0, i32 undef, i32 undef, i32 0, i32 undef, i32 0, i32 0 , i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_1(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 1, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef , i32 undef, i32 undef, i32 undef, i32 undef, i32 undef , i32 undef, i32 undef, i32 undef, i32 undef > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_2(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 2, i32 undef, i32 undef, i32 2, i32 undef, i32 2, i32 2 , i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_3(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 3, i32 undef, i32 undef, i32 3, i32 undef, i32 3, i32 3 , i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3 > - ret <16 x i8 > %tmp6 -} - - -define <16 x i8 > @shuf_16i8_4(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 4, i32 undef, i32 undef, i32 undef, i32 4, i32 undef, i32 undef , i32 undef, i32 undef, i32 undef, i32 undef , i32 undef, i32 undef, i32 undef, i32 undef , i32 undef > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_5(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 5, i32 undef, i32 undef, i32 5, i32 undef, i32 5, i32 5 , i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_6(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 6, i32 undef, i32 undef, i32 6, i32 undef, i32 6, i32 6 , i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_7(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 7, i32 undef, i32 undef, i32 7, i32 undef, i32 undef, i32 undef , i32 undef, i32 undef, i32 undef, i32 undef , i32 undef , i32 undef, i32 undef, i32 undef , i32 undef > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_8(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 8, i32 undef, i32 undef, i32 8, i32 undef, i32 8, i32 8 , i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_9(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 9, i32 undef, i32 undef, i32 9, i32 undef, i32 9, i32 9 , i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_10(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 10, i32 undef, i32 undef, i32 10, i32 undef, i32 10, i32 10 , i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_11(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 11, i32 undef, i32 undef, i32 11, i32 undef, i32 11, i32 11 , i32 11, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11, i32 11 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_12(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 12, i32 undef, i32 undef, i32 12, i32 undef, i32 12, i32 12 , i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_13(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 13, i32 undef, i32 undef, i32 13, i32 undef, i32 13, i32 13 , i32 13, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13, i32 13 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_14(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 14, i32 undef, i32 undef, i32 14, i32 undef, i32 14, i32 14 , i32 14, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14, i32 14 > - ret <16 x i8 > %tmp6 -} - -define <16 x i8 > @shuf_16i8_15(<16 x i8 > %T0, <16 x i8 > %T1) nounwind readnone { -entry: - %tmp6 = shufflevector <16 x i8 > %T0, <16 x i8 > %T1, <16 x i32> < i32 15, i32 undef, i32 undef, i32 15, i32 undef, i32 15, i32 15 , i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15 > - ret <16 x i8 > %tmp6 -} diff --git a/test/CodeGen/X86/vec_splat.ll b/test/CodeGen/X86/vec_splat.ll index 24d8487f17bd..deedee801967 100644 --- a/test/CodeGen/X86/vec_splat.ll +++ b/test/CodeGen/X86/vec_splat.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -march=x86 -mcpu=penryn -mattr=+sse2 | grep pshufd -; RUN: llc < %s -march=x86 -mcpu=penryn -mattr=+sse3 | grep movddup +; RUN: llc < %s -march=x86 -mcpu=pentium4 -mattr=+sse2 | FileCheck %s -check-prefix=SSE2 +; RUN: llc < %s -march=x86 -mcpu=pentium4 -mattr=+sse3 | FileCheck %s -check-prefix=SSE3 define void @test_v4sf(<4 x float>* %P, <4 x float>* %Q, float %X) nounwind { %tmp = insertelement <4 x float> zeroinitializer, float %X, i32 0 ; <<4 x float>> [#uses=1] @@ -10,6 +10,12 @@ define void @test_v4sf(<4 x float>* %P, <4 x float>* %Q, float %X) nounwind { %tmp10 = fmul <4 x float> %tmp8, %tmp6 ; <<4 x float>> [#uses=1] store <4 x float> %tmp10, <4 x float>* %P ret void + +; SSE2: test_v4sf: +; SSE2: pshufd $0 + +; SSE3: test_v4sf: +; SSE3: pshufd $0 } define void @test_v2sd(<2 x double>* %P, <2 x double>* %Q, double %X) nounwind { @@ -19,4 +25,10 @@ define void @test_v2sd(<2 x double>* %P, <2 x double>* %Q, double %X) nounwind { %tmp6 = fmul <2 x double> %tmp4, %tmp2 ; <<2 x double>> [#uses=1] store <2 x double> %tmp6, <2 x double>* %P ret void + +; SSE2: test_v2sd: +; SSE2: shufpd $0 + +; SSE3: test_v2sd: +; SSE3: movddup } diff --git a/test/CodeGen/X86/vec_zero.ll b/test/CodeGen/X86/vec_zero.ll index 682a0dfca806..c3ea0ad2023f 100644 --- a/test/CodeGen/X86/vec_zero.ll +++ b/test/CodeGen/X86/vec_zero.ll @@ -13,7 +13,7 @@ define void @foo(<4 x float>* %P) { ; CHECK: pxor define void @bar(<4 x i32>* %P) { %T = load <4 x i32>* %P ; <<4 x i32>> [#uses=1] - %S = add <4 x i32> zeroinitializer, %T ; <<4 x i32>> [#uses=1] + %S = sub <4 x i32> zeroinitializer, %T ; <<4 x i32>> [#uses=1] store <4 x i32> %S, <4 x i32>* %P ret void } diff --git a/test/CodeGen/X86/vector-gep.ll b/test/CodeGen/X86/vector-gep.ll index 3476e36c646f..ec93ce0761cc 100644 --- a/test/CodeGen/X86/vector-gep.ll +++ b/test/CodeGen/X86/vector-gep.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -march=x86 -mcpu=corei7-avx | FileCheck %s -; RUN: opt -instsimplify %s -disable-output +; RUN: opt -instsimplify -disable-output < %s ;CHECK: AGEP0: define <4 x i32*> @AGEP0(i32* %ptr) nounwind { @@ -8,10 +8,8 @@ entry: %vecinit2.i = insertelement <4 x i32*> %vecinit.i, i32* %ptr, i32 1 %vecinit4.i = insertelement <4 x i32*> %vecinit2.i, i32* %ptr, i32 2 %vecinit6.i = insertelement <4 x i32*> %vecinit4.i, i32* %ptr, i32 3 -;CHECK: pslld $2 ;CHECK: padd %A2 = getelementptr <4 x i32*> %vecinit6.i, <4 x i32> <i32 1, i32 2, i32 3, i32 4> -;CHECK: pslld $2 ;CHECK: padd %A3 = getelementptr <4 x i32*> %A2, <4 x i32> <i32 10, i32 14, i32 19, i32 233> ret <4 x i32*> %A3 @@ -21,7 +19,6 @@ entry: ;CHECK: AGEP1: define i32 @AGEP1(<4 x i32*> %param) nounwind { entry: -;CHECK: pslld $2 ;CHECK: padd %A2 = getelementptr <4 x i32*> %param, <4 x i32> <i32 1, i32 2, i32 3, i32 4> %k = extractelement <4 x i32*> %A2, i32 3 diff --git a/test/CodeGen/X86/vselect-minmax.ll b/test/CodeGen/X86/vselect-minmax.ll new file mode 100644 index 000000000000..cf654b6f2059 --- /dev/null +++ b/test/CodeGen/X86/vselect-minmax.ll @@ -0,0 +1,2788 @@ +; RUN: llc -march=x86-64 -mcpu=core2 < %s | FileCheck %s -check-prefix=SSE2 +; RUN: llc -march=x86-64 -mcpu=corei7 < %s | FileCheck %s -check-prefix=SSE4 +; RUN: llc -march=x86-64 -mcpu=corei7-avx < %s | FileCheck %s -check-prefix=AVX1 +; RUN: llc -march=x86-64 -mcpu=core-avx2 -mattr=+avx2 < %s | FileCheck %s -check-prefix=AVX2 + +define void @test1(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp slt <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.a, <16 x i8> %load.b + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test1: +; SSE4: pminsb + +; AVX1: test1: +; AVX1: vpminsb + +; AVX2: test1: +; AVX2: vpminsb +} + +define void @test2(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp sle <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.a, <16 x i8> %load.b + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test2: +; SSE4: pminsb + +; AVX1: test2: +; AVX1: vpminsb + +; AVX2: test2: +; AVX2: vpminsb +} + +define void @test3(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp sgt <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.a, <16 x i8> %load.b + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test3: +; SSE4: pmaxsb + +; AVX1: test3: +; AVX1: vpmaxsb + +; AVX2: test3: +; AVX2: vpmaxsb +} + +define void @test4(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp sge <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.a, <16 x i8> %load.b + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test4: +; SSE4: pmaxsb + +; AVX1: test4: +; AVX1: vpmaxsb + +; AVX2: test4: +; AVX2: vpmaxsb +} + +define void @test5(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp ult <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.a, <16 x i8> %load.b + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test5: +; SSE2: pminub + +; AVX1: test5: +; AVX1: vpminub + +; AVX2: test5: +; AVX2: vpminub +} + +define void @test6(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp ule <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.a, <16 x i8> %load.b + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test6: +; SSE2: pminub + +; AVX1: test6: +; AVX1: vpminub + +; AVX2: test6: +; AVX2: vpminub +} + +define void @test7(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp ugt <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.a, <16 x i8> %load.b + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test7: +; SSE2: pmaxub + +; AVX1: test7: +; AVX1: vpmaxub + +; AVX2: test7: +; AVX2: vpmaxub +} + +define void @test8(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp uge <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.a, <16 x i8> %load.b + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test8: +; SSE2: pmaxub + +; AVX1: test8: +; AVX1: vpmaxub + +; AVX2: test8: +; AVX2: vpmaxub +} + +define void @test9(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp slt <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.a, <8 x i16> %load.b + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test9: +; SSE2: pminsw + +; AVX1: test9: +; AVX1: vpminsw + +; AVX2: test9: +; AVX2: vpminsw +} + +define void @test10(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp sle <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.a, <8 x i16> %load.b + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test10: +; SSE2: pminsw + +; AVX1: test10: +; AVX1: vpminsw + +; AVX2: test10: +; AVX2: vpminsw +} + +define void @test11(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp sgt <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.a, <8 x i16> %load.b + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test11: +; SSE2: pmaxsw + +; AVX1: test11: +; AVX1: vpmaxsw + +; AVX2: test11: +; AVX2: vpmaxsw +} + +define void @test12(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp sge <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.a, <8 x i16> %load.b + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test12: +; SSE2: pmaxsw + +; AVX1: test12: +; AVX1: vpmaxsw + +; AVX2: test12: +; AVX2: vpmaxsw +} + +define void @test13(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp ult <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.a, <8 x i16> %load.b + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test13: +; SSE4: pminuw + +; AVX1: test13: +; AVX1: vpminuw + +; AVX2: test13: +; AVX2: vpminuw +} + +define void @test14(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp ule <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.a, <8 x i16> %load.b + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test14: +; SSE4: pminuw + +; AVX1: test14: +; AVX1: vpminuw + +; AVX2: test14: +; AVX2: vpminuw +} + +define void @test15(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp ugt <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.a, <8 x i16> %load.b + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test15: +; SSE4: pmaxuw + +; AVX1: test15: +; AVX1: vpmaxuw + +; AVX2: test15: +; AVX2: vpmaxuw +} + +define void @test16(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp uge <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.a, <8 x i16> %load.b + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test16: +; SSE4: pmaxuw + +; AVX1: test16: +; AVX1: vpmaxuw + +; AVX2: test16: +; AVX2: vpmaxuw +} + +define void @test17(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp slt <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.a, <4 x i32> %load.b + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test17: +; SSE4: pminsd + +; AVX1: test17: +; AVX1: vpminsd + +; AVX2: test17: +; AVX2: vpminsd +} + +define void @test18(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp sle <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.a, <4 x i32> %load.b + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test18: +; SSE4: pminsd + +; AVX1: test18: +; AVX1: vpminsd + +; AVX2: test18: +; AVX2: vpminsd +} + +define void @test19(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp sgt <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.a, <4 x i32> %load.b + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test19: +; SSE4: pmaxsd + +; AVX1: test19: +; AVX1: vpmaxsd + +; AVX2: test19: +; AVX2: vpmaxsd +} + +define void @test20(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp sge <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.a, <4 x i32> %load.b + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test20: +; SSE4: pmaxsd + +; AVX1: test20: +; AVX1: vpmaxsd + +; AVX2: test20: +; AVX2: vpmaxsd +} + +define void @test21(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp ult <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.a, <4 x i32> %load.b + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test21: +; SSE4: pminud + +; AVX1: test21: +; AVX1: vpminud + +; AVX2: test21: +; AVX2: vpminud +} + +define void @test22(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp ule <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.a, <4 x i32> %load.b + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test22: +; SSE4: pminud + +; AVX1: test22: +; AVX1: vpminud + +; AVX2: test22: +; AVX2: vpminud +} + +define void @test23(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp ugt <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.a, <4 x i32> %load.b + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test23: +; SSE4: pmaxud + +; AVX1: test23: +; AVX1: vpmaxud + +; AVX2: test23: +; AVX2: vpmaxud +} + +define void @test24(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp uge <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.a, <4 x i32> %load.b + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test24: +; SSE4: pmaxud + +; AVX1: test24: +; AVX1: vpmaxud + +; AVX2: test24: +; AVX2: vpmaxud +} + +define void @test25(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp slt <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.a, <32 x i8> %load.b + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test25: +; AVX2: vpminsb +} + +define void @test26(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp sle <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.a, <32 x i8> %load.b + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test26: +; AVX2: vpminsb +} + +define void @test27(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp sgt <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.a, <32 x i8> %load.b + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test27: +; AVX2: vpmaxsb +} + +define void @test28(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp sge <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.a, <32 x i8> %load.b + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test28: +; AVX2: vpmaxsb +} + +define void @test29(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp ult <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.a, <32 x i8> %load.b + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test29: +; AVX2: vpminub +} + +define void @test30(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp ule <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.a, <32 x i8> %load.b + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test30: +; AVX2: vpminub +} + +define void @test31(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp ugt <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.a, <32 x i8> %load.b + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test31: +; AVX2: vpmaxub +} + +define void @test32(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp uge <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.a, <32 x i8> %load.b + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test32: +; AVX2: vpmaxub +} + +define void @test33(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp slt <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.a, <16 x i16> %load.b + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test33: +; AVX2: vpminsw +} + +define void @test34(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp sle <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.a, <16 x i16> %load.b + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test34: +; AVX2: vpminsw +} + +define void @test35(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp sgt <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.a, <16 x i16> %load.b + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test35: +; AVX2: vpmaxsw +} + +define void @test36(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp sge <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.a, <16 x i16> %load.b + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test36: +; AVX2: vpmaxsw +} + +define void @test37(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp ult <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.a, <16 x i16> %load.b + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test37: +; AVX2: vpminuw +} + +define void @test38(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp ule <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.a, <16 x i16> %load.b + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test38: +; AVX2: vpminuw +} + +define void @test39(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp ugt <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.a, <16 x i16> %load.b + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test39: +; AVX2: vpmaxuw +} + +define void @test40(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp uge <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.a, <16 x i16> %load.b + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test40: +; AVX2: vpmaxuw +} + +define void @test41(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp slt <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.a, <8 x i32> %load.b + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test41: +; AVX2: vpminsd +} + +define void @test42(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp sle <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.a, <8 x i32> %load.b + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test42: +; AVX2: vpminsd +} + +define void @test43(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp sgt <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.a, <8 x i32> %load.b + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test43: +; AVX2: vpmaxsd +} + +define void @test44(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp sge <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.a, <8 x i32> %load.b + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test44: +; AVX2: vpmaxsd +} + +define void @test45(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp ult <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.a, <8 x i32> %load.b + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test45: +; AVX2: vpminud +} + +define void @test46(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp ule <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.a, <8 x i32> %load.b + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test46: +; AVX2: vpminud +} + +define void @test47(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp ugt <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.a, <8 x i32> %load.b + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test47: +; AVX2: vpmaxud +} + +define void @test48(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp uge <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.a, <8 x i32> %load.b + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test48: +; AVX2: vpmaxud +} + +define void @test49(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp slt <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.b, <16 x i8> %load.a + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test49: +; SSE4: pmaxsb + +; AVX1: test49: +; AVX1: vpmaxsb + +; AVX2: test49: +; AVX2: vpmaxsb +} + +define void @test50(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp sle <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.b, <16 x i8> %load.a + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test50: +; SSE4: pmaxsb + +; AVX1: test50: +; AVX1: vpmaxsb + +; AVX2: test50: +; AVX2: vpmaxsb +} + +define void @test51(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp sgt <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.b, <16 x i8> %load.a + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test51: +; SSE4: pminsb + +; AVX1: test51: +; AVX1: vpminsb + +; AVX2: test51: +; AVX2: vpminsb +} + +define void @test52(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp sge <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.b, <16 x i8> %load.a + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test52: +; SSE4: pminsb + +; AVX1: test52: +; AVX1: vpminsb + +; AVX2: test52: +; AVX2: vpminsb +} + +define void @test53(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp ult <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.b, <16 x i8> %load.a + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test53: +; SSE2: pmaxub + +; AVX1: test53: +; AVX1: vpmaxub + +; AVX2: test53: +; AVX2: vpmaxub +} + +define void @test54(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp ule <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.b, <16 x i8> %load.a + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test54: +; SSE2: pmaxub + +; AVX1: test54: +; AVX1: vpmaxub + +; AVX2: test54: +; AVX2: vpmaxub +} + +define void @test55(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp ugt <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.b, <16 x i8> %load.a + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test55: +; SSE2: pminub + +; AVX1: test55: +; AVX1: vpminub + +; AVX2: test55: +; AVX2: vpminub +} + +define void @test56(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <16 x i8>* + %ptr.b = bitcast i8* %gep.b to <16 x i8>* + %load.a = load <16 x i8>* %ptr.a, align 2 + %load.b = load <16 x i8>* %ptr.b, align 2 + %cmp = icmp uge <16 x i8> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i8> %load.b, <16 x i8> %load.a + store <16 x i8> %sel, <16 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test56: +; SSE2: pminub + +; AVX1: test56: +; AVX1: vpminub + +; AVX2: test56: +; AVX2: vpminub +} + +define void @test57(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp slt <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.b, <8 x i16> %load.a + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test57: +; SSE2: pmaxsw + +; AVX1: test57: +; AVX1: vpmaxsw + +; AVX2: test57: +; AVX2: vpmaxsw +} + +define void @test58(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp sle <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.b, <8 x i16> %load.a + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test58: +; SSE2: pmaxsw + +; AVX1: test58: +; AVX1: vpmaxsw + +; AVX2: test58: +; AVX2: vpmaxsw +} + +define void @test59(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp sgt <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.b, <8 x i16> %load.a + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test59: +; SSE2: pminsw + +; AVX1: test59: +; AVX1: vpminsw + +; AVX2: test59: +; AVX2: vpminsw +} + +define void @test60(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp sge <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.b, <8 x i16> %load.a + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE2: test60: +; SSE2: pminsw + +; AVX1: test60: +; AVX1: vpminsw + +; AVX2: test60: +; AVX2: vpminsw +} + +define void @test61(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp ult <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.b, <8 x i16> %load.a + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test61: +; SSE4: pmaxuw + +; AVX1: test61: +; AVX1: vpmaxuw + +; AVX2: test61: +; AVX2: vpmaxuw +} + +define void @test62(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp ule <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.b, <8 x i16> %load.a + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test62: +; SSE4: pmaxuw + +; AVX1: test62: +; AVX1: vpmaxuw + +; AVX2: test62: +; AVX2: vpmaxuw +} + +define void @test63(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp ugt <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.b, <8 x i16> %load.a + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test63: +; SSE4: pminuw + +; AVX1: test63: +; AVX1: vpminuw + +; AVX2: test63: +; AVX2: vpminuw +} + +define void @test64(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <8 x i16>* + %ptr.b = bitcast i16* %gep.b to <8 x i16>* + %load.a = load <8 x i16>* %ptr.a, align 2 + %load.b = load <8 x i16>* %ptr.b, align 2 + %cmp = icmp uge <8 x i16> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i16> %load.b, <8 x i16> %load.a + store <8 x i16> %sel, <8 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test64: +; SSE4: pminuw + +; AVX1: test64: +; AVX1: vpminuw + +; AVX2: test64: +; AVX2: vpminuw +} + +define void @test65(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp slt <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.b, <4 x i32> %load.a + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test65: +; SSE4: pmaxsd + +; AVX1: test65: +; AVX1: vpmaxsd + +; AVX2: test65: +; AVX2: vpmaxsd +} + +define void @test66(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp sle <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.b, <4 x i32> %load.a + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test66: +; SSE4: pmaxsd + +; AVX1: test66: +; AVX1: vpmaxsd + +; AVX2: test66: +; AVX2: vpmaxsd +} + +define void @test67(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp sgt <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.b, <4 x i32> %load.a + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test67: +; SSE4: pminsd + +; AVX1: test67: +; AVX1: vpminsd + +; AVX2: test67: +; AVX2: vpminsd +} + +define void @test68(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp sge <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.b, <4 x i32> %load.a + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test68: +; SSE4: pminsd + +; AVX1: test68: +; AVX1: vpminsd + +; AVX2: test68: +; AVX2: vpminsd +} + +define void @test69(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp ult <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.b, <4 x i32> %load.a + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test69: +; SSE4: pmaxud + +; AVX1: test69: +; AVX1: vpmaxud + +; AVX2: test69: +; AVX2: vpmaxud +} + +define void @test70(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp ule <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.b, <4 x i32> %load.a + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test70: +; SSE4: pmaxud + +; AVX1: test70: +; AVX1: vpmaxud + +; AVX2: test70: +; AVX2: vpmaxud +} + +define void @test71(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp ugt <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.b, <4 x i32> %load.a + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test71: +; SSE4: pminud + +; AVX1: test71: +; AVX1: vpminud + +; AVX2: test71: +; AVX2: vpminud +} + +define void @test72(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <4 x i32>* + %ptr.b = bitcast i32* %gep.b to <4 x i32>* + %load.a = load <4 x i32>* %ptr.a, align 2 + %load.b = load <4 x i32>* %ptr.b, align 2 + %cmp = icmp uge <4 x i32> %load.a, %load.b + %sel = select <4 x i1> %cmp, <4 x i32> %load.b, <4 x i32> %load.a + store <4 x i32> %sel, <4 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 4 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; SSE4: test72: +; SSE4: pminud + +; AVX1: test72: +; AVX1: vpminud + +; AVX2: test72: +; AVX2: vpminud +} + +define void @test73(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp slt <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.b, <32 x i8> %load.a + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test73: +; AVX2: vpmaxsb +} + +define void @test74(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp sle <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.b, <32 x i8> %load.a + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test74: +; AVX2: vpmaxsb +} + +define void @test75(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp sgt <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.b, <32 x i8> %load.a + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test75: +; AVX2: vpminsb +} + +define void @test76(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp sge <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.b, <32 x i8> %load.a + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test76: +; AVX2: vpminsb +} + +define void @test77(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp ult <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.b, <32 x i8> %load.a + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test77: +; AVX2: vpmaxub +} + +define void @test78(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp ule <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.b, <32 x i8> %load.a + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test78: +; AVX2: vpmaxub +} + +define void @test79(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp ugt <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.b, <32 x i8> %load.a + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test79: +; AVX2: vpminub +} + +define void @test80(i8* nocapture %a, i8* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i8* %a, i64 %index + %gep.b = getelementptr inbounds i8* %b, i64 %index + %ptr.a = bitcast i8* %gep.a to <32 x i8>* + %ptr.b = bitcast i8* %gep.b to <32 x i8>* + %load.a = load <32 x i8>* %ptr.a, align 2 + %load.b = load <32 x i8>* %ptr.b, align 2 + %cmp = icmp uge <32 x i8> %load.a, %load.b + %sel = select <32 x i1> %cmp, <32 x i8> %load.b, <32 x i8> %load.a + store <32 x i8> %sel, <32 x i8>* %ptr.a, align 2 + %index.next = add i64 %index, 32 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test80: +; AVX2: vpminub +} + +define void @test81(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp slt <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.b, <16 x i16> %load.a + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test81: +; AVX2: vpmaxsw +} + +define void @test82(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp sle <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.b, <16 x i16> %load.a + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test82: +; AVX2: vpmaxsw +} + +define void @test83(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp sgt <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.b, <16 x i16> %load.a + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test83: +; AVX2: vpminsw +} + +define void @test84(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp sge <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.b, <16 x i16> %load.a + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test84: +; AVX2: vpminsw +} + +define void @test85(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp ult <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.b, <16 x i16> %load.a + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test85: +; AVX2: vpmaxuw +} + +define void @test86(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp ule <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.b, <16 x i16> %load.a + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test86: +; AVX2: vpmaxuw +} + +define void @test87(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp ugt <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.b, <16 x i16> %load.a + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test87: +; AVX2: vpminuw +} + +define void @test88(i16* nocapture %a, i16* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i16* %a, i64 %index + %gep.b = getelementptr inbounds i16* %b, i64 %index + %ptr.a = bitcast i16* %gep.a to <16 x i16>* + %ptr.b = bitcast i16* %gep.b to <16 x i16>* + %load.a = load <16 x i16>* %ptr.a, align 2 + %load.b = load <16 x i16>* %ptr.b, align 2 + %cmp = icmp uge <16 x i16> %load.a, %load.b + %sel = select <16 x i1> %cmp, <16 x i16> %load.b, <16 x i16> %load.a + store <16 x i16> %sel, <16 x i16>* %ptr.a, align 2 + %index.next = add i64 %index, 16 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test88: +; AVX2: vpminuw +} + +define void @test89(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp slt <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.b, <8 x i32> %load.a + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test89: +; AVX2: vpmaxsd +} + +define void @test90(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp sle <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.b, <8 x i32> %load.a + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test90: +; AVX2: vpmaxsd +} + +define void @test91(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp sgt <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.b, <8 x i32> %load.a + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test91: +; AVX2: vpminsd +} + +define void @test92(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp sge <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.b, <8 x i32> %load.a + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test92: +; AVX2: vpminsd +} + +define void @test93(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp ult <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.b, <8 x i32> %load.a + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test93: +; AVX2: vpmaxud +} + +define void @test94(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp ule <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.b, <8 x i32> %load.a + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test94: +; AVX2: vpmaxud +} + +define void @test95(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp ugt <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.b, <8 x i32> %load.a + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test95: +; AVX2: vpminud +} + +define void @test96(i32* nocapture %a, i32* nocapture %b) nounwind { +vector.ph: + br label %vector.body + +vector.body: ; preds = %vector.body, %vector.ph + %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] + %gep.a = getelementptr inbounds i32* %a, i64 %index + %gep.b = getelementptr inbounds i32* %b, i64 %index + %ptr.a = bitcast i32* %gep.a to <8 x i32>* + %ptr.b = bitcast i32* %gep.b to <8 x i32>* + %load.a = load <8 x i32>* %ptr.a, align 2 + %load.b = load <8 x i32>* %ptr.b, align 2 + %cmp = icmp uge <8 x i32> %load.a, %load.b + %sel = select <8 x i1> %cmp, <8 x i32> %load.b, <8 x i32> %load.a + store <8 x i32> %sel, <8 x i32>* %ptr.a, align 2 + %index.next = add i64 %index, 8 + %loop = icmp eq i64 %index.next, 16384 + br i1 %loop, label %for.end, label %vector.body + +for.end: ; preds = %vector.body + ret void + +; AVX2: test96: +; AVX2: vpminud +} diff --git a/test/CodeGen/X86/vsplit-and.ll b/test/CodeGen/X86/vsplit-and.ll index ee98806c0f8b..3b7fdff84e3c 100644 --- a/test/CodeGen/X86/vsplit-and.ll +++ b/test/CodeGen/X86/vsplit-and.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-linux -mcpu=penryn | FileCheck %s define void @t0(<2 x i64>* %dst, <2 x i64> %src1, <2 x i64> %src2) nounwind readonly { ; CHECK: t0 diff --git a/test/CodeGen/X86/wide-fma-contraction.ll b/test/CodeGen/X86/wide-fma-contraction.ll new file mode 100644 index 000000000000..d93f33ba0e58 --- /dev/null +++ b/test/CodeGen/X86/wide-fma-contraction.ll @@ -0,0 +1,20 @@ +; RUN: llc -march=x86 -mattr=+fma4 -mtriple=x86_64-apple-darwin < %s | FileCheck %s + +; CHECK: fmafunc +define <16 x float> @fmafunc(<16 x float> %a, <16 x float> %b, <16 x float> %c) { +; CHECK-NOT: vmulps +; CHECK-NOT: vaddps +; CHECK: vfmaddps +; CHECK-NOT: vmulps +; CHECK-NOT: vaddps +; CHECK: vfmaddps +; CHECK-NOT: vmulps +; CHECK-NOT: vaddps + %ret = tail call <16 x float> @llvm.fmuladd.v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %c) + ret <16 x float> %ret +} + +declare <16 x float> @llvm.fmuladd.v16f32(<16 x float>, <16 x float>, <16 x float>) nounwind readnone + + + diff --git a/test/CodeGen/X86/win32_sret.ll b/test/CodeGen/X86/win32_sret.ll index 878c6db99286..52b987e2be65 100644 --- a/test/CodeGen/X86/win32_sret.ll +++ b/test/CodeGen/X86/win32_sret.ll @@ -1,28 +1,127 @@ -; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s -check-prefix=WIN_X32 -; RUN: llc < %s -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X32 +; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s -check-prefix=WIN32 +; RUN: llc < %s -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X86 ; RUN: llc < %s -mtriple=i386-pc-linux | FileCheck %s -check-prefix=LINUX -; RUN: llc < %s -O0 -mtriple=i686-pc-win32 | FileCheck %s -check-prefix=WIN_X32 -; RUN: llc < %s -O0 -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X32 +; RUN: llc < %s -O0 -mtriple=i686-pc-win32 | FileCheck %s -check-prefix=WIN32 +; RUN: llc < %s -O0 -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X86 ; RUN: llc < %s -O0 -mtriple=i386-pc-linux | FileCheck %s -check-prefix=LINUX ; The SysV ABI used by most Unixes and Mingw on x86 specifies that an sret pointer ; is callee-cleanup. However, in MSVC's cdecl calling convention, sret pointer ; arguments are caller-cleanup like normal arguments. -define void @sret1(i8* sret) nounwind { +define void @sret1(i8* sret %x) nounwind { entry: -; WIN_X32: {{ret$}} -; MINGW_X32: ret $4 +; WIN32: sret1 +; WIN32: movb $42, (%eax) +; WIN32-NOT: popl %eax +; WIN32: {{ret$}} + +; MINGW_X86: sret1 +; MINGW_X86: ret $4 + +; LINUX: sret1 ; LINUX: ret $4 + + store i8 42, i8* %x, align 4 ret void } -define void @sret2(i32* sret %x, i32 %y) nounwind { +define void @sret2(i8* sret %x, i8 %y) nounwind { entry: -; WIN_X32: {{ret$}} -; MINGW_X32: ret $4 +; WIN32: sret2 +; WIN32: movb {{.*}}, (%eax) +; WIN32-NOT: popl %eax +; WIN32: {{ret$}} + +; MINGW_X86: sret2 +; MINGW_X86: ret $4 + +; LINUX: sret2 ; LINUX: ret $4 - store i32 %y, i32* %x + + store i8 %y, i8* %x + ret void +} + +define void @sret3(i8* sret %x, i8* %y) nounwind { +entry: +; WIN32: sret3 +; WIN32: movb $42, (%eax) +; WIN32-NOT: movb $13, (%eax) +; WIN32-NOT: popl %eax +; WIN32: {{ret$}} + +; MINGW_X86: sret3 +; MINGW_X86: ret $4 + +; LINUX: sret3 +; LINUX: ret $4 + + store i8 42, i8* %x + store i8 13, i8* %y + ret void +} + +; PR15556 +%struct.S4 = type { i32, i32, i32 } + +define void @sret4(%struct.S4* noalias sret %agg.result) { +entry: +; WIN32: sret4 +; WIN32: movl $42, (%eax) +; WIN32-NOT: popl %eax +; WIN32: {{ret$}} + +; MINGW_X86: sret4 +; MINGW_X86: ret $4 + +; LINUX: sret4 +; LINUX: ret $4 + + %x = getelementptr inbounds %struct.S4* %agg.result, i32 0, i32 0 + store i32 42, i32* %x, align 4 ret void } +%struct.S5 = type { i32 } +%class.C5 = type { i8 } + +define x86_thiscallcc void @"\01?foo@C5@@QAE?AUS5@@XZ"(%struct.S5* noalias sret %agg.result, %class.C5* %this) { +entry: + %this.addr = alloca %class.C5*, align 4 + store %class.C5* %this, %class.C5** %this.addr, align 4 + %this1 = load %class.C5** %this.addr + %x = getelementptr inbounds %struct.S5* %agg.result, i32 0, i32 0 + store i32 42, i32* %x, align 4 + ret void +; WIN32: {{^}}"?foo@C5@@QAE?AUS5@@XZ": + +; The address of the return structure is passed as an implicit parameter. +; In the -O0 build, %eax is spilled at the beginning of the function, hence we +; should match both 4(%esp) and 8(%esp). +; WIN32: {{[48]}}(%esp), %eax +; WIN32: movl $42, (%eax) +; WIN32: ret $4 +} + +define void @call_foo5() { +entry: + %c = alloca %class.C5, align 1 + %s = alloca %struct.S5, align 4 + call x86_thiscallcc void @"\01?foo@C5@@QAE?AUS5@@XZ"(%struct.S5* sret %s, %class.C5* %c) +; WIN32: {{^}}_call_foo5: + +; Load the address of the result and put it onto stack +; (through %ecx in the -O0 build). +; WIN32: leal {{[0-9]+}}(%esp), %eax +; WIN32: movl %eax, (%e{{[sc][px]}}) + +; The this pointer goes to ECX. +; FIXME: for some reason, the below checks fail on the Ubuntu Atom D2700 bot. +; FIXME-NEXT: leal {{[0-9]+}}(%esp), %ecx +; FIXME-NEXT: calll "?foo@C5@@QAE?AUS5@@XZ" + +; WIN32: calll "?foo@C5@@QAE?AUS5@@XZ" +; WIN32: ret + ret void +} diff --git a/test/CodeGen/X86/win_ftol2.ll b/test/CodeGen/X86/win_ftol2.ll index 596b4262e6b0..14591248f354 100644 --- a/test/CodeGen/X86/win_ftol2.ll +++ b/test/CodeGen/X86/win_ftol2.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s -check-prefix=FTOL +; RUN: llc < %s -mtriple=i686-pc-win32 -mcpu=generic | FileCheck %s -check-prefix=FTOL ; RUN: llc < %s -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=COMPILERRT ; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s -check-prefix=COMPILERRT ; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s -check-prefix=COMPILERRT @@ -63,9 +63,9 @@ define i64 @double_ui64_2(double %x, double %y, double %z) nounwind { %1 = fdiv double %x, %y %2 = fsub double %x, %z - %3 = fptoui double %1 to i64 - %4 = fptoui double %2 to i64 - %5 = sub i64 %3, %4 + %3 = fptoui double %2 to i64 + %4 = fptoui double %1 to i64 + %5 = sub i64 %4, %3 ret i64 %5 } @@ -121,9 +121,9 @@ define {double, i64} @double_ui64_4(double %x, double %y) nounwind { ; FTOL_2: calll __ftol2 ;; stack is %x - %1 = fptoui double %x to i64 - %2 = fptoui double %y to i64 - %3 = sub i64 %1, %2 + %1 = fptoui double %y to i64 + %2 = fptoui double %x to i64 + %3 = sub i64 %2, %1 %4 = insertvalue {double, i64} undef, double %x, 0 %5 = insertvalue {double, i64} %4, i64 %3, 1 ret {double, i64} %5 diff --git a/test/CodeGen/X86/x86-64-dead-stack-adjust.ll b/test/CodeGen/X86/x86-64-dead-stack-adjust.ll index 902c9d5ae081..9c01f16f24f5 100644 --- a/test/CodeGen/X86/x86-64-dead-stack-adjust.ll +++ b/test/CodeGen/X86/x86-64-dead-stack-adjust.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -mcpu=nehalem | not grep rsp -; RUN: llc < %s -mcpu=nehalem | grep cvttsd2siq +; RUN: llc < %s -mcpu=nehalem | grep cvttsd2si target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" target triple = "x86_64-apple-darwin8" diff --git a/test/CodeGen/X86/x86-64-ptr-arg-simple.ll b/test/CodeGen/X86/x86-64-ptr-arg-simple.ll new file mode 100644 index 000000000000..6d466639890b --- /dev/null +++ b/test/CodeGen/X86/x86-64-ptr-arg-simple.ll @@ -0,0 +1,29 @@ +; RUN: llc -mtriple=x86_64-pc-linux < %s | FileCheck %s +; RUN: llc -mtriple=x86_64-pc-linux-gnux32 < %s | FileCheck -check-prefix=X32ABI %s + +; %in is kept in %esi for both ABIs. But the pointer will be passed in %edi +; for x32, not %rdi + +; CHECK: movl %esi, (%rdi) +; X32ABI: movl %esi, (%edi) + +define void @foo(i32* nocapture %out, i32 %in) nounwind { +entry: + store i32 %in, i32* %out, align 4 + ret void +} + +; CHECK: bar +; CHECK: movl (%rsi), %eax + +; Similarly here, but for loading +; X32ABI: bar +; X32ABI: movl (%esi), %eax + +define void @bar(i32* nocapture %pOut, i32* nocapture %pIn) nounwind { +entry: + %0 = load i32* %pIn, align 4 + store i32 %0, i32* %pOut, align 4 + ret void +} + diff --git a/test/CodeGen/X86/x86-64-sret-return.ll b/test/CodeGen/X86/x86-64-sret-return.ll index 7b5f189faa0f..bc8a54346580 100644 --- a/test/CodeGen/X86/x86-64-sret-return.ll +++ b/test/CodeGen/X86/x86-64-sret-return.ll @@ -1,11 +1,16 @@ -; RUN: llc < %s | FileCheck %s +; RUN: llc -mtriple=x86_64-apple-darwin8 < %s | FileCheck %s +; RUN: llc -mtriple=x86_64-pc-linux < %s | FileCheck %s +; RUN: llc -mtriple=x86_64-pc-linux-gnux32 < %s | FileCheck -check-prefix=X32ABI %s -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -target triple = "x86_64-apple-darwin8" - %struct.foo = type { [4 x i64] } +%struct.foo = type { [4 x i64] } ; CHECK: bar: ; CHECK: movq %rdi, %rax + +; For the x32 ABI, pointers are 32-bit so 32-bit instructions will be used +; X32ABI: bar: +; X32ABI: movl %edi, %eax + define void @bar(%struct.foo* noalias sret %agg.result, %struct.foo* %d) nounwind { entry: %d_addr = alloca %struct.foo* ; <%struct.foo**> [#uses=2] @@ -57,6 +62,11 @@ return: ; preds = %entry ; CHECK: foo: ; CHECK: movq %rdi, %rax + +; For the x32 ABI, pointers are 32-bit so 32-bit instructions will be used +; X32ABI: foo: +; X32ABI: movl %edi, %eax + define void @foo({ i64 }* noalias nocapture sret %agg.result) nounwind { store { i64 } { i64 0 }, { i64 }* %agg.result ret void diff --git a/test/CodeGen/X86/xtest.ll b/test/CodeGen/X86/xtest.ll new file mode 100644 index 000000000000..e85565edcd55 --- /dev/null +++ b/test/CodeGen/X86/xtest.ll @@ -0,0 +1,11 @@ +; RUN: llc < %s -march=x86-64 -mattr=+rtm | FileCheck %s + +declare i32 @llvm.x86.xtest() nounwind + +define i32 @test_xtest() nounwind uwtable { +entry: + %0 = tail call i32 @llvm.x86.xtest() nounwind + ret i32 %0 +; CHECK: test_xtest +; CHECK: xtest +} diff --git a/test/CodeGen/X86/zero-remat.ll b/test/CodeGen/X86/zero-remat.ll index 4242530f7731..5d25a2d74971 100644 --- a/test/CodeGen/X86/zero-remat.ll +++ b/test/CodeGen/X86/zero-remat.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: llc < %s -march=x86-64 | FileCheck %s --check-prefix=CHECK-64 ; RUN: llc < %s -march=x86-64 -o /dev/null -stats -info-output-file - | grep asm-printer | grep 12 ; RUN: llc < %s -march=x86 | FileCheck %s --check-prefix=CHECK-32 diff --git a/test/CodeGen/XCore/2010-04-07-DbgValueOtherTargets.ll b/test/CodeGen/XCore/2010-04-07-DbgValueOtherTargets.ll deleted file mode 100644 index 80cf3a6d678f..000000000000 --- a/test/CodeGen/XCore/2010-04-07-DbgValueOtherTargets.ll +++ /dev/null @@ -1,28 +0,0 @@ -; RUN: llc -O0 -march=xcore -asm-verbose < %s | FileCheck %s -; Check that DEBUG_VALUE comments come through on a variety of targets. - -define i32 @main() nounwind ssp { -entry: -; CHECK: DEBUG_VALUE - call void @llvm.dbg.value(metadata !6, i64 0, metadata !7), !dbg !9 - ret i32 0, !dbg !10 -} - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/tmp/x.c", metadata !"/Users/manav", metadata !"clang version 2.9 (trunk 120996)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 0} -!7 = metadata !{i32 590080, metadata !8, metadata !"i", metadata !1, i32 3, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!8 = metadata !{i32 589835, metadata !0, i32 2, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 3, i32 11, metadata !8, null} -!10 = metadata !{i32 4, i32 2, metadata !8, null} - diff --git a/test/CodeGen/XCore/DbgValueOtherTargets.test b/test/CodeGen/XCore/DbgValueOtherTargets.test new file mode 100644 index 000000000000..7c2ecd0312c6 --- /dev/null +++ b/test/CodeGen/XCore/DbgValueOtherTargets.test @@ -0,0 +1 @@ +RUN: llc -O0 -march=xcore -asm-verbose < %S/../Inputs/DbgValueOtherTargets.ll | FileCheck %S/../Inputs/DbgValueOtherTargets.ll diff --git a/test/CodeGen/XCore/aliases.ll b/test/CodeGen/XCore/aliases.ll new file mode 100644 index 000000000000..d83b246a5527 --- /dev/null +++ b/test/CodeGen/XCore/aliases.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s -march=xcore | FileCheck %s +declare void @a_val() nounwind +@b_val = external constant i32, section ".cp.rodata" +@c_val = external global i32 + +@a = alias void ()* @a_val +@b = alias i32* @b_val +@c = alias i32* @c_val + +; CHECK: a_addr: +; CHECK: ldap r11, a +; CHECK: retsp +define void ()* @a_addr() nounwind { +entry: + ret void ()* @a +} + +; CHECK: b_addr: +; CHECK: ldaw r11, cp[b] +; CHECK: retsp +define i32 *@b_addr() nounwind { +entry: + ret i32* @b +} + +; CHECK: c_addr: +; CHECK: ldaw r0, dp[c] +; CHECK: retsp +define i32 *@c_addr() nounwind { +entry: + ret i32* @c +} diff --git a/test/CodeGen/XCore/lit.local.cfg b/test/CodeGen/XCore/lit.local.cfg index f8726af57f79..8756f37fe8a1 100644 --- a/test/CodeGen/XCore/lit.local.cfg +++ b/test/CodeGen/XCore/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] +config.suffixes = ['.ll', '.c', '.cpp', '.test'] targets = set(config.root.targets_to_build.split()) if not 'XCore' in targets: diff --git a/test/DebugInfo/2009-11-03-InsertExtractValue.ll b/test/DebugInfo/2009-11-03-InsertExtractValue.ll index 8782e4446f4b..5bfca21b3ecb 100644 --- a/test/DebugInfo/2009-11-03-InsertExtractValue.ll +++ b/test/DebugInfo/2009-11-03-InsertExtractValue.ll @@ -1,11 +1,18 @@ ; RUN: llvm-as < %s | llvm-dis | FileCheck %s -!0 = metadata !{i32 42} +!dbg = !{!0} +!0 = metadata !{i32 786478, metadata !1, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", metadata !1, i32 3, metadata !2, i1 false, i1 false, i32 0, i32 0, null, i32 258, i1 false, null, null, i32 0, metadata !1, i32 3} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 41, metadata !4} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 21, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !3, i32 0, null} ; [ DW_TAG_subroutine_type ] +!3 = metadata !{null} +!4 = metadata !{metadata !"/foo", metadata !"bar.cpp"} define <{i32, i32}> @f1() { -; CHECK: !dbgx !0 - %r = insertvalue <{ i32, i32 }> zeroinitializer, i32 4, 1, !dbgx !0 -; CHECK: !dbgx !0 - %e = extractvalue <{ i32, i32 }> %r, 0, !dbgx !0 +; CHECK: !dbgx !1 + %r = insertvalue <{ i32, i32 }> zeroinitializer, i32 4, 1, !dbgx !1 +; CHECK: !dbgx !1 + %e = extractvalue <{ i32, i32 }> %r, 0, !dbgx !1 ret <{ i32, i32 }> %r } + +; CHECK: [protected] diff --git a/test/DebugInfo/2009-11-05-DeadGlobalVariable.ll b/test/DebugInfo/2009-11-05-DeadGlobalVariable.ll index e0371d646d37..13bd31039522 100644 --- a/test/DebugInfo/2009-11-05-DeadGlobalVariable.ll +++ b/test/DebugInfo/2009-11-05-DeadGlobalVariable.ll @@ -9,12 +9,10 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"fb.c", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 139632)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, i32 ()* @foo, null, null, metadata !10} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 720913, i32 12, metadata !6, metadata !"clang version 3.0 (trunk 139632)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 720942, metadata !6, metadata !"foo", metadata !"foo", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, i32 ()* @foo, null, null, metadata !10} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 720937, metadata !"fb.c", metadata !"/private/tmp", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9} diff --git a/test/DebugInfo/2009-11-10-CurrentFn.ll b/test/DebugInfo/2009-11-10-CurrentFn.ll index 01db617a679b..83d6ac28223e 100644 --- a/test/DebugInfo/2009-11-10-CurrentFn.ll +++ b/test/DebugInfo/2009-11-10-CurrentFn.ll @@ -12,12 +12,10 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"cf.c", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 139632)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"bar", metadata !"bar", metadata !"", metadata !6, i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void (i32)* @bar, null, null, metadata !9} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 720913, i32 12, metadata !6, metadata !"clang version 3.0 (trunk 139632)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 720942, metadata !6, metadata !"bar", metadata !"bar", metadata !"", metadata !6, i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void (i32)* @bar, null, null, metadata !9} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 720937, metadata !"cf.c", metadata !"/private/tmp", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null} diff --git a/test/DebugInfo/2010-03-24-MemberFn.ll b/test/DebugInfo/2010-03-24-MemberFn.ll index 20c0b8ee009f..06c2367913da 100644 --- a/test/DebugInfo/2010-03-24-MemberFn.ll +++ b/test/DebugInfo/2010-03-24-MemberFn.ll @@ -36,27 +36,32 @@ return: ; preds = %entry declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone -!0 = metadata !{i32 524544, metadata !1, metadata !"s1", metadata !4, i32 3, metadata !9} ; [ DW_TAG_auto_variable ] -!1 = metadata !{i32 524299, metadata !2, i32 3, i32 0} ; [ DW_TAG_lexical_block ] -!2 = metadata !{i32 524299, metadata !3, i32 3, i32 0} ; [ DW_TAG_lexical_block ] -!3 = metadata !{i32 524334, i32 0, metadata !4, metadata !"bar", metadata !"bar", metadata !"_Z3barv", metadata !4, i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!4 = metadata !{i32 524329, metadata !"one.cc", metadata !"/tmp/", metadata !5} ; [ DW_TAG_file_type ] -!5 = metadata !{i32 524305, i32 0, i32 4, metadata !"one.cc", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!6 = metadata !{i32 524309, metadata !4, metadata !"", metadata !4, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ] +!llvm.dbg.cu = !{!5} + +!0 = metadata !{i32 786688, metadata !1, metadata !"s1", metadata !4, i32 3, metadata !9, i32 0, null} ; [ DW_TAG_auto_variable ] +!1 = metadata !{i32 786443, metadata !2, i32 3, i32 0} ; [ DW_TAG_lexical_block ] +!2 = metadata !{i32 786443, metadata !3, i32 3, i32 0} ; [ DW_TAG_lexical_block ] +!3 = metadata !{i32 786478, metadata !4, metadata !4, metadata !"bar", metadata !"bar", metadata !"_Z3barv", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i1 false, i32 ()* @_Z3barv, null, null, null, i32 3} ; [ DW_TAG_subprogram ] +!4 = metadata !{i32 786473, metadata !25} ; [ DW_TAG_file_type ] +!5 = metadata !{i32 786449, i32 4, metadata !4, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, null, null, metadata !24, null, metadata !""} ; [ DW_TAG_compile_unit ] +!6 = metadata !{i32 786453, metadata !25, metadata !4, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ] !7 = metadata !{metadata !8} -!8 = metadata !{i32 524324, metadata !4, metadata !"int", metadata !4, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!9 = metadata !{i32 524307, metadata !4, metadata !"S", metadata !10, i32 2, i64 8, i64 8, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_structure_type ] -!10 = metadata !{i32 524329, metadata !"one.h", metadata !"/tmp/", metadata !5} ; [ DW_TAG_file_type ] +!8 = metadata !{i32 786468, metadata !25, metadata !4, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786451, metadata !26, metadata !4, metadata !"S", i32 2, i64 8, i64 8, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_structure_type ] +!10 = metadata !{i32 786473, metadata !26} ; [ DW_TAG_file_type ] !11 = metadata !{metadata !12} -!12 = metadata !{i32 524334, i32 0, metadata !9, metadata !"foo", metadata !"foo", metadata !"_ZN1S3fooEv", metadata !10, i32 3, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!13 = metadata !{i32 524309, metadata !4, metadata !"", metadata !4, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null} ; [ DW_TAG_subroutine_type ] +!12 = metadata !{i32 786478, metadata !10, metadata !9, metadata !"foo", metadata !"foo", metadata !"_ZN1S3fooEv", i32 3, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i1 false, i32 (%struct.S*)* @_ZN1S3fooEv, null, null, null, i32 3} ; [ DW_TAG_subprogram ] +!13 = metadata !{i32 786453, metadata !25, metadata !4, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null} ; [ DW_TAG_subroutine_type ] !14 = metadata !{metadata !8, metadata !15} -!15 = metadata !{i32 524303, metadata !4, metadata !"", metadata !4, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !9} ; [ DW_TAG_pointer_type ] +!15 = metadata !{i32 786447, metadata !25, metadata !4, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 64, metadata !9} ; [ DW_TAG_pointer_type ] !16 = metadata !{i32 3, i32 0, metadata !1, null} !17 = metadata !{i32 3, i32 0, metadata !3, null} -!18 = metadata !{i32 524545, metadata !12, metadata !"this", metadata !10, i32 3, metadata !19} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 524326, metadata !4, metadata !"", metadata !4, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !20} ; [ DW_TAG_const_type ] -!20 = metadata !{i32 524303, metadata !4, metadata !"", metadata !4, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] +!18 = metadata !{i32 786689, metadata !12, metadata !"this", metadata !10, i32 3, metadata !19, i32 0, null} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786470, metadata !25, metadata !4, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 64, metadata !20} ; [ DW_TAG_const_type ] +!20 = metadata !{i32 786447, metadata !25, metadata !4, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] !21 = metadata !{i32 3, i32 0, metadata !12, null} !22 = metadata !{i32 3, i32 0, metadata !23, null} -!23 = metadata !{i32 524299, metadata !12, i32 3, i32 0} ; [ DW_TAG_lexical_block ] +!23 = metadata !{i32 786443, metadata !12, i32 3, i32 0} ; [ DW_TAG_lexical_block ] +!24 = metadata !{metadata !3, metadata !12} +!25 = metadata !{metadata !"one.cc", metadata !"/tmp/"} +!26 = metadata !{metadata !"one.h", metadata !"/tmp/"} diff --git a/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll b/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll index 9bb35fab4fee..accdf8a86cb7 100644 --- a/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll +++ b/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll @@ -25,6 +25,6 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !14 = metadata !{i32 524289, metadata !4, metadata !"", metadata !4, i32 0, i64 8, i64 8, i64 0, i32 0, metadata !15, metadata !16, i32 0, null} ; [ DW_TAG_array_type ] !15 = metadata !{i32 524324, metadata !4, metadata !"char", metadata !4, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] !16 = metadata !{metadata !17} -!17 = metadata !{i32 524321, i64 0, i64 0} ; [ DW_TAG_subrange_type ] +!17 = metadata !{i32 524321, i64 0, i64 1} ; [ DW_TAG_subrange_type ] !18 = metadata !{metadata !"llvm.mdnode.fwdref.19"} !19 = metadata !{metadata !"llvm.mdnode.fwdref.23"} diff --git a/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll b/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll index dd6c5a965eb6..dd98db904509 100644 --- a/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll +++ b/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll @@ -50,40 +50,43 @@ entry: ret i32 %0, !dbg !35 } -!0 = metadata !{i32 524544, metadata !1, metadata !"b", metadata !3, i32 16, metadata !8} ; [ DW_TAG_auto_variable ] -!1 = metadata !{i32 524299, metadata !2, i32 15, i32 12} ; [ DW_TAG_lexical_block ] -!2 = metadata !{i32 524334, i32 0, metadata !3, metadata !"main", metadata !"main", metadata !"main", metadata !3, i32 15, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!3 = metadata !{i32 524329, metadata !"one.cc", metadata !"/tmp", metadata !4} ; [ DW_TAG_file_type ] -!4 = metadata !{i32 524305, i32 0, i32 4, metadata !"one.cc", metadata !"/tmp", metadata !"clang 1.5", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!5 = metadata !{i32 524309, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !6, i32 0, null} ; [ DW_TAG_subroutine_type ] +!llvm.dbg.cu = !{!4} +!37 = metadata !{metadata !2, metadata !10, metadata !23} + +!0 = metadata !{i32 786688, metadata !1, metadata !"b", metadata !3, i32 16, metadata !8, i32 0, null} ; [ DW_TAG_auto_variable ] +!1 = metadata !{i32 786443, metadata !2, i32 15, i32 12} ; [ DW_TAG_lexical_block ] +!2 = metadata !{i32 786478, metadata !3, metadata !"main", metadata !"main", metadata !"main", metadata !3, i32 15, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i1 false, i32 ()* @main, null, null, null, i32 15} ; [ DW_TAG_subprogram ] +!3 = metadata !{i32 786473, metadata !"one.cc", metadata !"/tmp", metadata !4} ; [ DW_TAG_file_type ] +!4 = metadata !{i32 786449, i32 4, metadata !3, metadata !"clang 1.5", i1 false, metadata !"", i32 0, null, null, metadata !37, null, metadata !""} ; [ DW_TAG_compile_unit ] +!5 = metadata !{i32 786453, metadata !3, metadata !3, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !6, i32 0, null} ; [ DW_TAG_subroutine_type ] !6 = metadata !{metadata !7} -!7 = metadata !{i32 524324, metadata !3, metadata !"int", metadata !3, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!8 = metadata !{i32 524290, metadata !3, metadata !"B", metadata !3, i32 2, i64 8, i64 8, i64 0, i32 0, null, metadata !9, i32 0, null} ; [ DW_TAG_class_type ] +!7 = metadata !{i32 786468, metadata !3, metadata !3, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 786434, metadata !3, metadata !3, metadata !"B", i32 2, i64 8, i64 8, i64 0, i32 0, null, metadata !9, i32 0, null} ; [ DW_TAG_class_type ] !9 = metadata !{metadata !10} -!10 = metadata !{i32 524334, i32 0, metadata !8, metadata !"fn", metadata !"fn", metadata !"_ZN1B2fnEv", metadata !3, i32 4, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 524309, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null} ; [ DW_TAG_subroutine_type ] +!10 = metadata !{i32 786478, metadata !8, metadata !"fn", metadata !"fn", metadata !"_ZN1B2fnEv", metadata !3, i32 4, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i1 false, i32 (%class.A*)* @_ZN1B2fnEv, null, null, null, i32 4} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 786453, metadata !3, metadata !3, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null} ; [ DW_TAG_subroutine_type ] !12 = metadata !{metadata !7, metadata !13} -!13 = metadata !{i32 524303, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !8} ; [ DW_TAG_pointer_type ] +!13 = metadata !{i32 786447, metadata !3, metadata !3, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 64, metadata !8} ; [ DW_TAG_pointer_type ] !14 = metadata !{i32 16, i32 5, metadata !1, null} !15 = metadata !{i32 17, i32 3, metadata !1, null} !16 = metadata !{i32 18, i32 1, metadata !2, null} -!17 = metadata !{i32 524545, metadata !10, metadata !"this", metadata !3, i32 4, metadata !13} ; [ DW_TAG_arg_variable ] +!17 = metadata !{i32 786689, metadata !10, metadata !"this", metadata !3, i32 4, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] !18 = metadata !{i32 4, i32 7, metadata !10, null} -!19 = metadata !{i32 524544, metadata !20, metadata !"a", metadata !3, i32 9, metadata !21} ; [ DW_TAG_auto_variable ] -!20 = metadata !{i32 524299, metadata !10, i32 4, i32 12} ; [ DW_TAG_lexical_block ] -!21 = metadata !{i32 524290, metadata !10, metadata !"A", metadata !3, i32 5, i64 8, i64 8, i64 0, i32 0, null, metadata !22, i32 0, null} ; [ DW_TAG_class_type ] +!19 = metadata !{i32 786688, metadata !20, metadata !"a", metadata !3, i32 9, metadata !21, i32 0, null} ; [ DW_TAG_auto_variable ] +!20 = metadata !{i32 786443, metadata !10, i32 4, i32 12} ; [ DW_TAG_lexical_block ] +!21 = metadata !{i32 786434, metadata !3, metadata !10, metadata !"A", i32 5, i64 8, i64 8, i64 0, i32 0, null, metadata !22, i32 0, null} ; [ DW_TAG_class_type ] !22 = metadata !{metadata !23} -!23 = metadata !{i32 524334, i32 0, metadata !21, metadata !"foo", metadata !"foo", metadata !"_ZZN1B2fnEvEN1A3fooEv", metadata !3, i32 7, metadata !24, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!24 = metadata !{i32 524309, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !25, i32 0, null} ; [ DW_TAG_subroutine_type ] +!23 = metadata !{i32 786478, metadata !21, metadata !"foo", metadata !"foo", metadata !"_ZZN1B2fnEvEN1A3fooEv", metadata !3, i32 7, metadata !24, i1 false, i1 true, i32 0, i32 0, null, i1 false, i32 (%class.A*)* @_ZZN1B2fnEvEN1A3fooEv, null, null, null, i32 7} ; [ DW_TAG_subprogram ] +!24 = metadata !{i32 786453, metadata !3, metadata !3, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !25, i32 0, null} ; [ DW_TAG_subroutine_type ] !25 = metadata !{metadata !7, metadata !26} -!26 = metadata !{i32 524303, metadata !3, metadata !"", metadata !3, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !21} ; [ DW_TAG_pointer_type ] +!26 = metadata !{i32 786447, metadata !3, metadata !3, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 64, metadata !21} ; [ DW_TAG_pointer_type ] !27 = metadata !{i32 9, i32 7, metadata !20, null} -!28 = metadata !{i32 524544, metadata !20, metadata !"i", metadata !3, i32 10, metadata !7} ; [ DW_TAG_auto_variable ] +!28 = metadata !{i32 786688, metadata !20, metadata !"i", metadata !3, i32 10, metadata !7, i32 0, null} ; [ DW_TAG_auto_variable ] !29 = metadata !{i32 10, i32 9, metadata !20, null} !30 = metadata !{i32 10, i32 5, metadata !20, null} !31 = metadata !{i32 11, i32 5, metadata !20, null} !32 = metadata !{i32 12, i32 3, metadata !10, null} -!33 = metadata !{i32 524545, metadata !23, metadata !"this", metadata !3, i32 7, metadata !26} ; [ DW_TAG_arg_variable ] +!33 = metadata !{i32 786689, metadata !23, metadata !"this", metadata !3, i32 7, metadata !26, i32 0, null} ; [ DW_TAG_arg_variable ] !34 = metadata !{i32 7, i32 11, metadata !23, null} !35 = metadata !{i32 7, i32 19, metadata !36, null} -!36 = metadata !{i32 524299, metadata !23, i32 7, i32 17} ; [ DW_TAG_lexical_block ] +!36 = metadata !{i32 786443, metadata !23, i32 7, i32 17} ; [ DW_TAG_lexical_block ] diff --git a/test/DebugInfo/2010-04-19-FramePtr.ll b/test/DebugInfo/2010-04-19-FramePtr.ll index 30031219d4ea..f9e90cd1b3d1 100644 --- a/test/DebugInfo/2010-04-19-FramePtr.ll +++ b/test/DebugInfo/2010-04-19-FramePtr.ll @@ -19,12 +19,15 @@ return: ; preds = %entry ret i32 %retval1, !dbg !7 } +!llvm.dbg.cu = !{!3} +!9 = metadata !{metadata !1} + !0 = metadata !{i32 2, i32 0, metadata !1, null} -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"a.c", metadata !"/tmp", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"a.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i32 ()* @foo, null, null, null, i32 2} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !"a.c", metadata !"/tmp", metadata !3} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 1, metadata !2, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, null, null, metadata !9, null, metadata !""} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6} -!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !7 = metadata !{i32 2, i32 0, metadata !8, null} -!8 = metadata !{i32 524299, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] +!8 = metadata !{i32 786443, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] diff --git a/test/DebugInfo/2010-05-03-OriginDIE.ll b/test/DebugInfo/2010-05-03-OriginDIE.ll index 94bddc092f4a..1ade04504631 100644 --- a/test/DebugInfo/2010-05-03-OriginDIE.ll +++ b/test/DebugInfo/2010-05-03-OriginDIE.ll @@ -81,6 +81,6 @@ declare void @uuid_LtoB(i8*, i8*) !30 = metadata !{i32 524310, metadata !3, metadata !"uint32_t", metadata !12, i32 55, i64 0, i64 0, i64 0, i32 0, metadata !31} ; [ DW_TAG_typedef ] !31 = metadata !{i32 524324, metadata !3, metadata !"unsigned int", metadata !3, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] !32 = metadata !{metadata !33} -!33 = metadata !{i32 524321, i64 0, i64 1} ; [ DW_TAG_subrange_type ] +!33 = metadata !{i32 524321, i64 0, i64 2} ; [ DW_TAG_subrange_type ] !34 = metadata !{i32 524544, metadata !24, metadata !"addr", metadata !10, i32 96, metadata !35} ; [ DW_TAG_auto_variable ] !35 = metadata !{i32 524303, metadata !3, metadata !"", metadata !3, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] diff --git a/test/DebugInfo/2010-05-10-MultipleCU.ll b/test/DebugInfo/2010-05-10-MultipleCU.ll index 721b70839fef..75e4389afef8 100644 --- a/test/DebugInfo/2010-05-10-MultipleCU.ll +++ b/test/DebugInfo/2010-05-10-MultipleCU.ll @@ -26,19 +26,23 @@ return: ret i32 21, !dbg !8 } +!llvm.dbg.cu = !{!4, !12} +!16 = metadata !{metadata !2} +!17 = metadata !{metadata !10} + !0 = metadata !{i32 3, i32 0, metadata !1, null} -!1 = metadata !{i32 524299, metadata !2, i32 2, i32 0} ; [ DW_TAG_lexical_block ] -!2 = metadata !{i32 524334, i32 0, metadata !3, metadata !"foo", metadata !"foo", metadata !"foo", metadata !3, i32 2, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [ DW_TAG_subprogram ] -!3 = metadata !{i32 524329, metadata !"a.c", metadata !"/tmp/", metadata !4} ; [ DW_TAG_file_type ] -!4 = metadata !{i32 524305, i32 0, i32 1, metadata !"a.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!5 = metadata !{i32 524309, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !6, i32 0, null} ; [ DW_TAG_subroutine_type ] +!1 = metadata !{i32 786443, metadata !2, i32 2, i32 0} ; [ DW_TAG_lexical_block ] +!2 = metadata !{i32 786478, metadata !3, metadata !"foo", metadata !"foo", metadata !"foo", metadata !3, i32 2, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @foo, null, null, null, i32 0} ; [ DW_TAG_subprogram ] +!3 = metadata !{i32 786473, metadata !"a.c", metadata !"/tmp/", metadata !4} ; [ DW_TAG_file_type ] +!4 = metadata !{i32 786449, i32 1, metadata !3, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, null, null, metadata !16, null, metadata !""} ; [ DW_TAG_compile_unit ] +!5 = metadata !{i32 786453, metadata !3, metadata !"", metadata !3, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !6, i32 0, null} ; [ DW_TAG_subroutine_type ] !6 = metadata !{metadata !7} -!7 = metadata !{i32 524324, metadata !3, metadata !"int", metadata !3, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786468, metadata !3, metadata !"int", metadata !3, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !8 = metadata !{i32 3, i32 0, metadata !9, null} -!9 = metadata !{i32 524299, metadata !10, i32 2, i32 0} ; [ DW_TAG_lexical_block ] -!10 = metadata !{i32 524334, i32 0, metadata !11, metadata !"bar", metadata !"bar", metadata !"bar", metadata !11, i32 2, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 524329, metadata !"b.c", metadata !"/tmp/", metadata !12} ; [ DW_TAG_file_type ] -!12 = metadata !{i32 524305, i32 0, i32 1, metadata !"b.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!13 = metadata !{i32 524309, metadata !11, metadata !"", metadata !11, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null} ; [ DW_TAG_subroutine_type ] +!9 = metadata !{i32 786443, metadata !10, i32 2, i32 0} ; [ DW_TAG_lexical_block ] +!10 = metadata !{i32 786478, metadata !11, metadata !"bar", metadata !"bar", metadata !"bar", metadata !11, i32 2, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @bar, null, null, null, i32 0} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 786473, metadata !"b.c", metadata !"/tmp/", metadata !12} ; [ DW_TAG_file_type ] +!12 = metadata !{i32 786449, i32 1, metadata !11, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, null, null, metadata !17, null, metadata !""} ; [ DW_TAG_compile_unit ] +!13 = metadata !{i32 786453, metadata !11, metadata !"", metadata !11, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null} ; [ DW_TAG_subroutine_type ] !14 = metadata !{metadata !15} -!15 = metadata !{i32 524324, metadata !11, metadata !"int", metadata !11, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!15 = metadata !{i32 786468, metadata !11, metadata !"int", metadata !11, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] diff --git a/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll b/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll index 2557c9c63dea..e44362d4129e 100644 --- a/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll +++ b/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll @@ -21,34 +21,33 @@ entry: ret i32 %1, !dbg !23 } -!llvm.dbg.sp = !{!0, !6} -!llvm.dbg.lv.foo = !{!9, !10} -!llvm.dbg.gv = !{!16} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 9, metadata !3, i1 true, i1 true, i32 0, i32 0, null, i1 false, i1 true, null, null, null, metadata !24} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 524329, metadata !"bar.c", metadata !"/tmp/", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 524305, i32 0, i32 1, metadata !"bar.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"foo", metadata !"foo", metadata !"", metadata !1, i32 9, metadata !3, i1 true, i1 true, i32 0, i32 0, null, i1 false, i1 true, null, null, null, metadata !24, i32 9} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !27} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 1, metadata !1, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, metadata !"", i32 0, null, null, metadata !25, metadata !26, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !27, metadata !1, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] !4 = metadata !{metadata !5, metadata !5} -!5 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 524334, i32 0, metadata !1, metadata !"bar", metadata !"bar", metadata !"bar", metadata !1, i32 14, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 ()* @bar} ; [ DW_TAG_subprogram ] -!7 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{i32 786468, metadata !27, metadata !1, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !1, metadata !"bar", metadata !"bar", metadata !"bar", metadata !1, i32 14, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 true, i32 ()* @bar} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786453, metadata !27, metadata !1, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !5} -!9 = metadata !{i32 524545, metadata !0, metadata !"j", metadata !1, i32 9, metadata !5} ; [ DW_TAG_arg_variable ] -!10 = metadata !{i32 524544, metadata !11, metadata !"xyz", metadata !1, i32 10, metadata !12} ; [ DW_TAG_auto_variable ] -!11 = metadata !{i32 524299, metadata !0, i32 9, i32 0} ; [ DW_TAG_lexical_block ] -!12 = metadata !{i32 524307, metadata !0, metadata !"X", metadata !1, i32 10, i64 64, i64 32, i64 0, i32 0, null, metadata !13, i32 0, null} ; [ DW_TAG_structure_type ] +!9 = metadata !{i32 786689, metadata !0, metadata !"j", metadata !1, i32 9, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] +!10 = metadata !{i32 786688, metadata !11, metadata !"xyz", metadata !1, i32 10, metadata !12, i32 0, null} ; [ DW_TAG_auto_variable ] +!11 = metadata !{i32 786443, metadata !1, metadata !0, i32 9, i32 0, i32 0} ; [ DW_TAG_lexical_block ] +!12 = metadata !{i32 786451, metadata !27, metadata !0, metadata !"X", i32 10, i64 64, i64 32, i64 0, i32 0, null, metadata !13, i32 0, null} ; [ DW_TAG_structure_type ] !13 = metadata !{metadata !14, metadata !15} -!14 = metadata !{i32 524301, metadata !12, metadata !"a", metadata !1, i32 10, i64 32, i64 32, i64 0, i32 0, metadata !5} ; [ DW_TAG_member ] -!15 = metadata !{i32 524301, metadata !12, metadata !"b", metadata !1, i32 10, i64 32, i64 32, i64 32, i32 0, metadata !5} ; [ DW_TAG_member ] -!16 = metadata !{i32 524340, i32 0, metadata !1, metadata !"i", metadata !"i", metadata !"", metadata !1, i32 5, metadata !5, i1 false, i1 true, i32* @i} ; [ DW_TAG_variable ] +!14 = metadata !{i32 786445, metadata !27, metadata !12, metadata !"a", i32 10, i64 32, i64 32, i64 0, i32 0, metadata !5} ; [ DW_TAG_member ] +!15 = metadata !{i32 786445, metadata !27, metadata !12, metadata !"b", i32 10, i64 32, i64 32, i64 32, i32 0, metadata !5} ; [ DW_TAG_member ] +!16 = metadata !{i32 786484, i32 0, metadata !1, metadata !"i", metadata !"i", metadata !"", metadata !1, i32 5, metadata !5, i1 false, i1 true, i32* @i} ; [ DW_TAG_variable ] !17 = metadata !{i32 15, i32 0, metadata !18, null} -!18 = metadata !{i32 524299, metadata !6, i32 14, i32 0} ; [ DW_TAG_lexical_block ] +!18 = metadata !{i32 786443, metadata !1, metadata !6, i32 14, i32 0, i32 1} ; [ DW_TAG_lexical_block ] !19 = metadata !{i32 9, i32 0, metadata !0, metadata !17} !20 = metadata !{null} !21 = metadata !{i32 9, i32 0, metadata !11, metadata !17} !22 = metadata !{i32 11, i32 0, metadata !11, metadata !17} !23 = metadata !{i32 16, i32 0, metadata !18, null} -!24 = metadata !{metadata !25} -!25 = metadata !{metadata !9, metadata !10} - +!24 = metadata !{metadata !9, metadata !10} +!25 = metadata !{metadata !0, metadata !6} +!26 = metadata !{metadata !16} +!27 = metadata !{metadata !"bar.c", metadata !"/tmp/"} diff --git a/test/DebugInfo/2010-10-01-crash.ll b/test/DebugInfo/2010-10-01-crash.ll index e61f63f40d8f..c4161b49426d 100644 --- a/test/DebugInfo/2010-10-01-crash.ll +++ b/test/DebugInfo/2010-10-01-crash.ll @@ -1,4 +1,5 @@ ; RUN: llc -O0 %s -o /dev/null +; XFAIL: hexagon ; PR 8235 define void @CGRectStandardize(i32* sret %agg.result, i32* byval %rect) nounwind ssp { diff --git a/test/DebugInfo/AArch64/cfi-frame.ll b/test/DebugInfo/AArch64/cfi-frame.ll new file mode 100644 index 000000000000..7290ddf357c1 --- /dev/null +++ b/test/DebugInfo/AArch64/cfi-frame.ll @@ -0,0 +1,58 @@ +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -disable-fp-elim < %s | FileCheck %s --check-prefix=CHECK-WITH-FP + +@bigspace = global [8 x i64] zeroinitializer + +declare void @use_addr(i8*) + +define void @test_frame([8 x i64] %val) { +; CHECK: test_frame: +; CHECK: .cfi_startproc + + %var = alloca i8, i32 1000000 +; CHECK: sub sp, sp, #[[SP_INIT_ADJ:[0-9]+]] +; CHECK-NEXT: .Ltmp +; CHECK-NEXT: .cfi_def_cfa sp, [[SP_INIT_ADJ]] + +; Make sure the prologue is reasonably efficient +; CHECK-NEXT: stp x29, x30, [sp, +; CHECK-NEXT: stp x25, x26, [sp, +; CHECK-NEXT: stp x23, x24, [sp, +; CHECK-NEXT: stp x21, x22, [sp, +; CHECK-NEXT: stp x19, x20, [sp, +; CHECK-NEXT: sub sp, sp, #160 +; CHECK-NEXT: sub sp, sp, #244, lsl #12 +; CHECK-NEXT: .Ltmp +; CHECK-NEXT: .cfi_def_cfa sp, 1000080 +; CHECK-NEXT: .Ltmp +; CHECK-NEXT: .cfi_offset x30, -8 +; CHECK-NEXT: .Ltmp +; CHECK-NEXT: .cfi_offset x29, -16 +; [...] +; CHECK: .cfi_offset x19, -80 + +; CHECK: bl use_addr + call void @use_addr(i8* %var) + + store [8 x i64] %val, [8 x i64]* @bigspace + ret void +; CHECK: ret +; CHECK: .cfi_endproc +} + +; CHECK-WITH-FP: test_frame: + +; CHECK-WITH-FP: sub sp, sp, #[[SP_INIT_ADJ:[0-9]+]] +; CHECK-WITH-FP-NEXT: .Ltmp +; CHECK-WITH-FP-NEXT: .cfi_def_cfa sp, [[SP_INIT_ADJ]] + +; CHECK-WITH-FP: stp x29, x30, [sp, [[OFFSET:#[0-9]+]]] +; CHECK-WITH-FP-NEXT: add x29, sp, [[OFFSET]] +; CHECK-WITH-FP-NEXT: .Ltmp +; CHECK-WITH-FP-NEXT: .cfi_def_cfa x29, 16 + + ; We shouldn't emit any kind of update for the second stack adjustment if the + ; FP is in use. +; CHECK-WITH-FP-NOT: .cfi_def_cfa_offset + +; CHECK-WITH-FP: bl use_addr diff --git a/test/DebugInfo/AArch64/dwarfdump.ll b/test/DebugInfo/AArch64/dwarfdump.ll new file mode 100644 index 000000000000..673c789fe62c --- /dev/null +++ b/test/DebugInfo/AArch64/dwarfdump.ll @@ -0,0 +1,34 @@ +; RUN: llc -mtriple=aarch64-non-linux-gnu < %s -filetype=obj | llvm-dwarfdump - | FileCheck %s + +; We're mostly checking that relocations are applied correctly +; here. Currently R_AARCH64_ABS32 is used for references to debug data +; and R_AARCH64_ABS64 is used for program addresses. + +; A couple of ABS32s, both at 0 and elsewhere, interpreted correctly: + +; CHECK: DW_AT_producer [DW_FORM_strp] ( .debug_str[0x00000000] = "clang version 3.3 ") +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000013] = "tmp.c") + +; A couple of ABS64s similarly: + +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; CHECK: DW_AT_high_pc [DW_FORM_addr] (0x0000000000000008) + +define i32 @main() nounwind { + ret i32 0, !dbg !8 +} + +attributes #0 = { nounwind } + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !9, i32 12, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !2, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/timnor01/llvm/build/tmp.c] [DW_LANG_C99] +!1 = metadata !{i32 0} +!2 = metadata !{metadata !3} +!3 = metadata !{i32 786478, metadata !4, metadata !"main", metadata !"main", metadata !"", metadata !4, i32 1, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [main] +!4 = metadata !{i32 786473, metadata !9} ; [ DW_TAG_file_type ] +!5 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !6, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!6 = metadata !{metadata !7} +!7 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!8 = metadata !{i32 2, i32 0, metadata !3, null} +!9 = metadata !{metadata !"tmp.c", metadata !"/home/tim/llvm/build"} diff --git a/test/DebugInfo/AArch64/eh_frame.ll b/test/DebugInfo/AArch64/eh_frame.ll new file mode 100644 index 000000000000..2539c56fa123 --- /dev/null +++ b/test/DebugInfo/AArch64/eh_frame.ll @@ -0,0 +1,51 @@ +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu %s -filetype=obj -o %t +; RUN: llvm-objdump -s %t | FileCheck %s +@var = global i32 0 + +declare void @bar() + +define i64 @check_largest_class(i32 %in) { + %res = load i32* @var + call void @bar() + %ext = zext i32 %res to i64 + ret i64 %ext +} + +; The really key points we're checking here are: +; * Return register is x30. +; * Pointer format is 0x1b (GNU doesn't appear to understand others). + +; The rest is largely incidental, but not expected to change regularly. + +; Output is: + +; CHECK: Contents of section .eh_frame: +; CHECK-NEXT: 0000 10000000 00000000 017a5200 017c1e01 .........zR..|.. +; CHECK-NEXT: 0010 1b0c1f00 18000000 18000000 00000000 ................ + + +; Won't check the rest, it's rather incidental. +; 0020 24000000 00440c1f 10449e02 93040000 $....D...D...... + + +; The first CIE: +; ------------------- +; 10000000: length of first CIE = 0x10 +; 00000000: This is a CIE +; 01: version = 0x1 +; 7a 52 00: augmentation string "zR" -- pointer format is specified +; 01: code alignment factor 1 +; 7c: data alignment factor -4 +; 1e: return address register 30 (== x30). +; 01: 1 byte of augmentation +; 1b: pointer format 1b: DW_EH_PE_pcrel | DW_EH_PE_sdata4 +; 0c 1f 00: initial instructions: "DW_CFA_def_cfa x31 ofs 0" in this case + +; Next the FDE: +; ------------- +; 18000000: FDE length 0x18 +; 18000000: Uses CIE 0x18 backwards (only coincidentally same as above) +; 00000000: PC begin for this FDE is at 00000000 (relocation is applied here) +; 24000000: FDE applies up to PC begin+0x24 +; 00: Augmentation string length 0 for this FDE +; Rest: call frame instructions diff --git a/test/DebugInfo/AArch64/eh_frame_personality.ll b/test/DebugInfo/AArch64/eh_frame_personality.ll new file mode 100644 index 000000000000..d35f2a2fcafb --- /dev/null +++ b/test/DebugInfo/AArch64/eh_frame_personality.ll @@ -0,0 +1,46 @@ +; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu %s -filetype=obj -o %t +; RUN: llvm-objdump -s %t | FileCheck %s + +declare i32 @__gxx_personality_v0(...) + +declare void @bar() + +define i64 @foo(i64 %lhs, i64 %rhs) { + invoke void @bar() to label %end unwind label %clean +end: + ret i64 0 + +clean: + %tst = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) cleanup + ret i64 42 +} + +; CHECK: Contents of section .eh_frame: +; CHECK: 0000 1c000000 00000000 017a504c 5200017c .........zPLR..| +; CHECK: 0010 1e0b0000 00000000 00000000 1b0c1f00 ................ + +; Don't really care about the rest: + +; 0020 1c000000 24000000 00000000 24000000 ....$.......$... +; 0030 08000000 00000000 00440c1f 10449e02 .........D...D.. + +; The key test here is that the personality routine is sanely encoded (under the +; small memory model it must be an 8-byte value for full generality: code+data < +; 4GB, but you might need both +4GB and -4GB depending on where things end +; up. However, for completeness: + +; First CIE: +; ---------- +; 1c000000: Length = 0x1c +; 00000000: This is a CIE +; 01: Version 1 +; 7a 50 4c 52 00: Augmentation string "zPLR" (personality routine, language-specific data, pointer format) +; 01: Code alignment factor 1 +; 78: Data alignment factor: -8 +; 1e: Return address in x30 +; 07: Augmentation data 0xb bytes (this is key!) +; 00: Personality encoding is DW_EH_PE_absptr +; 00 00 00 00 00 00 00 00: First part of aug (personality routine). Relocated, obviously +; 00: Second part of aug (language-specific data): absolute pointer format used +; 1b: pointer format: pc-relative signed 4-byte. Just like GNU. +; 0c 1f 00: Initial instructions ("DW_CFA_def_cfa x31 ofs 0" in this case) diff --git a/test/DebugInfo/AArch64/lit.local.cfg b/test/DebugInfo/AArch64/lit.local.cfg new file mode 100644 index 000000000000..c5ce2411ed48 --- /dev/null +++ b/test/DebugInfo/AArch64/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.ll', '.c', '.cpp'] + +targets = set(config.root.targets_to_build.split()) +if not 'AArch64' in targets: + config.unsupported = True + diff --git a/test/DebugInfo/AArch64/variable-loc.ll b/test/DebugInfo/AArch64/variable-loc.ll new file mode 100644 index 000000000000..ac3037e04b4b --- /dev/null +++ b/test/DebugInfo/AArch64/variable-loc.ll @@ -0,0 +1,98 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -disable-fp-elim < %s | FileCheck %s + +; This is a regression test making sure the location of variables is correct in +; debugging information, even if they're addressed via the frame pointer. + +; In case it needs, regenerating, the following suffices: +; int printf(const char *, ...); +; void populate_array(int *, int); +; int sum_array(int *, int); + +; int main() { +; int main_arr[100], val; +; populate_array(main_arr, 100); +; val = sum_array(main_arr, 100); +; printf("Total is %d\n", val); +; return 0; +; } + + ; First make sure main_arr is where we expect it: sp + 12 == x29 - 420: +; CHECK: main: +; CHECK: sub sp, sp, #448 +; CHECK: stp x29, x30, [sp, #432] +; CHECK: add x29, sp, #432 +; CHECK: add {{x[0-9]+}}, sp, #12 + + ; Now check the debugging information reflects this: +; CHECK: DW_TAG_variable +; CHECK-NEXT: .word .Linfo_string7 + + ; Rather hard-coded, but 145 => DW_OP_fbreg and the .ascii is LEB128 encoded -420. +; CHECK: DW_AT_location +; CHECK-NEXT: .byte 145 +; CHECK-NEXT: .ascii "\334|" + +; CHECK: .Linfo_string7: +; CHECK-NEXT: main_arr + + +target datalayout = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-f32:32:32-f64:64:64-f128:128:128-n32:64-S128" +target triple = "aarch64-none-linux-gnu" + +@.str = private unnamed_addr constant [13 x i8] c"Total is %d\0A\00", align 1 + +declare void @populate_array(i32*, i32) nounwind + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +declare i32 @sum_array(i32*, i32) nounwind + +define i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + %main_arr = alloca [100 x i32], align 4 + %val = alloca i32, align 4 + store i32 0, i32* %retval + call void @llvm.dbg.declare(metadata !{[100 x i32]* %main_arr}, metadata !17), !dbg !22 + call void @llvm.dbg.declare(metadata !{i32* %val}, metadata !23), !dbg !24 + %arraydecay = getelementptr inbounds [100 x i32]* %main_arr, i32 0, i32 0, !dbg !25 + call void @populate_array(i32* %arraydecay, i32 100), !dbg !25 + %arraydecay1 = getelementptr inbounds [100 x i32]* %main_arr, i32 0, i32 0, !dbg !26 + %call = call i32 @sum_array(i32* %arraydecay1, i32 100), !dbg !26 + store i32 %call, i32* %val, align 4, !dbg !26 + %0 = load i32* %val, align 4, !dbg !27 + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0), i32 %0), !dbg !27 + ret i32 0, !dbg !28 +} + +declare i32 @printf(i8*, ...) + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !29, i32 12, metadata !"clang version 3.2 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/timnor01/a64-trunk/build/simple.c] [DW_LANG_C99] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !11, metadata !14} +!5 = metadata !{i32 786478, metadata !6, metadata !"populate_array", metadata !"populate_array", metadata !"", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32*, i32)* @populate_array, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [populate_array] +!6 = metadata !{i32 786473, metadata !29} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{null, metadata !9, metadata !10} +!9 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!10 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!11 = metadata !{i32 786478, metadata !6, metadata !"sum_array", metadata !"sum_array", metadata !"", metadata !6, i32 9, metadata !12, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32*, i32)* @sum_array, null, null, metadata !1, i32 9} ; [ DW_TAG_subprogram ] [line 9] [def] [sum_array] +!12 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !13, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!13 = metadata !{metadata !10, metadata !9, metadata !10} +!14 = metadata !{i32 786478, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 18, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !1, i32 18} ; [ DW_TAG_subprogram ] [line 18] [def] [main] +!15 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !16, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!16 = metadata !{metadata !10} +!17 = metadata !{i32 786688, metadata !18, metadata !"main_arr", metadata !6, i32 19, metadata !19, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [main_arr] [line 19] +!18 = metadata !{i32 786443, metadata !6, metadata !14, i32 18, i32 16, i32 4} ; [ DW_TAG_lexical_block ] [/home/timnor01/a64-trunk/build/simple.c] +!19 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 3200, i64 32, i32 0, i32 0, metadata !10, metadata !20, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 3200, align 32, offset 0] [from int] +!20 = metadata !{i32 786465, i64 0, i64 99} ; [ DW_TAG_subrange_type ] [0, 99] +!22 = metadata !{i32 19, i32 7, metadata !18, null} +!23 = metadata !{i32 786688, metadata !18, metadata !"val", metadata !6, i32 20, metadata !10, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [val] [line 20] +!24 = metadata !{i32 20, i32 7, metadata !18, null} +!25 = metadata !{i32 22, i32 3, metadata !18, null} +!26 = metadata !{i32 23, i32 9, metadata !18, null} +!27 = metadata !{i32 24, i32 3, metadata !18, null} +!28 = metadata !{i32 26, i32 3, metadata !18, null} +!29 = metadata !{metadata !"simple.c", metadata !"/home/timnor01/a64-trunk/build"} diff --git a/test/DebugInfo/Inputs/dwarfdump-inl-test.cc b/test/DebugInfo/Inputs/dwarfdump-inl-test.cc new file mode 100644 index 000000000000..8ffbb528f2a9 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-inl-test.cc @@ -0,0 +1,15 @@ +#include "dwarfdump-inl-test.h" +static inline int inlined_f() { + volatile int x = inlined_g(); + return x; +} + +int main() { + return inlined_f(); +} + +// Built with Clang 3.2 +// $ mkdir -p /tmp/dbginfo +// $ cp dwarfdump-inl-test.* /tmp/dbginfo +// $ cd /tmp/dbginfo +// $ clang++ -O2 -gline-tables-only -fsanitize=address -fPIC -shared dwarfdump-inl-test.cc -o <output> diff --git a/test/DebugInfo/Inputs/dwarfdump-inl-test.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-inl-test.elf-x86-64 Binary files differindex 9a1d5383caac..6df03dad95a7 100755 --- a/test/DebugInfo/Inputs/dwarfdump-inl-test.elf-x86-64 +++ b/test/DebugInfo/Inputs/dwarfdump-inl-test.elf-x86-64 diff --git a/test/DebugInfo/Inputs/dwarfdump-inl-test.h b/test/DebugInfo/Inputs/dwarfdump-inl-test.h new file mode 100644 index 000000000000..ecc2aaac0994 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-inl-test.h @@ -0,0 +1,9 @@ +inline int inlined_h() { + volatile int z = 0; + return z; +} + +inline int inlined_g() { + volatile int y = inlined_h(); + return y; +} diff --git a/test/DebugInfo/Inputs/dwarfdump-pubnames.cc b/test/DebugInfo/Inputs/dwarfdump-pubnames.cc new file mode 100644 index 000000000000..284755bd940f --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-pubnames.cc @@ -0,0 +1,32 @@ +// Object file built using: +// clang -g -mllvm -generate-dwarf-pubnames -o dwarfdump-pubnames.elf-x86_64 \ +// dwarfdump-pubnames.cc -c + +struct C { + void member_function(); + static int static_member_function(); + static int static_member_variable; +}; + +int C::static_member_variable = 0; + +void C::member_function() { + static_member_variable = 0; +} + +int C::static_member_function() { + return static_member_variable; +} + +C global_variable; + +int global_function() { + return -1; +} + +namespace ns { + void global_namespace_function() { + global_variable.member_function(); + } + int global_namespace_variable = 1; +} diff --git a/test/DebugInfo/Inputs/dwarfdump-pubnames.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-pubnames.elf-x86-64 Binary files differnew file mode 100644 index 000000000000..3c9c1ad56b38 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-pubnames.elf-x86-64 diff --git a/test/DebugInfo/Inputs/dwarfdump-test-32bit.elf.c b/test/DebugInfo/Inputs/dwarfdump-test-32bit.elf.c new file mode 100644 index 000000000000..708e037f4e31 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test-32bit.elf.c @@ -0,0 +1,14 @@ +// clang -c -g -o dwarfdump-test-32bit.elf.o -m32 dwarfdump-test-32bit.elf.c + +extern int glob; + +int foo(int arg) { + int a = arg * 2; + return a + glob; +} + +int bar(int arg) { + int a = foo(arg) * foo(arg * 2); + return glob - foo(a); +} + diff --git a/test/DebugInfo/Inputs/dwarfdump-test-32bit.elf.o b/test/DebugInfo/Inputs/dwarfdump-test-32bit.elf.o Binary files differnew file mode 100644 index 000000000000..817665e6a708 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test-32bit.elf.o diff --git a/test/DebugInfo/Inputs/dwarfdump-test.cc b/test/DebugInfo/Inputs/dwarfdump-test.cc new file mode 100644 index 000000000000..408999864907 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test.cc @@ -0,0 +1,23 @@ +class DummyClass { + int a_; + public: + DummyClass(int a) : a_(a) {} + int add(int b) { + return a_ + b; + } +}; + +int f(int a, int b) { + DummyClass c(a); + return c.add(b); +} + +int main() { + return f(2, 3); +} + +// Built with Clang 3.2: +// $ mkdir -p /tmp/dbginfo +// $ cp dwarfdump-test.cc /tmp/dbginfo +// $ cd /tmp/dbginfo +// $ clang++ -g dwarfdump-test.cc -o <output> diff --git a/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64 Binary files differindex fe20c8e59667..455dd1ce4fc2 100755 --- a/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64 +++ b/test/DebugInfo/Inputs/dwarfdump-test.elf-x86-64 diff --git a/test/DebugInfo/Inputs/dwarfdump-test2-helper.cc b/test/DebugInfo/Inputs/dwarfdump-test2-helper.cc new file mode 100644 index 000000000000..7d9264050bd9 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test2-helper.cc @@ -0,0 +1,3 @@ +extern "C" int a() { + return 0; +} diff --git a/test/DebugInfo/Inputs/dwarfdump-test2-main.cc b/test/DebugInfo/Inputs/dwarfdump-test2-main.cc new file mode 100644 index 000000000000..b327674ab792 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test2-main.cc @@ -0,0 +1,11 @@ +extern "C" int a(); + +int main() { + return a(); +} + +// Built with gcc 4.6.3 +// $ mkdir -p /tmp/dbginfo +// $ cp dwarfdump-test2-helper.cc dwarfdump-test2-main.cc /tmp/dbginfo/ +// $ cd /tmp/dbginfo +// $ g++ -g dwarfdump-test2-helper.cc dwarfdump-test2-main.cc -o <output> diff --git a/test/DebugInfo/Inputs/dwarfdump-test2.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-test2.elf-x86-64 Binary files differindex ce4af7fd06bc..6f362ad62cf1 100755 --- a/test/DebugInfo/Inputs/dwarfdump-test2.elf-x86-64 +++ b/test/DebugInfo/Inputs/dwarfdump-test2.elf-x86-64 diff --git a/test/DebugInfo/Inputs/dwarfdump-test3-decl.h b/test/DebugInfo/Inputs/dwarfdump-test3-decl.h new file mode 100644 index 000000000000..4a79e959b0ce --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test3-decl.h @@ -0,0 +1,7 @@ +#include "dwarfdump-test3-decl2.h" + +class C { + explicit C(bool a = false, bool b = false); +}; + +void do1() {} diff --git a/test/DebugInfo/Inputs/dwarfdump-test3-decl2.h b/test/DebugInfo/Inputs/dwarfdump-test3-decl2.h new file mode 100644 index 000000000000..9c92d56fcf4e --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test3-decl2.h @@ -0,0 +1 @@ +void do2() { } diff --git a/test/DebugInfo/Inputs/dwarfdump-test3.cc b/test/DebugInfo/Inputs/dwarfdump-test3.cc new file mode 100644 index 000000000000..7b4d7ea71180 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test3.cc @@ -0,0 +1,12 @@ +#include "dwarfdump-test3-decl.h" + +C::C(bool a, bool b) {} + +// Built with gcc 4.6.3 +// $ mkdir -p /tmp/dbginfo/include +// $ mkdir -p /tmp/include +// $ cp dwarfdump-test3.cc /tmp/dbginfo +// $ cp dwarfdump-test3-decl.h /tmp/include +// $ cp dwarfdump-test3-decl2.h /tmp/dbginfo/include +// $ cd /tmp/dbginfo +// $ gcc dwarfdump-test3.cc -g -I/tmp/include -Iinclude -fPIC -shared -o <output> diff --git a/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 Binary files differdeleted file mode 100755 index 7c1730462055..000000000000 --- a/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 +++ /dev/null diff --git a/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 space b/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 space Binary files differnew file mode 100755 index 000000000000..7330cd8baa1e --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 space diff --git a/test/DebugInfo/Inputs/dwarfdump-test4-decl.h b/test/DebugInfo/Inputs/dwarfdump-test4-decl.h new file mode 100644 index 000000000000..9abd875415d6 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test4-decl.h @@ -0,0 +1 @@ +inline void a(){} diff --git a/test/DebugInfo/Inputs/dwarfdump-test4-part1.cc b/test/DebugInfo/Inputs/dwarfdump-test4-part1.cc new file mode 100644 index 000000000000..94a818cddd5f --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test4-part1.cc @@ -0,0 +1,8 @@ +#include "dwarfdump-test4-decl.h" +int c(){a();} + +// Built with gcc 4.6.3 +// $ mkdir -p /tmp/dbginfo +// $ cp dwarfdump-test4-*.* /tmp/dbginfo +// $ cd /tmp/dbginfo +// $ gcc -fPIC -shared -g dwarfdump-test4-part*.cc -o <output> diff --git a/test/DebugInfo/Inputs/dwarfdump-test4-part2.cc b/test/DebugInfo/Inputs/dwarfdump-test4-part2.cc new file mode 100644 index 000000000000..2a1936f0b3d4 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-test4-part2.cc @@ -0,0 +1,2 @@ +#include "dwarfdump-test4-decl.h" +int d(){a();} diff --git a/test/DebugInfo/Inputs/dwarfdump-test4.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-test4.elf-x86-64 Binary files differindex 884870859d98..a1dd8b91baa2 100755 --- a/test/DebugInfo/Inputs/dwarfdump-test4.elf-x86-64 +++ b/test/DebugInfo/Inputs/dwarfdump-test4.elf-x86-64 diff --git a/test/CodeGen/CellSPU/useful-harnesses/lit.local.cfg b/test/DebugInfo/Inputs/lit.local.cfg index e6f55eef7af5..e6f55eef7af5 100644 --- a/test/CodeGen/CellSPU/useful-harnesses/lit.local.cfg +++ b/test/DebugInfo/Inputs/lit.local.cfg diff --git a/test/DebugInfo/Inputs/test-inline.o b/test/DebugInfo/Inputs/test-inline.o Binary files differnew file mode 100644 index 000000000000..a650c91725d9 --- /dev/null +++ b/test/DebugInfo/Inputs/test-inline.o diff --git a/test/DebugInfo/Inputs/test-parameters.o b/test/DebugInfo/Inputs/test-parameters.o Binary files differnew file mode 100644 index 000000000000..7f4b6702df2e --- /dev/null +++ b/test/DebugInfo/Inputs/test-parameters.o diff --git a/test/DebugInfo/X86/2010-04-13-PubType.ll b/test/DebugInfo/X86/2010-04-13-PubType.ll index 559f032cb3a6..5169647fa41d 100644 --- a/test/DebugInfo/X86/2010-04-13-PubType.ll +++ b/test/DebugInfo/X86/2010-04-13-PubType.ll @@ -28,20 +28,24 @@ return: ; preds = %entry declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone -!0 = metadata !{i32 524545, metadata !1, metadata !"x", metadata !2, i32 7, metadata !7} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 7, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"a.c", metadata !"/tmp/", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"a.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!llvm.dbg.cu = !{!3} + +!0 = metadata !{i32 786689, metadata !1, metadata !"x", metadata !2, i32 7, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 7, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 (%struct.X*, %struct.Y*)* @foo, null, null, null, i32 7} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !18} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 1, metadata !2, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 false, metadata !"", i32 0, null, null, metadata !17, null, metadata !""} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !18, metadata !2, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6, metadata !7, metadata !9} -!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] -!8 = metadata !{i32 524307, metadata !2, metadata !"X", metadata !2, i32 3, i64 0, i64 0, i64 0, i32 4, null, null, i32 0, null} ; [ DW_TAG_structure_type ] -!9 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] -!10 = metadata !{i32 524307, metadata !2, metadata !"Y", metadata !2, i32 4, i64 32, i64 32, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_structure_type ] +!6 = metadata !{i32 786468, metadata !18, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786447, metadata !18, metadata !2, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] +!8 = metadata !{i32 786451, metadata !18, metadata !2, metadata !"X", i32 3, i64 0, i64 0, i64 0, i32 4, null, null, i32 0, null} ; [ DW_TAG_structure_type ] +!9 = metadata !{i32 786447, metadata !18, metadata !2, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] +!10 = metadata !{i32 786451, metadata !18, metadata !2, metadata !"Y", i32 4, i64 32, i64 32, i64 0, i32 0, null, metadata !11, i32 0, null} ; [ DW_TAG_structure_type ] !11 = metadata !{metadata !12} -!12 = metadata !{i32 524301, metadata !10, metadata !"x", metadata !2, i32 5, i64 32, i64 32, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] +!12 = metadata !{i32 786445, metadata !18, metadata !10, metadata !"x", i32 5, i64 32, i64 32, i64 0, i32 0, metadata !6} ; [ DW_TAG_member ] !13 = metadata !{i32 7, i32 0, metadata !1, null} -!14 = metadata !{i32 524545, metadata !1, metadata !"y", metadata !2, i32 7, metadata !9} ; [ DW_TAG_arg_variable ] +!14 = metadata !{i32 786689, metadata !1, metadata !"y", metadata !2, i32 7, metadata !9, i32 0, null} ; [ DW_TAG_arg_variable ] !15 = metadata !{i32 7, i32 0, metadata !16, null} -!16 = metadata !{i32 524299, metadata !1, i32 7, i32 0} ; [ DW_TAG_lexical_block ] +!16 = metadata !{i32 786443, metadata !1, i32 7, i32 0} ; [ DW_TAG_lexical_block ] +!17 = metadata !{metadata !1} +!18 = metadata !{metadata !"a.c", metadata !"/tmp/"} diff --git a/test/DebugInfo/X86/2010-08-10-DbgConstant.ll b/test/DebugInfo/X86/2010-08-10-DbgConstant.ll new file mode 100644 index 000000000000..d05dfc6c32be --- /dev/null +++ b/test/DebugInfo/X86/2010-08-10-DbgConstant.ll @@ -0,0 +1,28 @@ +; RUN: llc -mtriple=i686-linux -O0 -filetype=obj -o %t %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; CHECK: DW_TAG_constant [4] +; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000002c] = "ro") + +define void @foo() nounwind ssp { +entry: + call void @bar(i32 201), !dbg !8 + ret void, !dbg !8 +} + +declare void @bar(i32) + +!llvm.dbg.cu = !{!2} + +!0 = metadata !{i32 786478, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, void ()* @foo, null, null, null, i32 3} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !12} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !12, i32 12, metadata !"clang 2.8", i1 false, metadata !"", i32 0, null, null, metadata !10, metadata !11, metadata !""} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ] +!4 = metadata !{null} +!5 = metadata !{i32 786471, i32 0, metadata !1, metadata !"ro", metadata !"ro", metadata !"ro", metadata !1, i32 1, metadata !6, i1 true, i1 true, i32 201, null} ; [ DW_TAG_constant ] +!6 = metadata !{i32 786470, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !7} ; [ DW_TAG_const_type ] +!7 = metadata !{i32 786468, metadata !1, metadata !"unsigned int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 3, i32 14, metadata !9, null} +!9 = metadata !{i32 786443, metadata !0, i32 3, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!10 = metadata !{metadata !0} +!11 = metadata !{metadata !5} +!12 = metadata !{metadata !"/tmp/l.c", metadata !"/Volumes/Lalgate/clean/D"} diff --git a/test/DebugInfo/X86/2011-09-26-GlobalVarContext.ll b/test/DebugInfo/X86/2011-09-26-GlobalVarContext.ll index 934fa81435ad..ad55db05a70e 100644 --- a/test/DebugInfo/X86/2011-09-26-GlobalVarContext.ll +++ b/test/DebugInfo/X86/2011-09-26-GlobalVarContext.ll @@ -1,4 +1,5 @@ -; RUN: llc -mtriple=x86_64-pc-linux-gnu -asm-verbose %s -o - | FileCheck %s +; RUN: llc -mtriple=x86_64-pc-linux-gnu %s -o %t -filetype=obj +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; ModuleID = 'test.c' @@ -17,31 +18,32 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"test.c", metadata !"/work/llvm/vanilla/test/DebugInfo", metadata !"clang version 3.0 (trunk)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"f", metadata !"f", metadata !"", metadata !6, i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @f, null, null, metadata !10} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 720937, metadata !"test.c", metadata !"/work/llvm/vanilla/test/DebugInfo", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !20, i32 12, metadata !"clang version 3.0 (trunk)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 720942, metadata !6, metadata !6, metadata !"f", metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @f, null, null, metadata !10} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 720937, metadata !20} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9} -!9 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !10 = metadata !{metadata !11} !11 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!12 = metadata !{metadata !13} -!13 = metadata !{metadata !14} -!14 = metadata !{i32 720948, i32 0, null, metadata !"GLB", metadata !"GLB", metadata !"", metadata !6, i32 1, metadata !9, i32 0, i32 1, i32* @GLB} ; [ DW_TAG_variable ] -!15 = metadata !{i32 721152, metadata !16, metadata !"LOC", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] -!16 = metadata !{i32 720907, metadata !5, i32 3, i32 9, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!12 = metadata !{metadata !14} +!14 = metadata !{i32 720948, i32 0, null, metadata !"GLB", metadata !"GLB", metadata !"", metadata !6, i32 1, metadata !9, i32 0, i32 1, i32* @GLB, null} ; [ DW_TAG_variable ] +!15 = metadata !{i32 786688, metadata !16, metadata !"LOC", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] +!16 = metadata !{i32 786443, metadata !20, metadata !5, i32 3, i32 9, i32 0} ; [ DW_TAG_lexical_block ] !17 = metadata !{i32 4, i32 9, metadata !16, null} !18 = metadata !{i32 4, i32 23, metadata !16, null} !19 = metadata !{i32 5, i32 5, metadata !16, null} +!20 = metadata !{metadata !"test.c", metadata !"/work/llvm/vanilla/test/DebugInfo"} -; CHECK: .long .Lstring3 -; CHECK: .byte 1 -; CHECK: .byte 1 +; CHECK: DW_TAG_variable [3] +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000043] = "GLB") +; CHECK: DW_AT_decl_file [DW_FORM_data1] (0x01) +; CHECK: DW_AT_decl_line [DW_FORM_data1] (0x01) + +; CHECK: DW_TAG_variable [6] +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000004d] = "LOC") +; CHECK: DW_AT_decl_file [DW_FORM_data1] (0x01) +; CHECK: DW_AT_decl_line [DW_FORM_data1] (0x04) -; CHECK: .long .Lstring6 -; CHECK: .byte 1 -; CHECK: .byte 4 diff --git a/test/DebugInfo/X86/2011-12-16-BadStructRef.ll b/test/DebugInfo/X86/2011-12-16-BadStructRef.ll index 6e201695636e..e248aa60295e 100644 --- a/test/DebugInfo/X86/2011-12-16-BadStructRef.ll +++ b/test/DebugInfo/X86/2011-12-16-BadStructRef.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-macosx10.7 %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: b_ref ; CHECK-NOT: AT_bit_size @@ -88,53 +88,50 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 4, metadata !"main.cpp", metadata !"/Users/echristo/tmp/bad-struct-ref", metadata !"clang version 3.1 (trunk 146596)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !3, metadata !27, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !9} -!5 = metadata !{i32 720898, null, metadata !"bar", metadata !6, i32 9, i64 128, i64 64, i32 0, i32 0, null, metadata !7, i32 0, null, null} ; [ DW_TAG_class_type ] -!6 = metadata !{i32 720937, metadata !"main.cpp", metadata !"/Users/echristo/tmp/bad-struct-ref", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 720913, i32 4, metadata !6, metadata !"clang version 3.1 (trunk 146596)", i1 false, metadata !"", i32 0, metadata !1, metadata !3, metadata !27, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !9} +!5 = metadata !{i32 720898, metadata !82, null, metadata !"bar", i32 9, i64 128, i64 64, i32 0, i32 0, null, metadata !7, i32 0, null, null} ; [ DW_TAG_class_type ] +!6 = metadata !{i32 720937, metadata !82} ; [ DW_TAG_file_type ] !7 = metadata !{metadata !8, metadata !19, metadata !21} -!8 = metadata !{i32 720909, metadata !5, metadata !"b", metadata !6, i32 11, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] -!9 = metadata !{i32 720898, null, metadata !"baz", metadata !6, i32 3, i64 32, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null} ; [ DW_TAG_class_type ] +!8 = metadata !{i32 720909, metadata !82, metadata !5, metadata !"b", i32 11, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] +!9 = metadata !{i32 720898, metadata !82, null, metadata !"baz", i32 3, i64 32, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null} ; [ DW_TAG_class_type ] !10 = metadata !{metadata !11, metadata !13} -!11 = metadata !{i32 720909, metadata !9, metadata !"h", metadata !6, i32 5, i64 32, i64 32, i64 0, i32 0, metadata !12} ; [ DW_TAG_member ] -!12 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!13 = metadata !{i32 720942, i32 0, metadata !9, metadata !"baz", metadata !"baz", metadata !"", metadata !6, i32 6, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !17} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 720909, metadata !82, metadata !9, metadata !"h", i32 5, i64 32, i64 32, i64 0, i32 0, metadata !12} ; [ DW_TAG_member ] +!12 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!13 = metadata !{i32 720942, metadata !6, metadata !9, metadata !"baz", metadata !"baz", metadata !"", i32 6, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !17} ; [ DW_TAG_subprogram ] !14 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !15, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !15 = metadata !{null, metadata !16, metadata !12} !16 = metadata !{i32 720911, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !9} ; [ DW_TAG_pointer_type ] !17 = metadata !{metadata !18} !18 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!19 = metadata !{i32 720909, metadata !5, metadata !"b_ref", metadata !6, i32 12, i64 64, i64 64, i64 64, i32 0, metadata !20} ; [ DW_TAG_member ] +!19 = metadata !{i32 720909, metadata !82, metadata !5, metadata !"b_ref", i32 12, i64 64, i64 64, i64 64, i32 0, metadata !20} ; [ DW_TAG_member ] !20 = metadata !{i32 720912, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_reference_type ] -!21 = metadata !{i32 720942, i32 0, metadata !5, metadata !"bar", metadata !"bar", metadata !"", metadata !6, i32 13, metadata !22, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !25} ; [ DW_TAG_subprogram ] +!21 = metadata !{i32 720942, metadata !6, metadata !5, metadata !"bar", metadata !"bar", metadata !"", i32 13, metadata !22, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !25} ; [ DW_TAG_subprogram ] !22 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !23, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !23 = metadata !{null, metadata !24, metadata !12} !24 = metadata !{i32 720911, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !5} ; [ DW_TAG_pointer_type ] !25 = metadata !{metadata !26} !26 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!27 = metadata !{metadata !28} -!28 = metadata !{metadata !29, metadata !37, metadata !40, metadata !43, metadata !46} -!29 = metadata !{i32 720942, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 17, metadata !30, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, metadata !35} ; [ DW_TAG_subprogram ] +!27 = metadata !{metadata !29, metadata !37, metadata !40, metadata !43, metadata !46} +!29 = metadata !{i32 720942, metadata !6, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 17, metadata !30, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, metadata !35} ; [ DW_TAG_subprogram ] !30 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !31, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !31 = metadata !{metadata !12, metadata !12, metadata !32} -!32 = metadata !{i32 720911, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !33} ; [ DW_TAG_pointer_type ] -!33 = metadata !{i32 720911, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !34} ; [ DW_TAG_pointer_type ] -!34 = metadata !{i32 720932, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!32 = metadata !{i32 720911, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !33} ; [ DW_TAG_pointer_type ] +!33 = metadata !{i32 720911, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !34} ; [ DW_TAG_pointer_type ] +!34 = metadata !{i32 720932, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] !35 = metadata !{metadata !36} !36 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!37 = metadata !{i32 720942, i32 0, null, metadata !"bar", metadata !"bar", metadata !"_ZN3barC1Ei", metadata !6, i32 13, metadata !22, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.bar*, i32)* @_ZN3barC1Ei, null, metadata !21, metadata !38} ; [ DW_TAG_subprogram ] +!37 = metadata !{i32 720942, metadata !6, null, metadata !"bar", metadata !"bar", metadata !"_ZN3barC1Ei", i32 13, metadata !22, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.bar*, i32)* @_ZN3barC1Ei, null, metadata !21, metadata !38} ; [ DW_TAG_subprogram ] !38 = metadata !{metadata !39} !39 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!40 = metadata !{i32 720942, i32 0, null, metadata !"bar", metadata !"bar", metadata !"_ZN3barC2Ei", metadata !6, i32 13, metadata !22, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.bar*, i32)* @_ZN3barC2Ei, null, metadata !21, metadata !41} ; [ DW_TAG_subprogram ] +!40 = metadata !{i32 720942, metadata !6, null, metadata !"bar", metadata !"bar", metadata !"_ZN3barC2Ei", i32 13, metadata !22, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.bar*, i32)* @_ZN3barC2Ei, null, metadata !21, metadata !41} ; [ DW_TAG_subprogram ] !41 = metadata !{metadata !42} !42 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!43 = metadata !{i32 720942, i32 0, null, metadata !"baz", metadata !"baz", metadata !"_ZN3bazC1Ei", metadata !6, i32 6, metadata !14, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.baz*, i32)* @_ZN3bazC1Ei, null, metadata !13, metadata !44} ; [ DW_TAG_subprogram ] +!43 = metadata !{i32 720942, metadata !6, null, metadata !"baz", metadata !"baz", metadata !"_ZN3bazC1Ei", i32 6, metadata !14, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.baz*, i32)* @_ZN3bazC1Ei, null, metadata !13, metadata !44} ; [ DW_TAG_subprogram ] !44 = metadata !{metadata !45} !45 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!46 = metadata !{i32 720942, i32 0, null, metadata !"baz", metadata !"baz", metadata !"_ZN3bazC2Ei", metadata !6, i32 6, metadata !14, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.baz*, i32)* @_ZN3bazC2Ei, null, metadata !13, metadata !47} ; [ DW_TAG_subprogram ] +!46 = metadata !{i32 720942, metadata !6, null, metadata !"baz", metadata !"baz", metadata !"_ZN3bazC2Ei", i32 6, metadata !14, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.baz*, i32)* @_ZN3bazC2Ei, null, metadata !13, metadata !47} ; [ DW_TAG_subprogram ] !47 = metadata !{metadata !48} !48 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !49 = metadata !{i32 721153, metadata !29, metadata !"argc", metadata !6, i32 16777232, metadata !12, i32 0, i32 0} ; [ DW_TAG_arg_variable ] @@ -170,3 +167,4 @@ entry: !79 = metadata !{i32 6, i32 23, metadata !46, null} !80 = metadata !{i32 6, i32 24, metadata !81, null} !81 = metadata !{i32 720907, metadata !46, i32 6, i32 23, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] +!82 = metadata !{metadata !"main.cpp", metadata !"/Users/echristo/tmp/bad-struct-ref"} diff --git a/test/DebugInfo/X86/DW_AT_byte_size.ll b/test/DebugInfo/X86/DW_AT_byte_size.ll index 25b5f00c6af6..84e3f630976a 100644 --- a/test/DebugInfo/X86/DW_AT_byte_size.ll +++ b/test/DebugInfo/X86/DW_AT_byte_size.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s ; Checks that we don't emit a size for a pointer type. ; CHECK: DW_TAG_pointer_type @@ -24,23 +24,22 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata !"/Users/echristo", metadata !"clang version 3.1 (trunk 150996)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooP1A", metadata !6, i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%struct.A*)* @_Z3fooP1A, null, null, metadata !14} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 786473, metadata !"foo.cpp", metadata !"/Users/echristo", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.1 (trunk 150996)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooP1A", metadata !6, i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%struct.A*)* @_Z3fooP1A, null, null, metadata !14, i32 3} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9, metadata !10} -!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!10 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] -!11 = metadata !{i32 786434, null, metadata !"A", metadata !6, i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !12, i32 0, null, null} ; [ DW_TAG_class_type ] +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!10 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] +!11 = metadata !{i32 786434, metadata !20, null, metadata !"A", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !12, i32 0, null, null} ; [ DW_TAG_class_type ] !12 = metadata !{metadata !13} -!13 = metadata !{i32 786445, metadata !11, metadata !"b", metadata !6, i32 1, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] +!13 = metadata !{i32 786445, metadata !20, metadata !11, metadata !"b", i32 1, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] !14 = metadata !{metadata !15} !15 = metadata !{i32 786468} ; [ DW_TAG_base_type ] !16 = metadata !{i32 786689, metadata !5, metadata !"a", metadata !6, i32 16777219, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !17 = metadata !{i32 3, i32 13, metadata !5, null} !18 = metadata !{i32 4, i32 3, metadata !19, null} -!19 = metadata !{i32 786443, metadata !5, i32 3, i32 16, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!19 = metadata !{i32 786443, metadata !6, metadata !5, i32 3, i32 16, i32 0} ; [ DW_TAG_lexical_block ] +!20 = metadata !{metadata !"foo.cpp", metadata !"/Users/echristo"} diff --git a/test/DebugInfo/X86/DW_AT_location-reference.ll b/test/DebugInfo/X86/DW_AT_location-reference.ll index 3be9abaffcda..356360b09834 100644 --- a/test/DebugInfo/X86/DW_AT_location-reference.ll +++ b/test/DebugInfo/X86/DW_AT_location-reference.ll @@ -85,17 +85,16 @@ declare i32 @g(i32, i32) declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!llvm.dbg.sp = !{!0} -!llvm.dbg.lv.f = !{!5} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"f", metadata !"f", metadata !"", metadata !1, i32 4, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void ()* @f} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"simple.c", metadata !"/home/rengol01/temp/tests/dwarf/relocation", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"simple.c", metadata !"/home/rengol01/temp/tests/dwarf/relocation", metadata !"clang version 3.0 (trunk)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"f", metadata !"f", metadata !"", metadata !1, i32 4, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void ()* @f, null, null, metadata !22, i32 4} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !23} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 12, metadata !1, metadata !"clang version 3.0 (trunk)", i1 true, metadata !"", i32 0, null, null, metadata !21, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !4 = metadata !{null} -!5 = metadata !{i32 590080, metadata !6, metadata !"x", metadata !1, i32 5, metadata !7, i32 0} ; [ DW_TAG_auto_variable ] -!6 = metadata !{i32 589835, metadata !0, i32 4, i32 14, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!7 = metadata !{i32 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!5 = metadata !{i32 786688, metadata !6, metadata !"x", metadata !1, i32 5, metadata !7, i32 0, null} ; [ DW_TAG_auto_variable ] +!6 = metadata !{i32 786443, metadata !1, metadata !0, i32 4, i32 14, i32 0} ; [ DW_TAG_lexical_block ] +!7 = metadata !{i32 786468, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !8 = metadata !{i32 6, i32 3, metadata !6, null} !9 = metadata !{metadata !"int", metadata !10} !10 = metadata !{metadata !"omnipotent char", metadata !11} @@ -109,3 +108,6 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !18 = metadata !{i32 11, i32 3, metadata !6, null} !19 = metadata !{i32 12, i32 3, metadata !6, null} !20 = metadata !{i32 13, i32 1, metadata !6, null} +!21 = metadata !{metadata !0} +!22 = metadata !{metadata !5} +!23 = metadata !{metadata !"simple.c", metadata !"/home/rengol01/temp/tests/dwarf/relocation"} diff --git a/test/DebugInfo/X86/DW_AT_object_pointer.ll b/test/DebugInfo/X86/DW_AT_object_pointer.ll index 163a1e7cec73..a3ad26cf82bc 100644 --- a/test/DebugInfo/X86/DW_AT_object_pointer.ll +++ b/test/DebugInfo/X86/DW_AT_object_pointer.ll @@ -1,20 +1,25 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -; CHECK: DW_AT_object_pointer [DW_FORM_ref4] (cu + 0x00bf => {0x000000bf}) -; CHECK: 0x000000bf: DW_TAG_formal_parameter [12] -; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000085] = "this") +; CHECK: DW_TAG_formal_parameter [ +; CHECK: DW_TAG_class_type +; CHECK: DW_AT_object_pointer [DW_FORM_ref4] (cu + 0x00fd => {0x000000fd}) +; CHECK: 0x000000fd: DW_TAG_formal_parameter [13] +; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000086] = "this") %class.A = type { i32 } -define i32 @_Z3foov() nounwind uwtable ssp { +define i32 @_Z3fooi(i32) nounwind uwtable ssp { entry: + %.addr = alloca i32, align 4 %a = alloca %class.A, align 4 + store i32 %0, i32* %.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %.addr}, metadata !36), !dbg !35 call void @llvm.dbg.declare(metadata !{%class.A* %a}, metadata !21), !dbg !23 call void @_ZN1AC1Ev(%class.A* %a), !dbg !24 %m_a = getelementptr inbounds %class.A* %a, i32 0, i32 0, !dbg !25 - %0 = load i32* %m_a, align 4, !dbg !25 - ret i32 %0, !dbg !25 + %1 = load i32* %m_a, align 4, !dbg !25 + ret i32 %1, !dbg !25 } declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone @@ -42,38 +47,39 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"bar.cpp", metadata !"/Users/echristo/debug-tests", metadata !"clang version 3.2 (trunk 163586) (llvm/trunk 163570)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] [/Users/echristo/debug-tests/bar.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !10, metadata !20} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3foov", metadata !6, i32 7, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z3foov, null, null, metadata !1, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [foo] -!6 = metadata !{i32 786473, metadata !"bar.cpp", metadata !"/Users/echristo/debug-tests", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !37, i32 4, metadata !"clang version 3.2 (trunk 163586) (llvm/trunk 163570)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/echristo/debug-tests/bar.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !10, metadata !20} +!5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooi", i32 7, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_Z3fooi, null, null, metadata !1, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [foo] +!6 = metadata !{i32 786473, metadata !37} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9} -!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!10 = metadata !{i32 786478, i32 0, null, metadata !"A", metadata !"A", metadata !"_ZN1AC1Ev", metadata !6, i32 3, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*)* @_ZN1AC1Ev, null, metadata !17, metadata !1, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [A] +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786478, metadata !6, null, metadata !"A", metadata !"A", metadata !"_ZN1AC1Ev", i32 3, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*)* @_ZN1AC1Ev, null, metadata !17, metadata !1, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [A] !11 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !12 = metadata !{null, metadata !13} !13 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !14} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from A] -!14 = metadata !{i32 786434, null, metadata !"A", metadata !6, i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !15, i32 0, null, null} ; [ DW_TAG_class_type ] [A] [line 1, size 32, align 32, offset 0] [from ] +!14 = metadata !{i32 786434, metadata !37, null, metadata !"A", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !15, i32 0, null, null} ; [ DW_TAG_class_type ] [A] [line 1, size 32, align 32, offset 0] [from ] !15 = metadata !{metadata !16, metadata !17} -!16 = metadata !{i32 786445, metadata !14, metadata !"m_a", metadata !6, i32 4, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] [m_a] [line 4, size 32, align 32, offset 0] [from int] -!17 = metadata !{i32 786478, i32 0, metadata !14, metadata !"A", metadata !"A", metadata !"", metadata !6, i32 3, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !18, i32 3} ; [ DW_TAG_subprogram ] [line 3] [A] +!16 = metadata !{i32 786445, metadata !37, metadata !14, metadata !"m_a", i32 4, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] [m_a] [line 4, size 32, align 32, offset 0] [from int] +!17 = metadata !{i32 786478, metadata !6, metadata !14, metadata !"A", metadata !"A", metadata !"", i32 3, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !18, i32 3} ; [ DW_TAG_subprogram ] [line 3] [A] !18 = metadata !{metadata !19} !19 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] -!20 = metadata !{i32 786478, i32 0, null, metadata !"A", metadata !"A", metadata !"_ZN1AC2Ev", metadata !6, i32 3, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*)* @_ZN1AC2Ev, null, metadata !17, metadata !1, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [A] +!20 = metadata !{i32 786478, metadata !6, null, metadata !"A", metadata !"A", metadata !"_ZN1AC2Ev", i32 3, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*)* @_ZN1AC2Ev, null, metadata !17, metadata !1, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [A] !21 = metadata !{i32 786688, metadata !22, metadata !"a", metadata !6, i32 8, metadata !14, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 8] -!22 = metadata !{i32 786443, metadata !5, i32 7, i32 11, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] [/Users/echristo/debug-tests/bar.cpp] +!22 = metadata !{i32 786443, metadata !6, metadata !5, i32 7, i32 11, i32 0} ; [ DW_TAG_lexical_block ] [/Users/echristo/debug-tests/bar.cpp] !23 = metadata !{i32 8, i32 5, metadata !22, null} !24 = metadata !{i32 8, i32 6, metadata !22, null} !25 = metadata !{i32 9, i32 3, metadata !22, null} !26 = metadata !{i32 786689, metadata !10, metadata !"this", metadata !6, i32 16777219, metadata !27, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 3] -!27 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from A] +!27 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from A] !28 = metadata !{i32 3, i32 3, metadata !10, null} !29 = metadata !{i32 3, i32 18, metadata !10, null} !30 = metadata !{i32 786689, metadata !20, metadata !"this", metadata !6, i32 16777219, metadata !27, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 3] !31 = metadata !{i32 3, i32 3, metadata !20, null} !32 = metadata !{i32 3, i32 9, metadata !33, null} -!33 = metadata !{i32 786443, metadata !20, i32 3, i32 7, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] [/Users/echristo/debug-tests/bar.cpp] +!33 = metadata !{i32 786443, metadata !6, metadata !20, i32 3, i32 7, i32 1} ; [ DW_TAG_lexical_block ] [/Users/echristo/debug-tests/bar.cpp] !34 = metadata !{i32 3, i32 18, metadata !33, null} +!35 = metadata !{i32 7, i32 0, metadata !5, null} +!36 = metadata !{i32 786689, metadata !5, metadata !"", metadata !6, i32 16777223, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [line 7] +!37 = metadata !{metadata !"bar.cpp", metadata !"/Users/echristo/debug-tests"} diff --git a/test/DebugInfo/X86/DW_AT_specification.ll b/test/DebugInfo/X86/DW_AT_specification.ll index 078b740a4170..07849f352268 100644 --- a/test/DebugInfo/X86/DW_AT_specification.ll +++ b/test/DebugInfo/X86/DW_AT_specification.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; test that the DW_AT_specification is a back edge in the file. @@ -16,28 +16,26 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 4, metadata !"<unknown>", metadata !"/Users/espindola/mozilla-central/obj-x86_64-apple-darwin11.2.0/toolkit/library", metadata !"clang version 3.0 ()", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !18} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 720942, i32 0, null, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void ()* @_ZN3foo3barEv, null, metadata !11, metadata !16} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 720937, metadata !"nsNativeAppSupportBase.ii", metadata !"/Users/espindola/mozilla-central/obj-x86_64-apple-darwin11.2.0/toolkit/library", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !27, i32 4, metadata !"clang version 3.0 ()", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !18, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 720942, metadata !6, null, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void ()* @_ZN3foo3barEv, null, metadata !11, metadata !16, i32 4} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 720937, metadata !27} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null, metadata !9} -!9 = metadata !{i32 720911, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !10} ; [ DW_TAG_pointer_type ] -!10 = metadata !{i32 720915, null, metadata !"foo", metadata !6, i32 1, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] -!11 = metadata !{i32 720942, i32 0, metadata !12, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", metadata !6, i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !14} ; [ DW_TAG_subprogram ] -!12 = metadata !{i32 720898, null, metadata !"foo", metadata !6, i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !13, i32 0, null, null} ; [ DW_TAG_class_type ] +!9 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !10} ; [ DW_TAG_pointer_type ] +!10 = metadata !{i32 786451, metadata !27, null, metadata !"foo", i32 1, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!11 = metadata !{i32 720942, metadata !6, metadata !12, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !14, i32 2} ; [ DW_TAG_subprogram ] +!12 = metadata !{i32 720898, metadata !27, null, metadata !"foo", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !13, i32 0, null, null} ; [ DW_TAG_class_type ] !13 = metadata !{metadata !11} !14 = metadata !{metadata !15} !15 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !16 = metadata !{metadata !17} !17 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!18 = metadata !{metadata !19} -!19 = metadata !{metadata !20} -!20 = metadata !{i32 720948, i32 0, metadata !5, metadata !"x", metadata !"x", metadata !"", metadata !6, i32 5, metadata !21, i32 1, i32 1, i32* @_ZZN3foo3barEvE1x} ; [ DW_TAG_variable ] -!21 = metadata !{i32 720934, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !22} ; [ DW_TAG_const_type ] -!22 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!18 = metadata !{metadata !20} +!20 = metadata !{i32 720948, i32 0, metadata !5, metadata !"x", metadata !"x", metadata !"", metadata !6, i32 5, metadata !21, i32 1, i32 1, i32* @_ZZN3foo3barEvE1x, null} ; [ DW_TAG_variable ] +!21 = metadata !{i32 720934, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !22} ; [ DW_TAG_const_type ] +!22 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !25 = metadata !{i32 6, i32 1, metadata !26, null} -!26 = metadata !{i32 720907, metadata !5, i32 4, i32 17, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!26 = metadata !{i32 786443, metadata !5, i32 4, i32 17, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!27 = metadata !{metadata !"nsNativeAppSupportBase.ii", metadata !"/Users/espindola/mozilla-central/obj-x86_64-apple-darwin11.2.0/toolkit/library"} diff --git a/test/DebugInfo/X86/DW_TAG_friend.ll b/test/DebugInfo/X86/DW_TAG_friend.ll index a0dcec32e691..f60175fb69aa 100644 --- a/test/DebugInfo/X86/DW_TAG_friend.ll +++ b/test/DebugInfo/X86/DW_TAG_friend.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; Check that the friend tag is there and is followed by a DW_AT_friend that has a reference back. @@ -17,31 +17,30 @@ !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata !"/Users/echristo/tmp", metadata !"clang version 3.1 (trunk 153413) (llvm/trunk 153428)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !17} -!5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 10, metadata !7, i32 0, i32 1, %class.A* @a} ; [ DW_TAG_variable ] -!6 = metadata !{i32 786473, metadata !"foo.cpp", metadata !"/Users/echristo/tmp", null} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 786434, null, metadata !"A", metadata !6, i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !8, i32 0, null, null} ; [ DW_TAG_class_type ] +!0 = metadata !{i32 786449, metadata !28, i32 4, metadata !"clang version 3.1 (trunk 153413) (llvm/trunk 153428)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !17} +!5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 10, metadata !7, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] +!6 = metadata !{i32 786473, metadata !28} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786434, metadata !28, null, metadata !"A", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !8, i32 0, null, null} ; [ DW_TAG_class_type ] !8 = metadata !{metadata !9, metadata !11} -!9 = metadata !{i32 786445, metadata !7, metadata !"a", metadata !6, i32 2, i64 32, i64 32, i64 0, i32 1, metadata !10} ; [ DW_TAG_member ] -!10 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!11 = metadata !{i32 786478, i32 0, metadata !7, metadata !"A", metadata !"A", metadata !"", metadata !6, i32 1, metadata !12, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !15} ; [ DW_TAG_subprogram ] +!9 = metadata !{i32 786445, metadata !28, metadata !7, metadata !"a", i32 2, i64 32, i64 32, i64 0, i32 1, metadata !10} ; [ DW_TAG_member ] +!10 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!11 = metadata !{i32 786478, metadata !6, metadata !7, metadata !"A", metadata !"A", metadata !"", i32 1, metadata !12, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !15, i32 1} ; [ DW_TAG_subprogram ] !12 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !13, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !13 = metadata !{null, metadata !14} !14 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !7} ; [ DW_TAG_pointer_type ] !15 = metadata !{metadata !16} !16 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!17 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !6, i32 11, metadata !18, i32 0, i32 1, %class.B* @b} ; [ DW_TAG_variable ] -!18 = metadata !{i32 786434, null, metadata !"B", metadata !6, i32 5, i64 32, i64 32, i32 0, i32 0, null, metadata !19, i32 0, null, null} ; [ DW_TAG_class_type ] +!17 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !6, i32 11, metadata !18, i32 0, i32 1, %class.B* @b, null} ; [ DW_TAG_variable ] +!18 = metadata !{i32 786434, metadata !28, null, metadata !"B", i32 5, i64 32, i64 32, i32 0, i32 0, null, metadata !19, i32 0, null, null} ; [ DW_TAG_class_type ] !19 = metadata !{metadata !20, metadata !21, metadata !27} -!20 = metadata !{i32 786445, metadata !18, metadata !"b", metadata !6, i32 7, i64 32, i64 32, i64 0, i32 1, metadata !10} ; [ DW_TAG_member ] -!21 = metadata !{i32 786478, i32 0, metadata !18, metadata !"B", metadata !"B", metadata !"", metadata !6, i32 5, metadata !22, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !25} ; [ DW_TAG_subprogram ] +!20 = metadata !{i32 786445, metadata !28, metadata !18, metadata !"b", i32 7, i64 32, i64 32, i64 0, i32 1, metadata !10} ; [ DW_TAG_member ] +!21 = metadata !{i32 786478, metadata !6, metadata !18, metadata !"B", metadata !"B", metadata !"", i32 5, metadata !22, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !25, i32 5} ; [ DW_TAG_subprogram ] !22 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !23, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !23 = metadata !{null, metadata !24} !24 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !18} ; [ DW_TAG_pointer_type ] !25 = metadata !{metadata !26} !26 = metadata !{i32 786468} ; [ DW_TAG_base_type ] !27 = metadata !{i32 786474, metadata !18, null, metadata !6, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !7} ; [ DW_TAG_friend ] +!28 = metadata !{metadata !"foo.cpp", metadata !"/Users/echristo/tmp"} diff --git a/test/DebugInfo/X86/aligned_stack_var.ll b/test/DebugInfo/X86/aligned_stack_var.ll index 9e6c7ff813af..a8f6cca750c0 100644 --- a/test/DebugInfo/X86/aligned_stack_var.ll +++ b/test/DebugInfo/X86/aligned_stack_var.ll @@ -1,5 +1,5 @@ ; RUN: llc %s -mtriple=x86_64-pc-linux-gnu -O0 -filetype=obj -o %t -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; If stack is realigned, we shouldn't describe locations of local ; variables by giving offset from the frame pointer (%rbp): @@ -26,17 +26,15 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"test.cc", metadata !"/home/samsonov/debuginfo", metadata !"clang version 3.2 (trunk 155696:155697) (llvm/trunk 155696)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"run", metadata !"run", metadata !"_Z3runv", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3runv, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.2 (trunk 155696:155697) (llvm/trunk 155696)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"run", metadata !"run", metadata !"_Z3runv", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3runv, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !"test.cc", metadata !"/home/samsonov/debuginfo", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null} !9 = metadata !{i32 786688, metadata !10, metadata !"x", metadata !6, i32 2, metadata !11, i32 0, i32 0} ; [ DW_TAG_auto_variable ] -!10 = metadata !{i32 786443, metadata !5, i32 1, i32 12, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!10 = metadata !{i32 786443, metadata !6, metadata !5, i32 1, i32 12, i32 0} ; [ DW_TAG_lexical_block ] !11 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !12 = metadata !{i32 2, i32 7, metadata !10, null} !13 = metadata !{i32 3, i32 1, metadata !10, null} diff --git a/test/DebugInfo/X86/block-capture.ll b/test/DebugInfo/X86/block-capture.ll index 4953c421cd32..fadea775aadf 100644 --- a/test/DebugInfo/X86/block-capture.ll +++ b/test/DebugInfo/X86/block-capture.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; Checks that we emit debug info for the block variable declare. ; CHECK: 0x00000030: DW_TAG_subprogram [3] @@ -62,57 +62,55 @@ declare i32 @__objc_personality_v0(...) !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!35, !36, !37, !38} -!0 = metadata !{i32 786449, i32 0, i32 16, metadata !"foo.m", metadata !"/Users/echristo", metadata !"clang version 3.1 (trunk 151227)", i1 true, i1 false, metadata !"", i32 2, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !28, metadata !31, metadata !34} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"", metadata !6, i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 786473, metadata !"foo.m", metadata !"/Users/echristo", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !63, i32 16, metadata !"clang version 3.1 (trunk 151227)", i1 false, metadata !"", i32 2, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !28, metadata !31, metadata !34} +!5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"foo", metadata !"foo", metadata !"", i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26, i32 5} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !63} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null, metadata !9} -!9 = metadata !{i32 786454, null, metadata !"dispatch_block_t", metadata !6, i32 1, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_typedef ] -!10 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] -!11 = metadata !{i32 786451, metadata !6, metadata !"__block_literal_generic", metadata !6, i32 5, i64 256, i64 0, i32 0, i32 8, null, metadata !12, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!9 = metadata !{i32 786454, metadata !63, null, metadata !"dispatch_block_t", i32 1, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_typedef ] +!10 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] +!11 = metadata !{i32 786451, metadata !63, metadata !6, metadata !"__block_literal_generic", i32 5, i64 256, i64 0, i32 0, i32 8, null, metadata !12, i32 0, i32 0} ; [ DW_TAG_structure_type ] !12 = metadata !{metadata !13, metadata !15, metadata !17, metadata !18, metadata !19} -!13 = metadata !{i32 786445, metadata !6, metadata !"__isa", metadata !6, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_member ] -!14 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] -!15 = metadata !{i32 786445, metadata !6, metadata !"__flags", metadata !6, i32 0, i64 32, i64 32, i64 64, i32 0, metadata !16} ; [ DW_TAG_member ] -!16 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!17 = metadata !{i32 786445, metadata !6, metadata !"__reserved", metadata !6, i32 0, i64 32, i64 32, i64 96, i32 0, metadata !16} ; [ DW_TAG_member ] -!18 = metadata !{i32 786445, metadata !6, metadata !"__FuncPtr", metadata !6, i32 0, i64 64, i64 64, i64 128, i32 0, metadata !14} ; [ DW_TAG_member ] -!19 = metadata !{i32 786445, metadata !6, metadata !"__descriptor", metadata !6, i32 5, i64 64, i64 64, i64 192, i32 0, metadata !20} ; [ DW_TAG_member ] -!20 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 0, i64 0, i32 0, metadata !21} ; [ DW_TAG_pointer_type ] -!21 = metadata !{i32 786451, metadata !6, metadata !"__block_descriptor", metadata !6, i32 5, i64 128, i64 0, i32 0, i32 8, null, metadata !22, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!13 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__isa", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_member ] +!14 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!15 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__flags", i32 0, i64 32, i64 32, i64 64, i32 0, metadata !16} ; [ DW_TAG_member ] +!16 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!17 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__reserved", i32 0, i64 32, i64 32, i64 96, i32 0, metadata !16} ; [ DW_TAG_member ] +!18 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__FuncPtr", i32 0, i64 64, i64 64, i64 128, i32 0, metadata !14} ; [ DW_TAG_member ] +!19 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__descriptor", i32 5, i64 64, i64 64, i64 192, i32 0, metadata !20} ; [ DW_TAG_member ] +!20 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !21} ; [ DW_TAG_pointer_type ] +!21 = metadata !{i32 786451, metadata !63, metadata !6, metadata !"__block_descriptor", i32 5, i64 128, i64 0, i32 0, i32 8, null, metadata !22, i32 0, i32 0} ; [ DW_TAG_structure_type ] !22 = metadata !{metadata !23, metadata !25} -!23 = metadata !{i32 786445, metadata !6, metadata !"reserved", metadata !6, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !24} ; [ DW_TAG_member ] -!24 = metadata !{i32 786468, null, metadata !"long unsigned int", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] -!25 = metadata !{i32 786445, metadata !6, metadata !"Size", metadata !6, i32 0, i64 64, i64 64, i64 64, i32 0, metadata !24} ; [ DW_TAG_member ] +!23 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"reserved", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !24} ; [ DW_TAG_member ] +!24 = metadata !{i32 786468, null, null, metadata !"long unsigned int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!25 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"Size", i32 0, i64 64, i64 64, i64 64, i32 0, metadata !24} ; [ DW_TAG_member ] !26 = metadata !{metadata !27} !27 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!28 = metadata !{i32 786478, i32 0, metadata !6, metadata !"__foo_block_invoke_0", metadata !"__foo_block_invoke_0", metadata !"", metadata !6, i32 7, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*)* @__foo_block_invoke_0, null, null, metadata !26} ; [ DW_TAG_subprogram ] +!28 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__foo_block_invoke_0", metadata !"__foo_block_invoke_0", metadata !"", i32 7, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*)* @__foo_block_invoke_0, null, null, metadata !26, i32 7} ; [ DW_TAG_subprogram ] !29 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !30, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !30 = metadata !{null, metadata !14} -!31 = metadata !{i32 786478, i32 0, metadata !6, metadata !"__copy_helper_block_", metadata !"__copy_helper_block_", metadata !"", metadata !6, i32 10, metadata !32, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26} ; [ DW_TAG_subprogram ] +!31 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__copy_helper_block_", metadata !"__copy_helper_block_", metadata !"", i32 10, metadata !32, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26, i32 10} ; [ DW_TAG_subprogram ] !32 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !33, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !33 = metadata !{null, metadata !14, metadata !14} -!34 = metadata !{i32 786478, i32 0, metadata !6, metadata !"__destroy_helper_block_", metadata !"__destroy_helper_block_", metadata !"", metadata !6, i32 10, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26} ; [ DW_TAG_subprogram ] +!34 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__destroy_helper_block_", metadata !"__destroy_helper_block_", metadata !"", i32 10, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26, i32 10} ; [ DW_TAG_subprogram ] !35 = metadata !{i32 1, metadata !"Objective-C Version", i32 2} !36 = metadata !{i32 1, metadata !"Objective-C Image Info Version", i32 0} !37 = metadata !{i32 1, metadata !"Objective-C Image Info Section", metadata !"__DATA, __objc_imageinfo, regular, no_dead_strip"} !38 = metadata !{i32 4, metadata !"Objective-C Garbage Collection", i32 0} !39 = metadata !{i32 786689, metadata !28, metadata !".block_descriptor", metadata !6, i32 16777223, metadata !40, i32 64, i32 0} ; [ DW_TAG_arg_variable ] -!40 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 0, i64 0, i32 0, metadata !41} ; [ DW_TAG_pointer_type ] -!41 = metadata !{i32 786451, metadata !6, metadata !"__block_literal_1", metadata !6, i32 7, i64 320, i64 64, i32 0, i32 0, null, metadata !42, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!40 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !41} ; [ DW_TAG_pointer_type ] +!41 = metadata !{i32 786451, metadata !63, metadata !6, metadata !"__block_literal_1", i32 7, i64 320, i64 64, i32 0, i32 0, null, metadata !42, i32 0, i32 0} ; [ DW_TAG_structure_type ] !42 = metadata !{metadata !43, metadata !44, metadata !45, metadata !46, metadata !47, metadata !50} -!43 = metadata !{i32 786445, metadata !6, metadata !"__isa", metadata !6, i32 7, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_member ] -!44 = metadata !{i32 786445, metadata !6, metadata !"__flags", metadata !6, i32 7, i64 32, i64 32, i64 64, i32 0, metadata !16} ; [ DW_TAG_member ] -!45 = metadata !{i32 786445, metadata !6, metadata !"__reserved", metadata !6, i32 7, i64 32, i64 32, i64 96, i32 0, metadata !16} ; [ DW_TAG_member ] -!46 = metadata !{i32 786445, metadata !6, metadata !"__FuncPtr", metadata !6, i32 7, i64 64, i64 64, i64 128, i32 0, metadata !14} ; [ DW_TAG_member ] -!47 = metadata !{i32 786445, metadata !6, metadata !"__descriptor", metadata !6, i32 7, i64 64, i64 64, i64 192, i32 0, metadata !48} ; [ DW_TAG_member ] -!48 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !49} ; [ DW_TAG_pointer_type ] -!49 = metadata !{i32 786451, null, metadata !"__block_descriptor_withcopydispose", metadata !6, i32 7, i32 0, i32 0, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_structure_type ] -!50 = metadata !{i32 786445, metadata !6, metadata !"block", metadata !6, i32 7, i64 64, i64 64, i64 256, i32 0, metadata !9} ; [ DW_TAG_member ] +!43 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__isa", i32 7, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_member ] +!44 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__flags", i32 7, i64 32, i64 32, i64 64, i32 0, metadata !16} ; [ DW_TAG_member ] +!45 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__reserved", i32 7, i64 32, i64 32, i64 96, i32 0, metadata !16} ; [ DW_TAG_member ] +!46 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__FuncPtr", i32 7, i64 64, i64 64, i64 128, i32 0, metadata !14} ; [ DW_TAG_member ] +!47 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"__descriptor", i32 7, i64 64, i64 64, i64 192, i32 0, metadata !48} ; [ DW_TAG_member ] +!48 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !49} ; [ DW_TAG_pointer_type ] +!49 = metadata !{i32 786451, metadata !63, null, metadata !"__block_descriptor_withcopydispose", i32 7, i32 0, i32 0, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_structure_type ] +!50 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"block", i32 7, i64 64, i64 64, i64 256, i32 0, metadata !9} ; [ DW_TAG_member ] !51 = metadata !{i32 7, i32 18, metadata !28, null} !52 = metadata !{i32 7, i32 19, metadata !28, null} !53 = metadata !{i32 786688, metadata !28, metadata !"block", metadata !6, i32 5, metadata !9, i32 0, i32 0, i64 1, i64 32} ; [ DW_TAG_auto_variable ] @@ -125,3 +123,4 @@ declare i32 @__objc_personality_v0(...) !60 = metadata !{i32 786443, metadata !57, i32 9, i32 35, metadata !6, i32 3} ; [ DW_TAG_lexical_block ] !61 = metadata !{i32 10, i32 21, metadata !28, null} !62 = metadata !{i32 9, i32 20, metadata !56, null} +!63 = metadata !{metadata !"foo.m", metadata !"/Users/echristo"} diff --git a/test/DebugInfo/X86/concrete_out_of_line.ll b/test/DebugInfo/X86/concrete_out_of_line.ll index 58fb05573670..48e1defd4c95 100644 --- a/test/DebugInfo/X86/concrete_out_of_line.ll +++ b/test/DebugInfo/X86/concrete_out_of_line.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-linux %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; test that we add DW_AT_inline even when we only have concrete out of line ; instances. @@ -34,62 +34,55 @@ declare void @_Z8moz_freePv(i8*) !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 4, metadata !"nsAutoRefCnt.cpp", metadata !"/Users/espindola/mozilla-central/obj-x86_64-apple-darwin11.2.0/netwerk/base/src", metadata !"clang version 3.1 ()", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !47} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !23, metadata !27, metadata !31} -!5 = metadata !{i32 720942, i32 0, null, metadata !"Release", metadata !"Release", metadata !"_ZN17nsAutoRefCnt7ReleaseEv", metadata !6, i32 14, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32* null, null, metadata !12, metadata !20} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 720937, metadata !"nsAutoRefCnt.ii", metadata !"/Users/espindola/mozilla-central/obj-x86_64-apple-darwin11.2.0/netwerk/base/src", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !59, i32 4, metadata !"clang version 3.1 ()", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !47, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !23, metadata !27, metadata !31} +!5 = metadata !{i32 720942, metadata !6, null, metadata !"Release", metadata !"Release", metadata !"_ZN17nsAutoRefCnt7ReleaseEv", i32 14, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32* null, null, metadata !12, metadata !20, i32 14} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 720937, metadata !59} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9, metadata !10} -!9 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!10 = metadata !{i32 720911, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !11} ; [ DW_TAG_pointer_type ] -!11 = metadata !{i32 720915, null, metadata !"nsAutoRefCnt", metadata !6, i32 10, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] -!12 = metadata !{i32 720942, i32 0, metadata !13, metadata !"Release", metadata !"Release", metadata !"_ZN17nsAutoRefCnt7ReleaseEv", metadata !6, i32 11, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18} ; [ DW_TAG_subprogram ] -!13 = metadata !{i32 720898, null, metadata !"nsAutoRefCnt", metadata !6, i32 10, i64 8, i64 8, i32 0, i32 0, null, metadata !14, i32 0, null, null} ; [ DW_TAG_class_type ] +!9 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!10 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !11} ; [ DW_TAG_pointer_type ] +!11 = metadata !{i32 786451, metadata !59, null, metadata !"nsAutoRefCnt", i32 10, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!12 = metadata !{i32 720942, metadata !6, metadata !13, metadata !"Release", metadata !"Release", metadata !"_ZN17nsAutoRefCnt7ReleaseEv", i32 11, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18, i32 11} ; [ DW_TAG_subprogram ] +!13 = metadata !{i32 720898, metadata !59, null, metadata !"nsAutoRefCnt", i32 10, i64 8, i64 8, i32 0, i32 0, null, metadata !14, i32 0, null, null} ; [ DW_TAG_class_type ] !14 = metadata !{metadata !12, metadata !15} -!15 = metadata !{i32 720942, i32 0, metadata !13, metadata !"~nsAutoRefCnt", metadata !"~nsAutoRefCnt", metadata !"", metadata !6, i32 12, metadata !16, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18} ; [ DW_TAG_subprogram ] +!15 = metadata !{i32 720942, metadata !6, metadata !13, metadata !"~nsAutoRefCnt", metadata !"~nsAutoRefCnt", metadata !"", i32 12, metadata !16, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18, i32 12} ; [ DW_TAG_subprogram ] !16 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !17, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !17 = metadata !{null, metadata !10} -!18 = metadata !{metadata !19} -!19 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!20 = metadata !{metadata !21} -!21 = metadata !{metadata !22} -!22 = metadata !{i32 721153, metadata !5, metadata !"this", metadata !6, i32 16777230, metadata !10, i32 64, i32 0} ; [ DW_TAG_arg_variable ] -!23 = metadata !{i32 720942, i32 0, null, metadata !"~nsAutoRefCnt", metadata !"~nsAutoRefCnt", metadata !"_ZN17nsAutoRefCntD1Ev", metadata !6, i32 18, metadata !16, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32* null, null, metadata !15, metadata !24} ; [ DW_TAG_subprogram ] -!24 = metadata !{metadata !25} -!25 = metadata !{metadata !26} -!26 = metadata !{i32 721153, metadata !23, metadata !"this", metadata !6, i32 16777234, metadata !10, i32 64, i32 0} ; [ DW_TAG_arg_variable ] -!27 = metadata !{i32 720942, i32 0, null, metadata !"~nsAutoRefCnt", metadata !"~nsAutoRefCnt", metadata !"_ZN17nsAutoRefCntD2Ev", metadata !6, i32 18, metadata !16, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32* null, null, metadata !15, metadata !28} ; [ DW_TAG_subprogram ] -!28 = metadata !{metadata !29} -!29 = metadata !{metadata !30} -!30 = metadata !{i32 721153, metadata !27, metadata !"this", metadata !6, i32 16777234, metadata !10, i32 64, i32 0} ; [ DW_TAG_arg_variable ] -!31 = metadata !{i32 720942, i32 0, null, metadata !"operator=", metadata !"operator=", metadata !"_ZN12nsAutoRefCntaSEi", metadata !6, i32 4, metadata !32, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, null, null, metadata !36, metadata !43} ; [ DW_TAG_subprogram ] +!18 = metadata !{i32 720932} ; [ DW_TAG_base_type ] +!20 = metadata !{metadata !22} +!22 = metadata !{i32 786689, metadata !5, metadata !"this", metadata !6, i32 16777230, metadata !10, i32 64, i32 0} ; [ DW_TAG_arg_variable ] +!23 = metadata !{i32 720942, metadata !6, null, metadata !"~nsAutoRefCnt", metadata !"~nsAutoRefCnt", metadata !"_ZN17nsAutoRefCntD1Ev", i32 18, metadata !16, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32* null, null, metadata !15, metadata !24, i32 18} ; [ DW_TAG_subprogram ] +!24 = metadata !{metadata !26} +!26 = metadata !{i32 786689, metadata !23, metadata !"this", metadata !6, i32 16777234, metadata !10, i32 64, i32 0} ; [ DW_TAG_arg_variable ] +!27 = metadata !{i32 720942, metadata !6, null, metadata !"~nsAutoRefCnt", metadata !"~nsAutoRefCnt", metadata !"_ZN17nsAutoRefCntD2Ev", i32 18, metadata !16, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32* null, null, metadata !15, metadata !28, i32 18} ; [ DW_TAG_subprogram ] +!28 = metadata !{metadata !30} +!30 = metadata !{i32 786689, metadata !27, metadata !"this", metadata !6, i32 16777234, metadata !10, i32 64, i32 0} ; [ DW_TAG_arg_variable ] +!31 = metadata !{i32 720942, metadata !6, null, metadata !"operator=", metadata !"operator=", metadata !"_ZN12nsAutoRefCntaSEi", i32 4, metadata !32, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, null, null, metadata !36, metadata !43, i32 4} ; [ DW_TAG_subprogram ] !32 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !33, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !33 = metadata !{metadata !9, metadata !34, metadata !9} -!34 = metadata !{i32 720911, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !35} ; [ DW_TAG_pointer_type ] -!35 = metadata !{i32 720915, null, metadata !"nsAutoRefCnt", metadata !6, i32 2, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] -!36 = metadata !{i32 720942, i32 0, metadata !37, metadata !"operator=", metadata !"operator=", metadata !"_ZN12nsAutoRefCntaSEi", metadata !6, i32 4, metadata !32, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18} ; [ DW_TAG_subprogram ] -!37 = metadata !{i32 720898, null, metadata !"nsAutoRefCnt", metadata !6, i32 2, i64 32, i64 32, i32 0, i32 0, null, metadata !38, i32 0, null, null} ; [ DW_TAG_class_type ] +!34 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !35} ; [ DW_TAG_pointer_type ] +!35 = metadata !{i32 786451, metadata !59, null, metadata !"nsAutoRefCnt", i32 2, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!36 = metadata !{i32 720942, metadata !6, metadata !37, metadata !"operator=", metadata !"operator=", metadata !"_ZN12nsAutoRefCntaSEi", i32 4, metadata !32, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18, i32 4} ; [ DW_TAG_subprogram ] +!37 = metadata !{i32 720898, metadata !59, null, metadata !"nsAutoRefCnt", i32 2, i64 32, i64 32, i32 0, i32 0, null, metadata !38, i32 0, null, null} ; [ DW_TAG_class_type ] !38 = metadata !{metadata !39, metadata !40, metadata !36} -!39 = metadata !{i32 720909, metadata !37, metadata !"mValue", metadata !6, i32 7, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] -!40 = metadata !{i32 720942, i32 0, metadata !37, metadata !"nsAutoRefCnt", metadata !"nsAutoRefCnt", metadata !"", metadata !6, i32 3, metadata !41, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18} ; [ DW_TAG_subprogram ] +!39 = metadata !{i32 786445, metadata !59, metadata !37, metadata !"mValue", i32 7, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] +!40 = metadata !{i32 720942, metadata !6, metadata !37, metadata !"nsAutoRefCnt", metadata !"nsAutoRefCnt", metadata !"", i32 3, metadata !41, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18, i32 3} ; [ DW_TAG_subprogram ] !41 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !42, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !42 = metadata !{null, metadata !34} -!43 = metadata !{metadata !44} -!44 = metadata !{metadata !45, metadata !46} -!45 = metadata !{i32 721153, metadata !31, metadata !"this", metadata !6, i32 16777220, metadata !34, i32 64, i32 0} ; [ DW_TAG_arg_variable ] -!46 = metadata !{i32 721153, metadata !31, metadata !"aValue", metadata !6, i32 33554436, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] -!47 = metadata !{metadata !48} -!48 = metadata !{metadata !49} -!49 = metadata !{i32 720948, i32 0, null, metadata !"mRefCnt", metadata !"mRefCnt", metadata !"", metadata !6, i32 9, metadata !37, i32 0, i32 1, i32* null} ; [ DW_TAG_variable ] +!43 = metadata !{metadata !45, metadata !46} +!45 = metadata !{i32 786689, metadata !31, metadata !"this", metadata !6, i32 16777220, metadata !34, i32 64, i32 0} ; [ DW_TAG_arg_variable ] +!46 = metadata !{i32 786689, metadata !31, metadata !"aValue", metadata !6, i32 33554436, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!47 = metadata !{metadata !49} +!49 = metadata !{i32 720948, i32 0, null, metadata !"mRefCnt", metadata !"mRefCnt", metadata !"", metadata !6, i32 9, metadata !37, i32 0, i32 1, i32* null, null} ; [ DW_TAG_variable ] !50 = metadata !{i32 5, i32 5, metadata !51, metadata !52} -!51 = metadata !{i32 720907, metadata !31, i32 4, i32 29, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] +!51 = metadata !{i32 786443, metadata !6, metadata !31, i32 4, i32 29, i32 2} ; [ DW_TAG_lexical_block ] !52 = metadata !{i32 15, i32 0, metadata !53, null} -!53 = metadata !{i32 720907, metadata !5, i32 14, i32 34, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!53 = metadata !{i32 786443, metadata !6, metadata !5, i32 14, i32 34, i32 0} ; [ DW_TAG_lexical_block ] !54 = metadata !{i32 19, i32 3, metadata !55, metadata !56} -!55 = metadata !{i32 720907, metadata !27, i32 18, i32 41, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] +!55 = metadata !{i32 786443, metadata !6, metadata !27, i32 18, i32 41, i32 1} ; [ DW_TAG_lexical_block ] !56 = metadata !{i32 18, i32 41, metadata !23, metadata !52} !57 = metadata !{i32 19, i32 3, metadata !55, metadata !58} !58 = metadata !{i32 18, i32 41, metadata !23, null} +!59 = metadata !{metadata !"nsAutoRefCnt.ii", metadata !"/Users/espindola/mozilla-central/obj-x86_64-apple-darwin11.2.0/netwerk/base/src"} diff --git a/test/DebugInfo/X86/dbg-value-inlined-parameter.ll b/test/DebugInfo/X86/dbg-value-inlined-parameter.ll new file mode 100644 index 000000000000..e7a554ff868d --- /dev/null +++ b/test/DebugInfo/X86/dbg-value-inlined-parameter.ll @@ -0,0 +1,92 @@ +; RUN: llc -mtriple=x86_64-apple-darwin %s -filetype=obj -o %t +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; RUN: llc -mtriple=x86_64-apple-darwin -regalloc=basic %s -filetype=obj -o %t +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s + +;CHECK: DW_TAG_inlined_subroutine [12] +;CHECK-NEXT: DW_AT_abstract_origin +;CHECK-NEXT: DW_AT_low_pc +;CHECK-NEXT: DW_AT_high_pc +;CHECK-NEXT: DW_AT_call_file +;CHECK-NEXT: DW_AT_call_line + +;CHECK: DW_TAG_formal_parameter [9] +;CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000055] = "sp") + +%struct.S1 = type { float*, i32 } + +@p = common global %struct.S1 zeroinitializer, align 8 + +define i32 @foo(%struct.S1* nocapture %sp, i32 %nums) nounwind optsize ssp { +entry: + tail call void @llvm.dbg.value(metadata !{%struct.S1* %sp}, i64 0, metadata !9), !dbg !20 + tail call void @llvm.dbg.value(metadata !{i32 %nums}, i64 0, metadata !18), !dbg !21 + %tmp2 = getelementptr inbounds %struct.S1* %sp, i64 0, i32 1, !dbg !22 + store i32 %nums, i32* %tmp2, align 4, !dbg !22, !tbaa !24 + %call = tail call float* @bar(i32 %nums) nounwind optsize, !dbg !27 + %tmp5 = getelementptr inbounds %struct.S1* %sp, i64 0, i32 0, !dbg !27 + store float* %call, float** %tmp5, align 8, !dbg !27, !tbaa !28 + %cmp = icmp ne float* %call, null, !dbg !29 + %cond = zext i1 %cmp to i32, !dbg !29 + ret i32 %cond, !dbg !29 +} + +declare float* @bar(i32) optsize + +define void @foobar() nounwind optsize ssp { +entry: + tail call void @llvm.dbg.value(metadata !30, i64 0, metadata !9) nounwind, !dbg !31 + tail call void @llvm.dbg.value(metadata !34, i64 0, metadata !18) nounwind, !dbg !35 + store i32 1, i32* getelementptr inbounds (%struct.S1* @p, i64 0, i32 1), align 8, !dbg !36, !tbaa !24 + %call.i = tail call float* @bar(i32 1) nounwind optsize, !dbg !37 + store float* %call.i, float** getelementptr inbounds (%struct.S1* @p, i64 0, i32 0), align 8, !dbg !37, !tbaa !28 + ret void, !dbg !38 +} + +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone + +!llvm.dbg.cu = !{!2} + +!0 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"foo", metadata !"foo", metadata !"", i32 8, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i32 (%struct.S1*, i32)* @foo, null, null, metadata !41, i32 8} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !42} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !42, i32 12, metadata !"clang version 2.9 (trunk 125693)", i1 true, metadata !"", i32 0, null, null, metadata !39, metadata !40, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !42, metadata !1, metadata !"", 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, null, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"foobar", metadata !"foobar", metadata !"", i32 15, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 true, void ()* @foobar} ; [ DW_TAG_subprogram ] +!7 = metadata !{i32 786453, metadata !42, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!8 = metadata !{null} +!9 = metadata !{i32 786689, metadata !0, metadata !"sp", metadata !1, i32 7, metadata !10, i32 0, metadata !32} ; [ DW_TAG_arg_variable ] +!10 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] +!11 = metadata !{i32 786454, metadata !42, metadata !2, metadata !"S1", i32 4, i64 0, i64 0, i64 0, i32 0, metadata !12} ; [ DW_TAG_typedef ] +!12 = metadata !{i32 786451, metadata !42, metadata !2, metadata !"S1", i32 1, i64 128, i64 64, i32 0, i32 0, i32 0, metadata !13, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!13 = metadata !{metadata !14, metadata !17} +!14 = metadata !{i32 786445, metadata !42, metadata !1, metadata !"m", i32 2, i64 64, i64 64, i64 0, i32 0, metadata !15} ; [ DW_TAG_member ] +!15 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] +!16 = metadata !{i32 786468, null, metadata !2, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!17 = metadata !{i32 786445, metadata !42, metadata !1, metadata !"nums", i32 3, i64 32, i64 32, i64 64, i32 0, metadata !5} ; [ DW_TAG_member ] +!18 = metadata !{i32 786689, metadata !0, metadata !"nums", metadata !1, i32 7, metadata !5, i32 0, metadata !32} ; [ DW_TAG_arg_variable ] +!19 = metadata !{i32 786484, i32 0, metadata !2, metadata !"p", metadata !"p", metadata !"", metadata !1, i32 14, metadata !11, i32 0, i32 1, %struct.S1* @p, null} ; [ DW_TAG_variable ] +!20 = metadata !{i32 7, i32 13, metadata !0, null} +!21 = metadata !{i32 7, i32 21, metadata !0, null} +!22 = metadata !{i32 9, i32 3, metadata !23, null} +!23 = metadata !{i32 786443, metadata !1, metadata !0, i32 8, i32 1, i32 0} ; [ DW_TAG_lexical_block ] +!24 = metadata !{metadata !"int", metadata !25} +!25 = metadata !{metadata !"omnipotent char", metadata !26} +!26 = metadata !{metadata !"Simple C/C++ TBAA", null} +!27 = metadata !{i32 10, i32 3, metadata !23, null} +!28 = metadata !{metadata !"any pointer", metadata !25} +!29 = metadata !{i32 11, i32 3, metadata !23, null} +!30 = metadata !{%struct.S1* @p} +!31 = metadata !{i32 7, i32 13, metadata !0, metadata !32} +!32 = metadata !{i32 16, i32 3, metadata !33, null} +!33 = metadata !{i32 786443, metadata !1, metadata !6, i32 15, i32 15, i32 1} ; [ DW_TAG_lexical_block ] +!34 = metadata !{i32 1} +!35 = metadata !{i32 7, i32 21, metadata !0, metadata !32} +!36 = metadata !{i32 9, i32 3, metadata !23, metadata !32} +!37 = metadata !{i32 10, i32 3, metadata !23, metadata !32} +!38 = metadata !{i32 17, i32 1, metadata !33, null} +!39 = metadata !{metadata !0, metadata !6} +!40 = metadata !{metadata !19} +!41 = metadata !{metadata !9, metadata !18} +!42 = metadata !{metadata !"nm2.c", metadata !"/private/tmp"} diff --git a/test/DebugInfo/X86/debug-info-block-captured-self.ll b/test/DebugInfo/X86/debug-info-block-captured-self.ll new file mode 100644 index 000000000000..77e02c62aada --- /dev/null +++ b/test/DebugInfo/X86/debug-info-block-captured-self.ll @@ -0,0 +1,106 @@ +; RUN: llc -mtriple x86_64-apple-darwin -filetype=obj -o %t.o < %s +; RUN: llvm-dwarfdump %t.o | FileCheck %s +; +; Test that DW_AT_location is generated for a captured "self" inside a +; block. +; +; This test is split into two parts, the frontend part can be found at +; llvm/tools/clang/test/CodeGenObjC/debug-info-block-captured-self.m +; +; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}} +; CHECK: DW_TAG_variable +; CHECK: {{.*}}DW_AT_name{{.*}}"self"{{.*}} +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location +; +; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}} +; CHECK: DW_TAG_variable +; CHECK: {{.*}}DW_AT_name{{.*}}"self"{{.*}} +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location +; +; Generated (and then reduced) from +; ---------------------------------------------------------------------- +; +; @class T; +; @interface S +; @end +; @interface Mode +; -(int) count; +; @end +; @interface Context +; @end +; @interface ViewController +; @property (nonatomic, readwrite, strong) Context *context; +; @end +; typedef enum { +; Unknown = 0, +; } State; +; @interface Main : ViewController +; { +; T * t1; +; T * t2; +; } +; @property(readwrite, nonatomic) State state; +; @end +; @implementation Main +; - (id) initWithContext:(Context *) context +; { +; t1 = [self.context withBlock:^(id obj){ +; id *mode1; +; t2 = [mode1 withBlock:^(id object){ +; Mode *mode2 = object; +; if ([mode2 count] != 0) { +; self.state = 0; +; } +; }]; +; }]; +; } +; @end +; ---------------------------------------------------------------------- +; ModuleID = 'llvm/tools/clang/test/CodeGenObjC/debug-info-block-captured-self.m' +%0 = type opaque +%struct.__block_descriptor = type { i64, i64 } +declare void @llvm.dbg.declare(metadata, metadata) #1 +define internal void @"__24-[Main initWithContext:]_block_invoke"(i8* %.block_descriptor, i8* %obj) #0 { + %block = bitcast i8* %.block_descriptor to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !84 + %block.captured-self = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %block, i32 0, i32 5, !dbg !84 + call void @llvm.dbg.declare(metadata !{<{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %block}, metadata !86), !dbg !87 + ret void, !dbg !87 +} + +define internal void @"__24-[Main initWithContext:]_block_invoke_2"(i8* %.block_descriptor, i8* %object) #0 { + %block = bitcast i8* %.block_descriptor to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !103 + %block.captured-self = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %block, i32 0, i32 5, !dbg !103 + call void @llvm.dbg.declare(metadata !{<{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %block}, metadata !105), !dbg !106 + ret void, !dbg !106 +} + +!llvm.dbg.cu = !{!0} +!0 = metadata !{i32 786449, i32 16, metadata !1, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 2, metadata !2, metadata !4, metadata !23, metadata !15, metadata !""} ; [ DW_TAG_compile_unit ] [llvm/tools/clang/test/CodeGenObjC/debug-info-block-captured-self.m] [DW_LANG_ObjC] +!1 = metadata !{i32 786473, metadata !107} ; [ DW_TAG_file_type ] +!2 = metadata !{metadata !3} +!3 = metadata !{i32 786436, metadata !107, null, metadata !"", i32 20, i64 32, i64 32, i32 0, i32 0, null, metadata !4, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] [line 20, size 32, align 32, offset 0] [from ] +!4 = metadata !{} +!15 = metadata !{i32 0} +!23 = metadata !{metadata !38, metadata !42} +!27 = metadata !{i32 786454, metadata !107, null, metadata !"id", i32 31, i64 0, i64 0, i64 0, i32 0, metadata !28} ; [ DW_TAG_typedef ] [id] [line 31, size 0, align 0, offset 0] [from ] +!28 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !29} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from objc_object] +!29 = metadata !{i32 786451, metadata !107, null, metadata !"objc_object", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !30, i32 0, null, null} ; [ DW_TAG_structure_type ] [objc_object] [line 0, size 0, align 0, offset 0] [from ] +!30 = metadata !{metadata !31} +!31 = metadata !{i32 786445, metadata !107, metadata !29, metadata !"isa", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !32} ; [ DW_TAG_member ] [isa] [line 0, size 64, align 0, offset 0] [from ] +!32 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !33} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from objc_class] +!33 = metadata !{i32 786451, metadata !107, null, metadata !"objc_class", i32 0, i64 0, i64 0, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_structure_type ] [objc_class] [line 0, size 0, align 0, offset 0] [fwd] [from ] +!34 = metadata !{i32 786451, metadata !107, null, metadata !"Main", i32 23, i64 0, i64 0, i32 0, i32 1092, i32 0, i32 0, i32 16} ; [ DW_TAG_structure_type ] [Main] [line 23, size 0, align 0, offset 0] [artificial] [fwd] [from ] +!38 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"__24-[Main initWithContext:]_block_invoke", metadata !"__24-[Main initWithContext:]_block_invoke", metadata !"", i32 33, metadata !39, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*, i8*)* @"__24-[Main initWithContext:]_block_invoke", null, null, metadata !15, i32 33} ; [ DW_TAG_subprogram ] [line 33] [local] [def] [__24-[Main initWithContext:]_block_invoke] +!39 = metadata !{i32 786453, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !40, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!40 = metadata !{null, metadata !41, metadata !27} +!41 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!42 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"__24-[Main initWithContext:]_block_invoke_2", metadata !"__24-[Main initWithContext:]_block_invoke_2", metadata !"", i32 35, metadata !39, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*, i8*)* @"__24-[Main initWithContext:]_block_invoke_2", null, null, metadata !15, i32 35} ; [ DW_TAG_subprogram ] [line 35] [local] [def] [__24-[Main initWithContext:]_block_invoke_2] +!84 = metadata !{i32 33, i32 0, metadata !38, null} +!86 = metadata !{i32 786688, metadata !38, metadata !"self", metadata !1, i32 41, metadata !34, i32 0, i32 0, i64 1, i64 32} ; [ DW_TAG_auto_variable ] [self] [line 41] +!87 = metadata !{i32 41, i32 0, metadata !38, null} +!103 = metadata !{i32 35, i32 0, metadata !42, null} +!105 = metadata !{i32 786688, metadata !42, metadata !"self", metadata !1, i32 40, metadata !34, i32 0, i32 0, i64 1, i64 32} ; [ DW_TAG_auto_variable ] [self] [line 40] +!106 = metadata !{i32 40, i32 0, metadata !42, null} +!107 = metadata !{metadata !"llvm/tools/clang/test/CodeGenObjC/debug-info-block-captured-self.m", metadata !""} diff --git a/test/DebugInfo/X86/debug-info-blocks.ll b/test/DebugInfo/X86/debug-info-blocks.ll new file mode 100644 index 000000000000..36ab61100856 --- /dev/null +++ b/test/DebugInfo/X86/debug-info-blocks.ll @@ -0,0 +1,372 @@ +; RUN: llc -mtriple x86_64-apple-darwin -filetype=obj -o %t.o < %s +; RUN: llvm-dwarfdump -debug-dump=info %t.o | FileCheck %s + +; Generated from llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m +; rdar://problem/9279956 +; test that the DW_AT_location of self is at ( fbreg +{{[0-9]+}}, deref, +{{[0-9]+}} ) + +; CHECK: DW_AT_name{{.*}}_block_invoke +; CHECK-NOT: DW_TAG_subprogram +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: .block_descriptor +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG_subprogram +; CHECK: DW_TAG_variable +; CHECK-NEXT: DW_AT_name{{.*}}"self" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_type{{.*}}{[[APTR:.*]]} +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_artificial +; CHECK-NOT: DW_TAG +; 0x06 = DW_OP_deref +; 0x23 = DW_OP_uconst +; 0x91 = DW_OP_fbreg +; CHECK: DW_AT_location{{.*}}91 {{[0-9]+}} 06 23 {{[0-9]+}} ) +; CHECK: DW_TAG_structure_type +; CHECK: [[A:.*]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_APPLE_objc_complete_type +; CHECK-NEXT: DW_AT_name{{.*}}"A" +; CHECK: [[APTR]]: DW_TAG_pointer_type [5] +; CHECK-NEXT: {[[A]]} + + +; ModuleID = 'llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m' +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-darwin" + +%0 = type opaque +%1 = type opaque +%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* } +%struct._objc_cache = type opaque +%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* } +%struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] } +%struct._objc_method = type { i8*, i8*, i8* } +%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] } +%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8** } +%struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] } +%struct._prop_t = type { i8*, i8* } +%struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] } +%struct._ivar_t = type { i64*, i8*, i8*, i32, i32 } +%struct._message_ref_t = type { i8*, i8* } +%struct._objc_super = type { i8*, i8* } +%struct.__block_descriptor = type { i64, i64 } +%struct.__block_literal_generic = type { i8*, i32, i32, i8*, %struct.__block_descriptor* } + +@"OBJC_CLASS_$_A" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_A", %struct._class_t* @"OBJC_CLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** @_objc_empty_vtable, %struct._class_ro_t* @"\01l_OBJC_CLASS_RO_$_A" }, section "__DATA, __objc_data", align 8 +@"\01L_OBJC_CLASSLIST_SUP_REFS_$_" = internal global %struct._class_t* @"OBJC_CLASS_$_A", section "__DATA, __objc_superrefs, regular, no_dead_strip", align 8 +@"\01L_OBJC_METH_VAR_NAME_" = internal global [5 x i8] c"init\00", section "__TEXT,__objc_methname,cstring_literals", align 1 +@"\01L_OBJC_SELECTOR_REFERENCES_" = internal externally_initialized global i8* getelementptr inbounds ([5 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip" +@"OBJC_CLASS_$_NSMutableDictionary" = external global %struct._class_t +@"\01L_OBJC_CLASSLIST_REFERENCES_$_" = internal global %struct._class_t* @"OBJC_CLASS_$_NSMutableDictionary", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8 +@"\01L_OBJC_METH_VAR_NAME_1" = internal global [6 x i8] c"alloc\00", section "__TEXT,__objc_methname,cstring_literals", align 1 +@"\01l_objc_msgSend_fixup_alloc" = weak hidden global { i8* (i8*, %struct._message_ref_t*, ...)*, i8* } { i8* (i8*, %struct._message_ref_t*, ...)* @objc_msgSend_fixup, i8* getelementptr inbounds ([6 x i8]* @"\01L_OBJC_METH_VAR_NAME_1", i32 0, i32 0) }, section "__DATA, __objc_msgrefs, coalesced", align 16 +@"\01L_OBJC_METH_VAR_NAME_2" = internal global [6 x i8] c"count\00", section "__TEXT,__objc_methname,cstring_literals", align 1 +@"\01l_objc_msgSend_fixup_count" = weak hidden global { i8* (i8*, %struct._message_ref_t*, ...)*, i8* } { i8* (i8*, %struct._message_ref_t*, ...)* @objc_msgSend_fixup, i8* getelementptr inbounds ([6 x i8]* @"\01L_OBJC_METH_VAR_NAME_2", i32 0, i32 0) }, section "__DATA, __objc_msgrefs, coalesced", align 16 +@"OBJC_IVAR_$_A.ivar" = global i64 0, section "__DATA, __objc_ivar", align 8 +@_NSConcreteStackBlock = external global i8* +@.str = private unnamed_addr constant [6 x i8] c"v8@?0\00", align 1 +@__block_descriptor_tmp = internal constant { i64, i64, i8*, i8*, i8*, i64 } { i64 0, i64 40, i8* bitcast (void (i8*, i8*)* @__copy_helper_block_ to i8*), i8* bitcast (void (i8*)* @__destroy_helper_block_ to i8*), i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), i64 256 } +@_objc_empty_cache = external global %struct._objc_cache +@_objc_empty_vtable = external global i8* (i8*, i8*)* +@"OBJC_METACLASS_$_NSObject" = external global %struct._class_t +@"\01L_OBJC_CLASS_NAME_" = internal global [2 x i8] c"A\00", section "__TEXT,__objc_classname,cstring_literals", align 1 +@"\01l_OBJC_METACLASS_RO_$_A" = internal global %struct._class_ro_t { i32 1, i32 40, i32 40, i8* null, i8* getelementptr inbounds ([2 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8 +@"OBJC_METACLASS_$_A" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** @_objc_empty_vtable, %struct._class_ro_t* @"\01l_OBJC_METACLASS_RO_$_A" }, section "__DATA, __objc_data", align 8 +@"OBJC_CLASS_$_NSObject" = external global %struct._class_t +@"\01L_OBJC_METH_VAR_TYPE_" = internal global [8 x i8] c"@16@0:8\00", section "__TEXT,__objc_methtype,cstring_literals", align 1 +@"\01l_OBJC_$_INSTANCE_METHODS_A" = internal global { i32, i32, [1 x %struct._objc_method] } { i32 24, i32 1, [1 x %struct._objc_method] [%struct._objc_method { i8* getelementptr inbounds ([5 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* getelementptr inbounds ([8 x i8]* @"\01L_OBJC_METH_VAR_TYPE_", i32 0, i32 0), i8* bitcast (i8* (%0*, i8*)* @"\01-[A init]" to i8*) }] }, section "__DATA, __objc_const", align 8 +@"\01L_OBJC_METH_VAR_NAME_3" = internal global [5 x i8] c"ivar\00", section "__TEXT,__objc_methname,cstring_literals", align 1 +@"\01L_OBJC_METH_VAR_TYPE_4" = internal global [2 x i8] c"i\00", section "__TEXT,__objc_methtype,cstring_literals", align 1 +@"\01l_OBJC_$_INSTANCE_VARIABLES_A" = internal global { i32, i32, [1 x %struct._ivar_t] } { i32 32, i32 1, [1 x %struct._ivar_t] [%struct._ivar_t { i64* @"OBJC_IVAR_$_A.ivar", i8* getelementptr inbounds ([5 x i8]* @"\01L_OBJC_METH_VAR_NAME_3", i32 0, i32 0), i8* getelementptr inbounds ([2 x i8]* @"\01L_OBJC_METH_VAR_TYPE_4", i32 0, i32 0), i32 2, i32 4 }] }, section "__DATA, __objc_const", align 8 +@"\01l_OBJC_CLASS_RO_$_A" = internal global %struct._class_ro_t { i32 0, i32 0, i32 4, i8* null, i8* getelementptr inbounds ([2 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* bitcast ({ i32, i32, [1 x %struct._objc_method] }* @"\01l_OBJC_$_INSTANCE_METHODS_A" to %struct.__method_list_t*), %struct._objc_protocol_list* null, %struct._ivar_list_t* bitcast ({ i32, i32, [1 x %struct._ivar_t] }* @"\01l_OBJC_$_INSTANCE_VARIABLES_A" to %struct._ivar_list_t*), i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8 +@"\01L_OBJC_CLASSLIST_REFERENCES_$_5" = internal global %struct._class_t* @"OBJC_CLASS_$_A", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8 +@"\01L_OBJC_LABEL_CLASS_$" = internal global [1 x i8*] [i8* bitcast (%struct._class_t* @"OBJC_CLASS_$_A" to i8*)], section "__DATA, __objc_classlist, regular, no_dead_strip", align 8 +@llvm.used = appending global [14 x i8*] [i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_SUP_REFS_$_" to i8*), i8* getelementptr inbounds ([5 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_" to i8*), i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_" to i8*), i8* getelementptr inbounds ([6 x i8]* @"\01L_OBJC_METH_VAR_NAME_1", i32 0, i32 0), i8* getelementptr inbounds ([6 x i8]* @"\01L_OBJC_METH_VAR_NAME_2", i32 0, i32 0), i8* getelementptr inbounds ([2 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), i8* getelementptr inbounds ([8 x i8]* @"\01L_OBJC_METH_VAR_TYPE_", i32 0, i32 0), i8* bitcast ({ i32, i32, [1 x %struct._objc_method] }* @"\01l_OBJC_$_INSTANCE_METHODS_A" to i8*), i8* getelementptr inbounds ([5 x i8]* @"\01L_OBJC_METH_VAR_NAME_3", i32 0, i32 0), i8* getelementptr inbounds ([2 x i8]* @"\01L_OBJC_METH_VAR_TYPE_4", i32 0, i32 0), i8* bitcast ({ i32, i32, [1 x %struct._ivar_t] }* @"\01l_OBJC_$_INSTANCE_VARIABLES_A" to i8*), i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_5" to i8*), i8* bitcast ([1 x i8*]* @"\01L_OBJC_LABEL_CLASS_$" to i8*)], section "llvm.metadata" + +define internal i8* @"\01-[A init]"(%0* %self, i8* %_cmd) #0 { + %1 = alloca %0*, align 8 + %2 = alloca i8*, align 8 + %3 = alloca %struct._objc_super + %4 = alloca <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, align 8 + store %0* %self, %0** %1, align 8 + call void @llvm.dbg.declare(metadata !{%0** %1}, metadata !60), !dbg !62 + store i8* %_cmd, i8** %2, align 8 + call void @llvm.dbg.declare(metadata !{i8** %2}, metadata !63), !dbg !62 + %5 = load %0** %1, !dbg !65 + %6 = bitcast %0* %5 to i8*, !dbg !65 + %7 = getelementptr inbounds %struct._objc_super* %3, i32 0, i32 0, !dbg !65 + store i8* %6, i8** %7, !dbg !65 + %8 = load %struct._class_t** @"\01L_OBJC_CLASSLIST_SUP_REFS_$_", !dbg !65 + %9 = bitcast %struct._class_t* %8 to i8*, !dbg !65 + %10 = getelementptr inbounds %struct._objc_super* %3, i32 0, i32 1, !dbg !65 + store i8* %9, i8** %10, !dbg !65 + %11 = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_", !dbg !65, !invariant.load !67 + %12 = call i8* bitcast (i8* (%struct._objc_super*, i8*, ...)* @objc_msgSendSuper2 to i8* (%struct._objc_super*, i8*)*)(%struct._objc_super* %3, i8* %11), !dbg !65 + %13 = bitcast i8* %12 to %0*, !dbg !65 + store %0* %13, %0** %1, align 8, !dbg !65 + %14 = icmp ne %0* %13, null, !dbg !65 + br i1 %14, label %15, label %24, !dbg !65 + +; <label>:15 ; preds = %0 + %16 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 0, !dbg !68 + store i8* bitcast (i8** @_NSConcreteStackBlock to i8*), i8** %16, !dbg !68 + %17 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 1, !dbg !68 + store i32 -1040187392, i32* %17, !dbg !68 + %18 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 2, !dbg !68 + store i32 0, i32* %18, !dbg !68 + %19 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 3, !dbg !68 + store i8* bitcast (void (i8*)* @"__9-[A init]_block_invoke" to i8*), i8** %19, !dbg !68 + %20 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 4, !dbg !68 + store %struct.__block_descriptor* bitcast ({ i64, i64, i8*, i8*, i8*, i64 }* @__block_descriptor_tmp to %struct.__block_descriptor*), %struct.__block_descriptor** %20, !dbg !68 + %21 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 5, !dbg !68 + %22 = load %0** %1, align 8, !dbg !68 + store %0* %22, %0** %21, align 8, !dbg !68 + %23 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4 to void ()*, !dbg !68 + call void @run(void ()* %23), !dbg !68 + br label %24, !dbg !70 + +; <label>:24 ; preds = %15, %0 + %25 = load %0** %1, align 8, !dbg !71 + %26 = bitcast %0* %25 to i8*, !dbg !71 + ret i8* %26, !dbg !71 +} + +declare void @llvm.dbg.declare(metadata, metadata) #1 + +declare i8* @objc_msgSendSuper2(%struct._objc_super*, i8*, ...) + +define internal void @run(void ()* %block) #0 { + %1 = alloca void ()*, align 8 + store void ()* %block, void ()** %1, align 8 + call void @llvm.dbg.declare(metadata !{void ()** %1}, metadata !72), !dbg !73 + %2 = load void ()** %1, align 8, !dbg !74 + %3 = bitcast void ()* %2 to %struct.__block_literal_generic*, !dbg !74 + %4 = getelementptr inbounds %struct.__block_literal_generic* %3, i32 0, i32 3, !dbg !74 + %5 = bitcast %struct.__block_literal_generic* %3 to i8*, !dbg !74 + %6 = load i8** %4, !dbg !74 + %7 = bitcast i8* %6 to void (i8*)*, !dbg !74 + call void %7(i8* %5), !dbg !74 + ret void, !dbg !75 +} + +define internal void @"__9-[A init]_block_invoke"(i8* %.block_descriptor) #0 { + %1 = alloca i8*, align 8 + %2 = alloca <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, align 8 + %d = alloca %1*, align 8 + store i8* %.block_descriptor, i8** %1, align 8 + %3 = load i8** %1 + call void @llvm.dbg.value(metadata !{i8* %3}, i64 0, metadata !76), !dbg !88 + call void @llvm.dbg.declare(metadata !{i8* %.block_descriptor}, metadata !76), !dbg !88 + %4 = bitcast i8* %.block_descriptor to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !88 + store <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>** %2, align 8, !dbg !88 + %5 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 5, !dbg !88 + call void @llvm.dbg.declare(metadata !{<{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>** %2}, metadata !89), !dbg !90 + call void @llvm.dbg.declare(metadata !{%1** %d}, metadata !91), !dbg !100 + %6 = load %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_", !dbg !100 + %7 = bitcast %struct._class_t* %6 to i8*, !dbg !100 + %8 = load i8** getelementptr inbounds (%struct._message_ref_t* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_alloc" to %struct._message_ref_t*), i32 0, i32 0), !dbg !100 + %9 = bitcast i8* %8 to i8* (i8*, i8*)*, !dbg !100 + %10 = call i8* %9(i8* %7, i8* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_alloc" to i8*)), !dbg !100 + %11 = bitcast i8* %10 to %1*, !dbg !100 + %12 = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_", !dbg !100, !invariant.load !67 + %13 = bitcast %1* %11 to i8*, !dbg !100 + %14 = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %13, i8* %12), !dbg !100 + %15 = bitcast i8* %14 to %1*, !dbg !100 + store %1* %15, %1** %d, align 8, !dbg !100 + %16 = load %1** %d, align 8, !dbg !101 + %17 = bitcast %1* %16 to i8*, !dbg !101 + %18 = load i8** getelementptr inbounds (%struct._message_ref_t* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_count" to %struct._message_ref_t*), i32 0, i32 0), !dbg !101 + %19 = bitcast i8* %18 to i32 (i8*, i8*)*, !dbg !101 + %20 = call i32 %19(i8* %17, i8* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_count" to i8*)), !dbg !101 + %21 = add nsw i32 42, %20, !dbg !101 + %22 = load %0** %5, align 8, !dbg !101 + %23 = load i64* @"OBJC_IVAR_$_A.ivar", !dbg !101, !invariant.load !67 + %24 = bitcast %0* %22 to i8*, !dbg !101 + %25 = getelementptr inbounds i8* %24, i64 %23, !dbg !101 + %26 = bitcast i8* %25 to i32*, !dbg !101 + store i32 %21, i32* %26, align 4, !dbg !101 + ret void, !dbg !90 +} + +declare void @llvm.dbg.value(metadata, i64, metadata) #1 + +declare i8* @objc_msgSend_fixup(i8*, %struct._message_ref_t*, ...) + +declare i8* @objc_msgSend(i8*, i8*, ...) #2 + +define internal void @__copy_helper_block_(i8*, i8*) { + %3 = alloca i8*, align 8 + %4 = alloca i8*, align 8 + store i8* %0, i8** %3, align 8 + call void @llvm.dbg.declare(metadata !{i8** %3}, metadata !102), !dbg !103 + store i8* %1, i8** %4, align 8 + call void @llvm.dbg.declare(metadata !{i8** %4}, metadata !104), !dbg !103 + %5 = load i8** %4, !dbg !103 + %6 = bitcast i8* %5 to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !103 + %7 = load i8** %3, !dbg !103 + %8 = bitcast i8* %7 to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !103 + %9 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %6, i32 0, i32 5, !dbg !103 + %10 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %8, i32 0, i32 5, !dbg !103 + %11 = load %0** %9, !dbg !103 + %12 = bitcast %0* %11 to i8*, !dbg !103 + %13 = bitcast %0** %10 to i8*, !dbg !103 + call void @_Block_object_assign(i8* %13, i8* %12, i32 3) #3, !dbg !103 + ret void, !dbg !103 +} + +declare void @_Block_object_assign(i8*, i8*, i32) + +define internal void @__destroy_helper_block_(i8*) { + %2 = alloca i8*, align 8 + store i8* %0, i8** %2, align 8 + call void @llvm.dbg.declare(metadata !{i8** %2}, metadata !105), !dbg !106 + %3 = load i8** %2, !dbg !106 + %4 = bitcast i8* %3 to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !106 + %5 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 5, !dbg !106 + %6 = load %0** %5, !dbg !106 + %7 = bitcast %0* %6 to i8*, !dbg !106 + call void @_Block_object_dispose(i8* %7, i32 3) #3, !dbg !106 + ret void, !dbg !106 +} + +declare void @_Block_object_dispose(i8*, i32) + +define i32 @main() #0 { + %1 = alloca i32, align 4 + %a = alloca %0*, align 8 + store i32 0, i32* %1 + call void @llvm.dbg.declare(metadata !{%0** %a}, metadata !107), !dbg !108 + %2 = load %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_5", !dbg !108 + %3 = bitcast %struct._class_t* %2 to i8*, !dbg !108 + %4 = load i8** getelementptr inbounds (%struct._message_ref_t* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_alloc" to %struct._message_ref_t*), i32 0, i32 0), !dbg !108 + %5 = bitcast i8* %4 to i8* (i8*, i8*)*, !dbg !108 + %6 = call i8* %5(i8* %3, i8* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_alloc" to i8*)), !dbg !108 + %7 = bitcast i8* %6 to %0*, !dbg !108 + %8 = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_", !dbg !108, !invariant.load !67 + %9 = bitcast %0* %7 to i8*, !dbg !108 + %10 = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %9, i8* %8), !dbg !108 + %11 = bitcast i8* %10 to %0*, !dbg !108 + store %0* %11, %0** %a, align 8, !dbg !108 + ret i32 0, !dbg !109 +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } +attributes #2 = { nonlazybind } +attributes #3 = { nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!56, !57, !58, !59} + +!0 = metadata !{i32 786449, metadata !1, i32 16, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 2, metadata !2, metadata !3, metadata !12, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [llvm/tools/clang/test/CodeGenObjC/<unknown>] [DW_LANG_ObjC] +!1 = metadata !{metadata !"llvm/tools/clang/test/CodeGenObjC/<unknown>", metadata !"llvm/_build.ninja.Debug"} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"A", i32 33, i64 32, i64 32, i32 0, i32 512, null, metadata !7, i32 16, null, null} ; [ DW_TAG_structure_type ] [A] [line 33, size 32, align 32, offset 0] [from ] +!5 = metadata !{metadata !"llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m", metadata !"llvm/_build.ninja.Debug"} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m] +!7 = metadata !{metadata !8, metadata !10} +!8 = metadata !{i32 786460, null, metadata !4, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_inheritance ] [line 0, size 0, align 0, offset 0] [from NSObject] +!9 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"NSObject", i32 21, i64 0, i64 8, i32 0, i32 0, null, metadata !2, i32 16, null, null} ; [ DW_TAG_structure_type ] [NSObject] [line 21, size 0, align 8, offset 0] [from ] +!10 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"ivar", i32 35, i64 32, i64 32, i64 0, i32 0, metadata !11, null} ; [ DW_TAG_member ] [ivar] [line 35, size 32, align 32, offset 0] [from int] +!11 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!12 = metadata !{metadata !13, metadata !27, metadata !31, metadata !35, metadata !36, metadata !39} +!13 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"-[A init]", metadata !"-[A init]", metadata !"", i32 46, metadata !14, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, i8* (%0*, i8*)* @"\01-[A init]", null, null, metadata !2, i32 46} ; [ DW_TAG_subprogram ] [line 46] [local] [def] [-[A init]] +!14 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!15 = metadata !{metadata !16, metadata !23, metadata !24} +!16 = metadata !{i32 786454, metadata !5, null, metadata !"id", i32 46, i64 0, i64 0, i64 0, i32 0, metadata !17} ; [ DW_TAG_typedef ] [id] [line 46, size 0, align 0, offset 0] [from ] +!17 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !18} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from objc_object] +!18 = metadata !{i32 786451, metadata !1, null, metadata !"objc_object", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !19, i32 0, null, null} ; [ DW_TAG_structure_type ] [objc_object] [line 0, size 0, align 0, offset 0] [from ] +!19 = metadata !{metadata !20} +!20 = metadata !{i32 786445, metadata !1, metadata !18, metadata !"isa", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !21} ; [ DW_TAG_member ] [isa] [line 0, size 64, align 0, offset 0] [from ] +!21 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !22} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from objc_class] +!22 = metadata !{i32 786451, metadata !1, null, metadata !"objc_class", i32 0, i64 0, i64 0, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_structure_type ] [objc_class] [line 0, size 0, align 0, offset 0] [fwd] [from ] +!23 = metadata !{i32 786447, i32 0, i32 0, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !4} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from A] +!24 = metadata !{i32 786454, metadata !5, i32 0, metadata !"SEL", i32 46, i64 0, i64 0, i64 0, i32 64, metadata !25} ; [ DW_TAG_typedef ] [SEL] [line 46, size 0, align 0, offset 0] [artificial] [from ] +!25 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !26} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from objc_selector] +!26 = metadata !{i32 786451, metadata !1, null, metadata !"objc_selector", i32 0, i64 0, i64 0, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_structure_type ] [objc_selector] [line 0, size 0, align 0, offset 0] [fwd] [from ] +!27 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"__9-[A init]_block_invoke", metadata !"__9-[A init]_block_invoke", metadata !"", i32 49, metadata !28, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*)* @"__9-[A init]_block_invoke", null, null, metadata !2, i32 49} ; [ DW_TAG_subprogram ] [line 49] [local] [def] [__9-[A init]_block_invoke] +!28 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !29, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!29 = metadata !{null, metadata !30} +!30 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!31 = metadata !{i32 786478, metadata !1, metadata !32, metadata !"__copy_helper_block_", metadata !"__copy_helper_block_", metadata !"", i32 52, metadata !33, i1 true, i1 true, i32 0, i32 0, null, i32 0, i1 false, void (i8*, i8*)* @__copy_helper_block_, null, null, metadata !2, i32 52} ; [ DW_TAG_subprogram ] [line 52] [local] [def] [__copy_helper_block_] +!32 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [llvm/tools/clang/test/CodeGenObjC/<unknown>] +!33 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !34, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!34 = metadata !{null, metadata !30, metadata !30} +!35 = metadata !{i32 786478, metadata !1, metadata !32, metadata !"__destroy_helper_block_", metadata !"__destroy_helper_block_", metadata !"", i32 52, metadata !28, i1 true, i1 true, i32 0, i32 0, null, i32 0, i1 false, void (i8*)* @__destroy_helper_block_, null, null, metadata !2, i32 52} ; [ DW_TAG_subprogram ] [line 52] [local] [def] [__destroy_helper_block_] +!36 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 59, metadata !37, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !2, i32 60} ; [ DW_TAG_subprogram ] [line 59] [def] [scope 60] [main] +!37 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !38, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!38 = metadata !{metadata !11} +!39 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"run", metadata !"run", metadata !"", i32 39, metadata !40, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (void ()*)* @run, null, null, metadata !2, i32 40} ; [ DW_TAG_subprogram ] [line 39] [local] [def] [scope 40] [run] +!40 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !41, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!41 = metadata !{null, metadata !42} +!42 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !43} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from __block_literal_generic] +!43 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"__block_literal_generic", i32 40, i64 256, i64 0, i32 0, i32 8, null, metadata !44, i32 0, null, null} ; [ DW_TAG_structure_type ] [__block_literal_generic] [line 40, size 256, align 0, offset 0] [from ] +!44 = metadata !{metadata !45, metadata !46, metadata !47, metadata !48, metadata !49} +!45 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__isa", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !30} ; [ DW_TAG_member ] [__isa] [line 0, size 64, align 64, offset 0] [from ] +!46 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__flags", i32 0, i64 32, i64 32, i64 64, i32 0, metadata !11} ; [ DW_TAG_member ] [__flags] [line 0, size 32, align 32, offset 64] [from int] +!47 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__reserved", i32 0, i64 32, i64 32, i64 96, i32 0, metadata !11} ; [ DW_TAG_member ] [__reserved] [line 0, size 32, align 32, offset 96] [from int] +!48 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__FuncPtr", i32 0, i64 64, i64 64, i64 128, i32 0, metadata !30} ; [ DW_TAG_member ] [__FuncPtr] [line 0, size 64, align 64, offset 128] [from ] +!49 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__descriptor", i32 40, i64 64, i64 64, i64 192, i32 0, metadata !50} ; [ DW_TAG_member ] [__descriptor] [line 40, size 64, align 64, offset 192] [from ] +!50 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !51} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from __block_descriptor] +!51 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"__block_descriptor", i32 40, i64 128, i64 0, i32 0, i32 8, null, metadata !52, i32 0, null, null} ; [ DW_TAG_structure_type ] [__block_descriptor] [line 40, size 128, align 0, offset 0] [from ] +!52 = metadata !{metadata !53, metadata !55} +!53 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"reserved", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !54} ; [ DW_TAG_member ] [reserved] [line 0, size 64, align 64, offset 0] [from long unsigned int] +!54 = metadata !{i32 786468, null, null, metadata !"long unsigned int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [long unsigned int] [line 0, size 64, align 64, offset 0, enc DW_ATE_unsigned] +!55 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"Size", i32 0, i64 64, i64 64, i64 64, i32 0, metadata !54} ; [ DW_TAG_member ] [Size] [line 0, size 64, align 64, offset 64] [from long unsigned int] +!56 = metadata !{i32 1, metadata !"Objective-C Version", i32 2} +!57 = metadata !{i32 1, metadata !"Objective-C Image Info Version", i32 0} +!58 = metadata !{i32 1, metadata !"Objective-C Image Info Section", metadata !"__DATA, __objc_imageinfo, regular, no_dead_strip"} +!59 = metadata !{i32 4, metadata !"Objective-C Garbage Collection", i32 0} +!60 = metadata !{i32 786689, metadata !13, metadata !"self", metadata !32, i32 16777262, metadata !61, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [self] [line 46] +!61 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !4} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from A] +!62 = metadata !{i32 46, i32 0, metadata !13, null} +!63 = metadata !{i32 786689, metadata !13, metadata !"_cmd", metadata !32, i32 33554478, metadata !64, i32 64, i32 0} ; [ DW_TAG_arg_variable ] [_cmd] [line 46] +!64 = metadata !{i32 786454, metadata !5, null, metadata !"SEL", i32 46, i64 0, i64 0, i64 0, i32 0, metadata !25} ; [ DW_TAG_typedef ] [SEL] [line 46, size 0, align 0, offset 0] [from ] +!65 = metadata !{i32 48, i32 0, metadata !66, null} +!66 = metadata !{i32 786443, metadata !5, metadata !13, i32 47, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m] +!67 = metadata !{} +!68 = metadata !{i32 49, i32 0, metadata !69, null} +!69 = metadata !{i32 786443, metadata !5, metadata !66, i32 48, i32 0, i32 1} ; [ DW_TAG_lexical_block ] [llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m] +!70 = metadata !{i32 53, i32 0, metadata !69, null} +!71 = metadata !{i32 54, i32 0, metadata !66, null} +!72 = metadata !{i32 786689, metadata !39, metadata !"block", metadata !6, i32 16777255, metadata !42, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [block] [line 39] +!73 = metadata !{i32 39, i32 0, metadata !39, null} +!74 = metadata !{i32 41, i32 0, metadata !39, null} +!75 = metadata !{i32 42, i32 0, metadata !39, null} +!76 = metadata !{i32 786689, metadata !27, metadata !".block_descriptor", metadata !6, i32 16777265, metadata !77, i32 64, i32 0} ; [ DW_TAG_arg_variable ] [.block_descriptor] [line 49] +!77 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !78} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from __block_literal_1] +!78 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"__block_literal_1", i32 49, i64 320, i64 64, i32 0, i32 0, null, metadata !79, i32 0, null, null} ; [ DW_TAG_structure_type ] [__block_literal_1] [line 49, size 320, align 64, offset 0] [from ] +!79 = metadata !{metadata !80, metadata !81, metadata !82, metadata !83, metadata !84, metadata !87} +!80 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__isa", i32 49, i64 64, i64 64, i64 0, i32 0, metadata !30} ; [ DW_TAG_member ] [__isa] [line 49, size 64, align 64, offset 0] [from ] +!81 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__flags", i32 49, i64 32, i64 32, i64 64, i32 0, metadata !11} ; [ DW_TAG_member ] [__flags] [line 49, size 32, align 32, offset 64] [from int] +!82 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__reserved", i32 49, i64 32, i64 32, i64 96, i32 0, metadata !11} ; [ DW_TAG_member ] [__reserved] [line 49, size 32, align 32, offset 96] [from int] +!83 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__FuncPtr", i32 49, i64 64, i64 64, i64 128, i32 0, metadata !30} ; [ DW_TAG_member ] [__FuncPtr] [line 49, size 64, align 64, offset 128] [from ] +!84 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"__descriptor", i32 49, i64 64, i64 64, i64 192, i32 0, metadata !85} ; [ DW_TAG_member ] [__descriptor] [line 49, size 64, align 64, offset 192] [from ] +!85 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !86} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from __block_descriptor_withcopydispose] +!86 = metadata !{i32 786451, metadata !1, null, metadata !"__block_descriptor_withcopydispose", i32 49, i64 0, i64 0, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_structure_type ] [__block_descriptor_withcopydispose] [line 49, size 0, align 0, offset 0] [fwd] [from ] +!87 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"self", i32 49, i64 64, i64 64, i64 256, i32 0, metadata !61} ; [ DW_TAG_member ] [self] [line 49, size 64, align 64, offset 256] [from ] +!88 = metadata !{i32 49, i32 0, metadata !27, null} +!89 = metadata !{i32 786688, metadata !27, metadata !"self", metadata !32, i32 52, metadata !23, i32 0, i32 0, i64 2, i64 1, i64 32} ; [ DW_TAG_auto_variable ] [self] [line 52] +!90 = metadata !{i32 52, i32 0, metadata !27, null} +!91 = metadata !{i32 786688, metadata !92, metadata !"d", metadata !6, i32 50, metadata !93, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [d] [line 50] +!92 = metadata !{i32 786443, metadata !5, metadata !27, i32 49, i32 0, i32 2} ; [ DW_TAG_lexical_block ] [llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m] +!93 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !94} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from NSMutableDictionary] +!94 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"NSMutableDictionary", i32 30, i64 0, i64 8, i32 0, i32 0, null, metadata !95, i32 16, null, null} ; [ DW_TAG_structure_type ] [NSMutableDictionary] [line 30, size 0, align 8, offset 0] [from ] +!95 = metadata !{metadata !96} +!96 = metadata !{i32 786460, null, metadata !94, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !97} ; [ DW_TAG_inheritance ] [line 0, size 0, align 0, offset 0] [from NSDictionary] +!97 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"NSDictionary", i32 26, i64 0, i64 8, i32 0, i32 0, null, metadata !98, i32 16, null, null} ; [ DW_TAG_structure_type ] [NSDictionary] [line 26, size 0, align 8, offset 0] [from ] +!98 = metadata !{metadata !99} +!99 = metadata !{i32 786460, null, metadata !97, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_inheritance ] [line 0, size 0, align 0, offset 0] [from NSObject] +!100 = metadata !{i32 50, i32 0, metadata !92, null} +!101 = metadata !{i32 51, i32 0, metadata !92, null} +!102 = metadata !{i32 786689, metadata !31, metadata !"", metadata !32, i32 16777268, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [line 52] +!103 = metadata !{i32 52, i32 0, metadata !31, null} +!104 = metadata !{i32 786689, metadata !31, metadata !"", metadata !32, i32 33554484, metadata !30, i32 64, i32 0} ; [ DW_TAG_arg_variable ] [line 52] +!105 = metadata !{i32 786689, metadata !35, metadata !"", metadata !32, i32 16777268, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [line 52] +!106 = metadata !{i32 52, i32 0, metadata !35, null} +!107 = metadata !{i32 786688, metadata !36, metadata !"a", metadata !6, i32 61, metadata !61, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 61] +!108 = metadata !{i32 61, i32 0, metadata !36, null} +!109 = metadata !{i32 62, i32 0, metadata !36, null} diff --git a/test/DebugInfo/X86/debug-info-static-member.ll b/test/DebugInfo/X86/debug-info-static-member.ll new file mode 100644 index 000000000000..50a2b3fa5163 --- /dev/null +++ b/test/DebugInfo/X86/debug-info-static-member.ll @@ -0,0 +1,257 @@ +; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-unknown-linux-gnu +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=PRESENT +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=ABSENT +; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-apple-darwin +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINP +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINA +; Verify that attributes we do want are PRESENT; +; verify that attributes we don't want are ABSENT. +; It's a lot easier to do this in two passes than in one. +; PR14471 + +; LLVM IR generated using: clang -emit-llvm -S -g +; (with the Clang part of this patch applied). +; +; class C +; { +; static int a; +; const static bool const_a = true; +; protected: +; static int b; +; const static float const_b = 3.14; +; public: +; static int c; +; const static int const_c = 18; +; int d; +; }; +; +; int C::a = 4; +; int C::b = 2; +; int C::c = 1; +; +; int main() +; { +; C instance_C; +; instance_C.d = 8; +; return C::c; +; } + +%class.C = type { i32 } + +@_ZN1C1aE = global i32 4, align 4 +@_ZN1C1bE = global i32 2, align 4 +@_ZN1C1cE = global i32 1, align 4 + +define i32 @main() nounwind uwtable { +entry: + %retval = alloca i32, align 4 + %instance_C = alloca %class.C, align 4 + store i32 0, i32* %retval + call void @llvm.dbg.declare(metadata !{%class.C* %instance_C}, metadata !29), !dbg !30 + %d = getelementptr inbounds %class.C* %instance_C, i32 0, i32 0, !dbg !31 + store i32 8, i32* %d, align 4, !dbg !31 + %0 = load i32* @_ZN1C1cE, align 4, !dbg !32 + ret i32 %0, !dbg !32 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.3 (trunk 171914)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !10, metadata !""} ; [ DW_TAG_compile_unit ] [/home/probinson/projects/upstream/static-member/test/debug-info-static-member.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 18, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !1, i32 23} ; [ DW_TAG_subprogram ] [line 18] [def] [scope 23] [main] +!6 = metadata !{i32 786473, metadata !33} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{metadata !12, metadata !27, metadata !28} +!12 = metadata !{i32 786484, i32 0, metadata !13, metadata !"a", metadata !"a", metadata !"_ZN1C1aE", metadata !6, i32 14, metadata !9, i32 0, i32 1, i32* @_ZN1C1aE, metadata !15} ; [ DW_TAG_variable ] [a] [line 14] [def] +!13 = metadata !{i32 786434, metadata !33, null, metadata !"C", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !14, i32 0, null, null} ; [ DW_TAG_class_type ] [C] [line 1, size 32, align 32, offset 0] [from ] +!14 = metadata !{metadata !15, metadata !16, metadata !19, metadata !20, metadata !23, metadata !24, metadata !26} +!15 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"a", i32 3, i64 0, i64 0, i64 0, i32 4097, metadata !9, null} ; [ DW_TAG_member ] [a] [line 3, size 0, align 0, offset 0] [private] [static] [from int] +!16 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"const_a", i32 4, i64 0, i64 0, i64 0, i32 4097, metadata !17, i1 true} ; [ DW_TAG_member ] [const_a] [line 4, size 0, align 0, offset 0] [private] [static] [from ] +!17 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !18} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from bool] +!18 = metadata !{i32 786468, null, null, metadata !"bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] [bool] [line 0, size 8, align 8, offset 0, enc DW_ATE_boolean] +!19 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"b", i32 6, i64 0, i64 0, i64 0, i32 4098, metadata !9, null} ; [ DW_TAG_member ] [b] [line 6, size 0, align 0, offset 0] [protected] [static] [from int] +!20 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"const_b", i32 7, i64 0, i64 0, i64 0, i32 4098, metadata !21, float 0x40091EB860000000} ; [ DW_TAG_member ] [const_b] [line 7, size 0, align 0, offset 0] [protected] [static] [from ] +!21 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !22} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from float] +!22 = metadata !{i32 786468, null, null, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] [float] [line 0, size 32, align 32, offset 0, enc DW_ATE_float] +!23 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"c", i32 9, i64 0, i64 0, i64 0, i32 4096, metadata !9, null} ; [ DW_TAG_member ] [c] [line 9, size 0, align 0, offset 0] [static] [from int] +!24 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"const_c", i32 10, i64 0, i64 0, i64 0, i32 4096, metadata !25, i32 18} ; [ DW_TAG_member ] [const_c] [line 10, size 0, align 0, offset 0] [static] [from ] +!25 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from int] +!26 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"d", i32 11, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] [d] [line 11, size 32, align 32, offset 0] [from int] +!27 = metadata !{i32 786484, i32 0, metadata !13, metadata !"b", metadata !"b", metadata !"_ZN1C1bE", metadata !6, i32 15, metadata !9, i32 0, i32 1, i32* @_ZN1C1bE, metadata !19} ; [ DW_TAG_variable ] [b] [line 15] [def] +!28 = metadata !{i32 786484, i32 0, metadata !13, metadata !"c", metadata !"c", metadata !"_ZN1C1cE", metadata !6, i32 16, metadata !9, i32 0, i32 1, i32* @_ZN1C1cE, metadata !23} ; [ DW_TAG_variable ] [c] [line 16] [def] +!29 = metadata !{i32 786688, metadata !5, metadata !"instance_C", metadata !6, i32 20, metadata !13, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [instance_C] [line 20] +!30 = metadata !{i32 20, i32 0, metadata !5, null} +!31 = metadata !{i32 21, i32 0, metadata !5, null} +!32 = metadata !{i32 22, i32 0, metadata !5, null} +!33 = metadata !{metadata !"/usr/local/google/home/blaikie/Development/llvm/src/tools/clang/test/CodeGenCXX/debug-info-static-member.cpp", metadata !"/home/blaikie/local/Development/llvm/build/clang/x86-64/Debug/llvm"} +; PRESENT verifies that static member declarations have these attributes: +; external, declaration, accessibility, and either DW_AT_MIPS_linkage_name +; (for variables) or DW_AT_const_value (for constants). +; +; PRESENT: .debug_info contents: +; PRESENT: DW_TAG_class_type +; PRESENT-NEXT: DW_AT_name {{.*}} "C" +; PRESENT: 0x[[DECL_A:[0-9a-f]+]]: DW_TAG_member +; PRESENT-NEXT: DW_AT_name {{.*}} "a" +; PRESENT: DW_AT_external +; PRESENT: DW_AT_declaration +; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x03) +; PRESENT: DW_TAG_member +; PRESENT-NEXT: DW_AT_name {{.*}} "const_a" +; PRESENT: DW_AT_external +; PRESENT: DW_AT_declaration +; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x03) +; PRESENT: DW_AT_const_value {{.*}} (1) +; PRESENT: 0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member +; PRESENT-NEXT: DW_AT_name {{.*}} "b" +; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x02) +; PRESENT: DW_TAG_member +; PRESENT-NEXT: DW_AT_name {{.*}} "const_b" +; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x02) +; PRESENT: DW_AT_const_value {{.*}} (0x4048f5c3) +; PRESENT: 0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member +; PRESENT-NEXT: DW_AT_name {{.*}} "c" +; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x01) +; PRESENT: DW_TAG_member +; PRESENT-NEXT: DW_AT_name {{.*}} "const_c" +; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x01) +; PRESENT: DW_AT_const_value {{.*}} (0x00000012) +; While we're here, a normal member has data_member_location and +; accessibility attributes. +; PRESENT: DW_TAG_member +; PRESENT-NEXT: DW_AT_name {{.*}} "d" +; PRESENT: DW_AT_data_member_location +; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x01) +; PRESENT: NULL +; Definitions point back to their declarations, and have a location. +; PRESENT: DW_TAG_variable +; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]} +; PRESENT-NEXT: DW_AT_location +; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE" +; PRESENT: DW_TAG_variable +; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]} +; PRESENT-NEXT: DW_AT_location +; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE" +; PRESENT: DW_TAG_variable +; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]} +; PRESENT-NEXT: DW_AT_location +; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE" + +; For Darwin gdb: +; DARWINP: .debug_info contents: +; DARWINP: DW_TAG_class_type +; DARWINP-NEXT: DW_AT_name {{.*}} "C" +; DARWINP: 0x[[DECL_A:[0-9a-f]+]]: DW_TAG_member +; DARWINP-NEXT: DW_AT_name {{.*}} "a" +; DARWINP: DW_AT_external +; DARWINP: DW_AT_declaration +; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x03) +; DARWINP: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE" +; DARWINP: DW_TAG_member +; DARWINP-NEXT: DW_AT_name {{.*}} "const_a" +; DARWINP: DW_AT_external +; DARWINP: DW_AT_declaration +; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x03) +; DARWINP: DW_AT_const_value {{.*}} (1) +; DARWINP: 0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member +; DARWINP-NEXT: DW_AT_name {{.*}} "b" +; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x02) +; DARWINP: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE" +; DARWINP: DW_TAG_member +; DARWINP-NEXT: DW_AT_name {{.*}} "const_b" +; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x02) +; DARWINP: DW_AT_const_value {{.*}} (0x4048f5c3) +; DARWINP: 0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member +; DARWINP-NEXT: DW_AT_name {{.*}} "c" +; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x01) +; DARWINP: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE" +; DARWINP: DW_TAG_member +; DARWINP-NEXT: DW_AT_name {{.*}} "const_c" +; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x01) +; DARWINP: DW_AT_const_value {{.*}} (0x00000012) +; While we're here, a normal member has data_member_location and +; accessibility attributes. +; DARWINP: DW_TAG_member +; DARWINP-NEXT: DW_AT_name {{.*}} "d" +; DARWINP: DW_AT_data_member_location +; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x01) +; DARWINP: NULL +; Definitions point back to their declarations, and have a location. +; DARWINP: DW_TAG_variable +; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]} +; DARWINP-NEXT: DW_AT_location +; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE" +; DARWINP: DW_TAG_variable +; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]} +; DARWINP-NEXT: DW_AT_location +; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE" +; DARWINP: DW_TAG_variable +; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]} +; DARWINP-NEXT: DW_AT_location +; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE" + +; ABSENT verifies that static member declarations do not have either +; DW_AT_location or DW_AT_data_member_location; also, variables do not +; have DW_AT_const_value and constants do not have DW_AT_MIPS_linkage_name. +; +; ABSENT: .debug_info contents: +; ABSENT: DW_TAG_member +; ABSENT: DW_AT_name {{.*}} "a" +; ABSENT-NOT: DW_AT_const_value +; ABSENT-NOT: location +; ABSENT: DW_AT_name {{.*}} "const_a" +; ABSENT-NOT: DW_AT_MIPS_linkage_name +; ABSENT-NOT: location +; ABSENT: DW_AT_name {{.*}} "b" +; ABSENT-NOT: DW_AT_const_value +; ABSENT-NOT: location +; ABSENT: DW_AT_name {{.*}} "const_b" +; ABSENT-NOT: DW_AT_MIPS_linkage_name +; ABSENT-NOT: location +; ABSENT: DW_AT_name {{.*}} "c" +; ABSENT-NOT: DW_AT_const_value +; ABSENT-NOT: location +; ABSENT: DW_AT_name {{.*}} "const_c" +; ABSENT-NOT: DW_AT_MIPS_linkage_name +; ABSENT-NOT: location +; While we're here, a normal member does not have a linkage name, constant +; value, or DW_AT_location. +; ABSENT: DW_AT_name {{.*}} "d" +; ABSENT-NOT: DW_AT_MIPS_linkage_name +; ABSENT-NOT: DW_AT_const_value +; ABSENT-NOT: DW_AT_location +; ABSENT: NULL + +; For Darwin gdb: +; DARWINA: .debug_info contents: +; DARWINA: DW_TAG_member +; DARWINA: DW_AT_name {{.*}} "a" +; DARWINA-NOT: DW_AT_const_value +; DARWINA-NOT: location +; DARWINA: DW_AT_name {{.*}} "const_a" +; DARWINA-NOT: DW_AT_MIPS_linkage_name +; DARWINA-NOT: location +; DARWINA: DW_AT_name {{.*}} "b" +; DARWINA-NOT: DW_AT_const_value +; DARWINA-NOT: location +; DARWINA: DW_AT_name {{.*}} "const_b" +; DARWINA-NOT: DW_AT_MIPS_linkage_name +; DARWINA-NOT: location +; DARWINA: DW_AT_name {{.*}} "c" +; DARWINA-NOT: DW_AT_const_value +; DARWINA-NOT: location +; DARWINA: DW_AT_name {{.*}} "const_c" +; DARWINA-NOT: DW_AT_MIPS_linkage_name +; DARWINA-NOT: location +; While we're here, a normal member does not have a linkage name, constant +; value, or DW_AT_location. +; DARWINA: DW_AT_name {{.*}} "d" +; DARWINA-NOT: DW_AT_MIPS_linkage_name +; DARWINA-NOT: DW_AT_const_value +; DARWINA-NOT: DW_AT_location +; DARWINA: NULL diff --git a/test/DebugInfo/X86/debug_frame.ll b/test/DebugInfo/X86/debug_frame.ll index d273d7353786..0e93427df010 100644 --- a/test/DebugInfo/X86/debug_frame.ll +++ b/test/DebugInfo/X86/debug_frame.ll @@ -9,10 +9,11 @@ entry: ret void } -!llvm.dbg.sp = !{!0} +!llvm.dbg.cu = !{!2} +!5 = metadata !{metadata !0} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"f", metadata !"f", metadata !"", metadata !1, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void ()* @f, null, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build", metadata !"clang version 3.0 ()", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, i32 0, metadata !1, metadata !"f", metadata !"f", metadata !"", metadata !1, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void ()* @f, null, null, null, i32 1} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build", metadata !2} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 0, i32 12, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build", metadata !"clang version 3.0 ()", i1 true, i1 true, metadata !"", i32 0, null, null, metadata !5, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !4 = metadata !{null} diff --git a/test/DebugInfo/X86/elf-names.ll b/test/DebugInfo/X86/elf-names.ll index b908bcefe478..30e8c2e27430 100644 --- a/test/DebugInfo/X86/elf-names.ll +++ b/test/DebugInfo/X86/elf-names.ll @@ -1,5 +1,6 @@ ; RUN: llc -mtriple=x86_64-unknown-linux-gnu %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; RUN: llvm-as < %s | llvm-dis | FileCheck --check-prefix=CHECK-DIS %s ; CHECK: 0x0000000b: DW_TAG_compile_unit ; CHECK: 0x00000012: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000035] = "foo.cpp") @@ -7,6 +8,9 @@ ; CHECK: 0x0000003d: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000006d] = "D") ; CHECK: 0x00000044: DW_TAG_member ; CHECK: 0x00000045: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000005d] = "c1") +; CHECK: 0x0000008d: DW_AT_artificial [DW_FORM_flag_present] (true) + +; CHECK-DIS: [artificial] %class.D = type { i32, i32, i32, i32 } @@ -54,38 +58,36 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata !"/usr/local/google/home/echristo", metadata !"clang version 3.2 (trunk 167506) (llvm/trunk 167505)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/foo.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !31} -!5 = metadata !{i32 786478, i32 0, null, metadata !"D", metadata !"D", metadata !"_ZN1DC2Ev", metadata !6, i32 12, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (%class.D*)* @_ZN1DC2Ev, null, metadata !17, metadata !27, i32 12} ; [ DW_TAG_subprogram ] [line 12] [def] [D] -!6 = metadata !{i32 786473, metadata !"foo.cpp", metadata !"/usr/local/google/home/echristo", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !53, i32 4, metadata !"clang version 3.2 (trunk 167506) (llvm/trunk 167505)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/foo.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !31} +!5 = metadata !{i32 786478, metadata !6, null, metadata !"D", metadata !"D", metadata !"_ZN1DC2Ev", i32 12, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (%class.D*)* @_ZN1DC2Ev, null, metadata !17, metadata !27, i32 12} ; [ DW_TAG_subprogram ] [line 12] [def] [D] +!6 = metadata !{i32 786473, metadata !53} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{null, metadata !9} !9 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from D] -!10 = metadata !{i32 786434, null, metadata !"D", metadata !6, i32 1, i64 128, i64 32, i32 0, i32 0, null, metadata !11, i32 0, null, null} ; [ DW_TAG_class_type ] [D] [line 1, size 128, align 32, offset 0] [from ] +!10 = metadata !{i32 786434, metadata !53, null, metadata !"D", i32 1, i64 128, i64 32, i32 0, i32 0, null, metadata !11, i32 0, null, null} ; [ DW_TAG_class_type ] [D] [line 1, size 128, align 32, offset 0] [from ] !11 = metadata !{metadata !12, metadata !14, metadata !15, metadata !16, metadata !17, metadata !20} -!12 = metadata !{i32 786445, metadata !10, metadata !"c1", metadata !6, i32 6, i64 32, i64 32, i64 0, i32 1, metadata !13} ; [ DW_TAG_member ] [c1] [line 6, size 32, align 32, offset 0] [private] [from int] -!13 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!14 = metadata !{i32 786445, metadata !10, metadata !"c2", metadata !6, i32 7, i64 32, i64 32, i64 32, i32 1, metadata !13} ; [ DW_TAG_member ] [c2] [line 7, size 32, align 32, offset 32] [private] [from int] -!15 = metadata !{i32 786445, metadata !10, metadata !"c3", metadata !6, i32 8, i64 32, i64 32, i64 64, i32 1, metadata !13} ; [ DW_TAG_member ] [c3] [line 8, size 32, align 32, offset 64] [private] [from int] -!16 = metadata !{i32 786445, metadata !10, metadata !"c4", metadata !6, i32 9, i64 32, i64 32, i64 96, i32 1, metadata !13} ; [ DW_TAG_member ] [c4] [line 9, size 32, align 32, offset 96] [private] [from int] -!17 = metadata !{i32 786478, i32 0, metadata !10, metadata !"D", metadata !"D", metadata !"", metadata !6, i32 3, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18, i32 3} ; [ DW_TAG_subprogram ] [line 3] [D] +!12 = metadata !{i32 786445, metadata !53, metadata !10, metadata !"c1", i32 6, i64 32, i64 32, i64 0, i32 1, metadata !13} ; [ DW_TAG_member ] [c1] [line 6, size 32, align 32, offset 0] [private] [from int] +!13 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!14 = metadata !{i32 786445, metadata !53, metadata !10, metadata !"c2", i32 7, i64 32, i64 32, i64 32, i32 1, metadata !13} ; [ DW_TAG_member ] [c2] [line 7, size 32, align 32, offset 32] [private] [from int] +!15 = metadata !{i32 786445, metadata !53, metadata !10, metadata !"c3", i32 8, i64 32, i64 32, i64 64, i32 1, metadata !13} ; [ DW_TAG_member ] [c3] [line 8, size 32, align 32, offset 64] [private] [from int] +!16 = metadata !{i32 786445, metadata !53, metadata !10, metadata !"c4", i32 9, i64 32, i64 32, i64 96, i32 1, metadata !13} ; [ DW_TAG_member ] [c4] [line 9, size 32, align 32, offset 96] [private] [from int] +!17 = metadata !{i32 786478, metadata !6, metadata !10, metadata !"D", metadata !"D", metadata !"", i32 3, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18, i32 3} ; [ DW_TAG_subprogram ] [line 3] [D] !18 = metadata !{metadata !19} !19 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] -!20 = metadata !{i32 786478, i32 0, metadata !10, metadata !"D", metadata !"D", metadata !"", metadata !6, i32 4, metadata !21, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !25, i32 4} ; [ DW_TAG_subprogram ] [line 4] [D] +!20 = metadata !{i32 786478, metadata !6, metadata !10, metadata !"D", metadata !"D", metadata !"", i32 4, metadata !21, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !25, i32 4} ; [ DW_TAG_subprogram ] [line 4] [D] !21 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !22, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !22 = metadata !{null, metadata !9, metadata !23} !23 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !24} ; [ DW_TAG_reference_type ] [line 0, size 0, align 0, offset 0] [from ] -!24 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from D] +!24 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from D] !25 = metadata !{metadata !26} !26 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] !27 = metadata !{metadata !28} !28 = metadata !{metadata !29} !29 = metadata !{i32 786689, metadata !5, metadata !"this", metadata !6, i32 16777228, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 12] -!30 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from D] -!31 = metadata !{i32 786478, i32 0, null, metadata !"D", metadata !"D", metadata !"_ZN1DC2ERKS_", metadata !6, i32 19, metadata !21, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (%class.D*, %class.D*)* @_ZN1DC2ERKS_, null, metadata !20, metadata !32, i32 19} ; [ DW_TAG_subprogram ] [line 19] [def] [D] +!30 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from D] +!31 = metadata !{i32 786478, metadata !6, null, metadata !"D", metadata !"D", metadata !"_ZN1DC2ERKS_", i32 19, metadata !21, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (%class.D*, %class.D*)* @_ZN1DC2ERKS_, null, metadata !20, metadata !32, i32 19} ; [ DW_TAG_subprogram ] [line 19] [def] [D] !32 = metadata !{metadata !33} !33 = metadata !{metadata !34, metadata !35} !34 = metadata !{i32 786689, metadata !31, metadata !"this", metadata !6, i32 16777235, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 19] @@ -107,3 +109,4 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !50 = metadata !{i32 22, i32 0, metadata !48, null} !51 = metadata !{i32 23, i32 0, metadata !48, null} !52 = metadata !{i32 24, i32 0, metadata !48, null} +!53 = metadata !{metadata !"foo.cpp", metadata !"/usr/local/google/home/echristo"} diff --git a/test/DebugInfo/X86/empty-and-one-elem-array.ll b/test/DebugInfo/X86/empty-and-one-elem-array.ll new file mode 100644 index 000000000000..6e59915fe13e --- /dev/null +++ b/test/DebugInfo/X86/empty-and-one-elem-array.ll @@ -0,0 +1,92 @@ +; RUN: llc -mtriple=x86_64-apple-darwin -O0 -filetype=obj -o %t < %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; <rdar://problem/12566646> + +%struct.foo = type { i32, [1 x i32] } +%struct.bar = type { i32, [0 x i32] } + +define i32 @func() nounwind uwtable ssp { +entry: + %my_foo = alloca %struct.foo, align 4 + %my_bar = alloca %struct.bar, align 4 + call void @llvm.dbg.declare(metadata !{%struct.foo* %my_foo}, metadata !10), !dbg !19 + call void @llvm.dbg.declare(metadata !{%struct.bar* %my_bar}, metadata !20), !dbg !28 + %a = getelementptr inbounds %struct.foo* %my_foo, i32 0, i32 0, !dbg !29 + store i32 3, i32* %a, align 4, !dbg !29 + %a1 = getelementptr inbounds %struct.bar* %my_bar, i32 0, i32 0, !dbg !30 + store i32 5, i32* %a1, align 4, !dbg !30 + %a2 = getelementptr inbounds %struct.foo* %my_foo, i32 0, i32 0, !dbg !31 + %0 = load i32* %a2, align 4, !dbg !31 + %a3 = getelementptr inbounds %struct.bar* %my_bar, i32 0, i32 0, !dbg !31 + %1 = load i32* %a3, align 4, !dbg !31 + %add = add nsw i32 %0, %1, !dbg !31 + ret i32 %add, !dbg !31 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +; An empty array should not have an AT_upper_bound attribute. But an array of 1 +; should. + +; CHECK: 0x00000074: DW_TAG_base_type [5] +; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000043] = "int") +; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05) +; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04) + +; int[1]: +; CHECK: 0x00000082: DW_TAG_array_type [7] * +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x0074 => {0x00000074}) +; CHECK: 0x00000087: DW_TAG_subrange_type [8] +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x007b => {0x0000007b}) +; CHECK-NEXT: DW_AT_upper_bound [DW_FORM_data1] (0x00) + +; int foo::b[1]: +; CHECK: 0x000000a5: DW_TAG_member [10] +; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000050] = "b") +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x0082 => {0x00000082}) + +; int[0]: +; CHECK: 0x000000b5: DW_TAG_array_type [7] * +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x0074 => {0x00000074}) +; CHECK: 0x000000ba: DW_TAG_subrange_type [11] +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x007b => {0x0000007b}) +; CHECK-NOT: DW_AT_upper_bound + +; int bar::b[0]: +; CHECK: 0x000000d7: DW_TAG_member [10] +; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000050] = "b") +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x00b5 => {0x000000b5}) + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !32, i32 12, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/test.c] [DW_LANG_C99] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"func", metadata !"func", metadata !"", i32 11, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @func, null, null, metadata !1, i32 11} ; [ DW_TAG_subprogram ] [line 11] [def] [func] +!6 = metadata !{i32 786473, metadata !32} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786688, metadata !11, metadata !"my_foo", metadata !6, i32 12, metadata !12, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [my_foo] [line 12] +!11 = metadata !{i32 786443, metadata !6, metadata !5, i32 11, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/Volumes/Sandbox/llvm/test.c] +!12 = metadata !{i32 786451, metadata !32, null, metadata !"foo", i32 1, i64 64, i64 32, i32 0, i32 0, null, metadata !13, i32 0, i32 0, i32 0} ; [ DW_TAG_structure_type ] [foo] [line 1, size 64, align 32, offset 0] [from ] +!13 = metadata !{metadata !14, metadata !15} +!14 = metadata !{i32 786445, metadata !32, metadata !12, metadata !"a", i32 2, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] [a] [line 2, size 32, align 32, offset 0] [from int] +!15 = metadata !{i32 786445, metadata !32, metadata !12, metadata !"b", i32 3, i64 32, i64 32, i64 32, i32 0, metadata !16} ; [ DW_TAG_member ] [b] [line 3, size 32, align 32, offset 32] [from ] +!16 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 32, i64 32, i32 0, i32 0, metadata !9, metadata !17, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 32, align 32, offset 0] [from int] +!17 = metadata !{metadata !18} +!18 = metadata !{i32 786465, i64 0, i64 1} ; [ DW_TAG_subrange_type ] [0, 1] +!19 = metadata !{i32 12, i32 0, metadata !11, null} +!20 = metadata !{i32 786688, metadata !11, metadata !"my_bar", metadata !6, i32 13, metadata !21, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [my_bar] [line 13] +!21 = metadata !{i32 786451, metadata !32, null, metadata !"bar", i32 6, i64 32, i64 32, i32 0, i32 0, null, metadata !22, i32 0, i32 0, i32 0} ; [ DW_TAG_structure_type ] [bar] [line 6, size 32, align 32, offset 0] [from ] +!22 = metadata !{metadata !23, metadata !24} +!23 = metadata !{i32 786445, metadata !32, metadata !21, metadata !"a", i32 7, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] [a] [line 7, size 32, align 32, offset 0] [from int] +!24 = metadata !{i32 786445, metadata !32, metadata !21, metadata !"b", i32 8, i64 0, i64 32, i64 32, i32 0, metadata !25} ; [ DW_TAG_member ] [b] [line 8, size 0, align 32, offset 32] [from ] +!25 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 0, i64 32, i32 0, i32 0, metadata !9, metadata !26, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 0, align 32, offset 0] [from int] +!26 = metadata !{metadata !27} +!27 = metadata !{i32 786465, i64 0, i64 0} ; [ DW_TAG_subrange_type ] [0, 0] +!28 = metadata !{i32 13, i32 0, metadata !11, null} +!29 = metadata !{i32 15, i32 0, metadata !11, null} +!30 = metadata !{i32 16, i32 0, metadata !11, null} +!31 = metadata !{i32 17, i32 0, metadata !11, null} +!32 = metadata !{metadata !"test.c", metadata !"/Volumes/Sandbox/llvm"} diff --git a/test/DebugInfo/X86/empty-array.ll b/test/DebugInfo/X86/empty-array.ll new file mode 100644 index 000000000000..ace115610ebc --- /dev/null +++ b/test/DebugInfo/X86/empty-array.ll @@ -0,0 +1,45 @@ +; RUN: llc -mtriple=x86_64-apple-darwin -O0 -filetype=obj -o %t < %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; <rdar://problem/12566646> + +%class.A = type { [0 x i32] } + +@a = global %class.A zeroinitializer, align 4 + +; CHECK: 0x0000002d: DW_TAG_base_type [3] +; CHECK-NEXT: DW_AT_name +; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04) +; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05) + +; CHECK: 0x00000034: DW_TAG_array_type [4] * +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x0026 => {0x00000026}) + +; CHECK: 0x00000039: DW_TAG_subrange_type [5] +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x002d => {0x0000002d}) +; CHECK-NOT: DW_AT_upper_bound + +; CHECK: DW_TAG_member [8] +; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000003f] = "x") +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x0034 => {0x00000034}) + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/t.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] [a] [line 1] [def] +!6 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786434, metadata !20, null, metadata !"A", i32 1, i64 0, i64 32, i32 0, i32 0, null, metadata !8, i32 0, null, null} ; [ DW_TAG_class_type ] [A] [line 1, size 0, align 32, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !14} +!9 = metadata !{i32 786445, metadata !20, metadata !7, metadata !"x", i32 1, i64 0, i64 0, i64 0, i32 1, metadata !10} ; [ DW_TAG_member ] [x] [line 1, size 0, align 0, offset 0] [private] [from ] +!10 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 0, i64 32, i32 0, i32 0, metadata !11, metadata !12, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 0, align 32, offset 0] [from int] +!11 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!12 = metadata !{metadata !13} +!13 = metadata !{i32 786465, i64 0, i64 -1} ; [ DW_TAG_subrange_type ] [unbound] +!14 = metadata !{i32 786478, metadata !6, metadata !7, metadata !"A", metadata !"A", metadata !"", i32 1, metadata !15, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !18, i32 1} ; [ DW_TAG_subprogram ] [line 1] [A] +!15 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !16, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!16 = metadata !{null, metadata !17} +!17 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !7} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from A] +!18 = metadata !{metadata !19} +!19 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] +!20 = metadata !{metadata !"t.cpp", metadata !"/Volumes/Sandbox/llvm"} diff --git a/test/DebugInfo/X86/ending-run.ll b/test/DebugInfo/X86/ending-run.ll index 6935c47d0cf6..6de15f6404cb 100644 --- a/test/DebugInfo/X86/ending-run.ll +++ b/test/DebugInfo/X86/ending-run.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s ; Check that the line table starts at 7, not 4, but that the first ; statement isn't until line 8. @@ -28,13 +28,11 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"ending-run.c", metadata !"/Users/echristo/tmp", metadata !"clang version 3.1 (trunk 153921) (llvm/trunk 153916)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"callee", metadata !"callee", metadata !"", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 (i32)* @callee, null, null, metadata !10, i32 7} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 786473, metadata !"ending-run.c", metadata !"/Users/echristo/tmp", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !19, i32 12, metadata !"clang version 3.1 (trunk 153921) (llvm/trunk 153916)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !19, metadata !"callee", metadata !"callee", metadata !"", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 (i32)* @callee, null, null, metadata !10, i32 7} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !19} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9, metadata !9} !9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] @@ -43,7 +41,8 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !12 = metadata !{i32 786689, metadata !5, metadata !"x", metadata !6, i32 16777221, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !13 = metadata !{i32 5, i32 5, metadata !5, null} !14 = metadata !{i32 786688, metadata !15, metadata !"y", metadata !6, i32 8, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] -!15 = metadata !{i32 786443, metadata !5, i32 7, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!15 = metadata !{i32 786443, metadata !19, metadata !5, i32 7, i32 1, i32 0} ; [ DW_TAG_lexical_block ] !16 = metadata !{i32 8, i32 9, metadata !15, null} !17 = metadata !{i32 8, i32 18, metadata !15, null} !18 = metadata !{i32 9, i32 5, metadata !15, null} +!19 = metadata !{metadata !"ending-run.c", metadata !"/Users/echristo/tmp"} diff --git a/test/DebugInfo/X86/enum-class.ll b/test/DebugInfo/X86/enum-class.ll index 6eb715d82872..22728116d9bb 100644 --- a/test/DebugInfo/X86/enum-class.ll +++ b/test/DebugInfo/X86/enum-class.ll @@ -1,5 +1,5 @@ ; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s @a = global i32 0, align 4 @b = global i64 0, align 8 @@ -7,28 +7,26 @@ !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata !"/Users/echristo/tmp", metadata !"clang version 3.2 (trunk 157269) (llvm/trunk 157264)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !15, metadata !15, metadata !17} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{metadata !3, metadata !8, metadata !12} -!3 = metadata !{i32 786436, null, metadata !"A", metadata !4, i32 1, i64 32, i64 32, i32 0, i32 0, metadata !5, metadata !6, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] -!4 = metadata !{i32 786473, metadata !"foo.cpp", metadata !"/Users/echristo/tmp", null} ; [ DW_TAG_file_type ] -!5 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!0 = metadata !{i32 786449, metadata !22, i32 4, metadata !"clang version 3.2 (trunk 157269) (llvm/trunk 157264)", i1 false, metadata !"", i32 0, metadata !1, metadata !15, metadata !15, metadata !17, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{metadata !3, metadata !8, metadata !12} +!3 = metadata !{i32 786436, metadata !4, null, metadata !"A", i32 1, i64 32, i64 32, i32 0, i32 0, metadata !5, metadata !6, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!4 = metadata !{i32 786473, metadata !22} ; [ DW_TAG_file_type ] +!5 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !6 = metadata !{metadata !7} !7 = metadata !{i32 786472, metadata !"A1", i64 1} ; [ DW_TAG_enumerator ] -!8 = metadata !{i32 786436, null, metadata !"B", metadata !4, i32 2, i64 64, i64 64, i32 0, i32 0, metadata !9, metadata !10, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] -!9 = metadata !{i32 786468, null, metadata !"long unsigned int", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!8 = metadata !{i32 786436, metadata !4, null, metadata !"B", i32 2, i64 64, i64 64, i32 0, i32 0, metadata !9, metadata !10, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!9 = metadata !{i32 786468, null, null, metadata !"long unsigned int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] !10 = metadata !{metadata !11} !11 = metadata !{i32 786472, metadata !"B1", i64 1} ; [ DW_TAG_enumerator ] -!12 = metadata !{i32 786436, null, metadata !"C", metadata !4, i32 3, i64 32, i64 32, i32 0, i32 0, null, metadata !13, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!12 = metadata !{i32 786436, metadata !4, null, metadata !"C", i32 3, i64 32, i64 32, i32 0, i32 0, null, metadata !13, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] !13 = metadata !{metadata !14} !14 = metadata !{i32 786472, metadata !"C1", i64 1} ; [ DW_TAG_enumerator ] -!15 = metadata !{metadata !16} -!16 = metadata !{i32 0} -!17 = metadata !{metadata !18} -!18 = metadata !{metadata !19, metadata !20, metadata !21} -!19 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !4, i32 4, metadata !3, i32 0, i32 1, i32* @a} ; [ DW_TAG_variable ] -!20 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !4, i32 5, metadata !8, i32 0, i32 1, i64* @b} ; [ DW_TAG_variable ] -!21 = metadata !{i32 786484, i32 0, null, metadata !"c", metadata !"c", metadata !"", metadata !4, i32 6, metadata !12, i32 0, i32 1, i32* @c} ; [ DW_TAG_variable ] +!15 = metadata !{i32 0} +!17 = metadata !{metadata !19, metadata !20, metadata !21} +!19 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !4, i32 4, metadata !3, i32 0, i32 1, i32* @a, null} ; [ DW_TAG_variable ] +!20 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !4, i32 5, metadata !8, i32 0, i32 1, i64* @b, null} ; [ DW_TAG_variable ] +!21 = metadata !{i32 786484, i32 0, null, metadata !"c", metadata !"c", metadata !"", metadata !4, i32 6, metadata !12, i32 0, i32 1, i32* @c, null} ; [ DW_TAG_variable ] +!22 = metadata !{metadata !"foo.cpp", metadata !"/Users/echristo/tmp"} ; CHECK: DW_TAG_enumeration_type [3] ; CHECK: DW_AT_type [DW_FORM_ref4] (cu + 0x0026 => {0x00000026}) diff --git a/test/DebugInfo/X86/enum-fwd-decl.ll b/test/DebugInfo/X86/enum-fwd-decl.ll index 0902430008c1..33d807e30548 100644 --- a/test/DebugInfo/X86/enum-fwd-decl.ll +++ b/test/DebugInfo/X86/enum-fwd-decl.ll @@ -1,18 +1,16 @@ ; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s @e = global i16 0, align 2 !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata !"/tmp", metadata !"clang version 3.2 (trunk 165274) (llvm/trunk 165272)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ] [/tmp/foo.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786484, i32 0, null, metadata !"e", metadata !"e", metadata !"", metadata !6, i32 2, metadata !7, i32 0, i32 1, i16* @e} ; [ DW_TAG_variable ] [e] [line 2] [def] +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.2 (trunk 165274) (llvm/trunk 165272)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/foo.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786484, i32 0, null, metadata !"e", metadata !"e", metadata !"", metadata !6, i32 2, metadata !7, i32 0, i32 1, i16* @e, null} ; [ DW_TAG_variable ] [e] [line 2] [def] !6 = metadata !{i32 786473, metadata !"foo.cpp", metadata !"/tmp", null} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 786436, null, metadata !"E", metadata !6, i32 1, i64 16, i64 16, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_enumeration_type ] [E] [line 1, size 16, align 16, offset 0] [fwd] [from ] +!7 = metadata !{i32 786436, metadata !6, null, metadata !"E", i32 1, i64 16, i64 16, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_enumeration_type ] [E] [line 1, size 16, align 16, offset 0] [fwd] [from ] ; CHECK: DW_TAG_enumeration_type ; CHECK-NEXT: DW_AT_name diff --git a/test/DebugInfo/X86/fission-cu.ll b/test/DebugInfo/X86/fission-cu.ll new file mode 100644 index 000000000000..bfe2d17e20f1 --- /dev/null +++ b/test/DebugInfo/X86/fission-cu.ll @@ -0,0 +1,100 @@ +; RUN: llc -split-dwarf=Enable -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t +; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s + +@a = common global i32 0, align 4 + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !8, i32 12, metadata !"clang version 3.3 (trunk 169021) (llvm/trunk 169020)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !"baz.dwo"} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/baz.c] [DW_LANG_C99] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, i32* @a, null} ; [ DW_TAG_variable ] [a] [line 1] [def] +!6 = metadata !{i32 786473, metadata !8} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!8 = metadata !{metadata !"baz.c", metadata !"/usr/local/google/home/echristo/tmp"} + +; Check that the skeleton compile unit contains the proper attributes: +; This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list, +; DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id, +; DW_AT_ranges_base, DW_AT_addr_base. + +; CHECK: .debug_abbrev contents: +; CHECK: Abbrev table for offset: 0x00000000 +; CHECK: [1] DW_TAG_compile_unit DW_CHILDREN_no +; CHECK: DW_AT_GNU_dwo_name DW_FORM_strp +; CHECK: DW_AT_GNU_dwo_id DW_FORM_data8 +; CHECK: DW_AT_GNU_addr_base DW_FORM_sec_offset +; CHECK: DW_AT_low_pc DW_FORM_addr +; CHECK: DW_AT_stmt_list DW_FORM_sec_offset +; CHECK: DW_AT_comp_dir DW_FORM_strp + +; CHECK: .debug_info contents: +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000000] = "baz.dwo") +; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x0000000000000000) +; CHECK: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000000) +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) +; CHECK: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x00000008] = "/usr/local/google/home/echristo/tmp") + +; CHECK: .debug_str contents: +; CHECK: 0x00000000: "baz.dwo" +; CHECK: 0x00000008: "/usr/local/google/home/echristo/tmp" + +; Check that we're using the right forms. +; CHECK: .debug_abbrev.dwo contents: +; CHECK: Abbrev table for offset: 0x00000000 +; CHECK: [1] DW_TAG_compile_unit DW_CHILDREN_yes +; CHECK: DW_AT_producer DW_FORM_GNU_str_index +; CHECK: DW_AT_language DW_FORM_data2 +; CHECK: DW_AT_name DW_FORM_GNU_str_index +; CHECK: DW_AT_low_pc DW_FORM_GNU_addr_index +; CHECK: DW_AT_stmt_list DW_FORM_data4 +; CHECK: DW_AT_comp_dir DW_FORM_GNU_str_index +; CHECK: DW_AT_GNU_dwo_id DW_FORM_data8 + +; CHECK: [2] DW_TAG_base_type DW_CHILDREN_no +; CHECK: DW_AT_name DW_FORM_GNU_str_index +; CHECK: DW_AT_encoding DW_FORM_data1 +; CHECK: DW_AT_byte_size DW_FORM_data1 + +; CHECK: [3] DW_TAG_variable DW_CHILDREN_no +; CHECK: DW_AT_name DW_FORM_GNU_str_index +; CHECK: DW_AT_type DW_FORM_ref4 +; CHECK: DW_AT_external DW_FORM_flag_present +; CHECK: DW_AT_decl_file DW_FORM_data1 +; CHECK: DW_AT_decl_line DW_FORM_data1 +; CHECK: DW_AT_location DW_FORM_block1 + +; Check that the rest of the compile units have information. +; CHECK: .debug_info.dwo contents: +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_producer [DW_FORM_GNU_str_index] ( indexed (00000000) string = "clang version 3.3 (trunk 169021) (llvm/trunk 169020)") +; CHECK: DW_AT_language [DW_FORM_data2] (0x000c) +; CHECK: DW_AT_name [DW_FORM_GNU_str_index] ( indexed (00000001) string = "baz.c") +; CHECK: DW_AT_low_pc [DW_FORM_GNU_addr_index] ( indexed (00000000) address = 0x0000000000000000) +; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x0000000000000000) +; CHECK: DW_TAG_base_type +; CHECK: DW_AT_name [DW_FORM_GNU_str_index] ( indexed (00000004) string = "int") +; CHECK: DW_TAG_variable +; CHECK: DW_AT_name [DW_FORM_GNU_str_index] ( indexed (00000003) string = "a") +; CHECK: DW_AT_type [DW_FORM_ref4] (cu + 0x001e => {0x0000001e}) +; CHECK: DW_AT_external [DW_FORM_flag_present] (true) +; CHECK: DW_AT_decl_file [DW_FORM_data1] (0x01) +; CHECK: DW_AT_decl_line [DW_FORM_data1] (0x01) +; CHECK: DW_AT_location [DW_FORM_block1] (<0x02> fb 01 ) + + +; CHECK: .debug_str.dwo contents: +; CHECK: 0x00000000: "clang version 3.3 (trunk 169021) (llvm/trunk 169020)" +; CHECK: 0x00000035: "baz.c" +; CHECK: 0x0000003b: "/usr/local/google/home/echristo/tmp" +; CHECK: 0x0000005f: "a" +; CHECK: 0x00000061: "int" + +; CHECK: .debug_str_offsets.dwo contents: +; CHECK: 0x00000000: 00000000 +; CHECK: 0x00000004: 00000035 +; CHECK: 0x00000008: 0000003b +; CHECK: 0x0000000c: 0000005f +; CHECK: 0x00000010: 00000061 diff --git a/test/DebugInfo/X86/line-info.ll b/test/DebugInfo/X86/line-info.ll new file mode 100644 index 000000000000..0c0a7ab51d4b --- /dev/null +++ b/test/DebugInfo/X86/line-info.ll @@ -0,0 +1,58 @@ +; RUN: llc -mtriple=x86_64-apple-darwin -filetype=obj -O0 < %s > %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; CHECK: [[FILEID:[0-9]+]]]{{.*}}list0.h +; CHECK: [[FILEID]] 0 1 0 is_stmt{{$}} + +; IR generated from clang -g -emit-llvm with the following source: +; list0.h: +; int foo (int x) { +; return ++x; +; } +; list0.c: +; #include "list0.h" +; int main() { +; } + +define i32 @foo(i32 %x) #0 { +entry: + %x.addr = alloca i32, align 4 + store i32 %x, i32* %x.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %x.addr}, metadata !14), !dbg !15 + %0 = load i32* %x.addr, align 4, !dbg !16 + %inc = add nsw i32 %0, 1, !dbg !16 + store i32 %inc, i32* %x.addr, align 4, !dbg !16 + ret i32 %inc, !dbg !16 +} + +declare void @llvm.dbg.declare(metadata, metadata) #1 + +define i32 @main() #0 { +entry: + ret i32 0, !dbg !17 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/scratch/list0.c] [DW_LANG_C99] +!1 = metadata !{metadata !"list0.c", metadata !"/usr/local/google/home/blaikie/dev/scratch"} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4, metadata !10} +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @foo, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{metadata !"./list0.h", metadata !"/usr/local/google/home/blaikie/dev/scratch"} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [/usr/local/google/home/blaikie/dev/scratch/./list0.h] +!7 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !9} +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786478, metadata !1, metadata !11, metadata !"main", metadata !"main", metadata !"", i32 2, metadata !12, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [main] +!11 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/blaikie/dev/scratch/list0.c] +!12 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !13, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!13 = metadata !{metadata !9} +!14 = metadata !{i32 786689, metadata !4, metadata !"x", metadata !6, i32 16777217, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [x] [line 1] +!15 = metadata !{i32 1, i32 0, metadata !4, null} +!16 = metadata !{i32 2, i32 0, metadata !4, null} +!17 = metadata !{i32 3, i32 0, metadata !18, null} +!18 = metadata !{i32 786443, metadata !11, metadata !10} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/blaikie/dev/scratch/list0.c] diff --git a/test/DebugInfo/X86/linkage-name.ll b/test/DebugInfo/X86/linkage-name.ll index b98492383ac3..9440f3a994e1 100644 --- a/test/DebugInfo/X86/linkage-name.ll +++ b/test/DebugInfo/X86/linkage-name.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-macosx -darwin-gdb-compat=Disable %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: DW_TAG_subprogram [9] * ; CHECK-NOT: DW_AT_MIPS_linkage_name @@ -26,31 +26,29 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata !"/Users/echristo", metadata !"clang version 3.1 (trunk 152691) (llvm/trunk 152692)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !18} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786478, i32 0, null, metadata !"a", metadata !"a", metadata !"_ZN1A1aEi", metadata !6, i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%class.A*, i32)* @_ZN1A1aEi, null, metadata !13, metadata !16} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 786473, metadata !"foo.cpp", metadata !"/Users/echristo", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.1 (trunk 152691) (llvm/trunk 152692)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !18, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, null, metadata !"a", metadata !"a", metadata !"_ZN1A1aEi", i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%class.A*, i32)* @_ZN1A1aEi, null, metadata !13, metadata !16, i32 5} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !28} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9, metadata !10, metadata !9} -!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !10 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !11} ; [ DW_TAG_pointer_type ] -!11 = metadata !{i32 786434, null, metadata !"A", metadata !6, i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !12, i32 0, null, null} ; [ DW_TAG_class_type ] +!11 = metadata !{i32 786434, metadata !28, null, metadata !"A", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !12, i32 0, null, null} ; [ DW_TAG_class_type ] !12 = metadata !{metadata !13} -!13 = metadata !{i32 786478, i32 0, metadata !11, metadata !"a", metadata !"a", metadata !"_ZN1A1aEi", metadata !6, i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 257, i1 false, null, null, i32 0, metadata !14} ; [ DW_TAG_subprogram ] +!13 = metadata !{i32 786478, metadata !6, metadata !11, metadata !"a", metadata !"a", metadata !"_ZN1A1aEi", i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 257, i1 false, null, null, i32 0, metadata !14} ; [ DW_TAG_subprogram ] !14 = metadata !{metadata !15} !15 = metadata !{i32 786468} ; [ DW_TAG_base_type ] !16 = metadata !{metadata !17} !17 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!18 = metadata !{metadata !19} -!19 = metadata !{metadata !20} -!20 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 9, metadata !11, i32 0, i32 1, %class.A* @a} ; [ DW_TAG_variable ] +!18 = metadata !{metadata !20} +!20 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 9, metadata !11, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] !21 = metadata !{i32 786689, metadata !5, metadata !"this", metadata !6, i32 16777221, metadata !22, i32 64, i32 0} ; [ DW_TAG_arg_variable ] -!22 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] +!22 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] !23 = metadata !{i32 5, i32 8, metadata !5, null} !24 = metadata !{i32 786689, metadata !5, metadata !"b", metadata !6, i32 33554437, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !25 = metadata !{i32 5, i32 14, metadata !5, null} !26 = metadata !{i32 6, i32 4, metadata !27, null} -!27 = metadata !{i32 786443, metadata !5, i32 5, i32 17, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!27 = metadata !{i32 786443, metadata !6, metadata !5, i32 5, i32 17, i32 0} ; [ DW_TAG_lexical_block ] +!28 = metadata !{metadata !"foo.cpp", metadata !"/Users/echristo"} diff --git a/test/DebugInfo/X86/lit.local.cfg b/test/DebugInfo/X86/lit.local.cfg index 0d694da8df5a..60d66eae4953 100644 --- a/test/DebugInfo/X86/lit.local.cfg +++ b/test/DebugInfo/X86/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.ll'] +config.suffixes = ['.ll', '.s'] targets = set(config.root.targets_to_build.split()) if not 'X86' in targets: diff --git a/test/DebugInfo/X86/low-pc-cu.ll b/test/DebugInfo/X86/low-pc-cu.ll index f9d9b9171493..4dd5aafe18ea 100644 --- a/test/DebugInfo/X86/low-pc-cu.ll +++ b/test/DebugInfo/X86/low-pc-cu.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; Check that we use DW_AT_low_pc @@ -14,18 +14,16 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata !"/Users/echristo/tmp", metadata !"clang version 3.1 (trunk 153454) (llvm/trunk 153471)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !12} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"q", metadata !"q", metadata !"_Z1qv", metadata !6, i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z1qv, null, null, metadata !10} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.1 (trunk 153454) (llvm/trunk 153471)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !12} +!5 = metadata !{i32 786478, metadata !"_Z1qv", i32 0, metadata !6, metadata !"q", metadata !"q", metadata !6, i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z1qv, null, null, metadata !10} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !"foo.cpp", metadata !"/Users/echristo/tmp", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9} !9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !10 = metadata !{metadata !11} !11 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!12 = metadata !{i32 786478, i32 0, metadata !6, metadata !"t", metadata !"t", metadata !"", metadata !6, i32 2, metadata !7, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !10} ; [ DW_TAG_subprogram ] +!12 = metadata !{i32 786478, metadata !"", i32 0, metadata !6, metadata !"t", metadata !"t", metadata !6, i32 2, metadata !7, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !10} ; [ DW_TAG_subprogram ] !13 = metadata !{i32 7, i32 1, metadata !14, null} !14 = metadata !{i32 786443, metadata !5, i32 5, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] diff --git a/test/DebugInfo/X86/main-file-name.s b/test/DebugInfo/X86/main-file-name.s new file mode 100644 index 000000000000..0369c6158a43 --- /dev/null +++ b/test/DebugInfo/X86/main-file-name.s @@ -0,0 +1,17 @@ +// RUN: llvm-mc -triple x86_64-unknown-linux-gnu -filetype obj -main-file-name foo.S -g -o %t %s +// RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s + +// CHECK: DW_TAG_compile_unit [1] +// CHECK-NOT: DW_TAG_ +// CHECK: DW_AT_name [DW_FORM_string] ("foo.S") + + +# 1 "foo.S" +# 1 "<built-in>" 1 +# 1 "foo.S" 2 + +foo: + nop + nop + nop + diff --git a/test/DebugInfo/X86/misched-dbg-value.ll b/test/DebugInfo/X86/misched-dbg-value.ll new file mode 100644 index 000000000000..0980e23b7517 --- /dev/null +++ b/test/DebugInfo/X86/misched-dbg-value.ll @@ -0,0 +1,174 @@ +; RUN: llc %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t -enable-misched +; RUN: llvm-dwarfdump %t | FileCheck %s + +; rdar://13183203 +; Make sure when misched is enabled, we still have location information for +; function parameters. +; CHECK: .debug_info contents: +; CHECK: DW_TAG_compile_unit +; CHECK: DW_TAG_subprogram +; CHECK: Proc8 +; CHECK: DW_TAG_formal_parameter +; CHECK: Array1Par +; CHECK: DW_AT_location +; CHECK: DW_TAG_formal_parameter +; CHECK: Array2Par +; CHECK: DW_AT_location +; CHECK: DW_TAG_formal_parameter +; CHECK: IntParI1 +; CHECK: DW_AT_location +; CHECK: DW_TAG_formal_parameter +; CHECK: IntParI2 +; CHECK: DW_AT_location + +%struct.Record = type { %struct.Record*, i32, i32, i32, [31 x i8] } + +@Version = global [4 x i8] c"1.1\00", align 1 +@IntGlob = common global i32 0, align 4 +@BoolGlob = common global i32 0, align 4 +@Char1Glob = common global i8 0, align 1 +@Char2Glob = common global i8 0, align 1 +@Array1Glob = common global [51 x i32] zeroinitializer, align 16 +@Array2Glob = common global [51 x [51 x i32]] zeroinitializer, align 16 +@PtrGlb = common global %struct.Record* null, align 8 +@PtrGlbNext = common global %struct.Record* null, align 8 + +define void @Proc8(i32* nocapture %Array1Par, [51 x i32]* nocapture %Array2Par, i32 %IntParI1, i32 %IntParI2) nounwind optsize { +entry: + tail call void @llvm.dbg.value(metadata !{i32* %Array1Par}, i64 0, metadata !23), !dbg !64 + tail call void @llvm.dbg.value(metadata !{[51 x i32]* %Array2Par}, i64 0, metadata !24), !dbg !65 + tail call void @llvm.dbg.value(metadata !{i32 %IntParI1}, i64 0, metadata !25), !dbg !66 + tail call void @llvm.dbg.value(metadata !{i32 %IntParI2}, i64 0, metadata !26), !dbg !67 + %add = add i32 %IntParI1, 5, !dbg !68 + tail call void @llvm.dbg.value(metadata !{i32 %add}, i64 0, metadata !27), !dbg !68 + %idxprom = sext i32 %add to i64, !dbg !69 + %arrayidx = getelementptr inbounds i32* %Array1Par, i64 %idxprom, !dbg !69 + store i32 %IntParI2, i32* %arrayidx, align 4, !dbg !69, !tbaa !70 + %add3 = add nsw i32 %IntParI1, 6, !dbg !73 + %idxprom4 = sext i32 %add3 to i64, !dbg !73 + %arrayidx5 = getelementptr inbounds i32* %Array1Par, i64 %idxprom4, !dbg !73 + store i32 %IntParI2, i32* %arrayidx5, align 4, !dbg !73, !tbaa !70 + %add6 = add nsw i32 %IntParI1, 35, !dbg !74 + %idxprom7 = sext i32 %add6 to i64, !dbg !74 + %arrayidx8 = getelementptr inbounds i32* %Array1Par, i64 %idxprom7, !dbg !74 + store i32 %add, i32* %arrayidx8, align 4, !dbg !74, !tbaa !70 + tail call void @llvm.dbg.value(metadata !{i32 %add}, i64 0, metadata !28), !dbg !75 + br label %for.body, !dbg !75 + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %idxprom, %entry ], [ %indvars.iv.next, %for.body ] + %IntIndex.046 = phi i32 [ %add, %entry ], [ %inc, %for.body ] + %arrayidx13 = getelementptr inbounds [51 x i32]* %Array2Par, i64 %idxprom, i64 %indvars.iv, !dbg !77 + store i32 %add, i32* %arrayidx13, align 4, !dbg !77, !tbaa !70 + %inc = add nsw i32 %IntIndex.046, 1, !dbg !75 + tail call void @llvm.dbg.value(metadata !{i32 %inc}, i64 0, metadata !28), !dbg !75 + %cmp = icmp sgt i32 %inc, %add3, !dbg !75 + %indvars.iv.next = add i64 %indvars.iv, 1, !dbg !75 + br i1 %cmp, label %for.end, label %for.body, !dbg !75 + +for.end: ; preds = %for.body + %sub = add nsw i32 %IntParI1, 4, !dbg !78 + %idxprom14 = sext i32 %sub to i64, !dbg !78 + %arrayidx17 = getelementptr inbounds [51 x i32]* %Array2Par, i64 %idxprom, i64 %idxprom14, !dbg !78 + %0 = load i32* %arrayidx17, align 4, !dbg !78, !tbaa !70 + %inc18 = add nsw i32 %0, 1, !dbg !78 + store i32 %inc18, i32* %arrayidx17, align 4, !dbg !78, !tbaa !70 + %1 = load i32* %arrayidx, align 4, !dbg !79, !tbaa !70 + %add22 = add nsw i32 %IntParI1, 25, !dbg !79 + %idxprom23 = sext i32 %add22 to i64, !dbg !79 + %arrayidx25 = getelementptr inbounds [51 x i32]* %Array2Par, i64 %idxprom23, i64 %idxprom, !dbg !79 + store i32 %1, i32* %arrayidx25, align 4, !dbg !79, !tbaa !70 + store i32 5, i32* @IntGlob, align 4, !dbg !80, !tbaa !70 + ret void, !dbg !81 +} + +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone + +attributes #0 = { nounwind optsize ssp uwtable } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 12, metadata !3, metadata !"clang version 3.3 (trunk 175015)", i1 true, metadata !"", i32 0, metadata !1, metadata !10, metadata !11, metadata !29, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/manmanren/test-Nov/rdar_13183203/test2/dry.c] [DW_LANG_C99] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 786436, metadata !82, null, metadata !"", i32 128, i64 32, i64 32, i32 0, i32 0, null, metadata !4, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] [line 128, size 32, align 32, offset 0] [from ] +!3 = metadata !{i32 786473, metadata !82} ; [ DW_TAG_file_type ] +!4 = metadata !{metadata !5, metadata !6, metadata !7, metadata !8, metadata !9} +!5 = metadata !{i32 786472, metadata !"Ident1", i64 0} ; [ DW_TAG_enumerator ] [Ident1 :: 0] +!6 = metadata !{i32 786472, metadata !"Ident2", i64 10000} ; [ DW_TAG_enumerator ] [Ident2 :: 10000] +!7 = metadata !{i32 786472, metadata !"Ident3", i64 10001} ; [ DW_TAG_enumerator ] [Ident3 :: 10001] +!8 = metadata !{i32 786472, metadata !"Ident4", i64 10002} ; [ DW_TAG_enumerator ] [Ident4 :: 10002] +!9 = metadata !{i32 786472, metadata !"Ident5", i64 10003} ; [ DW_TAG_enumerator ] [Ident5 :: 10003] +!10 = metadata !{i32 0} +!11 = metadata !{metadata !12} +!12 = metadata !{i32 786478, metadata !3, metadata !"Proc8", metadata !"Proc8", metadata !"", metadata !3, i32 180, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, void (i32*, [51 x i32]*, i32, i32)* @Proc8, null, null, metadata !22, i32 185} ; [ DW_TAG_subprogram ] [line 180] [def] [scope 185] [Proc8] +!13 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!14 = metadata !{null, metadata !15, metadata !17, metadata !21, metadata !21} +!15 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!16 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!17 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !18} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!18 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 1632, i64 32, i32 0, i32 0, metadata !16, metadata !19, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 1632, align 32, offset 0] [from int] +!19 = metadata !{metadata !20} +!20 = metadata !{i32 786465, i64 0, i64 51} ; [ DW_TAG_subrange_type ] [0, 50] +!21 = metadata !{i32 786454, metadata !82, null, metadata !"OneToFifty", i32 132, i64 0, i64 0, i64 0, i32 0, metadata !16} ; [ DW_TAG_typedef ] [OneToFifty] [line 132, size 0, align 0, offset 0] [from int] +!22 = metadata !{metadata !23, metadata !24, metadata !25, metadata !26, metadata !27, metadata !28} +!23 = metadata !{i32 786689, metadata !12, metadata !"Array1Par", metadata !3, i32 16777397, metadata !15, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [Array1Par] [line 181] +!24 = metadata !{i32 786689, metadata !12, metadata !"Array2Par", metadata !3, i32 33554614, metadata !17, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [Array2Par] [line 182] +!25 = metadata !{i32 786689, metadata !12, metadata !"IntParI1", metadata !3, i32 50331831, metadata !21, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [IntParI1] [line 183] +!26 = metadata !{i32 786689, metadata !12, metadata !"IntParI2", metadata !3, i32 67109048, metadata !21, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [IntParI2] [line 184] +!27 = metadata !{i32 786688, metadata !12, metadata !"IntLoc", metadata !3, i32 186, metadata !21, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [IntLoc] [line 186] +!28 = metadata !{i32 786688, metadata !12, metadata !"IntIndex", metadata !3, i32 187, metadata !21, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [IntIndex] [line 187] +!29 = metadata !{metadata !30, metadata !35, metadata !36, metadata !38, metadata !39, metadata !40, metadata !42, metadata !46, metadata !63} +!30 = metadata !{i32 786484, i32 0, null, metadata !"Version", metadata !"Version", metadata !"", metadata !3, i32 111, metadata !31, i32 0, i32 1, [4 x i8]* @Version, null} ; [ DW_TAG_variable ] [Version] [line 111] [def] +!31 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 32, i64 8, i32 0, i32 0, metadata !32, metadata !33, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 32, align 8, offset 0] [from char] +!32 = metadata !{i32 786468, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char] +!33 = metadata !{metadata !34} +!34 = metadata !{i32 786465, i64 0, i64 4} ; [ DW_TAG_subrange_type ] [0, 3] +!35 = metadata !{i32 786484, i32 0, null, metadata !"IntGlob", metadata !"IntGlob", metadata !"", metadata !3, i32 171, metadata !16, i32 0, i32 1, i32* @IntGlob, null} ; [ DW_TAG_variable ] [IntGlob] [line 171] [def] +!36 = metadata !{i32 786484, i32 0, null, metadata !"BoolGlob", metadata !"BoolGlob", metadata !"", metadata !3, i32 172, metadata !37, i32 0, i32 1, i32* @BoolGlob, null} ; [ DW_TAG_variable ] [BoolGlob] [line 172] [def] +!37 = metadata !{i32 786454, metadata !82, null, metadata !"boolean", i32 149, i64 0, i64 0, i64 0, i32 0, metadata !16} ; [ DW_TAG_typedef ] [boolean] [line 149, size 0, align 0, offset 0] [from int] +!38 = metadata !{i32 786484, i32 0, null, metadata !"Char1Glob", metadata !"Char1Glob", metadata !"", metadata !3, i32 173, metadata !32, i32 0, i32 1, i8* @Char1Glob, null} ; [ DW_TAG_variable ] [Char1Glob] [line 173] [def] +!39 = metadata !{i32 786484, i32 0, null, metadata !"Char2Glob", metadata !"Char2Glob", metadata !"", metadata !3, i32 174, metadata !32, i32 0, i32 1, i8* @Char2Glob, null} ; [ DW_TAG_variable ] [Char2Glob] [line 174] [def] +!40 = metadata !{i32 786484, i32 0, null, metadata !"Array1Glob", metadata !"Array1Glob", metadata !"", metadata !3, i32 175, metadata !41, i32 0, i32 1, [51 x i32]* @Array1Glob, null} ; [ DW_TAG_variable ] [Array1Glob] [line 175] [def] +!41 = metadata !{i32 786454, metadata !82, null, metadata !"Array1Dim", i32 135, i64 0, i64 0, i64 0, i32 0, metadata !18} ; [ DW_TAG_typedef ] [Array1Dim] [line 135, size 0, align 0, offset 0] [from ] +!42 = metadata !{i32 786484, i32 0, null, metadata !"Array2Glob", metadata !"Array2Glob", metadata !"", metadata !3, i32 176, metadata !43, i32 0, i32 1, [51 x [51 x i32]]* @Array2Glob, null} ; [ DW_TAG_variable ] [Array2Glob] [line 176] [def] +!43 = metadata !{i32 786454, metadata !82, null, metadata !"Array2Dim", i32 136, i64 0, i64 0, i64 0, i32 0, metadata !44} ; [ DW_TAG_typedef ] [Array2Dim] [line 136, size 0, align 0, offset 0] [from ] +!44 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 83232, i64 32, i32 0, i32 0, metadata !16, metadata !45, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 83232, align 32, offset 0] [from int] +!45 = metadata !{metadata !20, metadata !20} +!46 = metadata !{i32 786484, i32 0, null, metadata !"PtrGlb", metadata !"PtrGlb", metadata !"", metadata !3, i32 177, metadata !47, i32 0, i32 1, %struct.Record** @PtrGlb, null} ; [ DW_TAG_variable ] [PtrGlb] [line 177] [def] +!47 = metadata !{i32 786454, metadata !82, null, metadata !"RecordPtr", i32 148, i64 0, i64 0, i64 0, i32 0, metadata !48} ; [ DW_TAG_typedef ] [RecordPtr] [line 148, size 0, align 0, offset 0] [from ] +!48 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !49} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from RecordType] +!49 = metadata !{i32 786454, metadata !82, null, metadata !"RecordType", i32 147, i64 0, i64 0, i64 0, i32 0, metadata !50} ; [ DW_TAG_typedef ] [RecordType] [line 147, size 0, align 0, offset 0] [from Record] +!50 = metadata !{i32 786451, metadata !82, null, metadata !"Record", i32 138, i64 448, i64 64, i32 0, i32 0, null, metadata !51, i32 0, i32 0, i32 0} ; [ DW_TAG_structure_type ] [Record] [line 138, size 448, align 64, offset 0] [from ] +!51 = metadata !{metadata !52, metadata !54, metadata !56, metadata !57, metadata !58} +!52 = metadata !{i32 786445, metadata !82, metadata !50, metadata !"PtrComp", i32 140, i64 64, i64 64, i64 0, i32 0, metadata !53} ; [ DW_TAG_member ] [PtrComp] [line 140, size 64, align 64, offset 0] [from ] +!53 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !50} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from Record] +!54 = metadata !{i32 786445, metadata !82, metadata !50, metadata !"Discr", i32 141, i64 32, i64 32, i64 64, i32 0, metadata !55} ; [ DW_TAG_member ] [Discr] [line 141, size 32, align 32, offset 64] [from Enumeration] +!55 = metadata !{i32 786454, metadata !82, null, metadata !"Enumeration", i32 128, i64 0, i64 0, i64 0, i32 0, metadata !2} ; [ DW_TAG_typedef ] [Enumeration] [line 128, size 0, align 0, offset 0] [from ] +!56 = metadata !{i32 786445, metadata !82, metadata !50, metadata !"EnumComp", i32 142, i64 32, i64 32, i64 96, i32 0, metadata !55} ; [ DW_TAG_member ] [EnumComp] [line 142, size 32, align 32, offset 96] [from Enumeration] +!57 = metadata !{i32 786445, metadata !82, metadata !50, metadata !"IntComp", i32 143, i64 32, i64 32, i64 128, i32 0, metadata !21} ; [ DW_TAG_member ] [IntComp] [line 143, size 32, align 32, offset 128] [from OneToFifty] +!58 = metadata !{i32 786445, metadata !82, metadata !50, metadata !"StringComp", i32 144, i64 248, i64 8, i64 160, i32 0, metadata !59} ; [ DW_TAG_member ] [StringComp] [line 144, size 248, align 8, offset 160] [from String30] +!59 = metadata !{i32 786454, metadata !82, null, metadata !"String30", i32 134, i64 0, i64 0, i64 0, i32 0, metadata !60} ; [ DW_TAG_typedef ] [String30] [line 134, size 0, align 0, offset 0] [from ] +!60 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 248, i64 8, i32 0, i32 0, metadata !32, metadata !61, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 248, align 8, offset 0] [from char] +!61 = metadata !{metadata !62} +!62 = metadata !{i32 786465, i64 0, i64 31} ; [ DW_TAG_subrange_type ] [0, 30] +!63 = metadata !{i32 786484, i32 0, null, metadata !"PtrGlbNext", metadata !"PtrGlbNext", metadata !"", metadata !3, i32 178, metadata !47, i32 0, i32 1, %struct.Record** @PtrGlbNext, null} ; [ DW_TAG_variable ] [PtrGlbNext] [line 178] [def] +!64 = metadata !{i32 181, i32 0, metadata !12, null} +!65 = metadata !{i32 182, i32 0, metadata !12, null} +!66 = metadata !{i32 183, i32 0, metadata !12, null} +!67 = metadata !{i32 184, i32 0, metadata !12, null} +!68 = metadata !{i32 189, i32 0, metadata !12, null} +!69 = metadata !{i32 190, i32 0, metadata !12, null} +!70 = metadata !{metadata !"int", metadata !71} +!71 = metadata !{metadata !"omnipotent char", metadata !72} +!72 = metadata !{metadata !"Simple C/C++ TBAA"} +!73 = metadata !{i32 191, i32 0, metadata !12, null} +!74 = metadata !{i32 192, i32 0, metadata !12, null} +!75 = metadata !{i32 193, i32 0, metadata !76, null} +!76 = metadata !{i32 786443, metadata !12, i32 193, i32 0, metadata !3, i32 0} ; [ DW_TAG_lexical_block ] [/Users/manmanren/test-Nov/rdar_13183203/test2/dry.c] +!77 = metadata !{i32 194, i32 0, metadata !76, null} +!78 = metadata !{i32 195, i32 0, metadata !12, null} +!79 = metadata !{i32 196, i32 0, metadata !12, null} +!80 = metadata !{i32 197, i32 0, metadata !12, null} +!81 = metadata !{i32 198, i32 0, metadata !12, null} +!82 = metadata !{metadata !"dry.c", metadata !"/Users/manmanren/test-Nov/rdar_13183203/test2"} diff --git a/test/DebugInfo/X86/multiple-at-const-val.ll b/test/DebugInfo/X86/multiple-at-const-val.ll new file mode 100644 index 000000000000..f6ca10bcc4ca --- /dev/null +++ b/test/DebugInfo/X86/multiple-at-const-val.ll @@ -0,0 +1,61 @@ +; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; rdar://13071590 +; Check we are not emitting mutliple AT_const_value for a single member. +; CHECK: .debug_info contents: +; CHECK: DW_TAG_compile_unit +; CHECK: DW_TAG_class_type +; CHECK: DW_TAG_member +; CHECK: badbit +; CHECK: DW_AT_const_value [DW_FORM_data4] (0x00000001) +; CHECK-NOT: DW_AT_const_value +; CHECK: NULL + +%"class.std::basic_ostream" = type { i32 (...)**, %"class.std::basic_os" } +%"class.std::basic_os" = type { %"class.std::os_base", %"class.std::basic_ostream"*, i8, i8 } +%"class.std::os_base" = type { i32 (...)**, i64, i64, i32, i32, i32 } + +@_ZSt4cout = external global %"class.std::basic_ostream" +@.str = private unnamed_addr constant [6 x i8] c"c is \00", align 1 + +define i32 @main() { +entry: + %call1.i = tail call %"class.std::basic_ostream"* @test(%"class.std::basic_ostream"* @_ZSt4cout, i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0), i64 5) + ret i32 0 +} + +declare %"class.std::basic_ostream"* @test(%"class.std::basic_ostream"*, i8*, i64) + +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 4, metadata !961, metadata !"clang version 3.3 (trunk 174207)", i1 true, metadata !"", i32 0, metadata !1, metadata !955, metadata !956, metadata !1786, metadata !""} ; [ DW_TAG_compile_unit ] [/privite/tmp/student2.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !26} +!4 = metadata !{i32 786489, null, metadata !"std", metadata !5, i32 48} ; [ DW_TAG_namespace ] +!5 = metadata !{i32 786473, metadata !1801} ; [ DW_TAG_file_type ] +!25 = metadata !{i32 786472, metadata !"_S_os_fmtflags_end", i64 65536} ; [ DW_TAG_enumerator ] +!26 = metadata !{i32 786436, metadata !1801, metadata !4, metadata !"_Ios_Iostate", i32 146, i64 32, i64 32, i32 0, i32 0, null, metadata !27, i32 0, i32 0} ; [ DW_TAG_enumeration_type ] +!27 = metadata !{metadata !28, metadata !29, metadata !30, metadata !31, metadata !32} +!28 = metadata !{i32 786472, metadata !"_S_goodbit", i64 0} ; [ DW_TAG_enumerator ] [_S_goodbit :: 0] +!29 = metadata !{i32 786472, metadata !"_S_badbit", i64 1} ; [ DW_TAG_enumerator ] [_S_badbit :: 1] +!30 = metadata !{i32 786472, metadata !"_S_eofbit", i64 2} ; [ DW_TAG_enumerator ] [_S_eofbit :: 2] +!31 = metadata !{i32 786472, metadata !"_S_failbit", i64 4} ; [ DW_TAG_enumerator ] [_S_failbit :: 4] +!32 = metadata !{i32 786472, metadata !"_S_os_ostate_end", i64 65536} ; [ DW_TAG_enumerator ] [_S_os_ostate_end :: 65536] +!49 = metadata !{i32 786434, metadata !1801, metadata !4, metadata !"os_base", i32 200, i64 1728, i64 64, i32 0, i32 0, null, metadata !50, i32 0, metadata !49, null} ; [ DW_TAG_class_type ] +!50 = metadata !{metadata !77} +!54 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !55, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!55 = metadata !{metadata !56} +!56 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!77 = metadata !{i32 786445, metadata !1801, metadata !49, metadata !"badbit", i32 331, i64 0, i64 0, i64 0, i32 4096, metadata !78, i32 1} ; [ DW_TAG_member ] +!78 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !79} ; [ DW_TAG_const_type ] +!79 = metadata !{i32 786454, metadata !49, metadata !"ostate", metadata !5, i32 327, i64 0, i64 0, i64 0, i32 0, metadata !26} ; [ DW_TAG_typedef ] +!955 = metadata !{i32 0} +!956 = metadata !{metadata !960} +!960 = metadata !{i32 786478, i32 0, metadata !961, metadata !"main", metadata !"main", metadata !"", metadata !961, i32 73, metadata !54, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !955, i32 73} ; [ DW_TAG_subprogram ] +!961 = metadata !{i32 786473, metadata !1802} ; [ DW_TAG_file_type ] +!1786 = metadata !{metadata !1800} +!1800 = metadata !{i32 786484, i32 0, metadata !5, metadata !"badbit", metadata !"badbit", metadata !"badbit", metadata !5, i32 331, metadata !78, i32 1, i32 1, i32 1, metadata !77} ; [ DW_TAG_variable ] +!1801 = metadata !{metadata !"os_base.h", metadata !"/privite/tmp"} +!1802 = metadata !{metadata !"student2.cpp", metadata !"/privite/tmp"} diff --git a/test/DebugInfo/X86/nondefault-subrange-array.ll b/test/DebugInfo/X86/nondefault-subrange-array.ll new file mode 100644 index 000000000000..33a6f8ba9e50 --- /dev/null +++ b/test/DebugInfo/X86/nondefault-subrange-array.ll @@ -0,0 +1,48 @@ +; RUN: llc -mtriple=x86_64-apple-darwin -O0 -filetype=obj -o %t < %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s + +%class.A = type { [42 x i32] } + +@a = global %class.A zeroinitializer, align 4 + +; Check that we can handle non-default array bounds. In this case, the array +; goes from [-3, 38]. + +; CHECK: 0x0000002d: DW_TAG_base_type [3] +; CHECK-NEXT: 0x0000002e: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000041] = "int") +; CHECK-NEXT: 0x00000032: DW_AT_byte_size [DW_FORM_data1] (0x04) +; CHECK-NEXT: 0x00000033: DW_AT_encoding [DW_FORM_data1] (0x05) + +; CHECK: 0x00000034: DW_TAG_array_type [4] * +; CHECK-NEXT: 0x00000035: DW_AT_type [DW_FORM_ref4] (cu + 0x0026 => {0x00000026}) + +; CHECK: 0x00000039: DW_TAG_subrange_type [5] +; CHECK-NEXT: 0x0000003a: DW_AT_type [DW_FORM_ref4] (cu + 0x002d => {0x0000002d}) +; CHECK-NEXT: 0x0000003e: DW_AT_lower_bound [DW_FORM_data8] (0xfffffffffffffffd) +; CHECK-NEXT: 0x00000046: DW_AT_upper_bound [DW_FORM_data1] (0x26) + +; CHECK: 0x00000055: DW_TAG_member [8] +; CHECK-NEXT: 0x00000056: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000003f] = "x") +; CHECK-NEXT: 0x0000005a: DW_AT_type [DW_FORM_ref4] (cu + 0x0034 => {0x00000034}) + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/t.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] [a] [line 1] [def] +!6 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786434, metadata !20, null, metadata !"A", i32 1, i64 0, i64 32, i32 0, i32 0, null, metadata !8, i32 0, null, null} ; [ DW_TAG_class_type ] [A] [line 1, size 0, align 32, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !14} +!9 = metadata !{i32 786445, metadata !20, metadata !7, metadata !"x", i32 1, i64 0, i64 0, i64 0, i32 1, metadata !10} ; [ DW_TAG_member ] [x] [line 1, size 0, align 0, offset 0] [private] [from ] +!10 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 0, i64 32, i32 0, i32 0, metadata !11, metadata !12, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 0, align 32, offset 0] [from int] +!11 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!12 = metadata !{metadata !13} +!13 = metadata !{i32 786465, i64 -3, i64 42} ; [ DW_TAG_subrange_type ] [-3, 39] +!14 = metadata !{i32 786478, metadata !6, metadata !7, metadata !"A", metadata !"A", metadata !"", i32 1, metadata !15, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !18, i32 1} ; [ DW_TAG_subprogram ] [line 1] [A] +!15 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !16, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!16 = metadata !{null, metadata !17} +!17 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !7} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from A] +!18 = metadata !{metadata !19} +!19 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] +!20 = metadata !{metadata !"t.cpp", metadata !"/Volumes/Sandbox/llvm"} diff --git a/test/DebugInfo/X86/objc-fwd-decl.ll b/test/DebugInfo/X86/objc-fwd-decl.ll index 1a815f936c17..1847d2c10fdf 100644 --- a/test/DebugInfo/X86/objc-fwd-decl.ll +++ b/test/DebugInfo/X86/objc-fwd-decl.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-macosx %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: 0x00000027: DW_TAG_structure_type ; CHECK: 0x0000002c: DW_AT_declaration @@ -12,16 +12,15 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!9, !10, !11, !12} -!0 = metadata !{i32 786449, i32 0, i32 16, metadata !"foo.m", metadata !"/Users/echristo", metadata !"clang version 3.1 (trunk 152054 trunk 152094)", i1 true, i1 false, metadata !"", i32 2, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 3, metadata !7, i32 0, i32 1, %0** @a} ; [ DW_TAG_variable ] -!6 = metadata !{i32 786473, metadata !"foo.m", metadata !"/Users/echristo", null} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] -!8 = metadata !{i32 786451, null, metadata !"FooBarBaz", metadata !6, i32 1, i32 0, i32 0, i32 0, i32 4, null, null, i32 16} ; [ DW_TAG_structure_type ] +!0 = metadata !{i32 786449, metadata !13, i32 16, metadata !"clang version 3.1 (trunk 152054 trunk 152094)", i1 false, metadata !"", i32 2, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 3, metadata !7, i32 0, i32 1, %0** @a, null} ; [ DW_TAG_variable ] +!6 = metadata !{i32 786473, metadata !13} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] +!8 = metadata !{i32 786451, metadata !13, null, metadata !"FooBarBaz", i32 1, i32 0, i32 0, i32 0, i32 4, null, null, i32 16} ; [ DW_TAG_structure_type ] !9 = metadata !{i32 1, metadata !"Objective-C Version", i32 2} !10 = metadata !{i32 1, metadata !"Objective-C Image Info Version", i32 0} !11 = metadata !{i32 1, metadata !"Objective-C Image Info Section", metadata !"__DATA, __objc_imageinfo, regular, no_dead_strip"} !12 = metadata !{i32 4, metadata !"Objective-C Garbage Collection", i32 0} +!13 = metadata !{metadata !"foo.m", metadata !"/Users/echristo"} diff --git a/test/DebugInfo/X86/op_deref.ll b/test/DebugInfo/X86/op_deref.ll index c84b2e6931f2..3bb93e7251b8 100644 --- a/test/DebugInfo/X86/op_deref.ll +++ b/test/DebugInfo/X86/op_deref.ll @@ -1,5 +1,5 @@ ; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000067] = "vla") ; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle @@ -59,31 +59,30 @@ declare void @llvm.stackrestore(i8*) nounwind !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"bar.c", metadata !"/Users/echristo/tmp", metadata !"clang version 3.2 (trunk 156005) (llvm/trunk 156000)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"testVLAwithSize", metadata !"testVLAwithSize", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32)* @testVLAwithSize, null, null, metadata !1, i32 2} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 786473, metadata !"bar.c", metadata !"/Users/echristo/tmp", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !28, i32 12, metadata !"clang version 3.2 (trunk 156005) (llvm/trunk 156000)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"testVLAwithSize", metadata !"testVLAwithSize", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32)* @testVLAwithSize, null, null, metadata !1, i32 2} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !28} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null, metadata !9} -!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !10 = metadata !{i32 786689, metadata !5, metadata !"s", metadata !6, i32 16777217, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !11 = metadata !{i32 1, i32 26, metadata !5, null} !12 = metadata !{i32 3, i32 13, metadata !13, null} -!13 = metadata !{i32 786443, metadata !5, i32 2, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!13 = metadata !{i32 786443, metadata !6, metadata !5, i32 2, i32 1, i32 0} ; [ DW_TAG_lexical_block ] !14 = metadata !{i32 786688, metadata !13, metadata !"vla", metadata !6, i32 3, metadata !15, i32 0, i32 0, i64 2} ; [ DW_TAG_auto_variable ] -!15 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 0, i64 32, i32 0, i32 0, metadata !9, metadata !16, i32 0, i32 0} ; [ DW_TAG_array_type ] +!15 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 0, i64 32, i32 0, i32 0, metadata !9, metadata !16, i32 0, i32 0} ; [ DW_TAG_array_type ] !16 = metadata !{metadata !17} -!17 = metadata !{i32 786465, i64 1, i64 0} ; [ DW_TAG_subrange_type ] +!17 = metadata !{i32 786465, i64 0, i64 -1} ; [ DW_TAG_subrange_type ] !18 = metadata !{i32 3, i32 7, metadata !13, null} !19 = metadata !{i32 786688, metadata !13, metadata !"i", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] !20 = metadata !{i32 4, i32 7, metadata !13, null} !21 = metadata !{i32 5, i32 8, metadata !22, null} -!22 = metadata !{i32 786443, metadata !13, i32 5, i32 3, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] +!22 = metadata !{i32 786443, metadata !6, metadata !13, i32 5, i32 3, i32 1} ; [ DW_TAG_lexical_block ] !23 = metadata !{i32 6, i32 5, metadata !24, null} -!24 = metadata !{i32 786443, metadata !22, i32 5, i32 27, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] +!24 = metadata !{i32 786443, metadata !6, metadata !22, i32 5, i32 27, i32 2} ; [ DW_TAG_lexical_block ] !25 = metadata !{i32 7, i32 3, metadata !24, null} !26 = metadata !{i32 5, i32 22, metadata !22, null} !27 = metadata !{i32 8, i32 1, metadata !13, null} +!28 = metadata !{metadata !"bar.c", metadata !"/Users/echristo/tmp"} diff --git a/test/DebugInfo/X86/pointer-type-size.ll b/test/DebugInfo/X86/pointer-type-size.ll index f11fbe4cc5f5..aa560587a602 100644 --- a/test/DebugInfo/X86/pointer-type-size.ll +++ b/test/DebugInfo/X86/pointer-type-size.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-macosx10.7 %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: ptr ; CHECK-NOT: AT_bit_size @@ -10,16 +10,15 @@ !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"foo.c", metadata !"/Users/echristo/tmp", metadata !"clang version 3.1 (trunk 147882)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 720948, i32 0, null, metadata !"crass", metadata !"crass", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, %struct.crass* @crass} ; [ DW_TAG_variable ] -!6 = metadata !{i32 720937, metadata !"foo.c", metadata !"/Users/echristo/tmp", null} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 720915, null, metadata !"crass", metadata !6, i32 1, i64 64, i64 64, i32 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!0 = metadata !{i32 786449, i32 12, metadata !6, metadata !"clang version 3.1 (trunk 147882)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 720948, i32 0, null, metadata !"crass", metadata !"crass", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, %struct.crass* @crass, null} ; [ DW_TAG_variable ] +!6 = metadata !{i32 720937, metadata !13} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786451, metadata !13, null, metadata !"crass", i32 1, i64 64, i64 64, i32 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_structure_type ] !8 = metadata !{metadata !9} -!9 = metadata !{i32 720909, metadata !7, metadata !"ptr", metadata !6, i32 1, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] -!10 = metadata !{i32 720934, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_const_type ] -!11 = metadata !{i32 720911, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !12} ; [ DW_TAG_pointer_type ] -!12 = metadata !{i32 720932, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786445, metadata !13, metadata !7, metadata !"ptr", i32 1, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] +!10 = metadata !{i32 720934, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_const_type ] +!11 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !12} ; [ DW_TAG_pointer_type ] +!12 = metadata !{i32 720932, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!13 = metadata !{metadata !"foo.c", metadata !"/Users/echristo/tmp"} diff --git a/test/DebugInfo/X86/pr11300.ll b/test/DebugInfo/X86/pr11300.ll index 5a001eea75a1..61df4ad0baa6 100644 --- a/test/DebugInfo/X86/pr11300.ll +++ b/test/DebugInfo/X86/pr11300.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; test that the DW_AT_specification is a back edge in the file. @@ -31,35 +31,34 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 4, metadata !"/home/espindola/llvm/test.cc", metadata !"/home/espindola/tmpfs/build", metadata !"clang version 3.0 ()", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !20} -!5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"zed", metadata !"zed", metadata !"_Z3zedP3foo", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.foo*)* @_Z3zedP3foo, null, null, metadata !18} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 720937, metadata !"/home/espindola/llvm/test.cc", metadata !"/home/espindola/tmpfs/build", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !32, i32 4, metadata !"clang version 3.0 ()", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !20} +!5 = metadata !{i32 720942, metadata !6, metadata !6, metadata !"zed", metadata !"zed", metadata !"_Z3zedP3foo", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.foo*)* @_Z3zedP3foo, null, null, metadata !18, i32 4} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 720937, metadata !32} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null, metadata !9} -!9 = metadata !{i32 720911, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] -!10 = metadata !{i32 720898, null, metadata !"foo", metadata !6, i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !11, i32 0, null, null} ; [ DW_TAG_class_type ] +!9 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] +!10 = metadata !{i32 720898, metadata !32, null, metadata !"foo", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !11, i32 0, null, null} ; [ DW_TAG_class_type ] !11 = metadata !{metadata !12} -!12 = metadata !{i32 720942, i32 0, metadata !10, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", metadata !6, i32 2, metadata !13, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !16} ; [ DW_TAG_subprogram ] +!12 = metadata !{i32 720942, metadata !6, metadata !10, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 2, metadata !13, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !16, i32 2} ; [ DW_TAG_subprogram ] !13 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !14, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !14 = metadata !{null, metadata !15} -!15 = metadata !{i32 720911, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !10} ; [ DW_TAG_pointer_type ] +!15 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !10} ; [ DW_TAG_pointer_type ] !16 = metadata !{metadata !17} !17 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !18 = metadata !{metadata !19} !19 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!20 = metadata !{i32 720942, i32 0, null, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", metadata !6, i32 2, metadata !13, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.foo*)* @_ZN3foo3barEv, null, metadata !12, metadata !21} ; [ DW_TAG_subprogram ] +!20 = metadata !{i32 720942, metadata !6, null, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 2, metadata !13, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, void (%struct.foo*)* @_ZN3foo3barEv, null, metadata !12, metadata !21, i32 2} ; [ DW_TAG_subprogram ] !21 = metadata !{metadata !22} !22 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!23 = metadata !{i32 721153, metadata !5, metadata !"x", metadata !6, i32 16777220, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!23 = metadata !{i32 786689, metadata !5, metadata !"x", metadata !6, i32 16777220, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !24 = metadata !{i32 4, i32 15, metadata !5, null} !25 = metadata !{i32 4, i32 20, metadata !26, null} -!26 = metadata !{i32 720907, metadata !5, i32 4, i32 18, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!26 = metadata !{i32 786443, metadata !6, metadata !5, i32 4, i32 18, i32 0} ; [ DW_TAG_lexical_block ] !27 = metadata !{i32 4, i32 30, metadata !26, null} -!28 = metadata !{i32 721153, metadata !20, metadata !"this", metadata !6, i32 16777218, metadata !15, i32 64, i32 0} ; [ DW_TAG_arg_variable ] +!28 = metadata !{i32 786689, metadata !20, metadata !"this", metadata !6, i32 16777218, metadata !15, i32 64, i32 0} ; [ DW_TAG_arg_variable ] !29 = metadata !{i32 2, i32 8, metadata !20, null} !30 = metadata !{i32 2, i32 15, metadata !31, null} -!31 = metadata !{i32 720907, metadata !20, i32 2, i32 14, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] +!31 = metadata !{i32 786443, metadata !6, metadata !20, i32 2, i32 14, i32 1} ; [ DW_TAG_lexical_block ] +!32 = metadata !{metadata !"/home/espindola/llvm/test.cc", metadata !"/home/espindola/tmpfs/build"} diff --git a/test/DebugInfo/X86/pr12831.ll b/test/DebugInfo/X86/pr12831.ll index abb946d51477..295c018c5e13 100644 --- a/test/DebugInfo/X86/pr12831.ll +++ b/test/DebugInfo/X86/pr12831.ll @@ -77,12 +77,10 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"BPLFunctionWriter.cpp", metadata !"/home/peter/crashdelta", metadata !"clang version 3.2 ", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !128} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !106, metadata !107, metadata !126, metadata !127} -!5 = metadata !{i32 786478, i32 0, null, metadata !"writeExpr", metadata !"writeExpr", metadata !"_ZN17BPLFunctionWriter9writeExprEv", metadata !6, i32 19, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.BPLFunctionWriter*)* @_ZN17BPLFunctionWriter9writeExprEv, null, metadata !103, metadata !1, i32 19} ; [ DW_TAG_subprogram ] +!0 = metadata !{i32 786449, i32 4, metadata !159, metadata !"clang version 3.2 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !128, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !106, metadata !107, metadata !126, metadata !127} +!5 = metadata !{i32 786478, metadata !"_ZN17BPLFunctionWriter9writeExprEv", i32 0, null, metadata !"writeExpr", metadata !"writeExpr", metadata !6, i32 19, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.BPLFunctionWriter*)* @_ZN17BPLFunctionWriter9writeExprEv, null, metadata !103, metadata !1, i32 19} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !"BPLFunctionWriter2.ii", metadata !"/home/peter/crashdelta", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null, metadata !9} @@ -93,32 +91,32 @@ entry: !13 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_pointer_type ] !14 = metadata !{i32 786434, null, metadata !"BPLModuleWriter", metadata !6, i32 12, i64 8, i64 8, i32 0, i32 0, null, metadata !15, i32 0, null, null} ; [ DW_TAG_class_type ] !15 = metadata !{metadata !16} -!16 = metadata !{i32 786478, i32 0, metadata !14, metadata !"writeIntrinsic", metadata !"writeIntrinsic", metadata !"_ZN15BPLModuleWriter14writeIntrinsicE8functionIFvvEE", metadata !6, i32 13, metadata !17, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !101, i32 13} ; [ DW_TAG_subprogram ] +!16 = metadata !{i32 786478, metadata !"_ZN15BPLModuleWriter14writeIntrinsicE8functionIFvvEE", i32 0, metadata !14, metadata !"writeIntrinsic", metadata !"writeIntrinsic", metadata !6, i32 13, metadata !17, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !101, i32 13} ; [ DW_TAG_subprogram ] !17 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !18, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !18 = metadata !{null, metadata !19, metadata !20} !19 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !14} ; [ DW_TAG_pointer_type ] !20 = metadata !{i32 786434, null, metadata !"function<void ()>", metadata !6, i32 6, i64 8, i64 8, i32 0, i32 0, null, metadata !21, i32 0, null, metadata !97} ; [ DW_TAG_class_type ] !21 = metadata !{metadata !22, metadata !51, metadata !58, metadata !86, metadata !92} -!22 = metadata !{i32 786478, i32 0, metadata !20, metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"", metadata !6, i32 8, metadata !23, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !47, i32 0, metadata !49, i32 8} ; [ DW_TAG_subprogram ] +!22 = metadata !{i32 786478, metadata !"", i32 0, metadata !20, metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !6, i32 8, metadata !23, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !47, i32 0, metadata !49, i32 8} ; [ DW_TAG_subprogram ] !23 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !24, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !24 = metadata !{null, metadata !25, metadata !26} !25 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !20} ; [ DW_TAG_pointer_type ] !26 = metadata !{i32 786434, metadata !5, metadata !"", metadata !6, i32 20, i64 8, i64 8, i32 0, i32 0, null, metadata !27, i32 0, null, null} ; [ DW_TAG_class_type ] !27 = metadata !{metadata !28, metadata !35, metadata !41} -!28 = metadata !{i32 786478, i32 0, metadata !26, metadata !"operator()", metadata !"operator()", metadata !"", metadata !6, i32 20, metadata !29, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !33, i32 20} ; [ DW_TAG_subprogram ] +!28 = metadata !{i32 786478, metadata !"", i32 0, metadata !26, metadata !"operator()", metadata !"operator()", metadata !6, i32 20, metadata !29, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !33, i32 20} ; [ DW_TAG_subprogram ] !29 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !30, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !30 = metadata !{null, metadata !31} !31 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !32} ; [ DW_TAG_pointer_type ] !32 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !26} ; [ DW_TAG_const_type ] !33 = metadata !{metadata !34} !34 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!35 = metadata !{i32 786478, i32 0, metadata !26, metadata !"~", metadata !"~", metadata !"", metadata !6, i32 20, metadata !36, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !39, i32 20} ; [ DW_TAG_subprogram ] +!35 = metadata !{i32 786478, metadata !"", i32 0, metadata !26, metadata !"~", metadata !"~", metadata !6, i32 20, metadata !36, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !39, i32 20} ; [ DW_TAG_subprogram ] !36 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !37, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !37 = metadata !{null, metadata !38} !38 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !26} ; [ DW_TAG_pointer_type ] !39 = metadata !{metadata !40} !40 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!41 = metadata !{i32 786478, i32 0, metadata !26, metadata !"", metadata !"", metadata !"", metadata !6, i32 20, metadata !42, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !45, i32 20} ; [ DW_TAG_subprogram ] +!41 = metadata !{i32 786478, metadata !"", i32 0, metadata !26, metadata !"", metadata !"", metadata !6, i32 20, metadata !42, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !45, i32 20} ; [ DW_TAG_subprogram ] !42 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !43, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !43 = metadata !{null, metadata !38, metadata !44} !44 = metadata !{i32 786498, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !26} ; [ DW_TAG_rvalue_reference_type ] @@ -128,32 +126,32 @@ entry: !48 = metadata !{i32 786479, null, metadata !"_Functor", metadata !26, null, i32 0, i32 0} ; [ DW_TAG_template_type_parameter ] !49 = metadata !{metadata !50} !50 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!51 = metadata !{i32 786478, i32 0, metadata !20, metadata !"function<function<void ()> >", metadata !"function<function<void ()> >", metadata !"", metadata !6, i32 8, metadata !52, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !54, i32 0, metadata !56, i32 8} ; [ DW_TAG_subprogram ] +!51 = metadata !{i32 786478, metadata !"", i32 0, metadata !20, metadata !"function<function<void ()> >", metadata !"function<function<void ()> >", metadata !6, i32 8, metadata !52, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !54, i32 0, metadata !56, i32 8} ; [ DW_TAG_subprogram ] !52 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !53, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !53 = metadata !{null, metadata !25, metadata !20} !54 = metadata !{metadata !55} !55 = metadata !{i32 786479, null, metadata !"_Functor", metadata !20, null, i32 0, i32 0} ; [ DW_TAG_template_type_parameter ] !56 = metadata !{metadata !57} !57 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!58 = metadata !{i32 786478, i32 0, metadata !20, metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"", metadata !6, i32 8, metadata !59, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !82, i32 0, metadata !84, i32 8} ; [ DW_TAG_subprogram ] +!58 = metadata !{i32 786478, metadata !"", i32 0, metadata !20, metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !6, i32 8, metadata !59, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !82, i32 0, metadata !84, i32 8} ; [ DW_TAG_subprogram ] !59 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !60, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !60 = metadata !{null, metadata !25, metadata !61} !61 = metadata !{i32 786434, metadata !5, metadata !"", metadata !6, i32 23, i64 8, i64 8, i32 0, i32 0, null, metadata !62, i32 0, null, null} ; [ DW_TAG_class_type ] !62 = metadata !{metadata !63, metadata !70, metadata !76} -!63 = metadata !{i32 786478, i32 0, metadata !61, metadata !"operator()", metadata !"operator()", metadata !"", metadata !6, i32 23, metadata !64, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !68, i32 23} ; [ DW_TAG_subprogram ] +!63 = metadata !{i32 786478, metadata !"", i32 0, metadata !61, metadata !"operator()", metadata !"operator()", metadata !6, i32 23, metadata !64, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !68, i32 23} ; [ DW_TAG_subprogram ] !64 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !65, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !65 = metadata !{null, metadata !66} !66 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !67} ; [ DW_TAG_pointer_type ] !67 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !61} ; [ DW_TAG_const_type ] !68 = metadata !{metadata !69} !69 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!70 = metadata !{i32 786478, i32 0, metadata !61, metadata !"~", metadata !"~", metadata !"", metadata !6, i32 23, metadata !71, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !74, i32 23} ; [ DW_TAG_subprogram ] +!70 = metadata !{i32 786478, metadata !"", i32 0, metadata !61, metadata !"~", metadata !"~", metadata !6, i32 23, metadata !71, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !74, i32 23} ; [ DW_TAG_subprogram ] !71 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !72, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !72 = metadata !{null, metadata !73} !73 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !61} ; [ DW_TAG_pointer_type ] !74 = metadata !{metadata !75} !75 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!76 = metadata !{i32 786478, i32 0, metadata !61, metadata !"", metadata !"", metadata !"", metadata !6, i32 23, metadata !77, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !80, i32 23} ; [ DW_TAG_subprogram ] +!76 = metadata !{i32 786478, metadata !"", i32 0, metadata !61, metadata !"", metadata !"", metadata !6, i32 23, metadata !77, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !80, i32 23} ; [ DW_TAG_subprogram ] !77 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !78, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !78 = metadata !{null, metadata !73, metadata !79} !79 = metadata !{i32 786498, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !61} ; [ DW_TAG_rvalue_reference_type ] @@ -163,13 +161,13 @@ entry: !83 = metadata !{i32 786479, null, metadata !"_Functor", metadata !61, null, i32 0, i32 0} ; [ DW_TAG_template_type_parameter ] !84 = metadata !{metadata !85} !85 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!86 = metadata !{i32 786478, i32 0, metadata !20, metadata !"function", metadata !"function", metadata !"", metadata !6, i32 6, metadata !87, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !90, i32 6} ; [ DW_TAG_subprogram ] +!86 = metadata !{i32 786478, metadata !"", i32 0, metadata !20, metadata !"function", metadata !"function", metadata !6, i32 6, metadata !87, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !90, i32 6} ; [ DW_TAG_subprogram ] !87 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !88, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !88 = metadata !{null, metadata !25, metadata !89} !89 = metadata !{i32 786498, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !20} ; [ DW_TAG_rvalue_reference_type ] !90 = metadata !{metadata !91} !91 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!92 = metadata !{i32 786478, i32 0, metadata !20, metadata !"~function", metadata !"~function", metadata !"", metadata !6, i32 6, metadata !93, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !95, i32 6} ; [ DW_TAG_subprogram ] +!92 = metadata !{i32 786478, metadata !"", i32 0, metadata !20, metadata !"~function", metadata !"~function", metadata !6, i32 6, metadata !93, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !95, i32 6} ; [ DW_TAG_subprogram ] !93 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !94, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !94 = metadata !{null, metadata !25} !95 = metadata !{metadata !96} @@ -180,20 +178,20 @@ entry: !100 = metadata !{null} !101 = metadata !{metadata !102} !102 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!103 = metadata !{i32 786478, i32 0, metadata !10, metadata !"writeExpr", metadata !"writeExpr", metadata !"_ZN17BPLFunctionWriter9writeExprEv", metadata !6, i32 17, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 257, i1 false, null, null, i32 0, metadata !104, i32 17} ; [ DW_TAG_subprogram ] +!103 = metadata !{i32 786478, metadata !"_ZN17BPLFunctionWriter9writeExprEv", i32 0, metadata !10, metadata !"writeExpr", metadata !"writeExpr", metadata !6, i32 17, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 257, i1 false, null, null, i32 0, metadata !104, i32 17} ; [ DW_TAG_subprogram ] !104 = metadata !{metadata !105} !105 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!106 = metadata !{i32 786478, i32 0, null, metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"_ZN8functionIFvvEEC2IZN17BPLFunctionWriter9writeExprEvE3$_1_0EET_", metadata !6, i32 8, metadata !59, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.function*)* @"_ZN8functionIFvvEEC2IZN17BPLFunctionWriter9writeExprEvE3$_1_0EET_", metadata !82, metadata !58, metadata !1, i32 8} ; [ DW_TAG_subprogram ] -!107 = metadata !{i32 786478, i32 0, null, metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_1_0EEvRKT_", metadata !6, i32 3, metadata !108, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.anon.0*)* @"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_1_0EEvRKT_", metadata !111, metadata !113, metadata !1, i32 3} ; [ DW_TAG_subprogram ] +!106 = metadata !{i32 786478, metadata !"_ZN8functionIFvvEEC2IZN17BPLFunctionWriter9writeExprEvE3$_1_0EET_", i32 0, null, metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !6, i32 8, metadata !59, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.function*)* @"_ZN8functionIFvvEEC2IZN17BPLFunctionWriter9writeExprEvE3$_1_0EET_", metadata !82, metadata !58, metadata !1, i32 8} ; [ DW_TAG_subprogram ] +!107 = metadata !{i32 786478, metadata !"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_1_0EEvRKT_", i32 0, null, metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !6, i32 3, metadata !108, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.anon.0*)* @"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_1_0EEvRKT_", metadata !111, metadata !113, metadata !1, i32 3} ; [ DW_TAG_subprogram ] !108 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !109, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !109 = metadata !{null, metadata !110} !110 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !61} ; [ DW_TAG_reference_type ] !111 = metadata !{metadata !112} !112 = metadata !{i32 786479, null, metadata !"_Tp", metadata !61, null, i32 0, i32 0} ; [ DW_TAG_template_type_parameter ] -!113 = metadata !{i32 786478, i32 0, metadata !114, metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_1_0EEvRKT_", metadata !6, i32 3, metadata !108, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !111, i32 0, metadata !124, i32 3} ; [ DW_TAG_subprogram ] +!113 = metadata !{i32 786478, metadata !"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_1_0EEvRKT_", i32 0, metadata !114, metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:23:36> >", metadata !6, i32 3, metadata !108, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !111, i32 0, metadata !124, i32 3} ; [ DW_TAG_subprogram ] !114 = metadata !{i32 786434, null, metadata !"_Base_manager", metadata !6, i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !115, i32 0, null, null} ; [ DW_TAG_class_type ] !115 = metadata !{metadata !116, metadata !113} -!116 = metadata !{i32 786478, i32 0, metadata !114, metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_0EEvRKT_", metadata !6, i32 3, metadata !117, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !120, i32 0, metadata !122, i32 3} ; [ DW_TAG_subprogram ] +!116 = metadata !{i32 786478, metadata !"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_0EEvRKT_", i32 0, metadata !114, metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !6, i32 3, metadata !117, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, metadata !120, i32 0, metadata !122, i32 3} ; [ DW_TAG_subprogram ] !117 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !118, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !118 = metadata !{null, metadata !119} !119 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !26} ; [ DW_TAG_reference_type ] @@ -203,10 +201,9 @@ entry: !123 = metadata !{i32 786468} ; [ DW_TAG_base_type ] !124 = metadata !{metadata !125} !125 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!126 = metadata !{i32 786478, i32 0, null, metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"_ZN8functionIFvvEEC2IZN17BPLFunctionWriter9writeExprEvE3$_0EET_", metadata !6, i32 8, metadata !23, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.function*)* @"_ZN8functionIFvvEEC2IZN17BPLFunctionWriter9writeExprEvE3$_0EET_", metadata !47, metadata !22, metadata !1, i32 8} ; [ DW_TAG_subprogram ] -!127 = metadata !{i32 786478, i32 0, null, metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_0EEvRKT_", metadata !6, i32 3, metadata !117, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.anon*)* @"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_0EEvRKT_", metadata !120, metadata !116, metadata !1, i32 3} ; [ DW_TAG_subprogram ] -!128 = metadata !{metadata !129} -!129 = metadata !{metadata !130} +!126 = metadata !{i32 786478, metadata !"_ZN8functionIFvvEEC2IZN17BPLFunctionWriter9writeExprEvE3$_0EET_", i32 0, null, metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !6, i32 8, metadata !23, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.function*)* @"_ZN8functionIFvvEEC2IZN17BPLFunctionWriter9writeExprEvE3$_0EET_", metadata !47, metadata !22, metadata !1, i32 8} ; [ DW_TAG_subprogram ] +!127 = metadata !{i32 786478, metadata !"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_0EEvRKT_", i32 0, null, metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !"_M_not_empty_function<BPLFunctionWriter::<lambda at BPLFunctionWriter2.ii:20:36> >", metadata !6, i32 3, metadata !117, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.anon*)* @"_ZN13_Base_manager21_M_not_empty_functionIZN17BPLFunctionWriter9writeExprEvE3$_0EEvRKT_", metadata !120, metadata !116, metadata !1, i32 3} ; [ DW_TAG_subprogram ] +!128 = metadata !{metadata !130} !130 = metadata !{i32 786484, i32 0, metadata !114, metadata !"__stored_locally", metadata !"__stored_locally", metadata !"__stored_locally", metadata !6, i32 2, metadata !131, i32 1, i32 1, i1 true} ; [ DW_TAG_variable ] !131 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !132} ; [ DW_TAG_const_type ] !132 = metadata !{i32 786468, null, metadata !"bool", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] @@ -236,3 +233,4 @@ entry: !156 = metadata !{i32 10, i32 13, metadata !155, null} !157 = metadata !{i32 4, i32 5, metadata !158, null} !158 = metadata !{i32 786443, metadata !127, i32 3, i32 105, metadata !6, i32 4} ; [ DW_TAG_lexical_block ] +!159 = metadata !{i32 786473, metadata !"BPLFunctionWriter.cpp", metadata !"/home/peter/crashdelta", null} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/pr13303.ll b/test/DebugInfo/X86/pr13303.ll new file mode 100644 index 000000000000..34956237ae0b --- /dev/null +++ b/test/DebugInfo/X86/pr13303.ll @@ -0,0 +1,26 @@ +; RUN: llc %s -o %t -filetype=obj -mtriple=x86_64-unknown-linux-gnu +; RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s +; PR13303 + +; Check that the prologue ends with is_stmt here. +; CHECK: 0x0000000000000000 {{.*}} is_stmt + +define i32 @main() nounwind uwtable { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + ret i32 0, !dbg !10 +} + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 12, metadata !6, metadata !"clang version 3.2 (trunk 160143)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/probinson/PR13303.c] [DW_LANG_C99] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [main] +!6 = metadata !{i32 786473, metadata !"PR13303.c", metadata !"/home/probinson", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 1, i32 14, metadata !11, null} +!11 = metadata !{i32 786443, metadata !6, metadata !5, i32 1, i32 12, i32 0} ; [ DW_TAG_lexical_block ] [/home/probinson/PR13303.c] diff --git a/test/DebugInfo/X86/pr9951.ll b/test/DebugInfo/X86/pr9951.ll index 7716cd7c6c1c..cb348e2c9adc 100644 --- a/test/DebugInfo/X86/pr9951.ll +++ b/test/DebugInfo/X86/pr9951.ll @@ -5,14 +5,15 @@ entry: ret i32 42 } -!llvm.dbg.sp = !{!0} +!llvm.dbg.cu = !{!2} +!6 = metadata !{metadata !0} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"f", metadata !"f", metadata !"", metadata !1, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 ()* @f, null, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build-rust2", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build-rust2", metadata !"clang version 3.0 ()", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, i32 0, metadata !1, metadata !"f", metadata !"f", metadata !"", metadata !1, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 ()* @f, null, null, null, i32 1} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build-rust2", metadata !2} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 0, i32 12, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build-rust2", metadata !"clang version 3.0 ()", i1 true, i1 false, metadata !"", i32 0, null, null, metadata !6, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, 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 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!5 = metadata !{i32 786468, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] ; CHECK: _f: ## @f diff --git a/test/DebugInfo/X86/prologue-stack.ll b/test/DebugInfo/X86/prologue-stack.ll index 929db5190267..6e4917747c14 100644 --- a/test/DebugInfo/X86/prologue-stack.ll +++ b/test/DebugInfo/X86/prologue-stack.ll @@ -20,16 +20,14 @@ declare i32 @callme(i32) !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"bar.c", metadata !"/usr/local/google/home/echristo/tmp", metadata !"clang version 3.2 (trunk 164980) (llvm/trunk 164979)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/bar.c] [DW_LANG_C99] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"isel_line_test2", metadata !"isel_line_test2", metadata !"", metadata !6, i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @isel_line_test2, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 4] [isel_line_test2] +!0 = metadata !{i32 786449, i32 12, metadata !6, metadata !"clang version 3.2 (trunk 164980) (llvm/trunk 164979)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/bar.c] [DW_LANG_C99] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"isel_line_test2", metadata !"isel_line_test2", metadata !"", metadata !6, i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @isel_line_test2, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 4] [isel_line_test2] !6 = metadata !{i32 786473, metadata !"bar.c", metadata !"/usr/local/google/home/echristo/tmp", null} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9} !9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] !10 = metadata !{i32 5, i32 3, metadata !11, null} -!11 = metadata !{i32 786443, metadata !5, i32 4, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/bar.c] +!11 = metadata !{i32 786443, metadata !6, metadata !5, i32 4, i32 1, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/bar.c] !12 = metadata !{i32 6, i32 3, metadata !11, null} diff --git a/test/DebugInfo/X86/rvalue-ref.ll b/test/DebugInfo/X86/rvalue-ref.ll index e73869dbe07a..ae2e3d4578c5 100644 --- a/test/DebugInfo/X86/rvalue-ref.ll +++ b/test/DebugInfo/X86/rvalue-ref.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -O0 -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: DW_TAG_rvalue_reference_type @@ -22,13 +22,11 @@ declare i32 @printf(i8*, ...) !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"foo.cpp", metadata !"/Users/echristo/tmp", metadata !"clang version 3.2 (trunk 157054) (llvm/trunk 157060)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooOi", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32*)* @_Z3fooOi, null, null, metadata !1, i32 5} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 786473, metadata !"foo.cpp", metadata !"/Users/echristo/tmp", null} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.2 (trunk 157054) (llvm/trunk 157060)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooOi", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32*)* @_Z3fooOi, null, null, metadata !1, i32 5} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !16} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{null, metadata !9} !9 = metadata !{i32 786498, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_rvalue_reference_type ] @@ -36,5 +34,6 @@ declare i32 @printf(i8*, ...) !11 = metadata !{i32 786689, metadata !5, metadata !"i", metadata !6, i32 16777220, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !12 = metadata !{i32 4, i32 17, metadata !5, null} !13 = metadata !{i32 6, i32 3, metadata !14, null} -!14 = metadata !{i32 786443, metadata !5, i32 5, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!14 = metadata !{i32 786443, metadata !6, metadata !5, i32 5, i32 1, i32 0} ; [ DW_TAG_lexical_block ] !15 = metadata !{i32 7, i32 1, metadata !14, null} +!16 = metadata !{metadata !"foo.cpp", metadata !"/Users/echristo/tmp"} diff --git a/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll b/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll new file mode 100644 index 000000000000..39a026c35494 --- /dev/null +++ b/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll @@ -0,0 +1,67 @@ +; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; rdar://13067005 +; CHECK: .debug_info contents: +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) + +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c) + +; CHECK: .debug_line contents: +; CHECK-NEXT: Line table prologue: +; CHECK-NEXT: total_length: 0x00000038 +; CHECK: file_names[ 1] 0 0x00000000 0x00000000 simple.c +; CHECK: Line table prologue: +; CHECK-NEXT: total_length: 0x00000039 +; CHECK: file_names[ 1] 0 0x00000000 0x00000000 simple2.c +; CHECK-NOT: file_names + +define i32 @test(i32 %a) nounwind uwtable ssp { +entry: + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !15), !dbg !16 + %0 = load i32* %a.addr, align 4, !dbg !17 + %call = call i32 @fn(i32 %0), !dbg !17 + ret i32 %call, !dbg !17 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +define i32 @fn(i32 %a) nounwind uwtable ssp { +entry: + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !19), !dbg !20 + %0 = load i32* %a.addr, align 4, !dbg !21 + ret i32 %0, !dbg !21 +} + +!llvm.dbg.cu = !{!0, !10} +!0 = metadata !{i32 786449, metadata !23, i32 12, metadata !"clang version 3.3", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !23, metadata !"test", metadata !"test", metadata !"", metadata !6, i32 2, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @test, null, null, metadata !1, i32 3} ; [ DW_TAG_subprogram ] [line 2] [def] [scope 3] [test] +!6 = metadata !{i32 786473, metadata !23} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !9} +!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786449, metadata !24, i32 12, metadata !"clang version 3.3 (trunk 172862)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !11, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!11 = metadata !{metadata !13} +!13 = metadata !{i32 786478, metadata !24, metadata !"fn", metadata !"fn", metadata !"", metadata !14, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @fn, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [fn] +!14 = metadata !{i32 786473, metadata !24} ; [ DW_TAG_file_type ] +!15 = metadata !{i32 786689, metadata !5, metadata !"a", metadata !6, i32 16777218, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a] [line 2] +!16 = metadata !{i32 2, i32 0, metadata !5, null} +!17 = metadata !{i32 4, i32 0, metadata !18, null} +!18 = metadata !{i32 786443, metadata !23, metadata !5, i32 3, i32 0, i32 0} ; [ DW_TAG_lexical_block ] +!19 = metadata !{i32 786689, metadata !13, metadata !"a", metadata !14, i32 16777217, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a] [line 1] +!20 = metadata !{i32 1, i32 0, metadata !13, null} +!21 = metadata !{i32 2, i32 0, metadata !22, null} +!22 = metadata !{i32 786443, metadata !24, metadata !13, i32 1, i32 0, i32 0} ; [ DW_TAG_lexical_block ] +!23 = metadata !{metadata !"simple.c", metadata !"/private/tmp"} +!24 = metadata !{metadata !"simple2.c", metadata !"/private/tmp"} diff --git a/test/DebugInfo/X86/stmt-list.ll b/test/DebugInfo/X86/stmt-list.ll index 145649bf4592..4c8521f5d805 100644 --- a/test/DebugInfo/X86/stmt-list.ll +++ b/test/DebugInfo/X86/stmt-list.ll @@ -10,10 +10,11 @@ entry: ret void } -!llvm.dbg.sp = !{!0} +!llvm.dbg.cu = !{!2} +!5 = metadata !{metadata !0} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"f", metadata !"f", metadata !"", metadata !1, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void ()* @f, null, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"test2.c", metadata !"/home/espindola/llvm", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"test2.c", metadata !"/home/espindola/llvm", metadata !"clang version 3.0 ()", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, i32 0, metadata !1, metadata !"f", metadata !"f", metadata !"", metadata !1, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void ()* @f, null, null, null, i32 1} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !"test2.c", metadata !"/home/espindola/llvm", metadata !2} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, i32 0, i32 12, metadata !"test2.c", metadata !"/home/espindola/llvm", metadata !"clang version 3.0 ()", i1 true, i1 true, metadata !"", i32 0, null, null, metadata !5, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !4 = metadata !{null} diff --git a/test/DebugInfo/X86/stringpool.ll b/test/DebugInfo/X86/stringpool.ll index caf12c2756e0..8df281d08ea6 100644 --- a/test/DebugInfo/X86/stringpool.ll +++ b/test/DebugInfo/X86/stringpool.ll @@ -5,17 +5,16 @@ !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"z.c", metadata !"/home/nicholas", metadata !"clang version 3.1 (trunk 143009)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 720948, i32 0, null, metadata !"yyyy", metadata !"yyyy", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, i32* @yyyy} ; [ DW_TAG_variable ] -!6 = metadata !{i32 720937, metadata !"z.c", metadata !"/home/nicholas", null} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!0 = metadata !{i32 786449, metadata !8, i32 12, metadata !"clang version 3.1 (trunk 143009)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 720948, i32 0, null, metadata !"yyyy", metadata !"yyyy", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, i32* @yyyy, null} ; [ DW_TAG_variable ] +!6 = metadata !{i32 720937, metadata !8} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!8 = metadata !{metadata !"z.c", metadata !"/home/nicholas"} ; Verify that we refer to 'yyyy' with a relocation. -; LINUX: .long .Lstring3 # DW_AT_name +; LINUX: .long .Linfo_string3 # DW_AT_name ; LINUX-NEXT: .long 38 # DW_AT_type ; LINUX-NEXT: # DW_AT_external ; LINUX-NEXT: .byte 1 # DW_AT_decl_file @@ -25,7 +24,7 @@ ; LINUX-NEXT: .quad yyyy ; Verify that we refer to 'yyyy' without a relocation. -; DARWIN: Lset5 = Lstring3-Lsection_str ## DW_AT_name +; DARWIN: Lset5 = Linfo_string3-Linfo_string ## DW_AT_name ; DARWIN-NEXT: .long Lset5 ; DARWIN-NEXT: .long 39 ## DW_AT_type ; DARWIN-NEXT: .byte 1 ## DW_AT_external diff --git a/test/DebugInfo/X86/struct-loc.ll b/test/DebugInfo/X86/struct-loc.ll index 9a047388207a..bdf104f07e39 100644 --- a/test/DebugInfo/X86/struct-loc.ll +++ b/test/DebugInfo/X86/struct-loc.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; Make sure that structures have a decl file and decl line attached. ; CHECK: DW_TAG_structure_type [3] @@ -13,14 +13,13 @@ !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"struct_bug.c", metadata !"/Users/echristo/tmp", metadata !"clang version 3.1 (trunk 152837) (llvm/trunk 152845)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786484, i32 0, null, metadata !"f", metadata !"f", metadata !"", metadata !6, i32 5, metadata !7, i32 0, i32 1, %struct.foo* @f} ; [ DW_TAG_variable ] -!6 = metadata !{i32 786473, metadata !"struct_bug.c", metadata !"/Users/echristo/tmp", null} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 786451, null, metadata !"foo", metadata !6, i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_structure_type ] +!0 = metadata !{i32 786449, i32 12, metadata !6, metadata !"clang version 3.1 (trunk 152837) (llvm/trunk 152845)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786484, i32 0, null, metadata !"f", metadata !"f", metadata !"", metadata !6, i32 5, metadata !7, i32 0, i32 1, %struct.foo* @f, null} ; [ DW_TAG_variable ] +!6 = metadata !{i32 786473, metadata !11} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786451, metadata !11, null, metadata !"foo", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_structure_type ] !8 = metadata !{metadata !9} -!9 = metadata !{i32 786445, metadata !7, metadata !"a", metadata !6, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] -!10 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786445, metadata !11, metadata !7, metadata !"a", i32 2, i64 32, i64 32, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ] +!10 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!11 = metadata !{metadata !"struct_bug.c", metadata !"/Users/echristo/tmp"} diff --git a/test/DebugInfo/X86/subrange-type.ll b/test/DebugInfo/X86/subrange-type.ll new file mode 100644 index 000000000000..efc5bf0417f1 --- /dev/null +++ b/test/DebugInfo/X86/subrange-type.ll @@ -0,0 +1,38 @@ +; RUN: llc -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s + +; Make sure that the base type from the subrange type has a name. +; CHECK: 0x0000006b: DW_TAG_base_type [6] +; CHECK-NEXT: DW_AT_name +; CHECK: DW_TAG_subrange_type [8] +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x006b => {0x0000006b}) + +define i32 @main() nounwind uwtable { +entry: + %retval = alloca i32, align 4 + %i = alloca [2 x i32], align 4 + store i32 0, i32* %retval + call void @llvm.dbg.declare(metadata !{[2 x i32]* %i}, metadata !10), !dbg !15 + ret i32 0, !dbg !16 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !17, i32 12, metadata !"clang version 3.3 (trunk 171472) (llvm/trunk 171487)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.c] [DW_LANG_C99] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 2, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !1, i32 3} ; [ DW_TAG_subprogram ] [line 2] [def] [scope 3] [main] +!6 = metadata !{i32 786473, metadata !17} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786688, metadata !11, metadata !"i", metadata !6, i32 4, metadata !12, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [i] [line 4] +!11 = metadata !{i32 786443, metadata !6, metadata !5, i32 3, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/foo.c] +!12 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 64, i64 32, i32 0, i32 0, metadata !9, metadata !13, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 64, align 32, offset 0] [from int] +!13 = metadata !{metadata !14} +!14 = metadata !{i32 786465, i64 0, i64 2} ; [ DW_TAG_subrange_type ] [0, 1] +!15 = metadata !{i32 4, i32 0, metadata !11, null} +!16 = metadata !{i32 6, i32 0, metadata !11, null} +!17 = metadata !{metadata !"foo.c", metadata !"/usr/local/google/home/echristo/tmp"} diff --git a/test/DebugInfo/X86/subreg.ll b/test/DebugInfo/X86/subreg.ll index 1c4456f4c5b4..027589b3d995 100644 --- a/test/DebugInfo/X86/subreg.ll +++ b/test/DebugInfo/X86/subreg.ll @@ -16,12 +16,15 @@ entry: declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone -!0 = metadata !{i32 590081, metadata !1, metadata !"zzz", metadata !2, i32 16777219, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"f", metadata !"f", metadata !"", metadata !2, i32 3, metadata !4, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i16 (i16)* @f, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/tmpfs/build", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589841, i32 0, i32 12, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/tmpfs/build", metadata !"clang version 3.0 ()", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 589845, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !5, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!llvm.dbg.cu = !{!3} +!9 = metadata !{metadata !1} + +!0 = metadata !{i32 786689, metadata !1, metadata !"zzz", metadata !2, i32 16777219, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"f", metadata !"f", metadata !"", metadata !2, i32 3, metadata !4, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i16 (i16)* @f, null, null, null, i32 3} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/tmpfs/build", metadata !3} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 12, metadata !2, metadata !"clang version 3.0 ()", i1 false, metadata !"", i32 0, null, null, metadata !9, null, metadata !""} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !5, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !5 = metadata !{null} -!6 = metadata !{i32 589860, metadata !3, metadata !"short", null, i32 0, i64 16, i64 16, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786468, metadata !3, metadata !"short", null, i32 0, i64 16, i64 16, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !7 = metadata !{i32 4, i32 22, metadata !8, null} -!8 = metadata !{i32 589835, metadata !1, i32 3, i32 19, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] +!8 = metadata !{i32 786443, metadata !2, metadata !1, i32 3, i32 19, i32 0} ; [ DW_TAG_lexical_block ] diff --git a/test/DebugInfo/X86/union-template.ll b/test/DebugInfo/X86/union-template.ll new file mode 100644 index 000000000000..0f5538e8b40e --- /dev/null +++ b/test/DebugInfo/X86/union-template.ll @@ -0,0 +1,58 @@ +; RUN: llc -O0 -mtriple=x86_64-linux-gnu %s -o %t -filetype=obj +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s + +; Verify that we've emitted template arguments for the union +; CHECK: DW_TAG_union_type +; CHECK-NEXT: "Value<float>" +; CHECK: DW_TAG_template_type_parameter +; CHECK: "T" + +%"union.PR15637::Value" = type { i32 } + +@_ZN7PR156371fE = global %"union.PR15637::Value" zeroinitializer, align 4 + +define void @_ZN7PR156371gEf(float %value) #0 { +entry: + %value.addr = alloca float, align 4 + %tempValue = alloca %"union.PR15637::Value", align 4 + store float %value, float* %value.addr, align 4 + call void @llvm.dbg.declare(metadata !{float* %value.addr}, metadata !23), !dbg !24 + call void @llvm.dbg.declare(metadata !{%"union.PR15637::Value"* %tempValue}, metadata !25), !dbg !26 + ret void, !dbg !27 +} + +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { nounwind } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.3 (trunk 178499) (llvm/trunk 178472)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !9, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"foo.cc", metadata !"/usr/local/google/home/echristo/tmp"} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"g", metadata !"g", metadata !"_ZN7PR156371gEf", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (float)* @_ZN7PR156371gEf, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [g] +!5 = metadata !{i32 786489, metadata !1, null, metadata !"PR15637", i32 1} ; [ DW_TAG_namespace ] [PR15637] [line 1] +!6 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] [float] [line 0, size 32, align 32, offset 0, enc DW_ATE_float] +!9 = metadata !{metadata !10} +!10 = metadata !{i32 786484, i32 0, metadata !5, metadata !"f", metadata !"f", metadata !"_ZN7PR156371fE", metadata !11, i32 6, metadata !12, i32 0, i32 1, %"union.PR15637::Value"* @_ZN7PR156371fE, null} ; [ DW_TAG_variable ] [f] [line 6] [def] +!11 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/foo.cc] +!12 = metadata !{i32 786455, metadata !1, metadata !5, metadata !"Value<float>", i32 2, i64 32, i64 32, i64 0, i32 0, null, metadata !13, i32 0, null, metadata !21} ; [ DW_TAG_union_type ] [Value<float>] [line 2, size 32, align 32, offset 0] [from ] +!13 = metadata !{metadata !14, metadata !16} +!14 = metadata !{i32 786445, metadata !1, metadata !12, metadata !"a", i32 2, i64 32, i64 32, i64 0, i32 0, metadata !15} ; [ DW_TAG_member ] [a] [line 2, size 32, align 32, offset 0] [from int] +!15 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!16 = metadata !{i32 786478, metadata !1, metadata !12, metadata !"Value", metadata !"Value", metadata !"", i32 2, metadata !17, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !20, i32 2} ; [ DW_TAG_subprogram ] [line 2] [Value] +!17 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !18, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!18 = metadata !{null, metadata !19} +!19 = metadata !{i32 786447, i32 0, i32 0, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !12} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from Value<float>] +!20 = metadata !{i32 786468} +!21 = metadata !{metadata !22} +!22 = metadata !{i32 786479, null, metadata !"T", metadata !8, null, i32 0, i32 0} ; [ DW_TAG_template_type_parameter ] +!23 = metadata !{i32 786689, metadata !4, metadata !"value", metadata !11, i32 16777219, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [value] [line 3] +!24 = metadata !{i32 3, i32 0, metadata !4, null} +!25 = metadata !{i32 786688, metadata !4, metadata !"tempValue", metadata !11, i32 4, metadata !12, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [tempValue] [line 4] +!26 = metadata !{i32 4, i32 0, metadata !4, null} +!27 = metadata !{i32 5, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/vector.ll b/test/DebugInfo/X86/vector.ll new file mode 100644 index 000000000000..570adf9e4329 --- /dev/null +++ b/test/DebugInfo/X86/vector.ll @@ -0,0 +1,28 @@ +; RUN: llc -mtriple=x86_64-linux-gnu -O0 -filetype=obj -o %t %s +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s + +; Generated from: +; clang -g -S -emit-llvm -o foo.ll foo.c +; typedef int v4si __attribute__((__vector_size__(16))); +; +; v4si a + +@a = common global <4 x i32> zeroinitializer, align 16 + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 12, metadata !6, metadata !"clang version 3.3 (trunk 171825) (llvm/trunk 171822)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/echristo/foo.c] [DW_LANG_C99] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 3, metadata !7, i32 0, i32 1, <4 x i32>* @a, null} ; [ DW_TAG_variable ] [a] [line 3] [def] +!6 = metadata !{i32 786473, metadata !12} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786454, metadata !12, null, metadata !"v4si", i32 1, i64 0, i64 0, i64 0, i32 0, metadata !8} ; [ DW_TAG_typedef ] [v4si] [line 1, size 0, align 0, offset 0] [from ] +!8 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 128, i64 128, i32 0, i32 2048, metadata !9, metadata !10, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 128, align 128, offset 0] [vector] [from int] +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{metadata !11} +!11 = metadata !{i32 786465, i64 0, i64 4} ; [ DW_TAG_subrange_type ] [0, 3] +!12 = metadata !{metadata !"foo.c", metadata !"/Users/echristo"} + +; Check that we get an array type with a vector attribute. +; CHECK: DW_TAG_array_type +; CHECK-NEXT: DW_AT_GNU_vector diff --git a/test/DebugInfo/array.ll b/test/DebugInfo/array.ll index 9f592a12a923..30771104912f 100644 --- a/test/DebugInfo/array.ll +++ b/test/DebugInfo/array.ll @@ -12,23 +12,25 @@ entry: declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone -!llvm.dbg.sp = !{!0} +!llvm.dbg.cu = !{!2} -!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @main, null} ; [ DW_TAG_subprogram ] -!1 = metadata !{i32 589865, metadata !"array.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, i32 0, i32 12, metadata !"array.c", metadata !"/private/tmp", metadata !"clang version 3.0 (trunk 129138)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786478, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, i32 ()* @main, null, null, null, i32 3} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 786473, metadata !14} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.0 (trunk 129138)", i1 false, metadata !"", i32 0, null, null, metadata !13, null, null} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 786453, metadata !1, metadata !"", metadata !1, 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 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 590080, metadata !7, metadata !"a", metadata !1, i32 4, metadata !8, i32 0} ; [ DW_TAG_auto_variable ] -!7 = metadata !{i32 589835, metadata !0, i32 3, i32 12, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] -!8 = metadata !{i32 589825, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 32, i32 0, i32 0, metadata !5, metadata !9, i32 0, i32 0} ; [ DW_TAG_array_type ] +!5 = metadata !{i32 786468, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786688, metadata !7, metadata !"a", metadata !1, i32 4, metadata !8, i32 0, null} ; [ DW_TAG_auto_variable ] +!7 = metadata !{i32 786443, metadata !1, metadata !0, i32 3, i32 12, i32 0} ; [ DW_TAG_lexical_block ] +!8 = metadata !{i32 786433, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 32, i32 0, i32 0, metadata !5, metadata !9, i32 0, i32 0} ; [ DW_TAG_array_type ] !9 = metadata !{metadata !10} ;CHECK: DW_TAG_subrange_type ;CHECK-NEXT: DW_AT_type ;CHECK-NOT: DW_AT_lower_bound ;CHECK-NOT: DW_AT_upper_bound ;CHECK-NEXT: End Of Children Mark -!10 = metadata !{i32 589857, i64 1, i64 0} ; [ DW_TAG_subrange_type ] +!10 = metadata !{i32 786465, i64 0, i64 -1} ; [ DW_TAG_subrange_type ] !11 = metadata !{i32 4, i32 7, metadata !7, null} !12 = metadata !{i32 5, i32 3, metadata !7, null} +!13 = metadata !{metadata !0} +!14 = metadata !{metadata !"array.c", metadata !"/private/tmp"} diff --git a/test/DebugInfo/debuglineinfo.test b/test/DebugInfo/debuglineinfo.test new file mode 100644 index 000000000000..14d2f82b04ac --- /dev/null +++ b/test/DebugInfo/debuglineinfo.test @@ -0,0 +1,49 @@ +RUN: llvm-rtdyld -printline %p/Inputs/test-inline.o \ +RUN: | FileCheck %s -check-prefix TEST_INLINE +RUN: llvm-rtdyld -printline %p/Inputs/test-parameters.o \ +RUN: | FileCheck %s -check-prefix TEST_PARAMETERS + +; This test verifies that relocations are correctly applied to the +; .debug_line section and exercises DIContext::getLineInfoForAddressRange(). +; If relocations are not applied the first two functions will be reported as +; both starting at address zero in the; line number table. +TEST_INLINE: Function: _Z15test_parametersPfPA2_dR11char_structPPitm, Size = 170 +TEST_INLINE-NEXT: Line info @ 0: test-inline.cpp, line:33 +TEST_INLINE-NEXT: Line info @ 35: test-inline.cpp, line:34 +TEST_INLINE-NEXT: Line info @ 165: test-inline.cpp, line:35 +TEST_INLINE-NEXT: Function: _Z3foov, Size = 3 +TEST_INLINE-NEXT: Line info @ 0: test-inline.cpp, line:28 +TEST_INLINE-NEXT: Line info @ 2: test-inline.cpp, line:29 +TEST_INLINE-NEXT: Line info @ 3: test-inline.cpp, line:29 +TEST_INLINE-NEXT: Function: main, Size = 146 +TEST_INLINE-NEXT: Line info @ 0: test-inline.cpp, line:39 +TEST_INLINE-NEXT: Line info @ 21: test-inline.cpp, line:41 +TEST_INLINE-NEXT: Line info @ 39: test-inline.cpp, line:42 +TEST_INLINE-NEXT: Line info @ 60: test-inline.cpp, line:44 +TEST_INLINE-NEXT: Line info @ 80: test-inline.cpp, line:48 +TEST_INLINE-NEXT: Line info @ 90: test-inline.cpp, line:45 +TEST_INLINE-NEXT: Line info @ 95: test-inline.cpp, line:46 +TEST_INLINE-NEXT: Line info @ 114: test-inline.cpp, line:48 +TEST_INLINE-NEXT: Line info @ 141: test-inline.cpp, line:49 +TEST_INLINE-NEXT: Line info @ 146: test-inline.cpp, line:49 + +; This test checks the case where all code is in a single section. +TEST_PARAMETERS: Function: _Z15test_parametersPfPA2_dR11char_structPPitm, Size = 170 +TEST_PARAMETERS-NEXT: Line info @ 0: test-parameters.cpp, line:33 +TEST_PARAMETERS-NEXT: Line info @ 35: test-parameters.cpp, line:34 +TEST_PARAMETERS-NEXT: Line info @ 165: test-parameters.cpp, line:35 +TEST_PARAMETERS-NEXT: Function: _Z3foov, Size = 3 +TEST_PARAMETERS-NEXT: Line info @ 0: test-parameters.cpp, line:28 +TEST_PARAMETERS-NEXT: Line info @ 2: test-parameters.cpp, line:29 +TEST_PARAMETERS-NEXT: Function: main, Size = 146 +TEST_PARAMETERS-NEXT: Line info @ 0: test-parameters.cpp, line:39 +TEST_PARAMETERS-NEXT: Line info @ 21: test-parameters.cpp, line:41 +TEST_PARAMETERS-NEXT: Line info @ 39: test-parameters.cpp, line:42 +TEST_PARAMETERS-NEXT: Line info @ 60: test-parameters.cpp, line:44 +TEST_PARAMETERS-NEXT: Line info @ 80: test-parameters.cpp, line:48 +TEST_PARAMETERS-NEXT: Line info @ 90: test-parameters.cpp, line:45 +TEST_PARAMETERS-NEXT: Line info @ 95: test-parameters.cpp, line:46 +TEST_PARAMETERS-NEXT: Line info @ 114: test-parameters.cpp, line:48 +TEST_PARAMETERS-NEXT: Line info @ 141: test-parameters.cpp, line:49 +TEST_PARAMETERS-NEXT: Line info @ 146: test-parameters.cpp, line:49 + diff --git a/test/DebugInfo/dwarf-public-names.ll b/test/DebugInfo/dwarf-public-names.ll new file mode 100644 index 000000000000..52b2397714e3 --- /dev/null +++ b/test/DebugInfo/dwarf-public-names.ll @@ -0,0 +1,125 @@ +; RUN: llc -generate-dwarf-pubnames -filetype=obj -o %t.o < %s +; RUN: llvm-dwarfdump -debug-dump=pubnames %t.o | FileCheck %s +; XFAIL: hexagon +; ModuleID = 'dwarf-public-names.cpp' +; +; Generated from: +; +; struct C { +; void member_function(); +; static int static_member_function(); +; static int static_member_variable; +; }; +; +; int C::static_member_variable = 0; +; +; void C::member_function() { +; static_member_variable = 0; +; } +; +; int C::static_member_function() { +; return static_member_variable; +; } +; +; C global_variable; +; +; int global_function() { +; return -1; +; } +; +; namespace ns { +; void global_namespace_function() { +; global_variable.member_function(); +; } +; int global_namespace_variable = 1; +; } + +; Skip the output to the header of the pubnames section. +; CHECK: debug_pubnames + +; Check for each name in the output. +; CHECK: global_namespace_variable +; CHECK: global_namespace_function +; CHECK: static_member_function +; CHECK: global_variable +; CHECK: global_function +; CHECK: member_function + +%struct.C = type { i8 } + +@_ZN1C22static_member_variableE = global i32 0, align 4 +@global_variable = global %struct.C zeroinitializer, align 1 +@_ZN2ns25global_namespace_variableE = global i32 1, align 4 + +define void @_ZN1C15member_functionEv(%struct.C* %this) nounwind uwtable align 2 { +entry: + %this.addr = alloca %struct.C*, align 8 + store %struct.C* %this, %struct.C** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !28), !dbg !30 + %this1 = load %struct.C** %this.addr + store i32 0, i32* @_ZN1C22static_member_variableE, align 4, !dbg !31 + ret void, !dbg !32 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +define i32 @_ZN1C22static_member_functionEv() nounwind uwtable align 2 { +entry: + %0 = load i32* @_ZN1C22static_member_variableE, align 4, !dbg !33 + ret i32 %0, !dbg !33 +} + +define i32 @_Z15global_functionv() nounwind uwtable { +entry: + ret i32 -1, !dbg !34 +} + +define void @_ZN2ns25global_namespace_functionEv() nounwind uwtable { +entry: + call void @_ZN1C15member_functionEv(%struct.C* @global_variable), !dbg !35 + ret void, !dbg !36 +} + +attributes #0 = { nounwind uwtable } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 4, metadata !4, metadata !"clang version 3.3 (http://llvm.org/git/clang.git a09cd8103a6a719cb2628cdf0c91682250a17bd2) (http://llvm.org/git/llvm.git 47d03cec0afca0c01ae42b82916d1d731716cd20)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !2, metadata !24, metadata !""} ; [ DW_TAG_compile_unit ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!2 = metadata !{metadata !3, metadata !18, metadata !19, metadata !20} +!3 = metadata !{i32 786478, metadata !4, null, metadata !"member_function", metadata !"member_function", metadata !"_ZN1C15member_functionEv", i32 9, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.C*)* @_ZN1C15member_functionEv, null, metadata !12, metadata !1, i32 9} ; [ DW_TAG_subprogram ] [line 9] [def] [member_function] +!4 = metadata !{i32 786473, metadata !37} ; [ DW_TAG_file_type ] +!5 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !6, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!6 = metadata !{null, metadata !7} +!7 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !8} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from C] +!8 = metadata !{i32 786451, metadata !37, null, metadata !"C", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !9, i32 0, null, null} ; [ DW_TAG_structure_type ] [C] [line 1, size 8, align 8, offset 0] [from ] +!9 = metadata !{metadata !10, metadata !12, metadata !14} +!10 = metadata !{i32 786445, metadata !37, metadata !8, metadata !"static_member_variable", i32 4, i64 0, i64 0, i64 0, i32 4096, metadata !11, null} ; [ DW_TAG_member ] [static_member_variable] [line 4, size 0, align 0, offset 0] [static] [from int] +!11 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!12 = metadata !{i32 786478, metadata !4, metadata !8, metadata !"member_function", metadata !"member_function", metadata !"_ZN1C15member_functionEv", i32 2, metadata !5, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !13, i32 2} ; [ DW_TAG_subprogram ] [line 2] [member_function] +!13 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] +!14 = metadata !{i32 786478, metadata !4, metadata !8, metadata !"static_member_function", metadata !"static_member_function", metadata !"_ZN1C22static_member_functionEv", i32 3, metadata !15, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !17, i32 3} ; [ DW_TAG_subprogram ] [line 3] [static_member_function] +!15 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !16, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!16 = metadata !{metadata !11} +!17 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] +!18 = metadata !{i32 786478, metadata !4, null, metadata !"static_member_function", metadata !"static_member_function", metadata !"_ZN1C22static_member_functionEv", i32 13, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_ZN1C22static_member_functionEv, null, metadata !14, metadata !1, i32 13} ; [ DW_TAG_subprogram ] [line 13] [def] [static_member_function] +!19 = metadata !{i32 786478, metadata !4, metadata !4, metadata !"global_function", metadata !"global_function", metadata !"_Z15global_functionv", i32 19, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z15global_functionv, null, null, metadata !1, i32 19} ; [ DW_TAG_subprogram ] [line 19] [def] [global_function] +!20 = metadata !{i32 786478, metadata !4, metadata !21, metadata !"global_namespace_function", metadata !"global_namespace_function", metadata !"_ZN2ns25global_namespace_functionEv", i32 24, metadata !22, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN2ns25global_namespace_functionEv, null, null, metadata !1, i32 24} ; [ DW_TAG_subprogram ] [line 24] [def] [global_namespace_function] +!21 = metadata !{i32 786489, null, metadata !"ns", metadata !4, i32 23} ; [ DW_TAG_namespace ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] +!22 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !23, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!23 = metadata !{null} +!24 = metadata !{metadata !25, metadata !26, metadata !27} +!25 = metadata !{i32 786484, i32 0, metadata !8, metadata !"static_member_variable", metadata !"static_member_variable", metadata !"_ZN1C22static_member_variableE", metadata !4, i32 7, metadata !11, i32 0, i32 1, i32* @_ZN1C22static_member_variableE, metadata !10} ; [ DW_TAG_variable ] [static_member_variable] [line 7] [def] +!26 = metadata !{i32 786484, i32 0, null, metadata !"global_variable", metadata !"global_variable", metadata !"", metadata !4, i32 17, metadata !8, i32 0, i32 1, %struct.C* @global_variable, null} ; [ DW_TAG_variable ] [global_variable] [line 17] [def] +!27 = metadata !{i32 786484, i32 0, metadata !21, metadata !"global_namespace_variable", metadata !"global_namespace_variable", metadata !"_ZN2ns25global_namespace_variableE", metadata !4, i32 27, metadata !11, i32 0, i32 1, i32* @_ZN2ns25global_namespace_variableE, null} ; [ DW_TAG_variable ] [global_namespace_variable] [line 27] [def] +!28 = metadata !{i32 786689, metadata !3, metadata !"this", metadata !4, i32 16777225, metadata !29, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 9] +!29 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from C] +!30 = metadata !{i32 9, i32 0, metadata !3, null} +!31 = metadata !{i32 10, i32 0, metadata !3, null} +!32 = metadata !{i32 11, i32 0, metadata !3, null} +!33 = metadata !{i32 14, i32 0, metadata !18, null} +!34 = metadata !{i32 20, i32 0, metadata !19, null} +!35 = metadata !{i32 25, i32 0, metadata !20, null} +!36 = metadata !{i32 26, i32 0, metadata !20, null} +!37 = metadata !{metadata !"dwarf-public-names.cpp", metadata !"/usr2/kparzysz/s.hex/t"} diff --git a/test/DebugInfo/dwarfdump-debug-frame-simple.test b/test/DebugInfo/dwarfdump-debug-frame-simple.test new file mode 100644 index 000000000000..c2427d840e45 --- /dev/null +++ b/test/DebugInfo/dwarfdump-debug-frame-simple.test @@ -0,0 +1,28 @@ +; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test-32bit.elf.o -debug-dump=frames | FileCheck %s -check-prefix FRAMES +; Note: the input file was generated from Inputs/dwarfdump-test-32bit.elf.c + +; FRAMES: .debug_frame +; FRAMES-NOT: .eh_frame + +; FRAMES: 00000000 00000010 ffffffff CIE +; FRAMES: Version: 1 +; FRAMES: DW_CFA_def_cfa +; FRAMES-NEXT: DW_CFA_offset +; FRAMES-NEXT: DW_CFA_nop +; FRAMES-NEXT: DW_CFA_nop + +; FRAMES: 00000014 00000010 00000000 FDE cie=00000000 pc=00000000...00000022 +; FRAMES: DW_CFA_advance_loc +; FRAMES-NEXT: DW_CFA_def_cfa_offset +; FRAMES-NEXT: DW_CFA_nop + +; FRAMES: 00000028 00000014 00000000 FDE cie=00000000 pc=00000030...00000080 +; FRAMES: DW_CFA_advance_loc +; FRAMES-NEXT: DW_CFA_def_cfa_offset +; FRAMES-NEXT: DW_CFA_offset +; FRAMES-NEXT: DW_CFA_advance_loc +; FRAMES-NEXT: DW_CFA_def_cfa_register + +; FRAMES-NOT: CIE +; FRAMES-NOT: FDE + diff --git a/test/DebugInfo/dwarfdump-dump-flags.test b/test/DebugInfo/dwarfdump-dump-flags.test new file mode 100644 index 000000000000..92b2d50f393b --- /dev/null +++ b/test/DebugInfo/dwarfdump-dump-flags.test @@ -0,0 +1,13 @@ +; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 -debug-dump=all | FileCheck %s -check-prefix DUMP_ALL +; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 -debug-dump=info | FileCheck %s -check-prefix DUMP_INFO +; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 -debug-dump=ranges | FileCheck %s -check-prefix DUMP_RANGES + +; DUMP_ALL: .debug_info +; DUMP_ALL: .debug_ranges + +; DUMP_INFO: .debug_info +; DUMP_INFO-NOT: .debug_ranges + +; DUMP_RANGES-NOT: .debug_info +; DUMP_RANGES: .debug_ranges + diff --git a/test/DebugInfo/dwarfdump-inlining.test b/test/DebugInfo/dwarfdump-inlining.test index d3a7e12a8703..e926634d52f6 100644 --- a/test/DebugInfo/dwarfdump-inlining.test +++ b/test/DebugInfo/dwarfdump-inlining.test @@ -1,28 +1,28 @@ -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x613 \ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x710 \ RUN: --inlining --functions | FileCheck %s -check-prefix DEEP_STACK -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x6de \ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x7d1 \ RUN: --inlining | FileCheck %s -check-prefix SHORTER_STACK -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x685 \ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x785 \ RUN: --inlining | FileCheck %s -check-prefix SHORT_STACK -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x640 \ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x737 \ RUN: --functions | FileCheck %s -check-prefix INL_FUNC_NAME DEEP_STACK: inlined_h -DEEP_STACK-NEXT: header.h:2:21 +DEEP_STACK-NEXT: dwarfdump-inl-test.h:2 DEEP_STACK-NEXT: inlined_g -DEEP_STACK-NEXT: header.h:7 +DEEP_STACK-NEXT: dwarfdump-inl-test.h:7 DEEP_STACK-NEXT: inlined_f -DEEP_STACK-NEXT: main.cc:3 +DEEP_STACK-NEXT: dwarfdump-inl-test.cc:3 DEEP_STACK-NEXT: main -DEEP_STACK-NEXT: main.cc:8 +DEEP_STACK-NEXT: dwarfdump-inl-test.cc:8 -SHORTER_STACK: header.h:7:20 -SHORTER_STACK-NEXT: main.cc:3 -SHORTER_STACK-NEXT: main.cc:8 +SHORTER_STACK: dwarfdump-inl-test.h:7 +SHORTER_STACK-NEXT: dwarfdump-inl-test.cc:3 +SHORTER_STACK-NEXT: dwarfdump-inl-test.cc:8 -SHORT_STACK: main.cc:3:20 -SHORT_STACK-NEXT: main.cc:8 +SHORT_STACK: dwarfdump-inl-test.cc:3 +SHORT_STACK-NEXT: dwarfdump-inl-test.cc:8 INL_FUNC_NAME: inlined_g -INL_FUNC_NAME-NEXT: header.h:7:20 +INL_FUNC_NAME-NEXT: dwarfdump-inl-test.h:7 diff --git a/test/DebugInfo/dwarfdump-pubnames.test b/test/DebugInfo/dwarfdump-pubnames.test new file mode 100644 index 000000000000..e1b16c2f2741 --- /dev/null +++ b/test/DebugInfo/dwarfdump-pubnames.test @@ -0,0 +1,16 @@ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-pubnames.elf-x86-64 \ +RUN: -debug-dump=pubnames | FileCheck %s + +CHECK: .debug_pubnames contents: +CHECK: Length: 161 +CHECK: Version: 2 +CHECK: Offset in .debug_info: 0 +CHECK: Size: 321 + +CHECK: Offset Name +CHECK: 98 global_namespace_variable +CHECK: a7 global_namespace_function +CHECK: ec static_member_function +CHECK: 7c global_variable +CHECK: 103 global_function +CHECK: c2 member_function diff --git a/test/DebugInfo/dwarfdump-test.test b/test/DebugInfo/dwarfdump-test.test index 973c3447e340..058d6a36981a 100644 --- a/test/DebugInfo/dwarfdump-test.test +++ b/test/DebugInfo/dwarfdump-test.test @@ -1,56 +1,56 @@ RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 \ -RUN: --address=0x400589 --functions | FileCheck %s -check-prefix MAIN +RUN: --address=0x400559 --functions | FileCheck %s -check-prefix MAIN RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 \ -RUN: --address=0x400558 --functions | FileCheck %s -check-prefix FUNCTION +RUN: --address=0x400528 --functions | FileCheck %s -check-prefix FUNCTION RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 \ -RUN: --address=0x4005b6 --functions | FileCheck %s -check-prefix CTOR_WITH_SPEC +RUN: --address=0x400586 --functions | FileCheck %s -check-prefix CTOR_WITH_SPEC RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test2.elf-x86-64 \ -RUN: --address=0x4004b8 --functions | FileCheck %s -check-prefix MANY_CU_1 +RUN: --address=0x4004e8 --functions | FileCheck %s -check-prefix MANY_CU_1 RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test2.elf-x86-64 \ -RUN: --address=0x4004c4 --functions | FileCheck %s -check-prefix MANY_CU_2 -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test3.elf-x86-64 \ -RUN: --address=0x580 --functions | FileCheck %s -check-prefix ABS_ORIGIN_1 -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test3.elf-x86-64 \ -RUN: --address=0x573 --functions | FileCheck %s -check-prefix INCLUDE_TEST_1 -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test3.elf-x86-64 \ -RUN: --address=0x56d --functions | FileCheck %s -check-prefix INCLUDE_TEST_2 +RUN: --address=0x4004f4 --functions | FileCheck %s -check-prefix MANY_CU_2 +RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \ +RUN: --address=0x640 --functions | FileCheck %s -check-prefix ABS_ORIGIN_1 +RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \ +RUN: --address=0x633 --functions | FileCheck %s -check-prefix INCLUDE_TEST_1 +RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \ +RUN: --address=0x62d --functions | FileCheck %s -check-prefix INCLUDE_TEST_2 RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test4.elf-x86-64 \ -RUN: --address=0x55c --functions \ +RUN: --address=0x62c --functions \ RUN: | FileCheck %s -check-prefix MANY_SEQ_IN_LINE_TABLE RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test4.elf-x86-64 \ RUN: | FileCheck %s -check-prefix DEBUG_RANGES MAIN: main -MAIN-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16:10 +MAIN-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16 FUNCTION: _Z1fii -FUNCTION-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:11:18 +FUNCTION-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:11 -CTOR_WITH_SPEC: _ZN10DummyClassC1Ei -CTOR_WITH_SPEC-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:4:30 +CTOR_WITH_SPEC: DummyClass +CTOR_WITH_SPEC-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:4 MANY_CU_1: a -MANY_CU_1-NEXT: /tmp/dbginfo{{[/\\]}}a.cc:2:0 +MANY_CU_1-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test2-helper.cc:2 MANY_CU_2: main -MANY_CU_2-NEXT: /tmp/dbginfo{{[/\\]}}main.cc:4:0 +MANY_CU_2-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test2-main.cc:4 ABS_ORIGIN_1: C -ABS_ORIGIN_1-NEXT: /tmp/dbginfo{{[/\\]}}def2.cc:4:0 +ABS_ORIGIN_1-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test3.cc:3 -INCLUDE_TEST_1: _Z3do2v -INCLUDE_TEST_1-NEXT: /tmp/dbginfo{{[/\\]}}include{{[/\\]}}decl2.h:1:0 +INCLUDE_TEST_1: _Z3do1v +INCLUDE_TEST_1-NEXT: /tmp/include{{[/\\]}}dwarfdump-test3-decl.h:7 -INCLUDE_TEST_2: _Z3do1v -INCLUDE_TEST_2-NEXT: /tmp/include{{[/\\]}}decl.h:5:0 +INCLUDE_TEST_2: _Z3do2v +INCLUDE_TEST_2-NEXT: /tmp/dbginfo{{[/\\]}}include{{[/\\]}}dwarfdump-test3-decl2.h:1 MANY_SEQ_IN_LINE_TABLE: _Z1cv -MANY_SEQ_IN_LINE_TABLE-NEXT: /tmp/dbginfo/sequences{{[/\\]}}c.cc:2:0 +MANY_SEQ_IN_LINE_TABLE-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test4-part1.cc:2 DEBUG_RANGES: .debug_ranges contents: -DEBUG_RANGES-NEXT: 00000000 000000000000055c 0000000000000567 -DEBUG_RANGES-NEXT: 00000000 0000000000000567 000000000000056d +DEBUG_RANGES-NEXT: 00000000 000000000000062c 0000000000000637 +DEBUG_RANGES-NEXT: 00000000 0000000000000637 000000000000063d DEBUG_RANGES-NEXT: 00000000 <End of list> -DEBUG_RANGES-NEXT: 00000030 0000000000000570 000000000000057b -DEBUG_RANGES-NEXT: 00000030 0000000000000567 000000000000056d +DEBUG_RANGES-NEXT: 00000030 0000000000000640 000000000000064b +DEBUG_RANGES-NEXT: 00000030 0000000000000637 000000000000063d DEBUG_RANGES-NEXT: 00000030 <End of list> diff --git a/test/DebugInfo/inlined-vars.ll b/test/DebugInfo/inlined-vars.ll index ed4e7da029e5..f302294031c0 100644 --- a/test/DebugInfo/inlined-vars.ll +++ b/test/DebugInfo/inlined-vars.ll @@ -4,8 +4,8 @@ define i32 @main() uwtable { entry: - tail call void @llvm.dbg.value(metadata !2, i64 0, metadata !18), !dbg !21 - tail call void @llvm.dbg.value(metadata !2, i64 0, metadata !22), !dbg !23 + tail call void @llvm.dbg.value(metadata !1, i64 0, metadata !18), !dbg !21 + tail call void @llvm.dbg.value(metadata !1, i64 0, metadata !22), !dbg !23 tail call void @smth(i32 0), !dbg !24 tail call void @smth(i32 0), !dbg !25 ret i32 0, !dbg !19 @@ -17,18 +17,16 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"inline-bug.cc", metadata !"/tmp/dbginfo/pr13202", metadata !"clang version 3.2 (trunk 159419)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !10} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 10, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !1, i32 10} ; [ DW_TAG_subprogram ] -!6 = metadata !{i32 786473, metadata !"inline-bug.cc", metadata !"/tmp/dbginfo/pr13202", null} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.2 (trunk 159419)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !10} +!5 = metadata !{i32 786478, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 10, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !1, i32 10} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !26} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !8 = metadata !{metadata !9} -!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!10 = metadata !{i32 786478, i32 0, metadata !6, metadata !"f", metadata !"f", metadata !"_ZL1fi", metadata !6, i32 3, metadata !11, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, null, null, null, metadata !13, i32 3} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!10 = metadata !{i32 786478, metadata !6, metadata !"f", metadata !"f", metadata !"_ZL1fi", metadata !6, i32 3, metadata !11, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, null, null, null, metadata !13, i32 3} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 786453, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !12 = metadata !{metadata !9, metadata !9} !13 = metadata !{metadata !14} !14 = metadata !{metadata !15, metadata !16} @@ -39,19 +37,18 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone ; ARGUMENT: {{.*Abbrev.*DW_TAG_formal_parameter}} ; ARGUMENT-NOT: {{.*Abbrev.*DW_TAG_formal_parameter}} -!16 = metadata !{i32 786688, metadata !17, metadata !"local", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] +!16 = metadata !{i32 786688, metadata !10, metadata !"local", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] ; Two DW_TAG_variable: one abstract and one inlined. ; VARIABLE: {{.*Abbrev.*DW_TAG_variable}} ; VARIABLE: {{.*Abbrev.*DW_TAG_variable}} ; VARIABLE-NOT: {{.*Abbrev.*DW_TAG_variable}} -!17 = metadata !{i32 786443, metadata !10, i32 3, i32 35, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] !18 = metadata !{i32 786689, metadata !10, metadata !"argument", metadata !6, i32 16777219, metadata !9, i32 0, metadata !19} ; [ DW_TAG_arg_variable ] -!19 = metadata !{i32 11, i32 10, metadata !20, null} -!20 = metadata !{i32 786443, metadata !5, i32 10, i32 12, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!19 = metadata !{i32 11, i32 10, metadata !5, null} !21 = metadata !{i32 3, i32 25, metadata !10, metadata !19} -!22 = metadata !{i32 786688, metadata !17, metadata !"local", metadata !6, i32 4, metadata !9, i32 0, metadata !19} ; [ DW_TAG_auto_variable ] -!23 = metadata !{i32 4, i32 16, metadata !17, metadata !19} -!24 = metadata !{i32 5, i32 3, metadata !17, metadata !19} -!25 = metadata !{i32 6, i32 3, metadata !17, metadata !19} +!22 = metadata !{i32 786688, metadata !10, metadata !"local", metadata !6, i32 4, metadata !9, i32 0, metadata !19} ; [ DW_TAG_auto_variable ] +!23 = metadata !{i32 4, i32 16, metadata !10, metadata !19} +!24 = metadata !{i32 5, i32 3, metadata !10, metadata !19} +!25 = metadata !{i32 6, i32 3, metadata !10, metadata !19} +!26 = metadata !{metadata !"inline-bug.cc", metadata !"/tmp/dbginfo/pr13202"} diff --git a/test/DebugInfo/llvm-symbolizer.test b/test/DebugInfo/llvm-symbolizer.test new file mode 100644 index 000000000000..842a5e603eb4 --- /dev/null +++ b/test/DebugInfo/llvm-symbolizer.test @@ -0,0 +1,25 @@ +RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400559" > %t.input +RUN: echo "%p/Inputs/dwarfdump-test4.elf-x86-64 0x62c" >> %t.input +RUN: echo "%p/Inputs/dwarfdump-inl-test.elf-x86-64 0x710" >> %t.input +RUN: echo '"%p/Inputs/dwarfdump-test3.elf-x86-64 space" 0x633' >> %t.input + +RUN: llvm-symbolizer --functions --inlining --demangle=false < %t.input \ +RUN: | FileCheck %s + +REQUIRES: shell + +CHECK: main +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16 +CHECK: _Z1cv +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test4-part1.cc:2 +CHECK: inlined_h +CHECK-NEXT: dwarfdump-inl-test.h:2 +CHECK-NEXT: inlined_g +CHECK-NEXT: dwarfdump-inl-test.h:7 +CHECK-NEXT: inlined_f +CHECK-NEXT: dwarfdump-inl-test.cc:3 +CHECK-NEXT: main +CHECK-NEXT: dwarfdump-inl-test.cc: + +CHECK: _Z3do1v +CHECK-NEXT: dwarfdump-test3-decl.h:7 diff --git a/test/DebugInfo/member-pointers.ll b/test/DebugInfo/member-pointers.ll new file mode 100644 index 000000000000..4b77189563fe --- /dev/null +++ b/test/DebugInfo/member-pointers.ll @@ -0,0 +1,36 @@ +; RUN: llc -filetype=obj -O0 < %s > %t +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; CHECK: DW_TAG_ptr_to_member_type +; CHECK: [[TYPE:.*]]: DW_TAG_subroutine_type +; CHECK: DW_TAG_formal_parameter +; CHECK-NEXT: DW_AT_type +; CHECK-NEXT: DW_AT_artificial [DW_FORM_flag_present] +; CHECK: DW_TAG_ptr_to_member_type +; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + {{.*}} => {[[TYPE]]}) +; IR generated from clang -g with the following source: +; XFAIL: hexagon +; struct S { +; }; +; +; int S::*x = 0; +; void (S::*y)(int) = 0; + +@x = global i64 -1, align 8 +@y = global { i64, i64 } zeroinitializer, align 8 + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/home/blaikie/Development/scratch/simple.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !10} +!5 = metadata !{i32 786484, i32 0, null, metadata !"x", metadata !"x", metadata !"", metadata !6, i32 4, metadata !7, i32 0, i32 1, i64* @x, null} ; [ DW_TAG_variable ] [x] [line 4] [def] +!6 = metadata !{i32 786473, metadata !15} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786463, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !8, metadata !9} ; [ DW_TAG_ptr_to_member_type ] [line 0, size 0, align 0, offset 0] [from int] +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786451, metadata !15, null, metadata !"S", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !1, i32 0, null, null} ; [ DW_TAG_structure_type ] [S] [line 1, size 8, align 8, offset 0] [from ] +!10 = metadata !{i32 786484, i32 0, null, metadata !"y", metadata !"y", metadata !"", metadata !6, i32 5, metadata !11, i32 0, i32 1, { i64, i64 }* @y, null} ; [ DW_TAG_variable ] [y] [line 5] [def] +!11 = metadata !{i32 786463, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !12, metadata !9} ; [ DW_TAG_ptr_to_member_type ] [line 0, size 0, align 0, offset 0] [from ] +!12 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !13, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!13 = metadata !{null, metadata !14, metadata !8} +!14 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from S] +!15 = metadata !{metadata !"simple.cpp", metadata !"/home/blaikie/Development/scratch"} diff --git a/test/DebugInfo/namespace.ll b/test/DebugInfo/namespace.ll new file mode 100644 index 000000000000..8d59b523028a --- /dev/null +++ b/test/DebugInfo/namespace.ll @@ -0,0 +1,42 @@ +; RUN: llc -O0 -filetype=obj < %s > %t +; RUN: llvm-dwarfdump %t | FileCheck %s +; CHECK: debug_info contents +; CHECK: DW_TAG_namespace +; CHECK-NEXT: DW_AT_name{{.*}} = "A" +; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F1:[0-9]]]) +; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x03) +; CHECK-NOT: NULL +; CHECK: DW_TAG_namespace +; CHECK-NEXT: DW_AT_name{{.*}} = "B" +; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2:[0-9]]]) +; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x01) +; CHECK-NOT: NULL +; CHECK: DW_TAG_variable +; CHECK-NEXT: DW_AT_name{{.*}}= "i" +; CHECK: file_names[ [[F1]]]{{.*}}debug-info-namespace.cpp +; CHECK: file_names[ [[F2]]]{{.*}}foo.cpp + +; IR generated from clang/test/CodeGenCXX/debug-info-namespace.cpp, file paths +; changed to protect the guilty. The C++ source code is simply: +; namespace A { +; #line 1 "foo.cpp" +; namespace B { +; int i; +; } +; } + +@_ZN1A1B1iE = global i32 0, align 4 + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, metadata !2, i32 4, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !3, metadata !3, metadata !3, metadata !4, metadata !""} ; [ DW_TAG_compile_unit ] [/home/foo/debug-info-namespace.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 786473, metadata !2} ; [ DW_TAG_file_type ] [/home/foo/debug-info-namespace.cpp] +!2 = metadata !{metadata !"debug-info-namespace.cpp", metadata !"/home/foo"} +!3 = metadata !{i32 0} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786484, i32 0, metadata !6, metadata !"i", metadata !"i", metadata !"_ZN1A1B1iE", metadata !7, i32 2, metadata !10, i32 0, i32 1, i32* @_ZN1A1B1iE, null} ; [ DW_TAG_variable ] [i] [line 2] [def] +!6 = metadata !{i32 786489, metadata !8, metadata !9, metadata !"B", i32 1} ; [ DW_TAG_namespace ] [B] [line 1] +!7 = metadata !{i32 786473, metadata !8} ; [ DW_TAG_file_type ] [/home/foo/foo.cpp] +!8 = metadata !{metadata !"foo.cpp", metadata !"/home/foo"} +!9 = metadata !{i32 786489, metadata !2, null, metadata !"A", i32 3} ; [ DW_TAG_namespace ] [A] [line 3] +!10 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] diff --git a/test/DebugInfo/printdbginfo2.ll b/test/DebugInfo/printdbginfo2.ll deleted file mode 100644 index 396ae852266a..000000000000 --- a/test/DebugInfo/printdbginfo2.ll +++ /dev/null @@ -1,66 +0,0 @@ -; RUN: opt < %s -print-dbginfo -disable-output 2>&1 | FileCheck %s -; grep {%b is variable b of type x declared at x.c:7} %t1 -; grep {%2 is variable b of type x declared at x.c:7} %t1 -; grep {@c.1442 is variable c of type int declared at x.c:4} %t1 - -%struct.foo = type { i32 } - -@main.c = internal global i32 5 ; <i32*> [#uses=1] - -define i32 @main() nounwind { -entry: - %retval = alloca i32 ; <i32*> [#uses=3] - %b = alloca %struct.foo, align 4 ; <%struct.foo*> [#uses=2] -; CHECK:; %b is variable b of type foo declared at x.c:7 - %a = alloca [4 x i32], align 4 ; <[4 x i32]*> [#uses=1] -; CHECK:; %a is variable a of type declared at x.c:8 - call void @llvm.dbg.func.start(metadata !3) - store i32 0, i32* %retval - call void @llvm.dbg.stoppoint(i32 6, i32 3, metadata !1) - call void @llvm.dbg.stoppoint(i32 7, i32 3, metadata !1) - %0 = bitcast %struct.foo* %b to { }* ; <{ }*> [#uses=1] - call void @llvm.dbg.declare(metadata !{%struct.foo* %b}, metadata !4) -; CHECK:; %0 is variable b of type foo declared at x.c:7 - call void @llvm.dbg.stoppoint(i32 8, i32 3, metadata !1) - %1 = bitcast [4 x i32]* %a to { }* ; <{ }*> [#uses=1] - call void @llvm.dbg.declare(metadata !{[4 x i32]* %a}, metadata !8) -; CHECK:; %1 is variable a of type declared at x.c:8 - call void @llvm.dbg.stoppoint(i32 9, i32 3, metadata !1) - %tmp = getelementptr inbounds %struct.foo* %b, i32 0, i32 0 ; <i32*> [#uses=1] -; CHECK:; %tmp is variable b of type foo declared at x.c:7 - store i32 5, i32* %tmp - call void @llvm.dbg.stoppoint(i32 10, i32 3, metadata !1) - %tmp1 = load i32* @main.c ; <i32> [#uses=1] -; CHECK:; @main.c is variable c of type int declared at x.c:6 - store i32 %tmp1, i32* %retval - br label %2 - -; <label>:2 ; preds = %entry - call void @llvm.dbg.stoppoint(i32 11, i32 1, metadata !1) - call void @llvm.dbg.region.end(metadata !3) - %3 = load i32* %retval ; <i32> [#uses=1] - ret i32 %3 -} - -declare void @llvm.dbg.func.start(metadata) nounwind readnone - -declare void @llvm.dbg.stoppoint(i32, i32, metadata) nounwind readnone - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare void @llvm.dbg.region.end(metadata) nounwind readnone - -!llvm.dbg.gv = !{!0} - -!0 = metadata !{i32 458804, i32 0, metadata !1, metadata !"c", metadata !"c", metadata !"", metadata !1, i32 6, metadata !2, i1 true, i1 true, i32* @main.c} -!1 = metadata !{i32 458769, i32 0, i32 12, metadata !"x.c", metadata !"/home/edwin/llvm-git/llvm/test/DebugInfo", metadata !"clang 1.0", i1 true, i1 false, metadata !"", i32 0} -!2 = metadata !{i32 458788, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} -!3 = metadata !{i32 458798, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 5, metadata !2, i1 false, i1 true} -!4 = metadata !{i32 459008, metadata !3, metadata !"b", metadata !1, i32 7, metadata !5} -!5 = metadata !{i32 458771, metadata !1, metadata !"foo", metadata !1, i32 1, i64 32, i64 32, i64 0, i32 0, null, metadata !6, i32 0} -!6 = metadata !{metadata !7} -!7 = metadata !{i32 458765, metadata !1, metadata !"a", metadata !1, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !2} -!8 = metadata !{i32 459008, metadata !3, metadata !"a", metadata !1, i32 8, metadata !9} -!9 = metadata !{i32 458753, metadata !1, metadata !"", null, i32 0, i64 128, i64 32, i64 0, i32 0, metadata !2, metadata !10, i32 0} -!10 = metadata !{metadata !11} -!11 = metadata !{i32 458785, i64 0, i64 3} diff --git a/test/DebugInfo/two-cus-from-same-file.ll b/test/DebugInfo/two-cus-from-same-file.ll new file mode 100644 index 000000000000..58671d59f748 --- /dev/null +++ b/test/DebugInfo/two-cus-from-same-file.ll @@ -0,0 +1,71 @@ +; For http://llvm.org/bugs/show_bug.cgi?id=12942 +; There are two CUs coming from /tmp/foo.c in this module. Make sure it doesn't +; blow llc up and produces something reasonable. +; + +; RUN: llc %s -o %t -filetype=obj -O0 +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s + +; XFAIL: hexagon +; ModuleID = 'test.bc' + +@str = private unnamed_addr constant [4 x i8] c"FOO\00" +@str1 = private unnamed_addr constant [6 x i8] c"Main!\00" + +define void @foo() nounwind { +entry: + %puts = tail call i32 @puts(i8* getelementptr inbounds ([4 x i8]* @str, i32 0, i32 0)), !dbg !23 + ret void, !dbg !25 +} + +declare i32 @puts(i8* nocapture) nounwind + +define i32 @main(i32 %argc, i8** nocapture %argv) nounwind { +entry: + tail call void @llvm.dbg.value(metadata !{i32 %argc}, i64 0, metadata !21), !dbg !26 + tail call void @llvm.dbg.value(metadata !{i8** %argv}, i64 0, metadata !22), !dbg !27 + %puts = tail call i32 @puts(i8* getelementptr inbounds ([6 x i8]* @str1, i32 0, i32 0)), !dbg !28 + tail call void @foo() nounwind, !dbg !30 + ret i32 0, !dbg !31 +} + +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone + +!llvm.dbg.cu = !{!0, !9} + +!0 = metadata !{i32 786449, metadata !32, i32 12, metadata !"clang version 3.2 (trunk 156513)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"foo", metadata !"foo", metadata !"", metadata !6, i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @foo, null, null, metadata !1, i32 5} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !32} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!8 = metadata !{null} +!9 = metadata !{i32 786449, metadata !32, i32 12, metadata !"clang version 3.2 (trunk 156513)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !10, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!10 = metadata !{metadata !12} +!12 = metadata !{i32 786478, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 11, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i8**)* @main, null, null, metadata !19, i32 11} ; [ DW_TAG_subprogram ] +!13 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!14 = metadata !{metadata !15, metadata !15, metadata !16} +!15 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!16 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !17} ; [ DW_TAG_pointer_type ] +!17 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !18} ; [ DW_TAG_pointer_type ] +!18 = metadata !{i32 786468, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!19 = metadata !{metadata !20} +!20 = metadata !{metadata !21, metadata !22} +!21 = metadata !{i32 786689, metadata !12, metadata !"argc", metadata !6, i32 16777227, metadata !15, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!22 = metadata !{i32 786689, metadata !12, metadata !"argv", metadata !6, i32 33554443, metadata !16, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!23 = metadata !{i32 6, i32 3, metadata !24, null} +!24 = metadata !{i32 786443, metadata !5, i32 5, i32 16, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!25 = metadata !{i32 7, i32 1, metadata !24, null} +!26 = metadata !{i32 11, i32 14, metadata !12, null} +!27 = metadata !{i32 11, i32 26, metadata !12, null} +!28 = metadata !{i32 12, i32 3, metadata !29, null} +!29 = metadata !{i32 786443, metadata !12, i32 11, i32 34, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!30 = metadata !{i32 13, i32 3, metadata !29, null} +!31 = metadata !{i32 14, i32 3, metadata !29, null} +!32 = metadata !{metadata !"foo.c", metadata !"/tmp"} + +; This test is simple to be cross platform (many targets don't yet have +; sufficiently good DWARF emission and/or dumping) +; CHECK: {{DW_TAG_compile_unit}} +; CHECK: {{foo\.c}} + diff --git a/test/ExecutionEngine/MCJIT/2002-12-16-ArgTest.ll b/test/ExecutionEngine/MCJIT/2002-12-16-ArgTest.ll index 28cc54a86806..babd8f6a7803 100644 --- a/test/ExecutionEngine/MCJIT/2002-12-16-ArgTest.ll +++ b/test/ExecutionEngine/MCJIT/2002-12-16-ArgTest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null @.LC0 = internal global [10 x i8] c"argc: %d\0A\00" ; <[10 x i8]*> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/2003-01-04-ArgumentBug.ll b/test/ExecutionEngine/MCJIT/2003-01-04-ArgumentBug.ll index 9f895983fdb1..bbb81b88b16a 100644 --- a/test/ExecutionEngine/MCJIT/2003-01-04-ArgumentBug.ll +++ b/test/ExecutionEngine/MCJIT/2003-01-04-ArgumentBug.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @foo(i32 %X, i32 %Y, double %A) { %cond212 = fcmp une double %A, 1.000000e+00 ; <i1> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/2003-01-04-LoopTest.ll b/test/ExecutionEngine/MCJIT/2003-01-04-LoopTest.ll index 997b2a9037ee..7574267bdcdc 100644 --- a/test/ExecutionEngine/MCJIT/2003-01-04-LoopTest.ll +++ b/test/ExecutionEngine/MCJIT/2003-01-04-LoopTest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { call i32 @mylog( i32 4 ) ; <i32>:1 [#uses=0] diff --git a/test/ExecutionEngine/MCJIT/2003-01-04-PhiTest.ll b/test/ExecutionEngine/MCJIT/2003-01-04-PhiTest.ll index ba35b5bcc436..261939ad2028 100644 --- a/test/ExecutionEngine/MCJIT/2003-01-04-PhiTest.ll +++ b/test/ExecutionEngine/MCJIT/2003-01-04-PhiTest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { ; <label>:0 diff --git a/test/ExecutionEngine/MCJIT/2003-01-09-SARTest.ll b/test/ExecutionEngine/MCJIT/2003-01-09-SARTest.ll index f3c88adf8435..f76f99832825 100644 --- a/test/ExecutionEngine/MCJIT/2003-01-09-SARTest.ll +++ b/test/ExecutionEngine/MCJIT/2003-01-09-SARTest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; We were accidentally inverting the signedness of right shifts. Whoops. diff --git a/test/ExecutionEngine/MCJIT/2003-01-10-FUCOM.ll b/test/ExecutionEngine/MCJIT/2003-01-10-FUCOM.ll index f925e79f2484..2b83bb9e43e8 100644 --- a/test/ExecutionEngine/MCJIT/2003-01-10-FUCOM.ll +++ b/test/ExecutionEngine/MCJIT/2003-01-10-FUCOM.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { %X = fadd double 0.000000e+00, 1.000000e+00 ; <double> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/2003-01-15-AlignmentTest.ll b/test/ExecutionEngine/MCJIT/2003-01-15-AlignmentTest.ll index 5b426f6c330b..d1ca2bee3994 100644 --- a/test/ExecutionEngine/MCJIT/2003-01-15-AlignmentTest.ll +++ b/test/ExecutionEngine/MCJIT/2003-01-15-AlignmentTest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @bar(i8* %X) { ; pointer should be 4 byte aligned! diff --git a/test/ExecutionEngine/MCJIT/2003-05-06-LivenessClobber.ll b/test/ExecutionEngine/MCJIT/2003-05-06-LivenessClobber.ll index c0a7393f8244..20ef0ff95cdd 100644 --- a/test/ExecutionEngine/MCJIT/2003-05-06-LivenessClobber.ll +++ b/test/ExecutionEngine/MCJIT/2003-05-06-LivenessClobber.ll @@ -1,6 +1,6 @@ ; This testcase should return with an exit code of 1. ; -; RUN: not %lli -mtriple=%mcjit_triple -use-mcjit %s +; RUN: not %lli_mcjit %s @test = global i64 0 ; <i64*> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/2003-05-07-ArgumentTest.ll b/test/ExecutionEngine/MCJIT/2003-05-07-ArgumentTest.ll index d3e6204a85be..c7bcc5450b09 100644 --- a/test/ExecutionEngine/MCJIT/2003-05-07-ArgumentTest.ll +++ b/test/ExecutionEngine/MCJIT/2003-05-07-ArgumentTest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s test +; RUN: %lli_mcjit %s test declare i32 @puts(i8*) diff --git a/test/ExecutionEngine/MCJIT/2003-05-11-PHIRegAllocBug.ll b/test/ExecutionEngine/MCJIT/2003-05-11-PHIRegAllocBug.ll index 55a169754104..0512575d1b4e 100644 --- a/test/ExecutionEngine/MCJIT/2003-05-11-PHIRegAllocBug.ll +++ b/test/ExecutionEngine/MCJIT/2003-05-11-PHIRegAllocBug.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null target datalayout = "e-p:32:32" diff --git a/test/ExecutionEngine/MCJIT/2003-06-04-bzip2-bug.ll b/test/ExecutionEngine/MCJIT/2003-06-04-bzip2-bug.ll index 79c6e7fe4cae..c292a818a091 100644 --- a/test/ExecutionEngine/MCJIT/2003-06-04-bzip2-bug.ll +++ b/test/ExecutionEngine/MCJIT/2003-06-04-bzip2-bug.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; Testcase distilled from 256.bzip2. diff --git a/test/ExecutionEngine/MCJIT/2003-06-05-PHIBug.ll b/test/ExecutionEngine/MCJIT/2003-06-05-PHIBug.ll index ffd6df6e5e25..c0a83f5ecbdb 100644 --- a/test/ExecutionEngine/MCJIT/2003-06-05-PHIBug.ll +++ b/test/ExecutionEngine/MCJIT/2003-06-05-PHIBug.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; Testcase distilled from 256.bzip2. diff --git a/test/ExecutionEngine/MCJIT/2003-08-15-AllocaAssertion.ll b/test/ExecutionEngine/MCJIT/2003-08-15-AllocaAssertion.ll index 90839e96986f..55ce689b865b 100644 --- a/test/ExecutionEngine/MCJIT/2003-08-15-AllocaAssertion.ll +++ b/test/ExecutionEngine/MCJIT/2003-08-15-AllocaAssertion.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; This testcase failed to work because two variable sized allocas confused the ; local register allocator. diff --git a/test/ExecutionEngine/MCJIT/2003-08-21-EnvironmentTest.ll b/test/ExecutionEngine/MCJIT/2003-08-21-EnvironmentTest.ll index 29ef2c556cd0..2e999967a2c5 100644 --- a/test/ExecutionEngine/MCJIT/2003-08-21-EnvironmentTest.ll +++ b/test/ExecutionEngine/MCJIT/2003-08-21-EnvironmentTest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; ; Regression Test: EnvironmentTest.ll diff --git a/test/ExecutionEngine/MCJIT/2003-08-23-RegisterAllocatePhysReg.ll b/test/ExecutionEngine/MCJIT/2003-08-23-RegisterAllocatePhysReg.ll index 2adb608acbb1..659901b9b36f 100644 --- a/test/ExecutionEngine/MCJIT/2003-08-23-RegisterAllocatePhysReg.ll +++ b/test/ExecutionEngine/MCJIT/2003-08-23-RegisterAllocatePhysReg.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; This testcase exposes a bug in the local register allocator where it runs out ; of registers (due to too many overlapping live ranges), but then attempts to diff --git a/test/ExecutionEngine/MCJIT/2003-10-18-PHINode-ConstantExpr-CondCode-Failure.ll b/test/ExecutionEngine/MCJIT/2003-10-18-PHINode-ConstantExpr-CondCode-Failure.ll index 91bde4690361..68e31a7074dd 100644 --- a/test/ExecutionEngine/MCJIT/2003-10-18-PHINode-ConstantExpr-CondCode-Failure.ll +++ b/test/ExecutionEngine/MCJIT/2003-10-18-PHINode-ConstantExpr-CondCode-Failure.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null @A = global i32 0 ; <i32*> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/2005-12-02-TailCallBug.ll b/test/ExecutionEngine/MCJIT/2005-12-02-TailCallBug.ll index a7462d9e698a..0bc010584f1e 100644 --- a/test/ExecutionEngine/MCJIT/2005-12-02-TailCallBug.ll +++ b/test/ExecutionEngine/MCJIT/2005-12-02-TailCallBug.ll @@ -1,5 +1,5 @@ ; PR672 -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s +; RUN: %lli_mcjit %s ; XFAIL: mcjit-ia32 define i32 @main() { diff --git a/test/ExecutionEngine/MCJIT/2007-12-10-APIntLoadStore.ll b/test/ExecutionEngine/MCJIT/2007-12-10-APIntLoadStore.ll index 240659660252..43188f2be481 100644 --- a/test/ExecutionEngine/MCJIT/2007-12-10-APIntLoadStore.ll +++ b/test/ExecutionEngine/MCJIT/2007-12-10-APIntLoadStore.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -force-interpreter %s +; RUN: %lli_mcjit -force-interpreter %s ; PR1836 define i32 @main() { diff --git a/test/ExecutionEngine/MCJIT/2008-06-05-APInt-OverAShr.ll b/test/ExecutionEngine/MCJIT/2008-06-05-APInt-OverAShr.ll index d429d519e04f..0912897c05fa 100644 --- a/test/ExecutionEngine/MCJIT/2008-06-05-APInt-OverAShr.ll +++ b/test/ExecutionEngine/MCJIT/2008-06-05-APInt-OverAShr.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -force-interpreter=true %s | grep 1 +; RUN: %lli_mcjit -force-interpreter=true %s | grep 1 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" target triple = "i686-pc-linux-gnu" diff --git a/test/ExecutionEngine/MCJIT/2010-01-15-UndefValue.ll b/test/ExecutionEngine/MCJIT/2010-01-15-UndefValue.ll index a6d18e7919cc..7ed0e3870a3b 100644 --- a/test/ExecutionEngine/MCJIT/2010-01-15-UndefValue.ll +++ b/test/ExecutionEngine/MCJIT/2010-01-15-UndefValue.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -force-interpreter=true %s > /dev/null +; RUN: %lli_mcjit -force-interpreter=true %s > /dev/null define i32 @main() { %a = add i32 0, undef diff --git a/test/ExecutionEngine/MCJIT/fpbitcast.ll b/test/ExecutionEngine/MCJIT/fpbitcast.ll index bb4957e9e66e..fb5ab6f24215 100644 --- a/test/ExecutionEngine/MCJIT/fpbitcast.ll +++ b/test/ExecutionEngine/MCJIT/fpbitcast.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -force-interpreter=true %s | grep 40091eb8 +; RUN: %lli_mcjit -force-interpreter=true %s | grep 40091eb8 ; define i32 @test(double %x) { entry: diff --git a/test/ExecutionEngine/MCJIT/hello.ll b/test/ExecutionEngine/MCJIT/hello.ll index ceb9c12ab4bd..b74470724deb 100644 --- a/test/ExecutionEngine/MCJIT/hello.ll +++ b/test/ExecutionEngine/MCJIT/hello.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null @.LC0 = internal global [12 x i8] c"Hello World\00" ; <[12 x i8]*> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/hello2.ll b/test/ExecutionEngine/MCJIT/hello2.ll index 756fcadb1caf..cd033d50947a 100644 --- a/test/ExecutionEngine/MCJIT/hello2.ll +++ b/test/ExecutionEngine/MCJIT/hello2.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null @X = global i32 7 ; <i32*> [#uses=0] @msg = internal global [13 x i8] c"Hello World\0A\00" ; <[13 x i8]*> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/pr13727.ll b/test/ExecutionEngine/MCJIT/pr13727.ll index c33bf3281087..1c719c5b7c27 100644 --- a/test/ExecutionEngine/MCJIT/pr13727.ll +++ b/test/ExecutionEngine/MCJIT/pr13727.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -O0 -disable-lazy-compilation=false %s +; RUN: %lli_mcjit -O0 -disable-lazy-compilation=false %s ; The intention of this test is to verify that symbols mapped to COMMON in ELF ; work as expected. diff --git a/test/ExecutionEngine/MCJIT/simplesttest.ll b/test/ExecutionEngine/MCJIT/simplesttest.ll index 02ad0061fd13..318baf4e8ffd 100644 --- a/test/ExecutionEngine/MCJIT/simplesttest.ll +++ b/test/ExecutionEngine/MCJIT/simplesttest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { ret i32 0 diff --git a/test/ExecutionEngine/MCJIT/simpletest-remote.ll b/test/ExecutionEngine/MCJIT/simpletest-remote.ll new file mode 100644 index 000000000000..9ceaf545c5e6 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/simpletest-remote.ll @@ -0,0 +1,12 @@ +; RUN: %lli_mcjit -remote-mcjit %s > /dev/null +; XFAIL: arm, mips + +define i32 @bar() { + ret i32 0 +} + +define i32 @main() { + %r = call i32 @bar( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/simpletest.ll b/test/ExecutionEngine/MCJIT/simpletest.ll index 958b783067e4..5b0f2dd3055e 100644 --- a/test/ExecutionEngine/MCJIT/simpletest.ll +++ b/test/ExecutionEngine/MCJIT/simpletest.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @bar() { ret i32 0 diff --git a/test/ExecutionEngine/MCJIT/stubs-remote.ll b/test/ExecutionEngine/MCJIT/stubs-remote.ll new file mode 100644 index 000000000000..15cb5d037efc --- /dev/null +++ b/test/ExecutionEngine/MCJIT/stubs-remote.ll @@ -0,0 +1,36 @@ +; RUN: %lli_mcjit -remote-mcjit -disable-lazy-compilation=false %s +; XFAIL: arm, mips + +define i32 @main() nounwind { +entry: + call void @lazily_compiled_address_is_consistent() + ret i32 0 +} + +; Test PR3043: @test should have the same address before and after +; it's JIT-compiled. +@funcPtr = common global i1 ()* null, align 4 +@lcaic_failure = internal constant [46 x i8] c"@lazily_compiled_address_is_consistent failed\00" + +define void @lazily_compiled_address_is_consistent() nounwind { +entry: + store i1 ()* @test, i1 ()** @funcPtr + %pass = tail call i1 @test() ; <i32> [#uses=1] + br i1 %pass, label %pass_block, label %fail_block +pass_block: + ret void +fail_block: + call i32 @puts(i8* getelementptr([46 x i8]* @lcaic_failure, i32 0, i32 0)) + call void @exit(i32 1) + unreachable +} + +define i1 @test() nounwind { +entry: + %tmp = load i1 ()** @funcPtr + %eq = icmp eq i1 ()* %tmp, @test + ret i1 %eq +} + +declare i32 @puts(i8*) noreturn +declare void @exit(i32) noreturn diff --git a/test/ExecutionEngine/MCJIT/stubs.ll b/test/ExecutionEngine/MCJIT/stubs.ll index 9e5d5b2e4186..f4aac3339450 100644 --- a/test/ExecutionEngine/MCJIT/stubs.ll +++ b/test/ExecutionEngine/MCJIT/stubs.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -disable-lazy-compilation=false %s +; RUN: %lli_mcjit -disable-lazy-compilation=false %s define i32 @main() nounwind { entry: diff --git a/test/ExecutionEngine/MCJIT/test-arith.ll b/test/ExecutionEngine/MCJIT/test-arith.ll index b73227fe635e..e1cc23b9fcd3 100644 --- a/test/ExecutionEngine/MCJIT/test-arith.ll +++ b/test/ExecutionEngine/MCJIT/test-arith.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { %A = add i8 0, 12 ; <i8> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/test-branch.ll b/test/ExecutionEngine/MCJIT/test-branch.ll index 8f3c7279051e..cdf10350ec11 100644 --- a/test/ExecutionEngine/MCJIT/test-branch.ll +++ b/test/ExecutionEngine/MCJIT/test-branch.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; test unconditional branch define i32 @main() { diff --git a/test/ExecutionEngine/MCJIT/test-call-no-external-funcs.ll b/test/ExecutionEngine/MCJIT/test-call-no-external-funcs.ll index 20150b2de626..8a36cf2953f7 100644 --- a/test/ExecutionEngine/MCJIT/test-call-no-external-funcs.ll +++ b/test/ExecutionEngine/MCJIT/test-call-no-external-funcs.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @_Z14func_exit_codev() nounwind uwtable { entry: diff --git a/test/ExecutionEngine/MCJIT/test-call.ll b/test/ExecutionEngine/MCJIT/test-call.ll index 51d19fe99178..1a0f00841685 100644 --- a/test/ExecutionEngine/MCJIT/test-call.ll +++ b/test/ExecutionEngine/MCJIT/test-call.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null declare void @exit(i32) diff --git a/test/ExecutionEngine/MCJIT/test-cast.ll b/test/ExecutionEngine/MCJIT/test-cast.ll index dcc97f466568..335ec508eff1 100644 --- a/test/ExecutionEngine/MCJIT/test-cast.ll +++ b/test/ExecutionEngine/MCJIT/test-cast.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @foo() { ret i32 0 diff --git a/test/ExecutionEngine/MCJIT/test-common-symbols-alignment.ll b/test/ExecutionEngine/MCJIT/test-common-symbols-alignment.ll index d666a2aa4aa3..989a47342339 100644 --- a/test/ExecutionEngine/MCJIT/test-common-symbols-alignment.ll +++ b/test/ExecutionEngine/MCJIT/test-common-symbols-alignment.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -O0 %s +; RUN: %lli_mcjit -O0 %s ; This test checks that common symbols have been allocated addresses honouring ; the alignment requirement. diff --git a/test/ExecutionEngine/MCJIT/test-common-symbols-remote.ll b/test/ExecutionEngine/MCJIT/test-common-symbols-remote.ll new file mode 100644 index 000000000000..3b8ee9dd1cce --- /dev/null +++ b/test/ExecutionEngine/MCJIT/test-common-symbols-remote.ll @@ -0,0 +1,89 @@ +; RUN: %lli_mcjit -remote-mcjit -O0 -disable-lazy-compilation=false %s +; XFAIL: arm, mips + +; The intention of this test is to verify that symbols mapped to COMMON in ELF +; work as expected. +; +; Compiled from this C code: +; +; int zero_int; +; double zero_double; +; int zero_arr[10]; +; +; int main() +; { +; zero_arr[zero_int + 5] = 40; +; +; if (zero_double < 1.0) +; zero_arr[zero_int + 2] = 70; +; +; for (int i = 1; i < 10; ++i) { +; zero_arr[i] = zero_arr[i - 1] + zero_arr[i]; +; } +; return zero_arr[9] == 110 ? 0 : -1; +; } + +@zero_int = common global i32 0, align 4 +@zero_arr = common global [10 x i32] zeroinitializer, align 16 +@zero_double = common global double 0.000000e+00, align 8 + +define i32 @main() nounwind { +entry: + %retval = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @zero_int, align 4 + %add = add nsw i32 %0, 5 + %idxprom = sext i32 %add to i64 + %arrayidx = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom + store i32 40, i32* %arrayidx, align 4 + %1 = load double* @zero_double, align 8 + %cmp = fcmp olt double %1, 1.000000e+00 + br i1 %cmp, label %if.then, label %if.end + +if.then: ; preds = %entry + %2 = load i32* @zero_int, align 4 + %add1 = add nsw i32 %2, 2 + %idxprom2 = sext i32 %add1 to i64 + %arrayidx3 = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom2 + store i32 70, i32* %arrayidx3, align 4 + br label %if.end + +if.end: ; preds = %if.then, %entry + store i32 1, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %if.end + %3 = load i32* %i, align 4 + %cmp4 = icmp slt i32 %3, 10 + br i1 %cmp4, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %4 = load i32* %i, align 4 + %sub = sub nsw i32 %4, 1 + %idxprom5 = sext i32 %sub to i64 + %arrayidx6 = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom5 + %5 = load i32* %arrayidx6, align 4 + %6 = load i32* %i, align 4 + %idxprom7 = sext i32 %6 to i64 + %arrayidx8 = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom7 + %7 = load i32* %arrayidx8, align 4 + %add9 = add nsw i32 %5, %7 + %8 = load i32* %i, align 4 + %idxprom10 = sext i32 %8 to i64 + %arrayidx11 = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom10 + store i32 %add9, i32* %arrayidx11, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %9 = load i32* %i, align 4 + %inc = add nsw i32 %9, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %10 = load i32* getelementptr inbounds ([10 x i32]* @zero_arr, i32 0, i64 9), align 4 + %cmp12 = icmp eq i32 %10, 110 + %cond = select i1 %cmp12, i32 0, i32 -1 + ret i32 %cond +} diff --git a/test/ExecutionEngine/MCJIT/test-common-symbols.ll b/test/ExecutionEngine/MCJIT/test-common-symbols.ll index 8c8190291f18..13ee06a65071 100644 --- a/test/ExecutionEngine/MCJIT/test-common-symbols.ll +++ b/test/ExecutionEngine/MCJIT/test-common-symbols.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -O0 -disable-lazy-compilation=false %s +; RUN: %lli_mcjit -O0 -disable-lazy-compilation=false %s ; The intention of this test is to verify that symbols mapped to COMMON in ELF ; work as expected. diff --git a/test/ExecutionEngine/MCJIT/test-constantexpr.ll b/test/ExecutionEngine/MCJIT/test-constantexpr.ll index 56c1290448ad..8f15cbd7f7ef 100644 --- a/test/ExecutionEngine/MCJIT/test-constantexpr.ll +++ b/test/ExecutionEngine/MCJIT/test-constantexpr.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; This tests to make sure that we can evaluate weird constant expressions diff --git a/test/ExecutionEngine/MCJIT/test-data-align-remote.ll b/test/ExecutionEngine/MCJIT/test-data-align-remote.ll new file mode 100644 index 000000000000..9daf1684de81 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/test-data-align-remote.ll @@ -0,0 +1,16 @@ +; RUN: %lli_mcjit -remote-mcjit -O0 %s +; XFAIL: armv7, mips + +; Check that a variable is always aligned as specified. + +@var = global i32 0, align 32 +define i32 @main() { + %addr = ptrtoint i32* @var to i64 + %mask = and i64 %addr, 31 + %tst = icmp eq i64 %mask, 0 + br i1 %tst, label %good, label %bad +good: + ret i32 0 +bad: + ret i32 1 +} diff --git a/test/ExecutionEngine/MCJIT/test-data-align.ll b/test/ExecutionEngine/MCJIT/test-data-align.ll index 0493cba87fdb..2472d95e7778 100644 --- a/test/ExecutionEngine/MCJIT/test-data-align.ll +++ b/test/ExecutionEngine/MCJIT/test-data-align.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -O0 %s +; RUN: %lli_mcjit -O0 %s ; Check that a variable is always aligned as specified. diff --git a/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs-remote.ll b/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs-remote.ll new file mode 100644 index 000000000000..847d2253a0ed --- /dev/null +++ b/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs-remote.ll @@ -0,0 +1,22 @@ +; RUN: %lli_mcjit -remote-mcjit %s > /dev/null +; XFAIL: arm, mips + +define double @test(double* %DP, double %Arg) { + %D = load double* %DP ; <double> [#uses=1] + %V = fadd double %D, 1.000000e+00 ; <double> [#uses=2] + %W = fsub double %V, %V ; <double> [#uses=3] + %X = fmul double %W, %W ; <double> [#uses=2] + %Y = fdiv double %X, %X ; <double> [#uses=2] + %Q = fadd double %Y, %Arg ; <double> [#uses=1] + %R = bitcast double %Q to double ; <double> [#uses=1] + store double %Q, double* %DP + ret double %Y +} + +define i32 @main() { + %X = alloca double ; <double*> [#uses=2] + store double 0.000000e+00, double* %X + call double @test( double* %X, double 2.000000e+00 ) ; <double>:1 [#uses=0] + ret i32 0 +} + diff --git a/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs.ll b/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs.ll index 7af1d8b53910..f094f3d91923 100644 --- a/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs.ll +++ b/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define double @test(double* %DP, double %Arg) { %D = load double* %DP ; <double> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/test-fp.ll b/test/ExecutionEngine/MCJIT/test-fp.ll index f7e6fb9ba18e..b10e9d6c169d 100644 --- a/test/ExecutionEngine/MCJIT/test-fp.ll +++ b/test/ExecutionEngine/MCJIT/test-fp.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define double @test(double* %DP, double %Arg) { %D = load double* %DP ; <double> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/test-global-ctors.ll b/test/ExecutionEngine/MCJIT/test-global-ctors.ll new file mode 100644 index 000000000000..4510d9b6a495 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/test-global-ctors.ll @@ -0,0 +1,21 @@ +; RUN: %lli_mcjit %s > /dev/null +@var = global i32 1, align 4 +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @ctor_func }] +@llvm.global_dtors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @dtor_func }] + +define i32 @main() nounwind { +entry: + %0 = load i32* @var, align 4 + ret i32 %0 +} + +define internal void @ctor_func() section ".text.startup" { +entry: + store i32 0, i32* @var, align 4 + ret void +} + +define internal void @dtor_func() section ".text.startup" { +entry: + ret void +} diff --git a/test/ExecutionEngine/MCJIT/test-global-init-nonzero-remote.ll b/test/ExecutionEngine/MCJIT/test-global-init-nonzero-remote.ll new file mode 100644 index 000000000000..b8d94b50cfe2 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/test-global-init-nonzero-remote.ll @@ -0,0 +1,35 @@ +; RUN: %lli_mcjit -remote-mcjit %s > /dev/null +; XFAIL: arm, mips + +@count = global i32 1, align 4 + +define i32 @main() nounwind uwtable { +entry: + %retval = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 0, i32* %retval + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 49 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* @count, align 4 + %inc = add nsw i32 %1, 1 + store i32 %inc, i32* @count, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %2 = load i32* %i, align 4 + %inc1 = add nsw i32 %2, 1 + store i32 %inc1, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %3 = load i32* @count, align 4 + %sub = sub nsw i32 %3, 50 + ret i32 %sub +} diff --git a/test/ExecutionEngine/MCJIT/test-global-init-nonzero.ll b/test/ExecutionEngine/MCJIT/test-global-init-nonzero.ll index ec6cbad2f14e..b9f74b8be403 100644 --- a/test/ExecutionEngine/MCJIT/test-global-init-nonzero.ll +++ b/test/ExecutionEngine/MCJIT/test-global-init-nonzero.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null @count = global i32 1, align 4 diff --git a/test/ExecutionEngine/MCJIT/test-global.ll b/test/ExecutionEngine/MCJIT/test-global.ll index e7972f978e95..6a8c042ef89e 100644 --- a/test/ExecutionEngine/MCJIT/test-global.ll +++ b/test/ExecutionEngine/MCJIT/test-global.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null @count = global i32 0, align 4 diff --git a/test/ExecutionEngine/MCJIT/test-loadstore.ll b/test/ExecutionEngine/MCJIT/test-loadstore.ll index f450d0ab528b..90381947e8fb 100644 --- a/test/ExecutionEngine/MCJIT/test-loadstore.ll +++ b/test/ExecutionEngine/MCJIT/test-loadstore.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define void @test(i8* %P, i16* %P.upgrd.1, i32* %P.upgrd.2, i64* %P.upgrd.3) { %V = load i8* %P ; <i8> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/test-local.ll b/test/ExecutionEngine/MCJIT/test-local.ll index d4e9f444e426..d7c173427977 100644 --- a/test/ExecutionEngine/MCJIT/test-local.ll +++ b/test/ExecutionEngine/MCJIT/test-local.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() nounwind uwtable { entry: diff --git a/test/ExecutionEngine/MCJIT/test-logical.ll b/test/ExecutionEngine/MCJIT/test-logical.ll index 32f45ef119e6..a03833e5c516 100644 --- a/test/ExecutionEngine/MCJIT/test-logical.ll +++ b/test/ExecutionEngine/MCJIT/test-logical.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { %A = and i8 4, 8 ; <i8> [#uses=2] diff --git a/test/ExecutionEngine/MCJIT/test-loop.ll b/test/ExecutionEngine/MCJIT/test-loop.ll index ebc689664d65..5ed8c4020f76 100644 --- a/test/ExecutionEngine/MCJIT/test-loop.ll +++ b/test/ExecutionEngine/MCJIT/test-loop.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { ; <label>:0 diff --git a/test/ExecutionEngine/MCJIT/test-phi.ll b/test/ExecutionEngine/MCJIT/test-phi.ll index 1408533d7ae9..4245ccabed78 100644 --- a/test/ExecutionEngine/MCJIT/test-phi.ll +++ b/test/ExecutionEngine/MCJIT/test-phi.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; test phi node @Y = global i32 6 ; <i32*> [#uses=1] diff --git a/test/ExecutionEngine/MCJIT/test-ptr-reloc-remote.ll b/test/ExecutionEngine/MCJIT/test-ptr-reloc-remote.ll new file mode 100644 index 000000000000..f2c2cd6199f7 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/test-ptr-reloc-remote.ll @@ -0,0 +1,17 @@ +; RUN: %lli_mcjit -remote-mcjit -O0 %s +; XFAIL: arm, mips + +@.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1 +@ptr = global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), align 4 +@.str1 = private unnamed_addr constant [6 x i8] c"data2\00", align 1 +@ptr2 = global i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0), align 4 + +define i32 @main(i32 %argc, i8** nocapture %argv) nounwind readonly { +entry: + %0 = load i8** @ptr, align 4 + %1 = load i8** @ptr2, align 4 + %cmp = icmp eq i8* %0, %1 + %. = zext i1 %cmp to i32 + ret i32 %. +} + diff --git a/test/ExecutionEngine/MCJIT/test-ptr-reloc.ll b/test/ExecutionEngine/MCJIT/test-ptr-reloc.ll index 93b6a6deffd1..871d8bfa29e8 100644 --- a/test/ExecutionEngine/MCJIT/test-ptr-reloc.ll +++ b/test/ExecutionEngine/MCJIT/test-ptr-reloc.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -O0 %s +; RUN: %lli_mcjit -O0 %s @.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1 @ptr = global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), align 4 diff --git a/test/ExecutionEngine/MCJIT/test-ret.ll b/test/ExecutionEngine/MCJIT/test-ret.ll index af282926907f..6bfc48052d02 100644 --- a/test/ExecutionEngine/MCJIT/test-ret.ll +++ b/test/ExecutionEngine/MCJIT/test-ret.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null ; test return instructions define void @test1() { diff --git a/test/ExecutionEngine/MCJIT/test-return.ll b/test/ExecutionEngine/MCJIT/test-return.ll index 67f7107c3d7d..4db1c3fe39f0 100644 --- a/test/ExecutionEngine/MCJIT/test-return.ll +++ b/test/ExecutionEngine/MCJIT/test-return.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() nounwind uwtable { entry: diff --git a/test/ExecutionEngine/MCJIT/test-setcond-fp.ll b/test/ExecutionEngine/MCJIT/test-setcond-fp.ll index a8f4bd8529f8..b4367d0337a0 100644 --- a/test/ExecutionEngine/MCJIT/test-setcond-fp.ll +++ b/test/ExecutionEngine/MCJIT/test-setcond-fp.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { diff --git a/test/ExecutionEngine/MCJIT/test-setcond-int.ll b/test/ExecutionEngine/MCJIT/test-setcond-int.ll index ed52b5065c84..8c7d815446cb 100644 --- a/test/ExecutionEngine/MCJIT/test-setcond-int.ll +++ b/test/ExecutionEngine/MCJIT/test-setcond-int.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { %int1 = add i32 0, 0 ; <i32> [#uses=6] diff --git a/test/ExecutionEngine/MCJIT/test-shift.ll b/test/ExecutionEngine/MCJIT/test-shift.ll index 5a5c10d56050..8d9a94ef12c8 100644 --- a/test/ExecutionEngine/MCJIT/test-shift.ll +++ b/test/ExecutionEngine/MCJIT/test-shift.ll @@ -1,4 +1,4 @@ -; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null +; RUN: %lli_mcjit %s > /dev/null define i32 @main() { %shamt = add i8 0, 1 ; <i8> [#uses=8] diff --git a/test/ExecutionEngine/lit.local.cfg b/test/ExecutionEngine/lit.local.cfg index f0343263dba6..1f8ae69b9868 100644 --- a/test/ExecutionEngine/lit.local.cfg +++ b/test/ExecutionEngine/lit.local.cfg @@ -7,6 +7,8 @@ def getRoot(config): root = getRoot(config) -if root.host_arch in ['PowerPC']: +if root.host_arch in ['PowerPC', 'AArch64']: config.unsupported = True +if 'hexagon' in root.target_triple: + config.unsupported = True diff --git a/test/ExecutionEngine/test-interp-vec-loadstore.ll b/test/ExecutionEngine/test-interp-vec-loadstore.ll new file mode 100644 index 000000000000..e9f5b445a864 --- /dev/null +++ b/test/ExecutionEngine/test-interp-vec-loadstore.ll @@ -0,0 +1,84 @@ +; RUN: %lli -force-interpreter=true %s | FileCheck %s +; CHECK: 1 +; CHECK: 2 +; CHECK: 3 +; CHECK: 4 +; CHECK: 5.{{[0]+}}e+{{[0]+}} +; CHECK: 6.{{[0]+}}e+{{[0]+}} +; CHECK: 7.{{[0]+}}e+{{[0]+}} +; CHECK: 8.{{[0]+}}e+{{[0]+}} +; CHECK: 9.{{[0]+}}e+{{[0]+}} +; CHECK: 1.{{[0]+}}e+{{[0]+}}1 +; CHECK: 1.1{{[0]+}}e+{{[0]+}}1 +; CHECK: 1.2{{[0]+}}e+{{[0]+}}1 + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32" + +@format_i32 = internal global [4 x i8] c"%d\0A\00" +@format_float = internal global [4 x i8] c"%e\0A\00" + +declare i32 @printf(i8*, ...) + +define i32 @main() { + %a = alloca <4 x i32>, align 16 + %b = alloca <4 x double>, align 16 + %c = alloca <4 x float>, align 16 + + store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %a, align 16 + + %val0 = load <4 x i32> *%a, align 16 + + %res_i32_0 = extractelement <4 x i32> %val0, i32 0 + %res_i32_1 = extractelement <4 x i32> %val0, i32 1 + %res_i32_2 = extractelement <4 x i32> %val0, i32 2 + %res_i32_3 = extractelement <4 x i32> %val0, i32 3 + + %ptr0 = getelementptr [4 x i8]* @format_i32, i32 0, i32 0 + call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_0) + call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_1) + call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_2) + call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_3) + + store <4 x double> <double 5.0, double 6.0, double 7.0, double 8.0>, <4 x double>* %b, align 16 + + %val1 = load <4 x double> *%b, align 16 + + %res_double_0 = extractelement <4 x double> %val1, i32 0 + %res_double_1 = extractelement <4 x double> %val1, i32 1 + %res_double_2 = extractelement <4 x double> %val1, i32 2 + %res_double_3 = extractelement <4 x double> %val1, i32 3 + + %ptr1 = getelementptr [4 x i8]* @format_float, i32 0, i32 0 + call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_0) + call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_1) + call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_2) + call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_3) + + + store <4 x float> <float 9.0, float 10.0, float 11.0, float 12.0>, <4 x float>* %c, align 16 + + %val2 = load <4 x float> *%c, align 16 + + %ptr2 = getelementptr [4 x i8]* @format_float, i32 0, i32 0 + + ; by some reason printf doesn't print float correctly, so + ; floats are casted to doubles and are printed as doubles + + %res_serv_0 = extractelement <4 x float> %val2, i32 0 + %res_float_0 = fpext float %res_serv_0 to double + %res_serv_1 = extractelement <4 x float> %val2, i32 1 + %res_float_1 = fpext float %res_serv_1 to double + %res_serv_2 = extractelement <4 x float> %val2, i32 2 + %res_float_2 = fpext float %res_serv_2 to double + %res_serv_3 = extractelement <4 x float> %val2, i32 3 + %res_float_3 = fpext float %res_serv_3 to double + + + call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_0) + call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_1) + call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_2) + call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_3) + + + ret i32 0 +} diff --git a/test/Feature/attributes.ll b/test/Feature/attributes.ll new file mode 100644 index 000000000000..7707d82be5ce --- /dev/null +++ b/test/Feature/attributes.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | llvm-dis > %t1.ll +; RUN: llvm-as %t1.ll -o - | llvm-dis > %t2.ll +; RUN: diff %t1.ll %t2.ll + +@.str = private unnamed_addr constant [14 x i8] c"hello world!\0A\00", align 1 + +define void @foo() #0 { +entry: + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) + ret void +} + +declare i32 @printf(i8*, ...) + +attributes #0 = { nounwind ssp uwtable } diff --git a/test/Feature/const_pv.ll b/test/Feature/const_pv.ll index 6fd6abdccf08..272bf43a0687 100644 --- a/test/Feature/const_pv.ll +++ b/test/Feature/const_pv.ll @@ -4,5 +4,5 @@ @G1 = global i8 zeroinitializer @g = constant <2 x i8*> getelementptr (<2 x i8*> <i8* @G1, i8* @G1>, <2 x i32> <i32 0, i32 0>) -@t = constant <2 x i1> icmp ((<2 x i32> ptrtoint (<2 x i8*> zeroinitializer to <2 x i32>), <2 x i32> zeroinitializer ) +@t = constant <2 x i1> icmp eq (<2 x i32> ptrtoint (<2 x i8*> zeroinitializer to <2 x i32>), <2 x i32> zeroinitializer ) diff --git a/test/Feature/global_pv.ll b/test/Feature/global_pv.ll index d257ec077ab9..34b9a7df8824 100644 --- a/test/Feature/global_pv.ll +++ b/test/Feature/global_pv.ll @@ -1,5 +1,5 @@ -; RUN: opt -instcombine -S -o - %s | llvm-as -; RUN: opt -instcombine -globalopt -S -o - %s | llvm-as +; RUN: opt -instcombine -S < %s | llvm-as +; RUN: opt -instcombine -globalopt -S < %s | llvm-as @G1 = global i32 zeroinitializer @G2 = global i32 zeroinitializer @g = global <2 x i32*> zeroinitializer diff --git a/test/Feature/intrinsics.ll b/test/Feature/intrinsics.ll index 9e7dc6d4102e..28be053714d1 100644 --- a/test/Feature/intrinsics.ll +++ b/test/Feature/intrinsics.ll @@ -61,10 +61,14 @@ define void @libm() { ; FIXME: test ALL the intrinsics in this file. ; rdar://11542750 -; CHECK: declare void @llvm.trap() noreturn nounwind +; CHECK: declare void @llvm.trap() #2 declare void @llvm.trap() define void @trap() { call void @llvm.trap() ret void } + +; CHECK: attributes #0 = { nounwind readnone } +; CHECK: attributes #1 = { nounwind readonly } +; CHECK: attributes #2 = { noreturn nounwind } diff --git a/test/Feature/minsize_attr.ll b/test/Feature/minsize_attr.ll index 51b133c4bdb7..1f915b35a365 100644 --- a/test/Feature/minsize_attr.ll +++ b/test/Feature/minsize_attr.ll @@ -1,7 +1,8 @@ ; RUN: llvm-as < %s | llvm-dis | FileCheck %s define void @test1() minsize { -; CHECK: define void @test1() minsize +; CHECK: define void @test1() #0 ret void } +; CHECK: attributes #0 = { minsize } diff --git a/test/Feature/properties.ll b/test/Feature/properties.ll index c688d689be28..2111fa2f8d61 100644 --- a/test/Feature/properties.ll +++ b/test/Feature/properties.ll @@ -4,4 +4,3 @@ target datalayout = "e-p:32:32" target triple = "proc-vend-sys" -deplibs = [ "m", "c" ] diff --git a/test/FileCheck/dos-style-eol.txt b/test/FileCheck/dos-style-eol.txt new file mode 100644 index 000000000000..4252aad4d3e7 --- /dev/null +++ b/test/FileCheck/dos-style-eol.txt @@ -0,0 +1,11 @@ +// Test for using FileCheck on DOS style end-of-line
+// This test was deliberately committed with DOS style end of line.
+// Don't change line endings!
+// RUN: FileCheck -input-file %s %s
+// RUN: FileCheck --strict-whitespace -input-file %s %s
+
+LINE 1
+; CHECK: {{^}}LINE 1{{$}}
+
+LINE 2
+; CHECK: {{^}}LINE 2{{$}}
\ No newline at end of file diff --git a/test/FileCheck/lit.local.cfg b/test/FileCheck/lit.local.cfg new file mode 100644 index 000000000000..ee25f56231c5 --- /dev/null +++ b/test/FileCheck/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.txt'] diff --git a/test/FileCheck/next-no-match.txt b/test/FileCheck/next-no-match.txt new file mode 100644 index 000000000000..908615b248c5 --- /dev/null +++ b/test/FileCheck/next-no-match.txt @@ -0,0 +1,9 @@ +// RUN: not FileCheck -input-file %s %s + +foo +bar +; CHECK: foo +baz +; CHECK-NEXT: baz + + diff --git a/test/FileCheck/regex-brackets.txt b/test/FileCheck/regex-brackets.txt new file mode 100644 index 000000000000..fd8568d3a504 --- /dev/null +++ b/test/FileCheck/regex-brackets.txt @@ -0,0 +1,7 @@ +// RUN: FileCheck -input-file %s %s + +op r1 +op r2, [x r1] +; CHECK: op [[REG:r[0-9]]] +; CHECK: op [[REG2:r[0-9]]], [x [[REG]]] + diff --git a/test/FileCheck/regex-no-match.txt b/test/FileCheck/regex-no-match.txt new file mode 100644 index 000000000000..f80ac12911e4 --- /dev/null +++ b/test/FileCheck/regex-no-match.txt @@ -0,0 +1,5 @@ +// RUN: not FileCheck -input-file %s %s + +foobar +; CHECK: fooba{{[a-b]}} + diff --git a/test/FileCheck/simple-var-capture.txt b/test/FileCheck/simple-var-capture.txt new file mode 100644 index 000000000000..a487baaa531c --- /dev/null +++ b/test/FileCheck/simple-var-capture.txt @@ -0,0 +1,13 @@ +// RUN: FileCheck -input-file %s %s + +op1 r1 +op2 r1, r2 +; CHECK: op1 [[REG:r[0-9]]] +; CHECK-NEXT: op2 [[REG]] + +op3 r16, r18, r21 +op4 r30, r18, r21 +; CHECK: op3 {{r[0-9]+}}, [[REGa:r[0-9]+]], [[REGb:r[0-9]+]] +; CHECK-NEXT: op4 {{r[0-9]+}}, [[REGa]], [[REGb]] + + diff --git a/test/FileCheck/two-checks-for-same-match.txt b/test/FileCheck/two-checks-for-same-match.txt new file mode 100644 index 000000000000..2195aa96c540 --- /dev/null +++ b/test/FileCheck/two-checks-for-same-match.txt @@ -0,0 +1,8 @@ +// Check that two distinct CHECK lines won't match the same string +// RUN: not FileCheck -input-file %s %s + +; CHECK: {{a[0-9]b}} +; CHECK: {{a[0-9]b}} + +a2b + diff --git a/test/FileCheck/var-ref-same-line.txt b/test/FileCheck/var-ref-same-line.txt new file mode 100644 index 000000000000..1755cefbf864 --- /dev/null +++ b/test/FileCheck/var-ref-same-line.txt @@ -0,0 +1,16 @@ +// Test for referencing a variable defined on the same line +// RUN: FileCheck -input-file %s %s + +op1 r1, r2, r1 + +; CHECK: op1 [[REG:r[0-9]+]], {{r[0-9]+}}, [[REG]] + +op3 r1, r2, r1, r2 + +; CHECK: op3 [[REG1:r[0-9]+]], [[REG2:r[0-9]+]], [[REG1]], [[REG2]] + +op4 g1, g2, g1 + +; Test that parens inside the regex don't confuse FileCheck +; CHECK: {{([a-z]+[0-9])+}} [[REG:g[0-9]+]], {{g[0-9]+}}, [[REG]] + diff --git a/test/Instrumentation/AddressSanitizer/X86/bug_11395.ll b/test/Instrumentation/AddressSanitizer/X86/bug_11395.ll index 35c5c4a0bba4..38168fc2d68d 100644 --- a/test/Instrumentation/AddressSanitizer/X86/bug_11395.ll +++ b/test/Instrumentation/AddressSanitizer/X86/bug_11395.ll @@ -36,14 +36,14 @@ target triple = "i386-unknown-linux-gnu" @ff_mlp_firorder_7 = external global i8 @ff_mlp_firorder_8 = external global i8 -define void @ff_mlp_init_x86(%struct.DSPContext* nocapture %c, %struct.AVCodecContext* nocapture %avctx) nounwind address_safety { +define void @ff_mlp_init_x86(%struct.DSPContext* nocapture %c, %struct.AVCodecContext* nocapture %avctx) nounwind sanitize_address { entry: %mlp_filter_channel = getelementptr inbounds %struct.DSPContext* %c, i32 0, i32 131 store void (i32*, i32*, i32, i32, i32, i32, i32, i32*)* @mlp_filter_channel_x86, void (i32*, i32*, i32, i32, i32, i32, i32, i32*)** %mlp_filter_channel, align 4, !tbaa !0 ret void } -define internal void @mlp_filter_channel_x86(i32* %state, i32* %coeff, i32 %firorder, i32 %iirorder, i32 %filter_shift, i32 %mask, i32 %blocksize, i32* %sample_buffer) nounwind address_safety { +define internal void @mlp_filter_channel_x86(i32* %state, i32* %coeff, i32 %firorder, i32 %iirorder, i32 %filter_shift, i32 %mask, i32 %blocksize, i32* %sample_buffer) nounwind sanitize_address { entry: %filter_shift.addr = alloca i32, align 4 %mask.addr = alloca i32, align 4 diff --git a/test/Instrumentation/AddressSanitizer/adaptive_global_redzones.ll b/test/Instrumentation/AddressSanitizer/adaptive_global_redzones.ll new file mode 100644 index 000000000000..6a60d1c29f56 --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/adaptive_global_redzones.ll @@ -0,0 +1,57 @@ +; RUN: opt < %s -asan -asan-module -S | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-unknown-linux-gnu" + +; Here we check that the global redzone sizes grow with the object size. + +@G10 = global [10 x i8] zeroinitializer, align 1 +; CHECK: @G10 = global { [10 x i8], [54 x i8] } + +@G31 = global [31 x i8] zeroinitializer, align 1 +@G32 = global [32 x i8] zeroinitializer, align 1 +@G33 = global [33 x i8] zeroinitializer, align 1 +; CHECK: @G31 = global { [31 x i8], [33 x i8] } +; CHECK: @G32 = global { [32 x i8], [32 x i8] } +; CHECK: @G33 = global { [33 x i8], [63 x i8] } + +@G63 = global [63 x i8] zeroinitializer, align 1 +@G64 = global [64 x i8] zeroinitializer, align 1 +@G65 = global [65 x i8] zeroinitializer, align 1 +; CHECK: @G63 = global { [63 x i8], [33 x i8] } +; CHECK: @G64 = global { [64 x i8], [32 x i8] } +; CHECK: @G65 = global { [65 x i8], [63 x i8] } + +@G127 = global [127 x i8] zeroinitializer, align 1 +@G128 = global [128 x i8] zeroinitializer, align 1 +@G129 = global [129 x i8] zeroinitializer, align 1 +; CHECK: @G127 = global { [127 x i8], [33 x i8] } +; CHECK: @G128 = global { [128 x i8], [32 x i8] } +; CHECK: @G129 = global { [129 x i8], [63 x i8] } + +@G255 = global [255 x i8] zeroinitializer, align 1 +@G256 = global [256 x i8] zeroinitializer, align 1 +@G257 = global [257 x i8] zeroinitializer, align 1 +; CHECK: @G255 = global { [255 x i8], [33 x i8] } +; CHECK: @G256 = global { [256 x i8], [64 x i8] } +; CHECK: @G257 = global { [257 x i8], [95 x i8] } + +@G511 = global [511 x i8] zeroinitializer, align 1 +@G512 = global [512 x i8] zeroinitializer, align 1 +@G513 = global [513 x i8] zeroinitializer, align 1 +; CHECK: @G511 = global { [511 x i8], [97 x i8] } +; CHECK: @G512 = global { [512 x i8], [128 x i8] } +; CHECK: @G513 = global { [513 x i8], [159 x i8] } + +@G1023 = global [1023 x i8] zeroinitializer, align 1 +@G1024 = global [1024 x i8] zeroinitializer, align 1 +@G1025 = global [1025 x i8] zeroinitializer, align 1 +; CHECK: @G1023 = global { [1023 x i8], [225 x i8] } +; CHECK: @G1024 = global { [1024 x i8], [256 x i8] } +; CHECK: @G1025 = global { [1025 x i8], [287 x i8] } + +@G1000000 = global [1000000 x i8] zeroinitializer, align 1 +@G10000000 = global [10000000 x i8] zeroinitializer, align 1 +@G100000000 = global [100000000 x i8] zeroinitializer, align 1 +; CHECK: @G1000000 = global { [1000000 x i8], [249984 x i8] } +; CHECK: @G10000000 = global { [10000000 x i8], [262144 x i8] } +; CHECK: @G100000000 = global { [100000000 x i8], [262144 x i8] } diff --git a/test/Instrumentation/AddressSanitizer/asan-vs-gvn.ll b/test/Instrumentation/AddressSanitizer/asan-vs-gvn.ll index c0fe15e9fcec..da8f54137598 100644 --- a/test/Instrumentation/AddressSanitizer/asan-vs-gvn.ll +++ b/test/Instrumentation/AddressSanitizer/asan-vs-gvn.ll @@ -11,9 +11,9 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f3 @f = global %struct_of_7_bytes_4_aligned zeroinitializer, align 4 -; Accessing bytes 4 and 6, not ok to widen to i32 if address_safety is set. +; Accessing bytes 4 and 6, not ok to widen to i32 if sanitize_address is set. -define i32 @test_widening_bad(i8* %P) nounwind ssp noredzone address_safety { +define i32 @test_widening_bad(i8* %P) nounwind ssp noredzone sanitize_address { entry: %tmp = load i8* getelementptr inbounds (%struct_of_7_bytes_4_aligned* @f, i64 0, i32 1), align 4 %conv = zext i8 %tmp to i32 @@ -36,7 +36,7 @@ define void @end_test_widening_bad() { ;; Accessing bytes 4 and 5. Ok to widen to i16. -define i32 @test_widening_ok(i8* %P) nounwind ssp noredzone address_safety { +define i32 @test_widening_ok(i8* %P) nounwind ssp noredzone sanitize_address { entry: %tmp = load i8* getelementptr inbounds (%struct_of_7_bytes_4_aligned* @f, i64 0, i32 1), align 4 %conv = zext i8 %tmp to i32 diff --git a/test/Instrumentation/AddressSanitizer/basic.ll b/test/Instrumentation/AddressSanitizer/basic.ll index 655f69c16fdf..fb32e704af86 100644 --- a/test/Instrumentation/AddressSanitizer/basic.ll +++ b/test/Instrumentation/AddressSanitizer/basic.ll @@ -5,12 +5,12 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" -define i32 @test_load(i32* %a) address_safety { +define i32 @test_load(i32* %a) sanitize_address { ; CHECK: @test_load ; CHECK-NOT: load ; CHECK: %[[LOAD_ADDR:[^ ]*]] = ptrtoint i32* %a to i64 ; CHECK: lshr i64 %[[LOAD_ADDR]], 3 -; CHECK: or i64 +; CHECK: {{or|add}} ; CHECK: %[[LOAD_SHADOW_PTR:[^ ]*]] = inttoptr ; CHECK: %[[LOAD_SHADOW:[^ ]*]] = load i8* %[[LOAD_SHADOW_PTR]] ; CHECK: icmp ne i8 @@ -38,12 +38,12 @@ entry: ret i32 %tmp1 } -define void @test_store(i32* %a) address_safety { +define void @test_store(i32* %a) sanitize_address { ; CHECK: @test_store ; CHECK-NOT: store ; CHECK: %[[STORE_ADDR:[^ ]*]] = ptrtoint i32* %a to i64 ; CHECK: lshr i64 %[[STORE_ADDR]], 3 -; CHECK: or i64 +; CHECK: {{or|add}} ; CHECK: %[[STORE_SHADOW_PTR:[^ ]*]] = inttoptr ; CHECK: %[[STORE_SHADOW:[^ ]*]] = load i8* %[[STORE_SHADOW_PTR]] ; CHECK: icmp ne i8 @@ -73,7 +73,7 @@ entry: ; Check that asan leaves just one alloca. declare void @alloca_test_use([10 x i8]*) -define void @alloca_test() address_safety { +define void @alloca_test() sanitize_address { entry: %x = alloca [10 x i8], align 1 %y = alloca [10 x i8], align 1 @@ -89,3 +89,54 @@ entry: ; CHECK-NOT: = alloca ; CHECK: ret void +define void @LongDoubleTest(x86_fp80* nocapture %a) nounwind uwtable sanitize_address { +entry: + store x86_fp80 0xK3FFF8000000000000000, x86_fp80* %a, align 16 + ret void +} + +; CHECK: LongDoubleTest +; CHECK: __asan_report_store_n +; CHECK: __asan_report_store_n +; CHECK: ret void + + +define void @i40test(i40* %a, i40* %b) nounwind uwtable sanitize_address { + entry: + %t = load i40* %a + store i40 %t, i40* %b, align 8 + ret void +} + +; CHECK: i40test +; CHECK: __asan_report_load_n{{.*}}, i64 5) +; CHECK: __asan_report_load_n{{.*}}, i64 5) +; CHECK: __asan_report_store_n{{.*}}, i64 5) +; CHECK: __asan_report_store_n{{.*}}, i64 5) +; CHECK: ret void + +define void @i80test(i80* %a, i80* %b) nounwind uwtable sanitize_address { + entry: + %t = load i80* %a + store i80 %t, i80* %b, align 8 + ret void +} + +; CHECK: i80test +; CHECK: __asan_report_load_n{{.*}}, i64 10) +; CHECK: __asan_report_load_n{{.*}}, i64 10) +; CHECK: __asan_report_store_n{{.*}}, i64 10) +; CHECK: __asan_report_store_n{{.*}}, i64 10) +; CHECK: ret void + +; asan should not instrument functions with available_externally linkage. +define available_externally i32 @f_available_externally(i32* %a) sanitize_address { +entry: + %tmp1 = load i32* %a + ret i32 %tmp1 +} +; CHECK: @f_available_externally +; CHECK-NOT: __asan_report +; CHECK: ret i32 + + diff --git a/test/Instrumentation/AddressSanitizer/debug_info.ll b/test/Instrumentation/AddressSanitizer/debug_info.ll new file mode 100644 index 000000000000..ec51caeb5868 --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/debug_info.ll @@ -0,0 +1,61 @@ +; RUN: opt < %s -asan -asan-module -S | FileCheck %s + +; Checks that llvm.dbg.declare instructions are updated +; accordingly as we merge allocas. + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define i32 @_Z3zzzi(i32 %p) nounwind uwtable sanitize_address { +entry: + %p.addr = alloca i32, align 4 + %r = alloca i32, align 4 + store i32 %p, i32* %p.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %p.addr}, metadata !10), !dbg !11 + call void @llvm.dbg.declare(metadata !{i32* %r}, metadata !12), !dbg !14 + %0 = load i32* %p.addr, align 4, !dbg !14 + %add = add nsw i32 %0, 1, !dbg !14 + store i32 %add, i32* %r, align 4, !dbg !14 + %1 = load i32* %r, align 4, !dbg !15 + ret i32 %1, !dbg !15 +} + +; CHECK: define i32 @_Z3zzzi +; CHECK: entry: +; Verify that llvm.dbg.declare calls are in the entry basic block. +; CHECK-NOT: %entry +; CHECK: call void @llvm.dbg.declare(metadata {{.*}}, metadata ![[ARG_ID:[0-9]+]]) +; CHECK-NOT: %entry +; CHECK: call void @llvm.dbg.declare(metadata {{.*}}, metadata ![[VAR_ID:[0-9]+]]) + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"a.cc", metadata !"/usr/local/google/llvm_cmake_clang/tmp/debuginfo", metadata !"clang version 3.3 (trunk 169314)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] [/usr/local/google/llvm_cmake_clang/tmp/debuginfo/a.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !6, metadata !"zzz", metadata !"zzz", metadata !"_Z3zzzi", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_Z3zzzi, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [zzz] +!6 = metadata !{i32 786473, metadata !16} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !9} +!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786689, metadata !5, metadata !"p", metadata !6, i32 16777217, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [p] [line 1] +!11 = metadata !{i32 1, i32 0, metadata !5, null} +!12 = metadata !{i32 786688, metadata !13, metadata !"r", metadata !6, i32 2, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [r] [line 2] + +; Verify that debug descriptors for argument and local variable will be replaced +; with descriptors that end with OpDeref (encoded as 2). +; CHECK: ![[ARG_ID]] = metadata {{.*}} i64 2} ; [ DW_TAG_arg_variable ] [p] [line 1] +; CHECK: ![[VAR_ID]] = metadata {{.*}} i64 2} ; [ DW_TAG_auto_variable ] [r] [line 2] +; Verify that there are no more variable descriptors. +; CHECK-NOT: DW_TAG_arg_variable +; CHECK-NOT: DW_TAG_auto_variable + + +!13 = metadata !{i32 786443, metadata !5, i32 1, i32 0, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/llvm_cmake_clang/tmp/debuginfo/a.cc] +!14 = metadata !{i32 2, i32 0, metadata !13, null} +!15 = metadata !{i32 3, i32 0, metadata !13, null} +!16 = metadata !{metadata !"a.cc", metadata !"/usr/local/google/llvm_cmake_clang/tmp/debuginfo"} diff --git a/test/Instrumentation/AddressSanitizer/different_scale_and_offset.ll b/test/Instrumentation/AddressSanitizer/different_scale_and_offset.ll new file mode 100644 index 000000000000..b0371769be05 --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/different_scale_and_offset.ll @@ -0,0 +1,41 @@ +; Test non-default shadow mapping scale and offset. +; +; RUN: opt < %s -asan -asan-mapping-scale=2 -asan-mapping-offset-log=0 -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-unknown-linux-gnu" + +; Test that ASan tells scale and offset to runtime. +; CHECK: @__asan_mapping_offset = linkonce_odr constant i64 0 +; CHECK: @__asan_mapping_scale = linkonce_odr constant i64 2 + +define i32 @test_load(i32* %a) sanitize_address { +; CHECK: @test_load +; CHECK-NOT: load +; CHECK: %[[LOAD_ADDR:[^ ]*]] = ptrtoint i32* %a to i64 +; CHECK: lshr i64 %[[LOAD_ADDR]], 2 + +; No need in shift for zero offset. +; CHECK-NOT: or i64 + +; CHECK: %[[LOAD_SHADOW_PTR:[^ ]*]] = inttoptr +; CHECK: %[[LOAD_SHADOW:[^ ]*]] = load i8* %[[LOAD_SHADOW_PTR]] +; CHECK: icmp ne i8 +; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} + +; No need in slow path for i32 and mapping scale equal to 2. +; CHECK-NOT: and i64 %[[LOAD_ADDR]] +; +; The crash block reports the error. +; CHECK: call void @__asan_report_load4(i64 %[[LOAD_ADDR]]) +; CHECK: unreachable +; +; The actual load. +; CHECK: %tmp1 = load i32* %a +; CHECK: ret i32 %tmp1 + +entry: + %tmp1 = load i32* %a + ret i32 %tmp1 +} + diff --git a/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll b/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll index 28d4ac0c0f58..0928c494154e 100644 --- a/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll +++ b/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll @@ -5,7 +5,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -define void @_Z3barv() uwtable address_safety { +define void @_Z3barv() uwtable sanitize_address { entry: %a = alloca i32, align 4 call void @_Z3fooPi(i32* %a) @@ -14,6 +14,7 @@ entry: declare void @_Z3fooPi(i32*) ; We create one global string constant for the stack frame above. +; It should have unnamed_addr and align 1. ; Make sure we don't create any other global constants. -; CHECK: = private constant -; CHECK-NOT: = private constant +; CHECK: = private unnamed_addr constant{{.*}}align 1 +; CHECK-NOT: = private unnamed_addr constant diff --git a/test/Instrumentation/AddressSanitizer/instrument-no-return.ll b/test/Instrumentation/AddressSanitizer/instrument-no-return.ll index 80f1b1c74cd1..2d835a34080a 100644 --- a/test/Instrumentation/AddressSanitizer/instrument-no-return.ll +++ b/test/Instrumentation/AddressSanitizer/instrument-no-return.ll @@ -1,17 +1,49 @@ ; RUN: opt < %s -asan -S | FileCheck %s ; AddressSanitizer must insert __asan_handle_no_return -; before every noreturn call. +; before every noreturn call or invoke. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" declare void @MyNoReturnFunc(i32) noreturn -define i32 @_Z5ChildPv(i8* nocapture %arg) uwtable address_safety { +define i32 @Call1(i8* nocapture %arg) uwtable sanitize_address { entry: - call void @MyNoReturnFunc(i32 1) noreturn + call void @MyNoReturnFunc(i32 1) noreturn ; The call insn has noreturn attr. +; CHECK: @Call1 +; CHECK: call void @__asan_handle_no_return +; CHECK-NEXT: call void @MyNoReturnFunc +; CHECK-NEXT: unreachable unreachable } +define i32 @Call2(i8* nocapture %arg) uwtable sanitize_address { +entry: + call void @MyNoReturnFunc(i32 1) ; No noreturn attribure on the call. +; CHECK: @Call2 ; CHECK: call void @__asan_handle_no_return ; CHECK-NEXT: call void @MyNoReturnFunc +; CHECK-NEXT: unreachable + unreachable +} + +declare i32 @__gxx_personality_v0(...) + +define i64 @Invoke1(i8** %esc) nounwind uwtable ssp sanitize_address { +entry: + invoke void @MyNoReturnFunc(i32 1) + to label %invoke.cont unwind label %lpad + +invoke.cont: + ret i64 0 + +lpad: + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + filter [0 x i8*] zeroinitializer + ret i64 1 +} +; CHECK: @Invoke1 +; CHECK: call void @__asan_handle_no_return +; CHECK-NEXT: invoke void @MyNoReturnFunc +; CHECK: ret i64 0 +; CHECK: ret i64 1 diff --git a/test/Instrumentation/AddressSanitizer/instrument_global.ll b/test/Instrumentation/AddressSanitizer/instrument_global.ll index 3d92946087ec..2c183f523feb 100644 --- a/test/Instrumentation/AddressSanitizer/instrument_global.ll +++ b/test/Instrumentation/AddressSanitizer/instrument_global.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -asan -S | FileCheck %s +; RUN: opt < %s -asan -asan-module -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" @xxx = global i32 0, align 4 diff --git a/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll b/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll index 472551654e53..1d00cfacafe4 100644 --- a/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll +++ b/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll @@ -1,11 +1,15 @@ -; RUN: opt < %s -asan -asan-initialization-order -S | FileCheck %s +; RUN: opt < %s -asan -asan-module -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" -@xxx = global i32 0, align 4 +@xxx = internal global i32 0, align 4 ; With dynamic initializer. +@XXX = global i32 0, align 4 ; With dynamic initializer. +@yyy = internal global i32 0, align 4 ; W/o dynamic initializer. +@YYY = global i32 0, align 4 ; W/o dynamic initializer. ; Clang will emit the following metadata identifying @xxx as dynamically ; initialized. !0 = metadata !{i32* @xxx} -!llvm.asan.dynamically_initialized_globals = !{!0} +!1 = metadata !{i32* @XXX} +!llvm.asan.dynamically_initialized_globals = !{!0, !1} define i32 @initializer() uwtable { entry: @@ -19,7 +23,7 @@ entry: ret void } -define internal void @_GLOBAL__I_a() address_safety section ".text.startup" { +define internal void @_GLOBAL__I_a() sanitize_address section ".text.startup" { entry: call void @__cxx_global_var_init() ret void @@ -34,3 +38,40 @@ entry: ; CHECK: call void @__cxx_global_var_init ; CHECK: call void @__asan_after_dynamic_init ; CHECK: ret + +; Check that xxx is instrumented. +define void @touch_xxx() sanitize_address { + store i32 0, i32 *@xxx, align 4 + ret void +; CHECK: define void @touch_xxx +; CHECK: call void @__asan_report_store4 +; CHECK: ret void +} + +; Check that XXX is instrumented. +define void @touch_XXX() sanitize_address { + store i32 0, i32 *@XXX, align 4 + ret void +; CHECK: define void @touch_XXX +; CHECK: call void @__asan_report_store4 +; CHECK: ret void +} + + +; Check that yyy is NOT instrumented (as it does not have dynamic initializer). +define void @touch_yyy() sanitize_address { + store i32 0, i32 *@yyy, align 4 + ret void +; CHECK: define void @touch_yyy +; CHECK-NOT: call void @__asan_report_store4 +; CHECK: ret void +} + +; Check that YYY is NOT instrumented (as it does not have dynamic initializer). +define void @touch_YYY() sanitize_address { + store i32 0, i32 *@YYY, align 4 + ret void +; CHECK: define void @touch_YYY +; CHECK-NOT: call void @__asan_report_store4 +; CHECK: ret void +} diff --git a/test/Instrumentation/AddressSanitizer/instrument_load_then_store.ll b/test/Instrumentation/AddressSanitizer/instrument_load_then_store.ll index 633bf9ae78c0..23cf6d28ec6c 100644 --- a/test/Instrumentation/AddressSanitizer/instrument_load_then_store.ll +++ b/test/Instrumentation/AddressSanitizer/instrument_load_then_store.ll @@ -4,7 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" -define void @IncrementMe(i32* %a) address_safety { +define void @IncrementMe(i32* %a) sanitize_address { entry: %tmp1 = load i32* %a, align 4 %tmp2 = add i32 %tmp1, 1 diff --git a/test/Instrumentation/AddressSanitizer/lifetime.ll b/test/Instrumentation/AddressSanitizer/lifetime.ll new file mode 100644 index 000000000000..334872865f1a --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/lifetime.ll @@ -0,0 +1,84 @@ +; Test hanlding of llvm.lifetime intrinsics. +; RUN: opt < %s -asan -asan-check-lifetime -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind +declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind + +define void @lifetime_no_size() sanitize_address { +entry: + %i = alloca i32, align 4 + %i.ptr = bitcast i32* %i to i8* + call void @llvm.lifetime.start(i64 -1, i8* %i.ptr) + call void @llvm.lifetime.end(i64 -1, i8* %i.ptr) + +; Check that lifetime with no size are ignored. +; CHECK: @lifetime_no_size +; CHECK-NOT: @__asan_poison_stack_memory +; CHECK-NOT: @__asan_unpoison_stack_memory +; CHECK: ret void + ret void +} + +; Generic case of lifetime analysis. +define void @lifetime() sanitize_address { + ; CHECK: @lifetime + + ; Regular variable lifetime intrinsics. + %i = alloca i32, align 4 + %i.ptr = bitcast i32* %i to i8* + call void @llvm.lifetime.start(i64 3, i8* %i.ptr) + ; Memory is unpoisoned at llvm.lifetime.start + ; CHECK: %[[VAR:[^ ]*]] = ptrtoint i32* %{{[^ ]+}} to i64 + ; CHECK-NEXT: call void @__asan_unpoison_stack_memory(i64 %[[VAR]], i64 3) + call void @llvm.lifetime.end(i64 4, i8* %i.ptr) + call void @llvm.lifetime.end(i64 2, i8* %i.ptr) + ; Memory is poisoned at every call to llvm.lifetime.end + ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 4) + ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 2) + + ; Lifetime intrinsics for array. + %arr = alloca [10 x i32], align 16 + %arr.ptr = bitcast [10 x i32]* %arr to i8* + call void @llvm.lifetime.start(i64 40, i8* %arr.ptr) + ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 40) + call void @llvm.lifetime.end(i64 40, i8* %arr.ptr) + ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 40) + + ; One more lifetime start/end for the same variable %i. + call void @llvm.lifetime.start(i64 4, i8* %i.ptr) + ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 4) + call void @llvm.lifetime.end(i64 4, i8* %i.ptr) + ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 4) + + ; Memory is unpoisoned at function exit (only once). + ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 {{.*}}) + ; CHECK-NOT: @__asan_unpoison_stack_memory + ; CHECK: ret void + ret void +} + +; Check that arguments of lifetime may come from phi nodes. +define void @phi_args(i1 %x) sanitize_address { + ; CHECK: @phi_args + +entry: + %i = alloca i64, align 4 + %i.ptr = bitcast i64* %i to i8* + call void @llvm.lifetime.start(i64 8, i8* %i.ptr) + ; CHECK: __asan_unpoison_stack_memory + br i1 %x, label %bb0, label %bb1 + +bb0: + %i.ptr2 = bitcast i64* %i to i8* + br label %bb1 + +bb1: + %i.phi = phi i8* [ %i.ptr, %entry ], [ %i.ptr2, %bb0 ] + call void @llvm.lifetime.end(i64 8, i8* %i.phi) + ; CHECK: __asan_poison_stack_memory + ; CHECK: ret void + ret void +} diff --git a/test/Instrumentation/AddressSanitizer/test64.ll b/test/Instrumentation/AddressSanitizer/test64.ll index d544d77b93db..6aa5c2885099 100644 --- a/test/Instrumentation/AddressSanitizer/test64.ll +++ b/test/Instrumentation/AddressSanitizer/test64.ll @@ -1,7 +1,7 @@ ; RUN: opt < %s -asan -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" -define i32 @read_4_bytes(i32* %a) address_safety { +define i32 @read_4_bytes(i32* %a) sanitize_address { entry: %tmp1 = load i32* %a, align 4 ret i32 %tmp1 @@ -9,11 +9,11 @@ entry: ; CHECK: @read_4_bytes ; CHECK-NOT: ret ; CHECK: lshr {{.*}} 3 -; Check for ASAN's Offset for 64-bit (2^44) -; CHECK-NEXT: 17592186044416 +; Check for ASAN's Offset for 64-bit (2^44 or 7fff8000) +; CHECK-NEXT: {{17592186044416|2147450880}} ; CHECK: ret -define void @example_atomicrmw(i64* %ptr) nounwind uwtable address_safety { +define void @example_atomicrmw(i64* %ptr) nounwind uwtable sanitize_address { entry: %0 = atomicrmw add i64* %ptr, i64 1 seq_cst ret void @@ -24,7 +24,7 @@ entry: ; CHECK: atomicrmw ; CHECK: ret -define void @example_cmpxchg(i64* %ptr, i64 %compare_to, i64 %new_value) nounwind uwtable address_safety { +define void @example_cmpxchg(i64* %ptr, i64 %compare_to, i64 %new_value) nounwind uwtable sanitize_address { entry: %0 = cmpxchg i64* %ptr, i64 %compare_to, i64 %new_value seq_cst ret void diff --git a/test/Instrumentation/MemorySanitizer/lit.local.cfg b/test/Instrumentation/MemorySanitizer/lit.local.cfg new file mode 100644 index 000000000000..19eebc0ac7ac --- /dev/null +++ b/test/Instrumentation/MemorySanitizer/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.ll', '.c', '.cpp'] diff --git a/test/Instrumentation/MemorySanitizer/msan_basic.ll b/test/Instrumentation/MemorySanitizer/msan_basic.ll new file mode 100644 index 000000000000..1e7a31793dea --- /dev/null +++ b/test/Instrumentation/MemorySanitizer/msan_basic.ll @@ -0,0 +1,625 @@ +; RUN: opt < %s -msan -msan-check-access-address=0 -S | FileCheck %s +; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=1 -S | FileCheck -check-prefix=CHECK-ORIGINS %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" + +; Check the presence of __msan_init +; CHECK: @llvm.global_ctors {{.*}} @__msan_init + +; Check the presence and the linkage type of __msan_track_origins +; CHECK: @__msan_track_origins = weak_odr constant i32 0 + + +; Check instrumentation of stores + +define void @Store(i32* nocapture %p, i32 %x) nounwind uwtable sanitize_memory { +entry: + store i32 %x, i32* %p, align 4 + ret void +} + +; CHECK: @Store +; CHECK: load {{.*}} @__msan_param_tls +; CHECK: store +; CHECK: store +; CHECK: ret void +; CHECK-ORIGINS: @Store +; CHECK-ORIGINS: load {{.*}} @__msan_param_tls +; CHECK-ORIGINS: store +; CHECK-ORIGINS: icmp +; CHECK-ORIGINS: br i1 +; CHECK-ORIGINS: <label> +; CHECK-ORIGINS: store +; CHECK-ORIGINS: br label +; CHECK-ORIGINS: <label> +; CHECK-ORIGINS: store +; CHECK-ORIGINS: ret void + + +; Check instrumentation of aligned stores +; Shadow store has the same alignment as the original store; origin store +; does not specify explicit alignment. + +define void @AlignedStore(i32* nocapture %p, i32 %x) nounwind uwtable sanitize_memory { +entry: + store i32 %x, i32* %p, align 32 + ret void +} + +; CHECK: @AlignedStore +; CHECK: load {{.*}} @__msan_param_tls +; CHECK: store {{.*}} align 32 +; CHECK: store {{.*}} align 32 +; CHECK: ret void +; CHECK-ORIGINS: @AlignedStore +; CHECK-ORIGINS: load {{.*}} @__msan_param_tls +; CHECK-ORIGINS: store {{.*}} align 32 +; CHECK-ORIGINS: icmp +; CHECK-ORIGINS: br i1 +; CHECK-ORIGINS: <label> +; CHECK-ORIGINS: store {{.*}} align 32 +; CHECK-ORIGINS: br label +; CHECK-ORIGINS: <label> +; CHECK-ORIGINS: store {{.*}} align 32 +; CHECK-ORIGINS: ret void + + +; load followed by cmp: check that we load the shadow and call __msan_warning. +define void @LoadAndCmp(i32* nocapture %a) nounwind uwtable sanitize_memory { +entry: + %0 = load i32* %a, align 4 + %tobool = icmp eq i32 %0, 0 + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + tail call void (...)* @foo() nounwind + br label %if.end + +if.end: ; preds = %entry, %if.then + ret void +} + +declare void @foo(...) + +; CHECK: @LoadAndCmp +; CHECK: = load +; CHECK: = load +; CHECK: call void @__msan_warning_noreturn() +; CHECK-NEXT: call void asm sideeffect +; CHECK-NEXT: unreachable +; CHECK: ret void + +; Check that we store the shadow for the retval. +define i32 @ReturnInt() nounwind uwtable readnone sanitize_memory { +entry: + ret i32 123 +} + +; CHECK: @ReturnInt +; CHECK: store i32 0,{{.*}}__msan_retval_tls +; CHECK: ret i32 + +; Check that we get the shadow for the retval. +define void @CopyRetVal(i32* nocapture %a) nounwind uwtable sanitize_memory { +entry: + %call = tail call i32 @ReturnInt() nounwind + store i32 %call, i32* %a, align 4 + ret void +} + +; CHECK: @CopyRetVal +; CHECK: load{{.*}}__msan_retval_tls +; CHECK: store +; CHECK: store +; CHECK: ret void + + +; Check that we generate PHIs for shadow. +define void @FuncWithPhi(i32* nocapture %a, i32* %b, i32* nocapture %c) nounwind uwtable sanitize_memory { +entry: + %tobool = icmp eq i32* %b, null + br i1 %tobool, label %if.else, label %if.then + + if.then: ; preds = %entry + %0 = load i32* %b, align 4 + br label %if.end + + if.else: ; preds = %entry + %1 = load i32* %c, align 4 + br label %if.end + + if.end: ; preds = %if.else, %if.then + %t.0 = phi i32 [ %0, %if.then ], [ %1, %if.else ] + store i32 %t.0, i32* %a, align 4 + ret void +} + +; CHECK: @FuncWithPhi +; CHECK: = phi +; CHECK-NEXT: = phi +; CHECK: store +; CHECK: store +; CHECK: ret void + +; Compute shadow for "x << 10" +define void @ShlConst(i32* nocapture %x) nounwind uwtable sanitize_memory { +entry: + %0 = load i32* %x, align 4 + %1 = shl i32 %0, 10 + store i32 %1, i32* %x, align 4 + ret void +} + +; CHECK: @ShlConst +; CHECK: = load +; CHECK: = load +; CHECK: shl +; CHECK: shl +; CHECK: store +; CHECK: store +; CHECK: ret void + +; Compute shadow for "10 << x": it should have 'sext i1'. +define void @ShlNonConst(i32* nocapture %x) nounwind uwtable sanitize_memory { +entry: + %0 = load i32* %x, align 4 + %1 = shl i32 10, %0 + store i32 %1, i32* %x, align 4 + ret void +} + +; CHECK: @ShlNonConst +; CHECK: = load +; CHECK: = load +; CHECK: = sext i1 +; CHECK: store +; CHECK: store +; CHECK: ret void + +; SExt +define void @SExt(i32* nocapture %a, i16* nocapture %b) nounwind uwtable sanitize_memory { +entry: + %0 = load i16* %b, align 2 + %1 = sext i16 %0 to i32 + store i32 %1, i32* %a, align 4 + ret void +} + +; CHECK: @SExt +; CHECK: = load +; CHECK: = load +; CHECK: = sext +; CHECK: = sext +; CHECK: store +; CHECK: store +; CHECK: ret void + + +; memset +define void @MemSet(i8* nocapture %x) nounwind uwtable sanitize_memory { +entry: + call void @llvm.memset.p0i8.i64(i8* %x, i8 42, i64 10, i32 1, i1 false) + ret void +} + +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind + +; CHECK: @MemSet +; CHECK: call i8* @__msan_memset +; CHECK: ret void + + +; memcpy +define void @MemCpy(i8* nocapture %x, i8* nocapture %y) nounwind uwtable sanitize_memory { +entry: + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %x, i8* %y, i64 10, i32 1, i1 false) + ret void +} + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind + +; CHECK: @MemCpy +; CHECK: call i8* @__msan_memcpy +; CHECK: ret void + + +; memmove is lowered to a call +define void @MemMove(i8* nocapture %x, i8* nocapture %y) nounwind uwtable sanitize_memory { +entry: + call void @llvm.memmove.p0i8.p0i8.i64(i8* %x, i8* %y, i64 10, i32 1, i1 false) + ret void +} + +declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind + +; CHECK: @MemMove +; CHECK: call i8* @__msan_memmove +; CHECK: ret void + + +; Check that we propagate shadow for "select" + +define i32 @Select(i32 %a, i32 %b, i32 %c) nounwind uwtable readnone sanitize_memory { +entry: + %tobool = icmp ne i32 %c, 0 + %cond = select i1 %tobool, i32 %a, i32 %b + ret i32 %cond +} + +; CHECK: @Select +; CHECK: select +; CHECK-NEXT: select +; CHECK: ret i32 + + +; Check that we propagate origin for "select" with vector condition. +; Select condition is flattened to i1, which is then used to select one of the +; argument origins. + +define <8 x i16> @SelectVector(<8 x i16> %a, <8 x i16> %b, <8 x i1> %c) nounwind uwtable readnone sanitize_memory { +entry: + %cond = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b + ret <8 x i16> %cond +} + +; CHECK-ORIGINS: @SelectVector +; CHECK-ORIGINS: bitcast <8 x i1> {{.*}} to i8 +; CHECK-ORIGINS: icmp ne i8 +; CHECK-ORIGINS: select i1 +; CHECK-ORIGINS: ret <8 x i16> + + +define i8* @IntToPtr(i64 %x) nounwind uwtable readnone sanitize_memory { +entry: + %0 = inttoptr i64 %x to i8* + ret i8* %0 +} + +; CHECK: @IntToPtr +; CHECK: load i64*{{.*}}__msan_param_tls +; CHECK-NEXT: inttoptr +; CHECK-NEXT: store i64{{.*}}__msan_retval_tls +; CHECK: ret i8 + + +define i8* @IntToPtr_ZExt(i16 %x) nounwind uwtable readnone sanitize_memory { +entry: + %0 = inttoptr i16 %x to i8* + ret i8* %0 +} + +; CHECK: @IntToPtr_ZExt +; CHECK: zext +; CHECK-NEXT: inttoptr +; CHECK: ret i8 + + +; Check that we insert exactly one check on udiv +; (2nd arg shadow is checked, 1st arg shadow is propagated) + +define i32 @Div(i32 %a, i32 %b) nounwind uwtable readnone sanitize_memory { +entry: + %div = udiv i32 %a, %b + ret i32 %div +} + +; CHECK: @Div +; CHECK: icmp +; CHECK: call void @__msan_warning +; CHECK-NOT: icmp +; CHECK: udiv +; CHECK-NOT: icmp +; CHECK: ret i32 + + +; Check that we propagate shadow for x<0, x>=0, etc (i.e. sign bit tests) + +define zeroext i1 @ICmpSLT(i32 %x) nounwind uwtable readnone sanitize_memory { + %1 = icmp slt i32 %x, 0 + ret i1 %1 +} + +; CHECK: @ICmpSLT +; CHECK: icmp slt +; CHECK-NOT: call void @__msan_warning +; CHECK: icmp slt +; CHECK-NOT: call void @__msan_warning +; CHECK: ret i1 + +define zeroext i1 @ICmpSGE(i32 %x) nounwind uwtable readnone sanitize_memory { + %1 = icmp sge i32 %x, 0 + ret i1 %1 +} + +; CHECK: @ICmpSGE +; CHECK: icmp slt +; CHECK-NOT: call void @__msan_warning +; CHECK: icmp sge +; CHECK-NOT: call void @__msan_warning +; CHECK: ret i1 + +define zeroext i1 @ICmpSGT(i32 %x) nounwind uwtable readnone sanitize_memory { + %1 = icmp sgt i32 0, %x + ret i1 %1 +} + +; CHECK: @ICmpSGT +; CHECK: icmp slt +; CHECK-NOT: call void @__msan_warning +; CHECK: icmp sgt +; CHECK-NOT: call void @__msan_warning +; CHECK: ret i1 + +define zeroext i1 @ICmpSLE(i32 %x) nounwind uwtable readnone sanitize_memory { + %1 = icmp sle i32 0, %x + ret i1 %1 +} + +; CHECK: @ICmpSLE +; CHECK: icmp slt +; CHECK-NOT: call void @__msan_warning +; CHECK: icmp sle +; CHECK-NOT: call void @__msan_warning +; CHECK: ret i1 + + +; Check that we propagate shadow for x<0, x>=0, etc (i.e. sign bit tests) +; of the vector arguments. + +define <2 x i1> @ICmpSLT_vector(<2 x i32*> %x) nounwind uwtable readnone sanitize_memory { + %1 = icmp slt <2 x i32*> %x, zeroinitializer + ret <2 x i1> %1 +} + +; CHECK: @ICmpSLT_vector +; CHECK: icmp slt <2 x i64> +; CHECK-NOT: call void @__msan_warning +; CHECK: icmp slt <2 x i32*> +; CHECK-NOT: call void @__msan_warning +; CHECK: ret <2 x i1> + + +; Check that we propagate shadow for unsigned relational comparisons with +; constants + +define zeroext i1 @ICmpUGTConst(i32 %x) nounwind uwtable readnone sanitize_memory { +entry: + %cmp = icmp ugt i32 %x, 7 + ret i1 %cmp +} + +; CHECK: @ICmpUGTConst +; CHECK: icmp ugt i32 +; CHECK-NOT: call void @__msan_warning +; CHECK: icmp ugt i32 +; CHECK-NOT: call void @__msan_warning +; CHECK: icmp ugt i32 +; CHECK-NOT: call void @__msan_warning +; CHECK: ret i1 + + +; Check that loads of shadow have the same aligment as the original loads. +; Check that loads of origin have the aligment of max(4, original alignment). + +define i32 @ShadowLoadAlignmentLarge() nounwind uwtable sanitize_memory { + %y = alloca i32, align 64 + %1 = load volatile i32* %y, align 64 + ret i32 %1 +} + +; CHECK: @ShadowLoadAlignmentLarge +; CHECK: load i32* {{.*}} align 64 +; CHECK: load volatile i32* {{.*}} align 64 +; CHECK: ret i32 + +define i32 @ShadowLoadAlignmentSmall() nounwind uwtable sanitize_memory { + %y = alloca i32, align 2 + %1 = load volatile i32* %y, align 2 + ret i32 %1 +} + +; CHECK: @ShadowLoadAlignmentSmall +; CHECK: load i32* {{.*}} align 2 +; CHECK: load volatile i32* {{.*}} align 2 +; CHECK: ret i32 + +; CHECK-ORIGINS: @ShadowLoadAlignmentSmall +; CHECK-ORIGINS: load i32* {{.*}} align 2 +; CHECK-ORIGINS: load i32* {{.*}} align 4 +; CHECK-ORIGINS: load volatile i32* {{.*}} align 2 +; CHECK-ORIGINS: ret i32 + + +; Test vector manipulation instructions. +; Check that the same bit manipulation is applied to the shadow values. +; Check that there is a zero test of the shadow of %idx argument, where present. + +define i32 @ExtractElement(<4 x i32> %vec, i32 %idx) sanitize_memory { + %x = extractelement <4 x i32> %vec, i32 %idx + ret i32 %x +} + +; CHECK: @ExtractElement +; CHECK: extractelement +; CHECK: call void @__msan_warning +; CHECK: extractelement +; CHECK: ret i32 + +define <4 x i32> @InsertElement(<4 x i32> %vec, i32 %idx, i32 %x) sanitize_memory { + %vec1 = insertelement <4 x i32> %vec, i32 %x, i32 %idx + ret <4 x i32> %vec1 +} + +; CHECK: @InsertElement +; CHECK: insertelement +; CHECK: call void @__msan_warning +; CHECK: insertelement +; CHECK: ret <4 x i32> + +define <4 x i32> @ShuffleVector(<4 x i32> %vec, <4 x i32> %vec1) sanitize_memory { + %vec2 = shufflevector <4 x i32> %vec, <4 x i32> %vec1, + <4 x i32> <i32 0, i32 4, i32 1, i32 5> + ret <4 x i32> %vec2 +} + +; CHECK: @ShuffleVector +; CHECK: shufflevector +; CHECK-NOT: call void @__msan_warning +; CHECK: shufflevector +; CHECK: ret <4 x i32> + + +; Test bswap intrinsic instrumentation +define i32 @BSwap(i32 %x) nounwind uwtable readnone sanitize_memory { + %y = tail call i32 @llvm.bswap.i32(i32 %x) + ret i32 %y +} + +declare i32 @llvm.bswap.i32(i32) nounwind readnone + +; CHECK: @BSwap +; CHECK-NOT: call void @__msan_warning +; CHECK: @llvm.bswap.i32 +; CHECK-NOT: call void @__msan_warning +; CHECK: @llvm.bswap.i32 +; CHECK-NOT: call void @__msan_warning +; CHECK: ret i32 + + +; Store intrinsic. + +define void @StoreIntrinsic(i8* %p, <4 x float> %x) nounwind uwtable sanitize_memory { + call void @llvm.x86.sse.storeu.ps(i8* %p, <4 x float> %x) + ret void +} + +declare void @llvm.x86.sse.storeu.ps(i8*, <4 x float>) nounwind + +; CHECK: @StoreIntrinsic +; CHECK-NOT: br +; CHECK-NOT: = or +; CHECK: store <4 x i32> {{.*}} align 1 +; CHECK: call void @llvm.x86.sse.storeu.ps +; CHECK: ret void + + +; Load intrinsic. + +define <16 x i8> @LoadIntrinsic(i8* %p) nounwind uwtable sanitize_memory { + %call = call <16 x i8> @llvm.x86.sse3.ldu.dq(i8* %p) + ret <16 x i8> %call +} + +declare <16 x i8> @llvm.x86.sse3.ldu.dq(i8* %p) nounwind + +; CHECK: @LoadIntrinsic +; CHECK: load <16 x i8>* {{.*}} align 1 +; CHECK-NOT: br +; CHECK-NOT: = or +; CHECK: call <16 x i8> @llvm.x86.sse3.ldu.dq +; CHECK: store <16 x i8> {{.*}} @__msan_retval_tls +; CHECK: ret <16 x i8> + +; CHECK-ORIGINS: @LoadIntrinsic +; CHECK-ORIGINS: [[ORIGIN:%[01-9a-z]+]] = load i32* {{.*}} +; CHECK-ORIGINS: call <16 x i8> @llvm.x86.sse3.ldu.dq +; CHECK-ORIGINS: store i32 {{.*}}[[ORIGIN]], i32* @__msan_retval_origin_tls +; CHECK-ORIGINS: ret <16 x i8> + + +; Simple NoMem intrinsic +; Check that shadow is OR'ed, and origin is Select'ed +; And no shadow checks! + +define <8 x i16> @Paddsw128(<8 x i16> %a, <8 x i16> %b) nounwind uwtable sanitize_memory { + %call = call <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %a, <8 x i16> %b) + ret <8 x i16> %call +} + +declare <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %a, <8 x i16> %b) nounwind + +; CHECK: @Paddsw128 +; CHECK-NEXT: load <8 x i16>* {{.*}} @__msan_param_tls +; CHECK-NEXT: load <8 x i16>* {{.*}} @__msan_param_tls +; CHECK-NEXT: = or <8 x i16> +; CHECK-NEXT: call <8 x i16> @llvm.x86.sse2.padds.w +; CHECK-NEXT: store <8 x i16> {{.*}} @__msan_retval_tls +; CHECK-NEXT: ret <8 x i16> + +; CHECK-ORIGINS: @Paddsw128 +; CHECK-ORIGINS: load i32* {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS: load i32* {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS: = bitcast <8 x i16> {{.*}} to i128 +; CHECK-ORIGINS-NEXT: = icmp ne i128 {{.*}}, 0 +; CHECK-ORIGINS-NEXT: = select i1 {{.*}}, i32 {{.*}}, i32 +; CHECK-ORIGINS: call <8 x i16> @llvm.x86.sse2.padds.w +; CHECK-ORIGINS: store i32 {{.*}} @__msan_retval_origin_tls +; CHECK-ORIGINS: ret <8 x i16> + + +; Test handling of vectors of pointers. +; Check that shadow of such vector is a vector of integers. + +define <8 x i8*> @VectorOfPointers(<8 x i8*>* %p) nounwind uwtable sanitize_memory { + %x = load <8 x i8*>* %p + ret <8 x i8*> %x +} + +; CHECK: @VectorOfPointers +; CHECK: load <8 x i64>* +; CHECK: load <8 x i8*>* +; CHECK: store <8 x i64> {{.*}} @__msan_retval_tls +; CHECK: ret <8 x i8*> + +; Test handling of va_copy. + +declare void @llvm.va_copy(i8*, i8*) nounwind + +define void @VACopy(i8* %p1, i8* %p2) nounwind uwtable sanitize_memory { + call void @llvm.va_copy(i8* %p1, i8* %p2) nounwind + ret void +} + +; CHECK: @VACopy +; CHECK: call void @llvm.memset.p0i8.i64({{.*}}, i8 0, i64 24, i32 8, i1 false) +; CHECK: ret void + + +; Test handling of volatile stores. +; Check that MemorySanitizer does not add a check of the value being stored. + +define void @VolatileStore(i32* nocapture %p, i32 %x) nounwind uwtable sanitize_memory { +entry: + store volatile i32 %x, i32* %p, align 4 + ret void +} + +; CHECK: @VolatileStore +; CHECK-NOT: @__msan_warning +; CHECK: ret void + + +; Test that checks are omitted but shadow propagation is kept if +; sanitize_memory attribute is missing. + +define i32 @NoSanitizeMemory(i32 %x) uwtable { +entry: + %tobool = icmp eq i32 %x, 0 + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + tail call void @bar() + br label %if.end + +if.end: ; preds = %entry, %if.then + ret i32 %x +} + +declare void @bar() + +; CHECK: @NoSanitizeMemory +; CHECK-NOT: @__msan_warning +; CHECK: load i32* {{.*}} @__msan_param_tls +; CHECK-NOT: @__msan_warning +; CHECK: store {{.*}} @__msan_retval_tls +; CHECK-NOT: @__msan_warning +; CHECK: ret i32 diff --git a/test/Instrumentation/MemorySanitizer/unreachable.ll b/test/Instrumentation/MemorySanitizer/unreachable.ll new file mode 100644 index 000000000000..c8130717c7da --- /dev/null +++ b/test/Instrumentation/MemorySanitizer/unreachable.ll @@ -0,0 +1,39 @@ +; RUN: opt < %s -msan -S | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + + +; Test that MemorySanitizer correctly handles unreachable blocks. + +define i32 @Func(i32* %p) nounwind uwtable { +entry: + br label %exit + +unreachable: + %x = load i32* %p + br label %exit + +exit: + %z = phi i32 [ 42, %entry ], [ %x, %unreachable ] + ret i32 %z +} + +; CHECK: @Func +; CHECK: store i32 0, {{.*}} @__msan_retval_tls +; CHECK: ret i32 42 + + +define i32 @UnreachableLoop() nounwind uwtable { +entry: + ret i32 0 + +zzz: + br label %xxx + +xxx: + br label %zzz +} + +; CHECK: @UnreachableLoop +; CHECK: store i32 0, {{.*}} @__msan_retval_tls +; CHECK: ret i32 0 diff --git a/test/Instrumentation/ThreadSanitizer/atomic.ll b/test/Instrumentation/ThreadSanitizer/atomic.ll index 107dbdc0f227..70b6cbbf3105 100644 --- a/test/Instrumentation/ThreadSanitizer/atomic.ll +++ b/test/Instrumentation/ThreadSanitizer/atomic.ll @@ -114,6 +114,14 @@ entry: ; CHECK: atomic8_xor_monotonic ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 0) +define void @atomic8_nand_monotonic(i8* %a) nounwind uwtable { +entry: + atomicrmw nand i8* %a, i8 0 monotonic + ret void +} +; CHECK: atomic8_nand_monotonic +; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 0) + define void @atomic8_xchg_acquire(i8* %a) nounwind uwtable { entry: atomicrmw xchg i8* %a, i8 0 acquire @@ -162,6 +170,14 @@ entry: ; CHECK: atomic8_xor_acquire ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 2) +define void @atomic8_nand_acquire(i8* %a) nounwind uwtable { +entry: + atomicrmw nand i8* %a, i8 0 acquire + ret void +} +; CHECK: atomic8_nand_acquire +; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 2) + define void @atomic8_xchg_release(i8* %a) nounwind uwtable { entry: atomicrmw xchg i8* %a, i8 0 release @@ -210,6 +226,14 @@ entry: ; CHECK: atomic8_xor_release ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 3) +define void @atomic8_nand_release(i8* %a) nounwind uwtable { +entry: + atomicrmw nand i8* %a, i8 0 release + ret void +} +; CHECK: atomic8_nand_release +; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 3) + define void @atomic8_xchg_acq_rel(i8* %a) nounwind uwtable { entry: atomicrmw xchg i8* %a, i8 0 acq_rel @@ -258,6 +282,14 @@ entry: ; CHECK: atomic8_xor_acq_rel ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 4) +define void @atomic8_nand_acq_rel(i8* %a) nounwind uwtable { +entry: + atomicrmw nand i8* %a, i8 0 acq_rel + ret void +} +; CHECK: atomic8_nand_acq_rel +; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 4) + define void @atomic8_xchg_seq_cst(i8* %a) nounwind uwtable { entry: atomicrmw xchg i8* %a, i8 0 seq_cst @@ -306,13 +338,21 @@ entry: ; CHECK: atomic8_xor_seq_cst ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 5) +define void @atomic8_nand_seq_cst(i8* %a) nounwind uwtable { +entry: + atomicrmw nand i8* %a, i8 0 seq_cst + ret void +} +; CHECK: atomic8_nand_seq_cst +; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 5) + define void @atomic8_cas_monotonic(i8* %a) nounwind uwtable { entry: cmpxchg i8* %a, i8 0, i8 1 monotonic ret void } ; CHECK: atomic8_cas_monotonic -; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 0) +; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 0, i32 0) define void @atomic8_cas_acquire(i8* %a) nounwind uwtable { entry: @@ -320,7 +360,7 @@ entry: ret void } ; CHECK: atomic8_cas_acquire -; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 2) +; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 2, i32 2) define void @atomic8_cas_release(i8* %a) nounwind uwtable { entry: @@ -328,7 +368,7 @@ entry: ret void } ; CHECK: atomic8_cas_release -; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 3) +; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 3, i32 0) define void @atomic8_cas_acq_rel(i8* %a) nounwind uwtable { entry: @@ -336,7 +376,7 @@ entry: ret void } ; CHECK: atomic8_cas_acq_rel -; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 4) +; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 4, i32 2) define void @atomic8_cas_seq_cst(i8* %a) nounwind uwtable { entry: @@ -344,7 +384,7 @@ entry: ret void } ; CHECK: atomic8_cas_seq_cst -; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 5) +; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 5, i32 5) define i16 @atomic16_load_unordered(i16* %a) nounwind uwtable { entry: @@ -458,6 +498,14 @@ entry: ; CHECK: atomic16_xor_monotonic ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 0) +define void @atomic16_nand_monotonic(i16* %a) nounwind uwtable { +entry: + atomicrmw nand i16* %a, i16 0 monotonic + ret void +} +; CHECK: atomic16_nand_monotonic +; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 0) + define void @atomic16_xchg_acquire(i16* %a) nounwind uwtable { entry: atomicrmw xchg i16* %a, i16 0 acquire @@ -506,6 +554,14 @@ entry: ; CHECK: atomic16_xor_acquire ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 2) +define void @atomic16_nand_acquire(i16* %a) nounwind uwtable { +entry: + atomicrmw nand i16* %a, i16 0 acquire + ret void +} +; CHECK: atomic16_nand_acquire +; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 2) + define void @atomic16_xchg_release(i16* %a) nounwind uwtable { entry: atomicrmw xchg i16* %a, i16 0 release @@ -554,6 +610,14 @@ entry: ; CHECK: atomic16_xor_release ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 3) +define void @atomic16_nand_release(i16* %a) nounwind uwtable { +entry: + atomicrmw nand i16* %a, i16 0 release + ret void +} +; CHECK: atomic16_nand_release +; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 3) + define void @atomic16_xchg_acq_rel(i16* %a) nounwind uwtable { entry: atomicrmw xchg i16* %a, i16 0 acq_rel @@ -602,6 +666,14 @@ entry: ; CHECK: atomic16_xor_acq_rel ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 4) +define void @atomic16_nand_acq_rel(i16* %a) nounwind uwtable { +entry: + atomicrmw nand i16* %a, i16 0 acq_rel + ret void +} +; CHECK: atomic16_nand_acq_rel +; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 4) + define void @atomic16_xchg_seq_cst(i16* %a) nounwind uwtable { entry: atomicrmw xchg i16* %a, i16 0 seq_cst @@ -650,13 +722,21 @@ entry: ; CHECK: atomic16_xor_seq_cst ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 5) +define void @atomic16_nand_seq_cst(i16* %a) nounwind uwtable { +entry: + atomicrmw nand i16* %a, i16 0 seq_cst + ret void +} +; CHECK: atomic16_nand_seq_cst +; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 5) + define void @atomic16_cas_monotonic(i16* %a) nounwind uwtable { entry: cmpxchg i16* %a, i16 0, i16 1 monotonic ret void } ; CHECK: atomic16_cas_monotonic -; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 0) +; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 0, i32 0) define void @atomic16_cas_acquire(i16* %a) nounwind uwtable { entry: @@ -664,7 +744,7 @@ entry: ret void } ; CHECK: atomic16_cas_acquire -; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 2) +; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 2, i32 2) define void @atomic16_cas_release(i16* %a) nounwind uwtable { entry: @@ -672,7 +752,7 @@ entry: ret void } ; CHECK: atomic16_cas_release -; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 3) +; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 3, i32 0) define void @atomic16_cas_acq_rel(i16* %a) nounwind uwtable { entry: @@ -680,7 +760,7 @@ entry: ret void } ; CHECK: atomic16_cas_acq_rel -; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 4) +; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 4, i32 2) define void @atomic16_cas_seq_cst(i16* %a) nounwind uwtable { entry: @@ -688,7 +768,7 @@ entry: ret void } ; CHECK: atomic16_cas_seq_cst -; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 5) +; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 5, i32 5) define i32 @atomic32_load_unordered(i32* %a) nounwind uwtable { entry: @@ -802,6 +882,14 @@ entry: ; CHECK: atomic32_xor_monotonic ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 0) +define void @atomic32_nand_monotonic(i32* %a) nounwind uwtable { +entry: + atomicrmw nand i32* %a, i32 0 monotonic + ret void +} +; CHECK: atomic32_nand_monotonic +; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 0) + define void @atomic32_xchg_acquire(i32* %a) nounwind uwtable { entry: atomicrmw xchg i32* %a, i32 0 acquire @@ -850,6 +938,14 @@ entry: ; CHECK: atomic32_xor_acquire ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 2) +define void @atomic32_nand_acquire(i32* %a) nounwind uwtable { +entry: + atomicrmw nand i32* %a, i32 0 acquire + ret void +} +; CHECK: atomic32_nand_acquire +; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 2) + define void @atomic32_xchg_release(i32* %a) nounwind uwtable { entry: atomicrmw xchg i32* %a, i32 0 release @@ -898,6 +994,14 @@ entry: ; CHECK: atomic32_xor_release ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 3) +define void @atomic32_nand_release(i32* %a) nounwind uwtable { +entry: + atomicrmw nand i32* %a, i32 0 release + ret void +} +; CHECK: atomic32_nand_release +; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 3) + define void @atomic32_xchg_acq_rel(i32* %a) nounwind uwtable { entry: atomicrmw xchg i32* %a, i32 0 acq_rel @@ -946,6 +1050,14 @@ entry: ; CHECK: atomic32_xor_acq_rel ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 4) +define void @atomic32_nand_acq_rel(i32* %a) nounwind uwtable { +entry: + atomicrmw nand i32* %a, i32 0 acq_rel + ret void +} +; CHECK: atomic32_nand_acq_rel +; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 4) + define void @atomic32_xchg_seq_cst(i32* %a) nounwind uwtable { entry: atomicrmw xchg i32* %a, i32 0 seq_cst @@ -994,13 +1106,21 @@ entry: ; CHECK: atomic32_xor_seq_cst ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 5) +define void @atomic32_nand_seq_cst(i32* %a) nounwind uwtable { +entry: + atomicrmw nand i32* %a, i32 0 seq_cst + ret void +} +; CHECK: atomic32_nand_seq_cst +; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 5) + define void @atomic32_cas_monotonic(i32* %a) nounwind uwtable { entry: cmpxchg i32* %a, i32 0, i32 1 monotonic ret void } ; CHECK: atomic32_cas_monotonic -; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 0) +; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 0, i32 0) define void @atomic32_cas_acquire(i32* %a) nounwind uwtable { entry: @@ -1008,7 +1128,7 @@ entry: ret void } ; CHECK: atomic32_cas_acquire -; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 2) +; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 2, i32 2) define void @atomic32_cas_release(i32* %a) nounwind uwtable { entry: @@ -1016,7 +1136,7 @@ entry: ret void } ; CHECK: atomic32_cas_release -; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 3) +; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 3, i32 0) define void @atomic32_cas_acq_rel(i32* %a) nounwind uwtable { entry: @@ -1024,7 +1144,7 @@ entry: ret void } ; CHECK: atomic32_cas_acq_rel -; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 4) +; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 4, i32 2) define void @atomic32_cas_seq_cst(i32* %a) nounwind uwtable { entry: @@ -1032,7 +1152,7 @@ entry: ret void } ; CHECK: atomic32_cas_seq_cst -; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 5) +; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 5, i32 5) define i64 @atomic64_load_unordered(i64* %a) nounwind uwtable { entry: @@ -1146,6 +1266,14 @@ entry: ; CHECK: atomic64_xor_monotonic ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 0) +define void @atomic64_nand_monotonic(i64* %a) nounwind uwtable { +entry: + atomicrmw nand i64* %a, i64 0 monotonic + ret void +} +; CHECK: atomic64_nand_monotonic +; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 0) + define void @atomic64_xchg_acquire(i64* %a) nounwind uwtable { entry: atomicrmw xchg i64* %a, i64 0 acquire @@ -1194,6 +1322,14 @@ entry: ; CHECK: atomic64_xor_acquire ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 2) +define void @atomic64_nand_acquire(i64* %a) nounwind uwtable { +entry: + atomicrmw nand i64* %a, i64 0 acquire + ret void +} +; CHECK: atomic64_nand_acquire +; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 2) + define void @atomic64_xchg_release(i64* %a) nounwind uwtable { entry: atomicrmw xchg i64* %a, i64 0 release @@ -1242,6 +1378,14 @@ entry: ; CHECK: atomic64_xor_release ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 3) +define void @atomic64_nand_release(i64* %a) nounwind uwtable { +entry: + atomicrmw nand i64* %a, i64 0 release + ret void +} +; CHECK: atomic64_nand_release +; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 3) + define void @atomic64_xchg_acq_rel(i64* %a) nounwind uwtable { entry: atomicrmw xchg i64* %a, i64 0 acq_rel @@ -1290,6 +1434,14 @@ entry: ; CHECK: atomic64_xor_acq_rel ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 4) +define void @atomic64_nand_acq_rel(i64* %a) nounwind uwtable { +entry: + atomicrmw nand i64* %a, i64 0 acq_rel + ret void +} +; CHECK: atomic64_nand_acq_rel +; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 4) + define void @atomic64_xchg_seq_cst(i64* %a) nounwind uwtable { entry: atomicrmw xchg i64* %a, i64 0 seq_cst @@ -1338,13 +1490,21 @@ entry: ; CHECK: atomic64_xor_seq_cst ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 5) +define void @atomic64_nand_seq_cst(i64* %a) nounwind uwtable { +entry: + atomicrmw nand i64* %a, i64 0 seq_cst + ret void +} +; CHECK: atomic64_nand_seq_cst +; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 5) + define void @atomic64_cas_monotonic(i64* %a) nounwind uwtable { entry: cmpxchg i64* %a, i64 0, i64 1 monotonic ret void } ; CHECK: atomic64_cas_monotonic -; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 0) +; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 0, i32 0) define void @atomic64_cas_acquire(i64* %a) nounwind uwtable { entry: @@ -1352,7 +1512,7 @@ entry: ret void } ; CHECK: atomic64_cas_acquire -; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 2) +; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 2, i32 2) define void @atomic64_cas_release(i64* %a) nounwind uwtable { entry: @@ -1360,7 +1520,7 @@ entry: ret void } ; CHECK: atomic64_cas_release -; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 3) +; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 3, i32 0) define void @atomic64_cas_acq_rel(i64* %a) nounwind uwtable { entry: @@ -1368,7 +1528,7 @@ entry: ret void } ; CHECK: atomic64_cas_acq_rel -; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 4) +; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 4, i32 2) define void @atomic64_cas_seq_cst(i64* %a) nounwind uwtable { entry: @@ -1376,7 +1536,7 @@ entry: ret void } ; CHECK: atomic64_cas_seq_cst -; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 5) +; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 5, i32 5) define i128 @atomic128_load_unordered(i128* %a) nounwind uwtable { entry: @@ -1490,6 +1650,14 @@ entry: ; CHECK: atomic128_xor_monotonic ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 0) +define void @atomic128_nand_monotonic(i128* %a) nounwind uwtable { +entry: + atomicrmw nand i128* %a, i128 0 monotonic + ret void +} +; CHECK: atomic128_nand_monotonic +; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 0) + define void @atomic128_xchg_acquire(i128* %a) nounwind uwtable { entry: atomicrmw xchg i128* %a, i128 0 acquire @@ -1538,6 +1706,14 @@ entry: ; CHECK: atomic128_xor_acquire ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 2) +define void @atomic128_nand_acquire(i128* %a) nounwind uwtable { +entry: + atomicrmw nand i128* %a, i128 0 acquire + ret void +} +; CHECK: atomic128_nand_acquire +; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 2) + define void @atomic128_xchg_release(i128* %a) nounwind uwtable { entry: atomicrmw xchg i128* %a, i128 0 release @@ -1586,6 +1762,14 @@ entry: ; CHECK: atomic128_xor_release ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 3) +define void @atomic128_nand_release(i128* %a) nounwind uwtable { +entry: + atomicrmw nand i128* %a, i128 0 release + ret void +} +; CHECK: atomic128_nand_release +; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 3) + define void @atomic128_xchg_acq_rel(i128* %a) nounwind uwtable { entry: atomicrmw xchg i128* %a, i128 0 acq_rel @@ -1634,6 +1818,14 @@ entry: ; CHECK: atomic128_xor_acq_rel ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 4) +define void @atomic128_nand_acq_rel(i128* %a) nounwind uwtable { +entry: + atomicrmw nand i128* %a, i128 0 acq_rel + ret void +} +; CHECK: atomic128_nand_acq_rel +; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 4) + define void @atomic128_xchg_seq_cst(i128* %a) nounwind uwtable { entry: atomicrmw xchg i128* %a, i128 0 seq_cst @@ -1682,13 +1874,21 @@ entry: ; CHECK: atomic128_xor_seq_cst ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 5) +define void @atomic128_nand_seq_cst(i128* %a) nounwind uwtable { +entry: + atomicrmw nand i128* %a, i128 0 seq_cst + ret void +} +; CHECK: atomic128_nand_seq_cst +; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 5) + define void @atomic128_cas_monotonic(i128* %a) nounwind uwtable { entry: cmpxchg i128* %a, i128 0, i128 1 monotonic ret void } ; CHECK: atomic128_cas_monotonic -; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 0) +; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 0, i32 0) define void @atomic128_cas_acquire(i128* %a) nounwind uwtable { entry: @@ -1696,7 +1896,7 @@ entry: ret void } ; CHECK: atomic128_cas_acquire -; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 2) +; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 2, i32 2) define void @atomic128_cas_release(i128* %a) nounwind uwtable { entry: @@ -1704,7 +1904,7 @@ entry: ret void } ; CHECK: atomic128_cas_release -; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 3) +; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 3, i32 0) define void @atomic128_cas_acq_rel(i128* %a) nounwind uwtable { entry: @@ -1712,7 +1912,7 @@ entry: ret void } ; CHECK: atomic128_cas_acq_rel -; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 4) +; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 4, i32 2) define void @atomic128_cas_seq_cst(i128* %a) nounwind uwtable { entry: @@ -1720,7 +1920,7 @@ entry: ret void } ; CHECK: atomic128_cas_seq_cst -; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 5) +; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 5, i32 5) define void @atomic_signal_fence_acquire() nounwind uwtable { entry: diff --git a/test/Instrumentation/ThreadSanitizer/read_from_global.ll b/test/Instrumentation/ThreadSanitizer/read_from_global.ll index a08453ac4a94..7b6b94edf1b1 100644 --- a/test/Instrumentation/ThreadSanitizer/read_from_global.ll +++ b/test/Instrumentation/ThreadSanitizer/read_from_global.ll @@ -48,7 +48,7 @@ entry: } ; CHECK: define void @call_virtual_func -; CHECK: __tsan_read +; CHECK: __tsan_vptr_read ; CHECK: = load ; CHECK-NOT: __tsan_read ; CHECK: = load diff --git a/test/Instrumentation/ThreadSanitizer/tsan-vs-gvn.ll b/test/Instrumentation/ThreadSanitizer/tsan-vs-gvn.ll new file mode 100644 index 000000000000..a83a274bcf6e --- /dev/null +++ b/test/Instrumentation/ThreadSanitizer/tsan-vs-gvn.ll @@ -0,0 +1,26 @@ +; RUN: opt < %s -basicaa -gvn -tsan -S | FileCheck %s +; TSAN conflicts with load widening. Make sure the load widening is off with -tsan. + +; 32-bit little endian target. +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" + +%struct_of_8_bytes_4_aligned = type { i32, i8, i8, i8, i8} + +@f = global %struct_of_8_bytes_4_aligned zeroinitializer, align 4 + +; Accessing bytes 4 and 6, not ok to widen to i32 if sanitize_thread is set. + +define i32 @test_widening_bad(i8* %P) nounwind ssp noredzone sanitize_thread { +entry: + %tmp = load i8* getelementptr inbounds (%struct_of_8_bytes_4_aligned* @f, i64 0, i32 1), align 4 + %conv = zext i8 %tmp to i32 + %tmp1 = load i8* getelementptr inbounds (%struct_of_8_bytes_4_aligned* @f, i64 0, i32 3), align 1 + %conv2 = zext i8 %tmp1 to i32 + %add = add nsw i32 %conv, %conv2 + ret i32 %add +; CHECK: @test_widening_bad +; CHECK: call void @__tsan_read1 +; CHECK: call void @__tsan_read1 +; CHECK-NOT: call void @__tsan_read4 +; CHECK: ret i32 +} diff --git a/test/Instrumentation/ThreadSanitizer/tsan_basic.ll b/test/Instrumentation/ThreadSanitizer/tsan_basic.ll index 33c703b4c9bd..0ecff40493a2 100644 --- a/test/Instrumentation/ThreadSanitizer/tsan_basic.ll +++ b/test/Instrumentation/ThreadSanitizer/tsan_basic.ll @@ -20,3 +20,36 @@ entry: ; CHECK: ret i32 +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) +declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) + + +; Check that tsan converts mem intrinsics back to function calls. + +define void @MemCpyTest(i8* nocapture %x, i8* nocapture %y) { +entry: + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %x, i8* %y, i64 16, i32 4, i1 false) + ret void +; CHECK: define void @MemCpyTest +; CHECK: call i8* @memcpy +; CHECK: ret void +} + +define void @MemMoveTest(i8* nocapture %x, i8* nocapture %y) { +entry: + tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %x, i8* %y, i64 16, i32 4, i1 false) + ret void +; CHECK: define void @MemMoveTest +; CHECK: call i8* @memmove +; CHECK: ret void +} + +define void @MemSetTest(i8* nocapture %x) { +entry: + tail call void @llvm.memset.p0i8.i64(i8* %x, i8 77, i64 16, i32 4, i1 false) + ret void +; CHECK define void @MemSetTest +; CHECK: call i8* @memset +; CHECK: ret void +} diff --git a/test/Instrumentation/ThreadSanitizer/vptr_read.ll b/test/Instrumentation/ThreadSanitizer/vptr_read.ll new file mode 100644 index 000000000000..404ca3ffe50f --- /dev/null +++ b/test/Instrumentation/ThreadSanitizer/vptr_read.ll @@ -0,0 +1,13 @@ +; RUN: opt < %s -tsan -S | FileCheck %s +; Check that vptr reads are treated in a special way. +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" + +define i8 @Foo(i8* %a) nounwind uwtable { +entry: +; CHECK: call void @__tsan_vptr_read + %0 = load i8* %a, align 8, !tbaa !0 + ret i8 %0 +} +!0 = metadata !{metadata !"vtable pointer", metadata !1} +!1 = metadata !{metadata !"Simple C/C++ TBAA", null} + diff --git a/test/Integer/properties_bt.ll b/test/Integer/properties_bt.ll index f24ddc2e80ef..695adf3c5f1d 100644 --- a/test/Integer/properties_bt.ll +++ b/test/Integer/properties_bt.ll @@ -5,5 +5,3 @@ target datalayout = "e-p:32:32" target triple = "proc-vend-sys" -deplibs = [ "m", "c" ] - diff --git a/test/JitListener/lit.local.cfg b/test/JitListener/lit.local.cfg new file mode 100644 index 000000000000..a5aa6de182c4 --- /dev/null +++ b/test/JitListener/lit.local.cfg @@ -0,0 +1,11 @@ +config.suffixes = ['.ll'] + +def getRoot(config): + if not config.parent: + return config + return getRoot(config.parent) + +root = getRoot(config) +if not root.llvm_use_intel_jitevents == "ON": + config.unsupported = True + diff --git a/test/JitListener/test-common-symbols.ll b/test/JitListener/test-common-symbols.ll new file mode 100644 index 000000000000..bc94bda9a410 --- /dev/null +++ b/test/JitListener/test-common-symbols.ll @@ -0,0 +1,113 @@ +; RUN: llvm-jitlistener %s | FileCheck %s + +; CHECK: Method load [1]: main, Size = 164 +; CHECK: Method unload [1] + +; ModuleID = '<stdin>' +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@zero_int = common global i32 0, align 4 +@zero_arr = common global [10 x i32] zeroinitializer, align 16 +@zero_double = common global double 0.000000e+00, align 8 + +define i32 @main() nounwind uwtable { +entry: + %retval = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @zero_int, align 4, !dbg !21 + %add = add nsw i32 %0, 5, !dbg !21 + %idxprom = sext i32 %add to i64, !dbg !21 + %arrayidx = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom, !dbg !21 + store i32 40, i32* %arrayidx, align 4, !dbg !21 + %1 = load double* @zero_double, align 8, !dbg !23 + %cmp = fcmp olt double %1, 1.000000e+00, !dbg !23 + br i1 %cmp, label %if.then, label %if.end, !dbg !23 + +if.then: ; preds = %entry + %2 = load i32* @zero_int, align 4, !dbg !24 + %add1 = add nsw i32 %2, 2, !dbg !24 + %idxprom2 = sext i32 %add1 to i64, !dbg !24 + %arrayidx3 = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom2, !dbg !24 + store i32 70, i32* %arrayidx3, align 4, !dbg !24 + br label %if.end, !dbg !24 + +if.end: ; preds = %if.then, %entry + call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !25), !dbg !27 + store i32 1, i32* %i, align 4, !dbg !28 + br label %for.cond, !dbg !28 + +for.cond: ; preds = %for.inc, %if.end + %3 = load i32* %i, align 4, !dbg !28 + %cmp4 = icmp slt i32 %3, 10, !dbg !28 + br i1 %cmp4, label %for.body, label %for.end, !dbg !28 + +for.body: ; preds = %for.cond + %4 = load i32* %i, align 4, !dbg !29 + %sub = sub nsw i32 %4, 1, !dbg !29 + %idxprom5 = sext i32 %sub to i64, !dbg !29 + %arrayidx6 = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom5, !dbg !29 + %5 = load i32* %arrayidx6, align 4, !dbg !29 + %6 = load i32* %i, align 4, !dbg !29 + %idxprom7 = sext i32 %6 to i64, !dbg !29 + %arrayidx8 = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom7, !dbg !29 + %7 = load i32* %arrayidx8, align 4, !dbg !29 + %add9 = add nsw i32 %5, %7, !dbg !29 + %8 = load i32* %i, align 4, !dbg !29 + %idxprom10 = sext i32 %8 to i64, !dbg !29 + %arrayidx11 = getelementptr inbounds [10 x i32]* @zero_arr, i32 0, i64 %idxprom10, !dbg !29 + store i32 %add9, i32* %arrayidx11, align 4, !dbg !29 + br label %for.inc, !dbg !31 + +for.inc: ; preds = %for.body + %9 = load i32* %i, align 4, !dbg !32 + %inc = add nsw i32 %9, 1, !dbg !32 + store i32 %inc, i32* %i, align 4, !dbg !32 + br label %for.cond, !dbg !32 + +for.end: ; preds = %for.cond + %10 = load i32* getelementptr inbounds ([10 x i32]* @zero_arr, i32 0, i64 9), align 4, !dbg !33 + %cmp12 = icmp eq i32 %10, 110, !dbg !33 + %cond = select i1 %cmp12, i32 0, i32 -1, !dbg !33 + ret i32 %cond, !dbg !33 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"test-common-symbols.c", metadata !"/store/store/llvm/build", metadata !"clang version 3.1 ()", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12} ; [ DW_TAG_compile_unit ] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 720942, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 6, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !10} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 720937, metadata !"test-common-symbols.c", metadata !"/store/store/llvm/build", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 720917, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!10 = metadata !{metadata !11} +!11 = metadata !{i32 720932} ; [ DW_TAG_base_type ] +!12 = metadata !{metadata !13} +!13 = metadata !{metadata !14, metadata !15, metadata !17} +!14 = metadata !{i32 720948, i32 0, null, metadata !"zero_int", metadata !"zero_int", metadata !"", metadata !6, i32 1, metadata !9, i32 0, i32 1, i32* @zero_int} ; [ DW_TAG_variable ] +!15 = metadata !{i32 720948, i32 0, null, metadata !"zero_double", metadata !"zero_double", metadata !"", metadata !6, i32 2, metadata !16, i32 0, i32 1, double* @zero_double} ; [ DW_TAG_variable ] +!16 = metadata !{i32 720932, null, metadata !"double", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!17 = metadata !{i32 720948, i32 0, null, metadata !"zero_arr", metadata !"zero_arr", metadata !"", metadata !6, i32 3, metadata !18, i32 0, i32 1, [10 x i32]* @zero_arr} ; [ DW_TAG_variable ] +!18 = metadata !{i32 720897, null, metadata !"", null, i32 0, i64 320, i64 32, i32 0, i32 0, metadata !9, metadata !19, i32 0, i32 0} ; [ DW_TAG_array_type ] +!19 = metadata !{metadata !20} +!20 = metadata !{i32 720929, i64 0, i64 10} ; [ DW_TAG_subrange_type ] +!21 = metadata !{i32 7, i32 5, metadata !22, null} +!22 = metadata !{i32 720907, metadata !5, i32 6, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!23 = metadata !{i32 9, i32 5, metadata !22, null} +!24 = metadata !{i32 10, i32 9, metadata !22, null} +!25 = metadata !{i32 721152, metadata !26, metadata !"i", metadata !6, i32 12, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] +!26 = metadata !{i32 720907, metadata !22, i32 12, i32 5, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] +!27 = metadata !{i32 12, i32 14, metadata !26, null} +!28 = metadata !{i32 12, i32 19, metadata !26, null} +!29 = metadata !{i32 13, i32 9, metadata !30, null} +!30 = metadata !{i32 720907, metadata !26, i32 12, i32 34, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] +!31 = metadata !{i32 14, i32 5, metadata !30, null} +!32 = metadata !{i32 12, i32 29, metadata !26, null} +!33 = metadata !{i32 15, i32 5, metadata !22, null} diff --git a/test/JitListener/test-inline.ll b/test/JitListener/test-inline.ll new file mode 100644 index 000000000000..ca5d8d6484b8 --- /dev/null +++ b/test/JitListener/test-inline.ll @@ -0,0 +1,212 @@ +; RUN: llvm-jitlistener %s | FileCheck %s + +; CHECK: Method load [1]: _Z15test_parametersPfPA2_dR11char_structPPitm, Size = 170 +; CHECK: Line info @ 0: test-inline.cpp, line 33 +; CHECK: Line info @ 35: test-inline.cpp, line 34 +; CHECK: Line info @ 165: test-inline.cpp, line 35 +; CHECK: Method load [2]: _Z3foov, Size = 3 +; CHECK: Line info @ 0: test-inline.cpp, line 28 +; CHECK: Line info @ 2: test-inline.cpp, line 29 +; CHECK: Line info @ 3: test-inline.cpp, line 29 +; CHECK: Method load [3]: main, Size = 146 +; CHECK: Line info @ 0: test-inline.cpp, line 39 +; CHECK: Line info @ 21: test-inline.cpp, line 41 +; CHECK: Line info @ 39: test-inline.cpp, line 42 +; CHECK: Line info @ 60: test-inline.cpp, line 44 +; CHECK: Line info @ 80: test-inline.cpp, line 48 +; CHECK: Line info @ 90: test-inline.cpp, line 45 +; CHECK: Line info @ 95: test-inline.cpp, line 46 +; CHECK: Line info @ 114: test-inline.cpp, line 48 +; CHECK: Line info @ 141: test-inline.cpp, line 49 +; CHECK: Line info @ 146: test-inline.cpp, line 49 +; CHECK: Method unload [1] +; CHECK: Method unload [2] +; CHECK: Method unload [3] + +; ModuleID = 'test-inline.cpp' +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%struct.char_struct = type { i8, [2 x i8] } + +@compound_char = global %struct.char_struct zeroinitializer, align 1 +@_ZZ4mainE1d = private unnamed_addr constant [2 x [2 x double]] [[2 x double] [double 0.000000e+00, double 1.000000e+00], [2 x double] [double 2.000000e+00, double 3.000000e+00]], align 16 + +define double @_Z15test_parametersPfPA2_dR11char_structPPitm(float* %pf, [2 x double]* %ppd, %struct.char_struct* %s, i32** %ppn, i16 zeroext %us, i64 %l) uwtable { +entry: + %pf.addr = alloca float*, align 8 + %ppd.addr = alloca [2 x double]*, align 8 + %s.addr = alloca %struct.char_struct*, align 8 + %ppn.addr = alloca i32**, align 8 + %us.addr = alloca i16, align 2 + %l.addr = alloca i64, align 8 + %result = alloca double, align 8 + store float* %pf, float** %pf.addr, align 8 + call void @llvm.dbg.declare(metadata !{float** %pf.addr}, metadata !46), !dbg !47 + store [2 x double]* %ppd, [2 x double]** %ppd.addr, align 8 + call void @llvm.dbg.declare(metadata !{[2 x double]** %ppd.addr}, metadata !48), !dbg !47 + store %struct.char_struct* %s, %struct.char_struct** %s.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.char_struct** %s.addr}, metadata !49), !dbg !47 + store i32** %ppn, i32*** %ppn.addr, align 8 + call void @llvm.dbg.declare(metadata !{i32*** %ppn.addr}, metadata !50), !dbg !47 + store i16 %us, i16* %us.addr, align 2 + call void @llvm.dbg.declare(metadata !{i16* %us.addr}, metadata !51), !dbg !47 + store i64 %l, i64* %l.addr, align 8 + call void @llvm.dbg.declare(metadata !{i64* %l.addr}, metadata !52), !dbg !47 + call void @llvm.dbg.declare(metadata !{double* %result}, metadata !53), !dbg !55 + %0 = load float** %pf.addr, align 8, !dbg !55 + %arrayidx = getelementptr inbounds float* %0, i64 0, !dbg !55 + %1 = load float* %arrayidx, align 4, !dbg !55 + %conv = fpext float %1 to double, !dbg !55 + %2 = load [2 x double]** %ppd.addr, align 8, !dbg !55 + %arrayidx1 = getelementptr inbounds [2 x double]* %2, i64 1, !dbg !55 + %arrayidx2 = getelementptr inbounds [2 x double]* %arrayidx1, i32 0, i64 1, !dbg !55 + %3 = load double* %arrayidx2, align 8, !dbg !55 + %mul = fmul double %conv, %3, !dbg !55 + %4 = load %struct.char_struct** %s.addr, align 8, !dbg !55 + %c = getelementptr inbounds %struct.char_struct* %4, i32 0, i32 0, !dbg !55 + %5 = load i8* %c, align 1, !dbg !55 + %conv3 = sext i8 %5 to i32, !dbg !55 + %conv4 = sitofp i32 %conv3 to double, !dbg !55 + %mul5 = fmul double %mul, %conv4, !dbg !55 + %6 = load i16* %us.addr, align 2, !dbg !55 + %conv6 = zext i16 %6 to i32, !dbg !55 + %conv7 = sitofp i32 %conv6 to double, !dbg !55 + %mul8 = fmul double %mul5, %conv7, !dbg !55 + %7 = load i64* %l.addr, align 8, !dbg !55 + %conv9 = uitofp i64 %7 to double, !dbg !55 + %mul10 = fmul double %mul8, %conv9, !dbg !55 + %call = call i32 @_Z3foov(), !dbg !55 + %conv11 = sitofp i32 %call to double, !dbg !55 + %add = fadd double %mul10, %conv11, !dbg !55 + store double %add, double* %result, align 8, !dbg !55 + %8 = load double* %result, align 8, !dbg !56 + ret double %8, !dbg !56 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +define linkonce_odr i32 @_Z3foov() nounwind uwtable inlinehint { +entry: + ret i32 0, !dbg !57 +} + +define i32 @main(i32 %argc, i8** %argv) uwtable { +entry: + %retval = alloca i32, align 4 + %argc.addr = alloca i32, align 4 + %argv.addr = alloca i8**, align 8 + %s = alloca %struct.char_struct, align 1 + %f = alloca float, align 4 + %d = alloca [2 x [2 x double]], align 16 + %result = alloca double, align 8 + store i32 0, i32* %retval + store i32 %argc, i32* %argc.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !59), !dbg !60 + store i8** %argv, i8*** %argv.addr, align 8 + call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !61), !dbg !60 + call void @llvm.dbg.declare(metadata !{%struct.char_struct* %s}, metadata !62), !dbg !64 + call void @llvm.dbg.declare(metadata !{float* %f}, metadata !65), !dbg !66 + store float 0.000000e+00, float* %f, align 4, !dbg !66 + call void @llvm.dbg.declare(metadata !{[2 x [2 x double]]* %d}, metadata !67), !dbg !70 + %0 = bitcast [2 x [2 x double]]* %d to i8*, !dbg !70 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ([2 x [2 x double]]* @_ZZ4mainE1d to i8*), i64 32, i32 16, i1 false), !dbg !70 + %c = getelementptr inbounds %struct.char_struct* %s, i32 0, i32 0, !dbg !71 + store i8 97, i8* %c, align 1, !dbg !71 + %c2 = getelementptr inbounds %struct.char_struct* %s, i32 0, i32 1, !dbg !72 + %arrayidx = getelementptr inbounds [2 x i8]* %c2, i32 0, i64 0, !dbg !72 + store i8 48, i8* %arrayidx, align 1, !dbg !72 + %c21 = getelementptr inbounds %struct.char_struct* %s, i32 0, i32 1, !dbg !73 + %arrayidx2 = getelementptr inbounds [2 x i8]* %c21, i32 0, i64 1, !dbg !73 + store i8 49, i8* %arrayidx2, align 1, !dbg !73 + call void @llvm.dbg.declare(metadata !{double* %result}, metadata !74), !dbg !75 + %arraydecay = getelementptr inbounds [2 x [2 x double]]* %d, i32 0, i32 0, !dbg !75 + %call = call double @_Z15test_parametersPfPA2_dR11char_structPPitm(float* %f, [2 x double]* %arraydecay, %struct.char_struct* %s, i32** null, i16 zeroext 10, i64 42), !dbg !75 + store double %call, double* %result, align 8, !dbg !75 + %1 = load double* %result, align 8, !dbg !76 + %cmp = fcmp oeq double %1, 0.000000e+00, !dbg !76 + %cond = select i1 %cmp, i32 0, i32 -1, !dbg !76 + ret i32 %cond, !dbg !76 +} + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"test-inline.cpp", metadata !"/home/akaylor/dev", metadata !"clang version 3.3 (ssh://akaylor@git-amr-1.devtools.intel.com:29418/ssg_llvm-clang2 gitosis@miro.kw.intel.com:clang.git 39450d0469e0d5589ad39fd0b20b5742750619a0) (ssh://akaylor@git-amr-1.devtools.intel.com:29418/ssg_llvm-llvm gitosis@miro.kw.intel.com:llvm.git 376642ed620ecae05b68c7bc81f79aeb2065abe0)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !43} ; [ DW_TAG_compile_unit ] [/home/akaylor/dev/test-inline.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5, metadata !35, metadata !40} +!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"test_parameters", metadata !"test_parameters", metadata !"_Z15test_parametersPfPA2_dR11char_structPPitm", metadata !6, i32 32, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, double (float*, [2 x double]*, %struct.char_struct*, i32**, i16, i64)* @_Z15test_parametersPfPA2_dR11char_structPPitm, null, null, metadata !1, i32 33} ; [ DW_TAG_subprogram ] [line 32] [def] [scope 33] [test_parameters] +!6 = metadata !{i32 786473, metadata !"test-inline.cpp", metadata !"/home/akaylor/dev", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !10, metadata !12, metadata !16, metadata !29, metadata !32, metadata !33} +!9 = metadata !{i32 786468, null, metadata !"double", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] [double] [line 0, size 64, align 64, offset 0, enc DW_ATE_float] +!10 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from float] +!11 = metadata !{i32 786468, null, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] [float] [line 0, size 32, align 32, offset 0, enc DW_ATE_float] +!12 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !13} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!13 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 128, i64 64, i32 0, i32 0, metadata !9, metadata !14, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 128, align 64, offset 0] [from double] +!14 = metadata !{metadata !15} +!15 = metadata !{i32 786465, i64 0, i64 2} ; [ DW_TAG_subrange_type ] [0, 1] +!16 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !17} ; [ DW_TAG_reference_type ] [line 0, size 0, align 0, offset 0] [from char_struct] +!17 = metadata !{i32 786451, null, metadata !"char_struct", metadata !6, i32 22, i64 24, i64 8, i32 0, i32 0, null, metadata !18, i32 0, null, null} ; [ DW_TAG_structure_type ] [char_struct] [line 22, size 24, align 8, offset 0] [from ] +!18 = metadata !{metadata !19, metadata !21, metadata !23} +!19 = metadata !{i32 786445, metadata !17, metadata !"c", metadata !6, i32 23, i64 8, i64 8, i64 0, i32 0, metadata !20} ; [ DW_TAG_member ] [c] [line 23, size 8, align 8, offset 0] [from char] +!20 = metadata !{i32 786468, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char] +!21 = metadata !{i32 786445, metadata !17, metadata !"c2", metadata !6, i32 24, i64 16, i64 8, i64 8, i32 0, metadata !22} ; [ DW_TAG_member ] [c2] [line 24, size 16, align 8, offset 8] [from ] +!22 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 16, i64 8, i32 0, i32 0, metadata !20, metadata !14, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 16, align 8, offset 0] [from char] +!23 = metadata !{i32 786478, i32 0, metadata !17, metadata !"char_struct", metadata !"char_struct", metadata !"", metadata !6, i32 22, metadata !24, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !27, i32 22} ; [ DW_TAG_subprogram ] [line 22] [char_struct] +!24 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !25, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!25 = metadata !{null, metadata !26} +!26 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !17} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from char_struct] +!27 = metadata !{metadata !28} +!28 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] +!29 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !30} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!30 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !31} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!31 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!32 = metadata !{i32 786468, null, metadata !"unsigned short", null, i32 0, i64 16, i64 16, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [unsigned short] [line 0, size 16, align 16, offset 0, enc DW_ATE_unsigned] +!33 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !34} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from long unsigned int] +!34 = metadata !{i32 786468, null, metadata !"long unsigned int", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [long unsigned int] [line 0, size 64, align 64, offset 0, enc DW_ATE_unsigned] +!35 = metadata !{i32 786478, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 38, metadata !36, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, metadata !1, i32 39} ; [ DW_TAG_subprogram ] [line 38] [def] [scope 39] [main] +!36 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !37, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!37 = metadata !{metadata !31, metadata !31, metadata !38} +!38 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !39} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!39 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !20} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from char] +!40 = metadata !{i32 786478, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3foov", metadata !6, i32 27, metadata !41, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z3foov, null, null, metadata !1, i32 28} ; [ DW_TAG_subprogram ] [line 27] [def] [scope 28] [foo] +!41 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !42, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!42 = metadata !{metadata !31} +!43 = metadata !{metadata !44} +!44 = metadata !{metadata !45} +!45 = metadata !{i32 786484, i32 0, null, metadata !"compound_char", metadata !"compound_char", metadata !"", metadata !6, i32 25, metadata !17, i32 0, i32 1, %struct.char_struct* @compound_char} ; [ DW_TAG_variable ] [compound_char] [line 25] [def] +!46 = metadata !{i32 786689, metadata !5, metadata !"pf", metadata !6, i32 16777248, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [pf] [line 32] +!47 = metadata !{i32 32, i32 0, metadata !5, null} +!48 = metadata !{i32 786689, metadata !5, metadata !"ppd", metadata !6, i32 33554464, metadata !12, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [ppd] [line 32] +!49 = metadata !{i32 786689, metadata !5, metadata !"s", metadata !6, i32 50331680, metadata !16, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [s] [line 32] +!50 = metadata !{i32 786689, metadata !5, metadata !"ppn", metadata !6, i32 67108896, metadata !29, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [ppn] [line 32] +!51 = metadata !{i32 786689, metadata !5, metadata !"us", metadata !6, i32 83886112, metadata !32, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [us] [line 32] +!52 = metadata !{i32 786689, metadata !5, metadata !"l", metadata !6, i32 100663328, metadata !33, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [l] [line 32] +!53 = metadata !{i32 786688, metadata !54, metadata !"result", metadata !6, i32 34, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [result] [line 34] +!54 = metadata !{i32 786443, metadata !5, i32 33, i32 0, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] [/home/akaylor/dev/test-inline.cpp] +!55 = metadata !{i32 34, i32 0, metadata !54, null} +!56 = metadata !{i32 35, i32 0, metadata !54, null} +!57 = metadata !{i32 29, i32 0, metadata !58, null} +!58 = metadata !{i32 786443, metadata !40, i32 28, i32 0, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] [/home/akaylor/dev/test-inline.cpp] +!59 = metadata !{i32 786689, metadata !35, metadata !"argc", metadata !6, i32 16777254, metadata !31, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argc] [line 38] +!60 = metadata !{i32 38, i32 0, metadata !35, null} +!61 = metadata !{i32 786689, metadata !35, metadata !"argv", metadata !6, i32 33554470, metadata !38, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argv] [line 38] +!62 = metadata !{i32 786688, metadata !63, metadata !"s", metadata !6, i32 40, metadata !17, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [s] [line 40] +!63 = metadata !{i32 786443, metadata !35, i32 39, i32 0, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] [/home/akaylor/dev/test-inline.cpp] +!64 = metadata !{i32 40, i32 0, metadata !63, null} +!65 = metadata !{i32 786688, metadata !63, metadata !"f", metadata !6, i32 41, metadata !11, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [f] [line 41] +!66 = metadata !{i32 41, i32 0, metadata !63, null} +!67 = metadata !{i32 786688, metadata !63, metadata !"d", metadata !6, i32 42, metadata !68, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [d] [line 42] +!68 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 256, i64 64, i32 0, i32 0, metadata !9, metadata !69, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 256, align 64, offset 0] [from double] +!69 = metadata !{metadata !15, metadata !15} +!70 = metadata !{i32 42, i32 0, metadata !63, null} +!71 = metadata !{i32 44, i32 0, metadata !63, null} +!72 = metadata !{i32 45, i32 0, metadata !63, null} +!73 = metadata !{i32 46, i32 0, metadata !63, null} +!74 = metadata !{i32 786688, metadata !63, metadata !"result", metadata !6, i32 48, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [result] [line 48] +!75 = metadata !{i32 48, i32 0, metadata !63, null} +!76 = metadata !{i32 49, i32 0, metadata !63, null} diff --git a/test/JitListener/test-parameters.ll b/test/JitListener/test-parameters.ll new file mode 100644 index 000000000000..1e2a2b342aae --- /dev/null +++ b/test/JitListener/test-parameters.ll @@ -0,0 +1,211 @@ +; RUN: llvm-jitlistener %s | FileCheck %s + +; CHECK: Method load [1]: _Z15test_parametersPfPA2_dR11char_structPPitm, Size = 170 +; CHECK: Line info @ 0: test-parameters.cpp, line 33 +; CHECK: Line info @ 35: test-parameters.cpp, line 34 +; CHECK: Line info @ 165: test-parameters.cpp, line 35 +; CHECK: Method load [2]: _Z3foov, Size = 3 +; CHECK: Line info @ 0: test-parameters.cpp, line 28 +; CHECK: Line info @ 2: test-parameters.cpp, line 29 +; CHECK: Method load [3]: main, Size = 146 +; CHECK: Line info @ 0: test-parameters.cpp, line 39 +; CHECK: Line info @ 21: test-parameters.cpp, line 41 +; CHECK: Line info @ 39: test-parameters.cpp, line 42 +; CHECK: Line info @ 60: test-parameters.cpp, line 44 +; CHECK: Line info @ 80: test-parameters.cpp, line 48 +; CHECK: Line info @ 90: test-parameters.cpp, line 45 +; CHECK: Line info @ 95: test-parameters.cpp, line 46 +; CHECK: Line info @ 114: test-parameters.cpp, line 48 +; CHECK: Line info @ 141: test-parameters.cpp, line 49 +; CHECK: Line info @ 146: test-parameters.cpp, line 49 +; CHECK: Method unload [1] +; CHECK: Method unload [2] +; CHECK: Method unload [3] + +; ModuleID = 'test-parameters.cpp' +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%struct.char_struct = type { i8, [2 x i8] } + +@compound_char = global %struct.char_struct zeroinitializer, align 1 +@_ZZ4mainE1d = private unnamed_addr constant [2 x [2 x double]] [[2 x double] [double 0.000000e+00, double 1.000000e+00], [2 x double] [double 2.000000e+00, double 3.000000e+00]], align 16 + +define i32 @_Z3foov() nounwind uwtable { +entry: + ret i32 0, !dbg !46 +} + +define double @_Z15test_parametersPfPA2_dR11char_structPPitm(float* %pf, [2 x double]* %ppd, %struct.char_struct* %s, i32** %ppn, i16 zeroext %us, i64 %l) nounwind uwtable { +entry: + %pf.addr = alloca float*, align 8 + %ppd.addr = alloca [2 x double]*, align 8 + %s.addr = alloca %struct.char_struct*, align 8 + %ppn.addr = alloca i32**, align 8 + %us.addr = alloca i16, align 2 + %l.addr = alloca i64, align 8 + %result = alloca double, align 8 + store float* %pf, float** %pf.addr, align 8 + call void @llvm.dbg.declare(metadata !{float** %pf.addr}, metadata !48), !dbg !49 + store [2 x double]* %ppd, [2 x double]** %ppd.addr, align 8 + call void @llvm.dbg.declare(metadata !{[2 x double]** %ppd.addr}, metadata !50), !dbg !49 + store %struct.char_struct* %s, %struct.char_struct** %s.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.char_struct** %s.addr}, metadata !51), !dbg !49 + store i32** %ppn, i32*** %ppn.addr, align 8 + call void @llvm.dbg.declare(metadata !{i32*** %ppn.addr}, metadata !52), !dbg !49 + store i16 %us, i16* %us.addr, align 2 + call void @llvm.dbg.declare(metadata !{i16* %us.addr}, metadata !53), !dbg !49 + store i64 %l, i64* %l.addr, align 8 + call void @llvm.dbg.declare(metadata !{i64* %l.addr}, metadata !54), !dbg !49 + call void @llvm.dbg.declare(metadata !{double* %result}, metadata !55), !dbg !57 + %0 = load float** %pf.addr, align 8, !dbg !57 + %arrayidx = getelementptr inbounds float* %0, i64 0, !dbg !57 + %1 = load float* %arrayidx, align 4, !dbg !57 + %conv = fpext float %1 to double, !dbg !57 + %2 = load [2 x double]** %ppd.addr, align 8, !dbg !57 + %arrayidx1 = getelementptr inbounds [2 x double]* %2, i64 1, !dbg !57 + %arrayidx2 = getelementptr inbounds [2 x double]* %arrayidx1, i32 0, i64 1, !dbg !57 + %3 = load double* %arrayidx2, align 8, !dbg !57 + %mul = fmul double %conv, %3, !dbg !57 + %4 = load %struct.char_struct** %s.addr, align 8, !dbg !57 + %c = getelementptr inbounds %struct.char_struct* %4, i32 0, i32 0, !dbg !57 + %5 = load i8* %c, align 1, !dbg !57 + %conv3 = sext i8 %5 to i32, !dbg !57 + %conv4 = sitofp i32 %conv3 to double, !dbg !57 + %mul5 = fmul double %mul, %conv4, !dbg !57 + %6 = load i16* %us.addr, align 2, !dbg !57 + %conv6 = zext i16 %6 to i32, !dbg !57 + %conv7 = sitofp i32 %conv6 to double, !dbg !57 + %mul8 = fmul double %mul5, %conv7, !dbg !57 + %7 = load i64* %l.addr, align 8, !dbg !57 + %conv9 = uitofp i64 %7 to double, !dbg !57 + %mul10 = fmul double %mul8, %conv9, !dbg !57 + %call = call i32 @_Z3foov(), !dbg !57 + %conv11 = sitofp i32 %call to double, !dbg !57 + %add = fadd double %mul10, %conv11, !dbg !57 + store double %add, double* %result, align 8, !dbg !57 + %8 = load double* %result, align 8, !dbg !58 + ret double %8, !dbg !58 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +define i32 @main(i32 %argc, i8** %argv) nounwind uwtable { +entry: + %retval = alloca i32, align 4 + %argc.addr = alloca i32, align 4 + %argv.addr = alloca i8**, align 8 + %s = alloca %struct.char_struct, align 1 + %f = alloca float, align 4 + %d = alloca [2 x [2 x double]], align 16 + %result = alloca double, align 8 + store i32 0, i32* %retval + store i32 %argc, i32* %argc.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !59), !dbg !60 + store i8** %argv, i8*** %argv.addr, align 8 + call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !61), !dbg !60 + call void @llvm.dbg.declare(metadata !{%struct.char_struct* %s}, metadata !62), !dbg !64 + call void @llvm.dbg.declare(metadata !{float* %f}, metadata !65), !dbg !66 + store float 0.000000e+00, float* %f, align 4, !dbg !66 + call void @llvm.dbg.declare(metadata !{[2 x [2 x double]]* %d}, metadata !67), !dbg !70 + %0 = bitcast [2 x [2 x double]]* %d to i8*, !dbg !70 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ([2 x [2 x double]]* @_ZZ4mainE1d to i8*), i64 32, i32 16, i1 false), !dbg !70 + %c = getelementptr inbounds %struct.char_struct* %s, i32 0, i32 0, !dbg !71 + store i8 97, i8* %c, align 1, !dbg !71 + %c2 = getelementptr inbounds %struct.char_struct* %s, i32 0, i32 1, !dbg !72 + %arrayidx = getelementptr inbounds [2 x i8]* %c2, i32 0, i64 0, !dbg !72 + store i8 48, i8* %arrayidx, align 1, !dbg !72 + %c21 = getelementptr inbounds %struct.char_struct* %s, i32 0, i32 1, !dbg !73 + %arrayidx2 = getelementptr inbounds [2 x i8]* %c21, i32 0, i64 1, !dbg !73 + store i8 49, i8* %arrayidx2, align 1, !dbg !73 + call void @llvm.dbg.declare(metadata !{double* %result}, metadata !74), !dbg !75 + %arraydecay = getelementptr inbounds [2 x [2 x double]]* %d, i32 0, i32 0, !dbg !75 + %call = call double @_Z15test_parametersPfPA2_dR11char_structPPitm(float* %f, [2 x double]* %arraydecay, %struct.char_struct* %s, i32** null, i16 zeroext 10, i64 42), !dbg !75 + store double %call, double* %result, align 8, !dbg !75 + %1 = load double* %result, align 8, !dbg !76 + %cmp = fcmp oeq double %1, 0.000000e+00, !dbg !76 + %cond = select i1 %cmp, i32 0, i32 -1, !dbg !76 + ret i32 %cond, !dbg !76 +} + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"test-parameters.cpp", metadata !"/home/akaylor/dev", metadata !"clang version 3.3 (ssh://akaylor@git-amr-1.devtools.intel.com:29418/ssg_llvm-clang2 gitosis@miro.kw.intel.com:clang.git 39450d0469e0d5589ad39fd0b20b5742750619a0) (ssh://akaylor@git-amr-1.devtools.intel.com:29418/ssg_llvm-llvm gitosis@miro.kw.intel.com:llvm.git 376642ed620ecae05b68c7bc81f79aeb2065abe0)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !43} ; [ DW_TAG_compile_unit ] [/home/akaylor/dev/test-parameters.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5, metadata !10, metadata !38} +!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3foov", metadata !6, i32 27, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z3foov, null, null, metadata !1, i32 28} ; [ DW_TAG_subprogram ] [line 27] [def] [scope 28] [foo] +!6 = metadata !{i32 786473, metadata !"test-parameters.cpp", metadata !"/home/akaylor/dev", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786478, i32 0, metadata !6, metadata !"test_parameters", metadata !"test_parameters", metadata !"_Z15test_parametersPfPA2_dR11char_structPPitm", metadata !6, i32 32, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, double (float*, [2 x double]*, %struct.char_struct*, i32**, i16, i64)* @_Z15test_parametersPfPA2_dR11char_structPPitm, null, null, metadata !1, i32 33} ; [ DW_TAG_subprogram ] [line 32] [def] [scope 33] [test_parameters] +!11 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!12 = metadata !{metadata !13, metadata !14, metadata !16, metadata !20, metadata !33, metadata !35, metadata !36} +!13 = metadata !{i32 786468, null, metadata !"double", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] [double] [line 0, size 64, align 64, offset 0, enc DW_ATE_float] +!14 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !15} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from float] +!15 = metadata !{i32 786468, null, metadata !"float", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] [float] [line 0, size 32, align 32, offset 0, enc DW_ATE_float] +!16 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !17} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!17 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 128, i64 64, i32 0, i32 0, metadata !13, metadata !18, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 128, align 64, offset 0] [from double] +!18 = metadata !{metadata !19} +!19 = metadata !{i32 786465, i64 0, i64 2} ; [ DW_TAG_subrange_type ] [0, 1] +!20 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !21} ; [ DW_TAG_reference_type ] [line 0, size 0, align 0, offset 0] [from char_struct] +!21 = metadata !{i32 786451, null, metadata !"char_struct", metadata !6, i32 22, i64 24, i64 8, i32 0, i32 0, null, metadata !22, i32 0, null, null} ; [ DW_TAG_structure_type ] [char_struct] [line 22, size 24, align 8, offset 0] [from ] +!22 = metadata !{metadata !23, metadata !25, metadata !27} +!23 = metadata !{i32 786445, metadata !21, metadata !"c", metadata !6, i32 23, i64 8, i64 8, i64 0, i32 0, metadata !24} ; [ DW_TAG_member ] [c] [line 23, size 8, align 8, offset 0] [from char] +!24 = metadata !{i32 786468, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char] +!25 = metadata !{i32 786445, metadata !21, metadata !"c2", metadata !6, i32 24, i64 16, i64 8, i64 8, i32 0, metadata !26} ; [ DW_TAG_member ] [c2] [line 24, size 16, align 8, offset 8] [from ] +!26 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 16, i64 8, i32 0, i32 0, metadata !24, metadata !18, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 16, align 8, offset 0] [from char] +!27 = metadata !{i32 786478, i32 0, metadata !21, metadata !"char_struct", metadata !"char_struct", metadata !"", metadata !6, i32 22, metadata !28, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !31, i32 22} ; [ DW_TAG_subprogram ] [line 22] [char_struct] +!28 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !29, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!29 = metadata !{null, metadata !30} +!30 = metadata !{i32 786447, i32 0, metadata !"", i32 0, i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !21} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from char_struct] +!31 = metadata !{metadata !32} +!32 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] +!33 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !34} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!34 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!35 = metadata !{i32 786468, null, metadata !"unsigned short", null, i32 0, i64 16, i64 16, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [unsigned short] [line 0, size 16, align 16, offset 0, enc DW_ATE_unsigned] +!36 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !37} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from long unsigned int] +!37 = metadata !{i32 786468, null, metadata !"long unsigned int", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [long unsigned int] [line 0, size 64, align 64, offset 0, enc DW_ATE_unsigned] +!38 = metadata !{i32 786478, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 38, metadata !39, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, metadata !1, i32 39} ; [ DW_TAG_subprogram ] [line 38] [def] [scope 39] [main] +!39 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !40, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!40 = metadata !{metadata !9, metadata !9, metadata !41} +!41 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !42} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!42 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !24} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from char] +!43 = metadata !{metadata !44} +!44 = metadata !{metadata !45} +!45 = metadata !{i32 786484, i32 0, null, metadata !"compound_char", metadata !"compound_char", metadata !"", metadata !6, i32 25, metadata !21, i32 0, i32 1, %struct.char_struct* @compound_char} ; [ DW_TAG_variable ] [compound_char] [line 25] [def] +!46 = metadata !{i32 29, i32 0, metadata !47, null} +!47 = metadata !{i32 786443, metadata !5, i32 28, i32 0, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] [/home/akaylor/dev/test-parameters.cpp] +!48 = metadata !{i32 786689, metadata !10, metadata !"pf", metadata !6, i32 16777248, metadata !14, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [pf] [line 32] +!49 = metadata !{i32 32, i32 0, metadata !10, null} +!50 = metadata !{i32 786689, metadata !10, metadata !"ppd", metadata !6, i32 33554464, metadata !16, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [ppd] [line 32] +!51 = metadata !{i32 786689, metadata !10, metadata !"s", metadata !6, i32 50331680, metadata !20, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [s] [line 32] +!52 = metadata !{i32 786689, metadata !10, metadata !"ppn", metadata !6, i32 67108896, metadata !33, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [ppn] [line 32] +!53 = metadata !{i32 786689, metadata !10, metadata !"us", metadata !6, i32 83886112, metadata !35, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [us] [line 32] +!54 = metadata !{i32 786689, metadata !10, metadata !"l", metadata !6, i32 100663328, metadata !36, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [l] [line 32] +!55 = metadata !{i32 786688, metadata !56, metadata !"result", metadata !6, i32 34, metadata !13, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [result] [line 34] +!56 = metadata !{i32 786443, metadata !10, i32 33, i32 0, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] [/home/akaylor/dev/test-parameters.cpp] +!57 = metadata !{i32 34, i32 0, metadata !56, null} +!58 = metadata !{i32 35, i32 0, metadata !56, null} +!59 = metadata !{i32 786689, metadata !38, metadata !"argc", metadata !6, i32 16777254, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argc] [line 38] +!60 = metadata !{i32 38, i32 0, metadata !38, null} +!61 = metadata !{i32 786689, metadata !38, metadata !"argv", metadata !6, i32 33554470, metadata !41, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argv] [line 38] +!62 = metadata !{i32 786688, metadata !63, metadata !"s", metadata !6, i32 40, metadata !21, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [s] [line 40] +!63 = metadata !{i32 786443, metadata !38, i32 39, i32 0, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] [/home/akaylor/dev/test-parameters.cpp] +!64 = metadata !{i32 40, i32 0, metadata !63, null} +!65 = metadata !{i32 786688, metadata !63, metadata !"f", metadata !6, i32 41, metadata !15, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [f] [line 41] +!66 = metadata !{i32 41, i32 0, metadata !63, null} +!67 = metadata !{i32 786688, metadata !63, metadata !"d", metadata !6, i32 42, metadata !68, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [d] [line 42] +!68 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 256, i64 64, i32 0, i32 0, metadata !13, metadata !69, i32 0, i32 0} ; [ DW_TAG_array_type ] [line 0, size 256, align 64, offset 0] [from double] +!69 = metadata !{metadata !19, metadata !19} +!70 = metadata !{i32 42, i32 0, metadata !63, null} +!71 = metadata !{i32 44, i32 0, metadata !63, null} +!72 = metadata !{i32 45, i32 0, metadata !63, null} +!73 = metadata !{i32 46, i32 0, metadata !63, null} +!74 = metadata !{i32 786688, metadata !63, metadata !"result", metadata !6, i32 48, metadata !13, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [result] [line 48] +!75 = metadata !{i32 48, i32 0, metadata !63, null} +!76 = metadata !{i32 49, i32 0, metadata !63, null} diff --git a/test/Linker/2006-01-19-ConstantPacked.ll b/test/Linker/2006-01-19-ConstantPacked.ll index d2409e20c4d9..5b39cb2ad279 100644 --- a/test/Linker/2006-01-19-ConstantPacked.ll +++ b/test/Linker/2006-01-19-ConstantPacked.ll @@ -3,11 +3,8 @@ target datalayout = "E-p:32:32" target triple = "powerpc-apple-darwin7.7.0" -deplibs = [ "c", "crtend" ] @source = global <4 x i32> < i32 0, i32 1, i32 2, i32 3 > ; <<4 x i32>*> [#uses=0] define i32 @main() { -entry: - ret i32 0 + ret i32 0 } - diff --git a/test/Linker/DbgDeclare.ll b/test/Linker/DbgDeclare.ll new file mode 100644 index 000000000000..7f64f95c3a7f --- /dev/null +++ b/test/Linker/DbgDeclare.ll @@ -0,0 +1,58 @@ +; RUN: llvm-link %s %p/DbgDeclare2.ll -o %t.bc +; RUN: llvm-dis < %t.bc | FileCheck %s +; Test if metadata in dbg.declare is mapped properly or not. + +; rdar://13089880 +; CHECK: define i32 @main(i32 %argc, i8** %argv) +; CHECK: call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !{{[0-9]+}}) +; CHECK: call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !{{[0-9]+}}) +; CHECK: define void @test(i32 %argc, i8** %argv) +; CHECK: call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !{{[0-9]+}}) +; CHECK: call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !{{[0-9]+}}) +; CHECK: call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !{{[0-9]+}}) + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +define i32 @main(i32 %argc, i8** %argv) uwtable ssp { +entry: + %retval = alloca i32, align 4 + %argc.addr = alloca i32, align 4 + %argv.addr = alloca i8**, align 8 + store i32 0, i32* %retval + store i32 %argc, i32* %argc.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !14), !dbg !15 + store i8** %argv, i8*** %argv.addr, align 8 + call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !16), !dbg !15 + %0 = load i32* %argc.addr, align 4, !dbg !17 + %1 = load i8*** %argv.addr, align 8, !dbg !17 + call void @test(i32 %0, i8** %1), !dbg !17 + ret i32 0, !dbg !19 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +declare void @test(i32, i8**) + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"main.cpp", metadata !"/private/tmp", metadata !"clang version 3.3 (trunk 173515)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !"main.cpp", metadata !"/private/tmp", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!8 = metadata !{metadata !9, metadata !9, metadata !10} +!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!10 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] +!11 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !12} ; [ DW_TAG_pointer_type ] +!12 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !13} ; [ DW_TAG_const_type ] +!13 = metadata !{i32 786468, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786689, metadata !5, metadata !"argc", metadata !6, i32 16777219, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!15 = metadata !{i32 3, i32 0, metadata !5, null} +!16 = metadata !{i32 786689, metadata !5, metadata !"argv", metadata !6, i32 33554435, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!17 = metadata !{i32 5, i32 0, metadata !18, null} +!18 = metadata !{i32 786443, metadata !5, i32 4, i32 0, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!19 = metadata !{i32 6, i32 0, metadata !18, null} diff --git a/test/Linker/DbgDeclare2.ll b/test/Linker/DbgDeclare2.ll new file mode 100644 index 000000000000..e2e56b289338 --- /dev/null +++ b/test/Linker/DbgDeclare2.ll @@ -0,0 +1,76 @@ +; This file is used by 2011-08-04-DebugLoc.ll, so it doesn't actually do anything itself +; +; RUN: true + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +define void @test(i32 %argc, i8** %argv) uwtable ssp { +entry: + %argc.addr = alloca i32, align 4 + %argv.addr = alloca i8**, align 8 + %i = alloca i32, align 4 + store i32 %argc, i32* %argc.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !14), !dbg !15 + store i8** %argv, i8*** %argv.addr, align 8 + call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !16), !dbg !15 + call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !17), !dbg !20 + store i32 0, i32* %i, align 4, !dbg !20 + br label %for.cond, !dbg !20 + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4, !dbg !20 + %1 = load i32* %argc.addr, align 4, !dbg !20 + %cmp = icmp slt i32 %0, %1, !dbg !20 + br i1 %cmp, label %for.body, label %for.end, !dbg !20 + +for.body: ; preds = %for.cond + %2 = load i32* %i, align 4, !dbg !21 + %idxprom = sext i32 %2 to i64, !dbg !21 + %3 = load i8*** %argv.addr, align 8, !dbg !21 + %arrayidx = getelementptr inbounds i8** %3, i64 %idxprom, !dbg !21 + %4 = load i8** %arrayidx, align 8, !dbg !21 + %call = call i32 @puts(i8* %4), !dbg !21 + br label %for.inc, !dbg !23 + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4, !dbg !20 + %inc = add nsw i32 %5, 1, !dbg !20 + store i32 %inc, i32* %i, align 4, !dbg !20 + br label %for.cond, !dbg !20 + +for.end: ; preds = %for.cond + ret void, !dbg !24 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +declare i32 @puts(i8*) + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"main.cpp", metadata !"/private/tmp", metadata !"clang version 3.3 (trunk 173515)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"print_args", metadata !"print_args", metadata !"test", metadata !6, i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32, i8**)* @test, null, null, metadata !1, i32 5} ; [ DW_TAG_subprogram ] +!6 = metadata !{i32 786473, metadata !"test.cpp", metadata !"/private/tmp", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!8 = metadata !{null, metadata !9, metadata !10} +!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!10 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] +!11 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !12} ; [ DW_TAG_pointer_type ] +!12 = metadata !{i32 786470, null, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !13} ; [ DW_TAG_const_type ] +!13 = metadata !{i32 786468, null, metadata !"char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786689, metadata !5, metadata !"argc", metadata !6, i32 16777220, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!15 = metadata !{i32 4, i32 0, metadata !5, null} +!16 = metadata !{i32 786689, metadata !5, metadata !"argv", metadata !6, i32 33554436, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] +!17 = metadata !{i32 786688, metadata !18, metadata !"i", metadata !6, i32 6, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] +!18 = metadata !{i32 786443, metadata !19, i32 6, i32 0, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] +!19 = metadata !{i32 786443, metadata !5, i32 5, i32 0, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!20 = metadata !{i32 6, i32 0, metadata !18, null} +!21 = metadata !{i32 8, i32 0, metadata !22, null} +!22 = metadata !{i32 786443, metadata !18, i32 7, i32 0, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] +!23 = metadata !{i32 9, i32 0, metadata !22, null} +!24 = metadata !{i32 10, i32 0, metadata !19, null} diff --git a/test/Linker/module-flags-1-a.ll b/test/Linker/module-flags-1-a.ll index 973aa80822c5..32f189cf99f1 100644 --- a/test/Linker/module-flags-1-a.ll +++ b/test/Linker/module-flags-1-a.ll @@ -3,10 +3,10 @@ ; Test basic functionality of module flags. ; CHECK: !0 = metadata !{i32 1, metadata !"foo", i32 37} -; CHECK: !1 = metadata !{i32 1, metadata !"qux", i32 42} +; CHECK: !1 = metadata !{i32 2, metadata !"bar", i32 42} ; CHECK: !2 = metadata !{i32 1, metadata !"mux", metadata !3} ; CHECK: !3 = metadata !{metadata !"hello world", i32 927} -; CHECK: !4 = metadata !{i32 2, metadata !"bar", i32 42} +; CHECK: !4 = metadata !{i32 1, metadata !"qux", i32 42} ; CHECK: !llvm.module.flags = !{!0, !1, !2, !4} !0 = metadata !{ i32 1, metadata !"foo", i32 37 } diff --git a/test/Linker/module-flags-3-a.ll b/test/Linker/module-flags-3-a.ll index 4233a0a7a5b1..e7a720e9c024 100644 --- a/test/Linker/module-flags-3-a.ll +++ b/test/Linker/module-flags-3-a.ll @@ -3,10 +3,10 @@ ; Test 'require' behavior. ; CHECK: !0 = metadata !{i32 1, metadata !"foo", i32 37} -; CHECK: !1 = metadata !{i32 3, metadata !"foo", metadata !2} -; CHECK: !2 = metadata !{metadata !"bar", i32 42} -; CHECK: !3 = metadata !{i32 1, metadata !"bar", i32 42} -; CHECK: !llvm.module.flags = !{!0, !1, !3} +; CHECK: !1 = metadata !{i32 1, metadata !"bar", i32 42} +; CHECK: !2 = metadata !{i32 3, metadata !"foo", metadata !3} +; CHECK: !3 = metadata !{metadata !"bar", i32 42} +; CHECK: !llvm.module.flags = !{!0, !1, !2} !0 = metadata !{ i32 1, metadata !"foo", i32 37 } !1 = metadata !{ i32 1, metadata !"bar", i32 42 } diff --git a/test/Linker/module-flags-7-a.ll b/test/Linker/module-flags-7-a.ll new file mode 100644 index 000000000000..976c8fecf5fe --- /dev/null +++ b/test/Linker/module-flags-7-a.ll @@ -0,0 +1,9 @@ +; RUN: not llvm-link %s %p/module-flags-7-b.ll -S -o - 2>&1 | FileCheck %s + +; Test module flags error messages. + +; CHECK: linking module flags 'foo': IDs have conflicting behaviors + +!0 = metadata !{ i32 1, metadata !"foo", i32 37 } + +!llvm.module.flags = !{ !0 } diff --git a/test/Linker/module-flags-7-b.ll b/test/Linker/module-flags-7-b.ll new file mode 100644 index 000000000000..2bc72508d468 --- /dev/null +++ b/test/Linker/module-flags-7-b.ll @@ -0,0 +1,6 @@ +; This file is used with module-flags-7-a.ll +; RUN: true + +!0 = metadata !{ i32 2, metadata !"foo", i32 37 } + +!llvm.module.flags = !{ !0 } diff --git a/test/Linker/module-flags-8-a.ll b/test/Linker/module-flags-8-a.ll new file mode 100644 index 000000000000..146cae763d6d --- /dev/null +++ b/test/Linker/module-flags-8-a.ll @@ -0,0 +1,14 @@ +; RUN: llvm-link %s %p/module-flags-8-b.ll -S -o - | sort | FileCheck %s + +; Test append-type module flags. + +; CHECK: !0 = metadata !{i32 5, metadata !"flag-0", metadata !1} +; CHECK: !1 = metadata !{i32 0, i32 0, i32 1} +; CHECK: !2 = metadata !{i32 6, metadata !"flag-1", metadata !3} +; CHECK: !3 = metadata !{i32 0, i32 1, i32 2} +; CHECK: !llvm.module.flags = !{!0, !2} + +!0 = metadata !{ i32 5, metadata !"flag-0", metadata !{ i32 0 } } +!1 = metadata !{ i32 6, metadata !"flag-1", metadata !{ i32 0, i32 1 } } + +!llvm.module.flags = !{ !0, !1 } diff --git a/test/Linker/module-flags-8-b.ll b/test/Linker/module-flags-8-b.ll new file mode 100644 index 000000000000..08f9bc49ee5e --- /dev/null +++ b/test/Linker/module-flags-8-b.ll @@ -0,0 +1,7 @@ +; This file is used with module-flags-6-a.ll +; RUN: true + +!0 = metadata !{ i32 5, metadata !"flag-0", metadata !{ i32 0, i32 1 } } +!1 = metadata !{ i32 6, metadata !"flag-1", metadata !{ i32 1, i32 2 } } + +!llvm.module.flags = !{ !0, !1 } diff --git a/test/Linker/testlink1.ll b/test/Linker/testlink1.ll index a8746379b6cf..6ba6fd5fd7e9 100644 --- a/test/Linker/testlink1.ll +++ b/test/Linker/testlink1.ll @@ -13,6 +13,10 @@ ; The uses of intlist in the other file should be remapped. ; CHECK-NOT: {{%intlist.[0-9]}} +; CHECK: %VecSize = type { <5 x i32> } +; CHECK: %VecSize.{{[0-9]}} = type { <10 x i32> } +%VecSize = type { <5 x i32> } + %Struct1 = type opaque @S1GV = external global %Struct1* @@ -93,3 +97,5 @@ define internal void @Testintern() { define void @testIntern() { ret void } + +declare void @VecSizeCrash(%VecSize) diff --git a/test/Linker/testlink2.ll b/test/Linker/testlink2.ll index 1798e31e47dc..ff8e5299869a 100644 --- a/test/Linker/testlink2.ll +++ b/test/Linker/testlink2.ll @@ -8,6 +8,8 @@ %Ty1 = type { %Ty2* } %Ty2 = type opaque +%VecSize = type { <10 x i32> } + @GVTy1 = global %Ty1* null @GVTy2 = external global %Ty2* @@ -53,3 +55,4 @@ define internal void @testIntern() { ret void } +declare void @VecSizeCrash1(%VecSize) diff --git a/test/MC/AArch64/basic-a64-diagnostics.s b/test/MC/AArch64/basic-a64-diagnostics.s new file mode 100644 index 000000000000..1e9024c5eede --- /dev/null +++ b/test/MC/AArch64/basic-a64-diagnostics.s @@ -0,0 +1,3713 @@ +// RUN: not llvm-mc -triple=aarch64 < %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-ERROR < %t %s + +//------------------------------------------------------------------------------ +// Add/sub (extended register) +//------------------------------------------------------------------------------ + + // Mismatched final register and extend + add x2, x3, x5, sxtb + add x2, x4, w2, uxtx + add w5, w7, x9, sxtx +// CHECK-ERROR: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR: add x2, x3, x5, sxtb +// CHECK-ERROR: ^ +// CHECK-ERROR: error: expected '[su]xt[bhw]' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR: add x2, x4, w2, uxtx +// CHECK-ERROR: ^ +// CHECK-ERROR: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR: add w5, w7, x9, sxtx +// CHECK-ERROR: ^ + + // Out of range extends + add x9, x10, w11, uxtb #-1 + add x3, x5, w7, uxtb #5 + sub x9, x15, x2, uxth #5 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR: add x9, x10, w11, uxtb #-1 +// CHECK-ERROR: ^ +// CHECK-ERROR: error: expected '[su]xt[bhw]' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR: add x3, x5, w7, uxtb #5 +// CHECK-ERROR: ^ +// CHECK-ERROR: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR: sub x9, x15, x2, uxth #5 +// CHECK-ERROR: ^ + + // Wrong registers on normal variants + add xzr, x3, x5, uxtx + sub x3, xzr, w9, sxth #1 + add x1, x2, sp, uxtx +// CHECK-ERROR: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR: add xzr, x3, x5, uxtx +// CHECK-ERROR: ^ +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR: sub x3, xzr, w9, sxth #1 +// CHECK-ERROR: ^ +// CHECK-ERROR: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR: add x1, x2, sp, uxtx +// CHECK-ERROR: ^ + + // Wrong registers on flag-setting variants + adds sp, x3, w2, uxtb + adds x3, xzr, x9, uxtx + subs x2, x1, sp, uxtx + adds x2, x1, sp, uxtb #2 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR: adds sp, x3, w2, uxtb +// CHECK-ERROR: ^ +// CHECK-ERROR: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR: adds x3, xzr, x9, uxtx +// CHECK-ERROR: ^ +// CHECK-ERROR: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR: subs x2, x1, sp, uxtx +// CHECK-ERROR: ^ +// CHECK-ERROR: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR: adds x2, x1, sp, uxtb #2 +// CHECK-ERROR: ^ + + // Amount not optional if lsl valid and used + add sp, x5, x7, lsl +// CHECK-ERROR: error: expected #imm after shift specifier +// CHECK-ERROR: add sp, x5, x7, lsl +// CHECK-ERROR: ^ + +//------------------------------------------------------------------------------ +// Add/sub (immediate) +//------------------------------------------------------------------------------ + +// Out of range immediates: < 0 or more than 12 bits + add w4, w5, #-1 + add w5, w6, #0x1000 + add w4, w5, #-1, lsl #12 + add w5, w6, #0x1000, lsl #12 +// CHECK-ERROR: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: add w4, w5, #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: add w5, w6, #0x1000 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: add w4, w5, #-1, lsl #12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: add w5, w6, #0x1000, lsl #12 +// CHECK-ERROR-NEXT: ^ + +// Only lsl #0 and lsl #12 are allowed + add w2, w3, #0x1, lsl #1 + add w5, w17, #0xfff, lsl #13 + add w17, w20, #0x1000, lsl #12 + sub xsp, x34, #0x100, lsl #-1 +// CHECK-ERROR: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: add w2, w3, #0x1, lsl #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: add w5, w17, #0xfff, lsl #13 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: add w17, w20, #0x1000, lsl #12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: only 'lsl #+N' valid after immediate +// CHECK-ERROR-NEXT: sub xsp, x34, #0x100, lsl #-1 +// CHECK-ERROR-NEXT: ^ + +// Incorrect registers (w31 doesn't exist at all, and 31 decodes to sp for these). + add w31, w20, #1234 + add wzr, w20, #0x123 + add w20, wzr, #0x321 + add wzr, wzr, #0xfff +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: add w31, w20, #1234 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: add wzr, w20, #0x123 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: add w20, wzr, #0x321 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: add wzr, wzr, #0xfff +// CHECK-ERROR-NEXT: ^ + +// Mixed register classes + add xsp, w2, #123 + sub w2, x30, #32 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: add xsp, w2, #123 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sub w2, x30, #32 +// CHECK-ERROR-NEXT: ^ + +// Out of range immediate + adds w0, w5, #0x10000 +// CHECK-ERROR: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: adds w0, w5, #0x10000 +// CHECK-ERROR-NEXT: ^ + +// Wn|WSP should be in second place + adds w4, wzr, #0x123 +// ...but wzr is the 31 destination + subs wsp, w5, #123 + subs x5, xzr, #0x456, lsl #12 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adds w4, wzr, #0x123 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: subs wsp, w5, #123 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: subs x5, xzr, #0x456, lsl #12 +// CHECK-ERROR-NEXT: ^ + + // MOV alias should not accept any fiddling + mov x2, xsp, #123 + mov wsp, w27, #0xfff, lsl #12 +// CHECK-ERROR: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: mov x2, xsp, #123 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: mov wsp, w27, #0xfff, lsl #12 +// CHECK-ERROR-NEXT: ^ + + // A relocation should be provided for symbols + add x3, x9, #variable +// CHECK-ERROR: error: expected compatible register, symbol or integer in range [0, 4095] +// CHECK-ERROR-NEXT: add x3, x9, #variable +// CHECK-ERROR-NEXT: ^ + + +//------------------------------------------------------------------------------ +// Add-subtract (shifted register) +//------------------------------------------------------------------------------ + + add wsp, w1, w2, lsr #3 + add x4, sp, x9, asr #5 + add x9, x10, x5, ror #3 +// CHECK-ERROR: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add wsp, w1, w2, lsr #3 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add x4, sp, x9, asr #5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add x9, x10, x5, ror #3 +// CHECK-ERROR-NEXT: ^ + + add w1, w2, w3, lsl #-1 + add w1, w2, w3, lsl #32 + add w1, w2, w3, lsr #-1 + add w1, w2, w3, lsr #32 + add w1, w2, w3, asr #-1 + add w1, w2, w3, asr #32 + add x1, x2, x3, lsl #-1 + add x1, x2, x3, lsl #64 + add x1, x2, x3, lsr #-1 + add x1, x2, x3, lsr #64 + add x1, x2, x3, asr #-1 + add x1, x2, x3, asr #64 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: add w1, w2, w3, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add w1, w2, w3, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: add w1, w2, w3, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add w1, w2, w3, lsr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: add w1, w2, w3, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add w1, w2, w3, asr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: add x1, x2, x3, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add x1, x2, x3, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: add x1, x2, x3, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add x1, x2, x3, lsr #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: add x1, x2, x3, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: add x1, x2, x3, asr #64 +// CHECK-ERROR-NEXT: ^ + + adds w1, w2, w3, lsl #-1 + adds w1, w2, w3, lsl #32 + adds w1, w2, w3, lsr #-1 + adds w1, w2, w3, lsr #32 + adds w1, w2, w3, asr #-1 + adds w1, w2, w3, asr #32 + adds x1, x2, x3, lsl #-1 + adds x1, x2, x3, lsl #64 + adds x1, x2, x3, lsr #-1 + adds x1, x2, x3, lsr #64 + adds x1, x2, x3, asr #-1 + adds x1, x2, x3, asr #64 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: adds w1, w2, w3, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: adds w1, w2, w3, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: adds w1, w2, w3, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: adds w1, w2, w3, lsr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: adds w1, w2, w3, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: adds w1, w2, w3, asr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: adds x1, x2, x3, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: adds x1, x2, x3, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: adds x1, x2, x3, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: adds x1, x2, x3, lsr #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: adds x1, x2, x3, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: adds x1, x2, x3, asr #64 +// CHECK-ERROR-NEXT: ^ + + sub w1, w2, w3, lsl #-1 + sub w1, w2, w3, lsl #32 + sub w1, w2, w3, lsr #-1 + sub w1, w2, w3, lsr #32 + sub w1, w2, w3, asr #-1 + sub w1, w2, w3, asr #32 + sub x1, x2, x3, lsl #-1 + sub x1, x2, x3, lsl #64 + sub x1, x2, x3, lsr #-1 + sub x1, x2, x3, lsr #64 + sub x1, x2, x3, asr #-1 + sub x1, x2, x3, asr #64 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: sub w1, w2, w3, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: sub w1, w2, w3, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: sub w1, w2, w3, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: sub w1, w2, w3, lsr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: sub w1, w2, w3, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: sub w1, w2, w3, asr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: sub x1, x2, x3, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: sub x1, x2, x3, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: sub x1, x2, x3, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: sub x1, x2, x3, lsr #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: sub x1, x2, x3, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: sub x1, x2, x3, asr #64 +// CHECK-ERROR-NEXT: ^ + + subs w1, w2, w3, lsl #-1 + subs w1, w2, w3, lsl #32 + subs w1, w2, w3, lsr #-1 + subs w1, w2, w3, lsr #32 + subs w1, w2, w3, asr #-1 + subs w1, w2, w3, asr #32 + subs x1, x2, x3, lsl #-1 + subs x1, x2, x3, lsl #64 + subs x1, x2, x3, lsr #-1 + subs x1, x2, x3, lsr #64 + subs x1, x2, x3, asr #-1 + subs x1, x2, x3, asr #64 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: subs w1, w2, w3, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: subs w1, w2, w3, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: subs w1, w2, w3, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: subs w1, w2, w3, lsr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: subs w1, w2, w3, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: subs w1, w2, w3, asr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: subs x1, x2, x3, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: subs x1, x2, x3, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: subs x1, x2, x3, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: subs x1, x2, x3, lsr #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: subs x1, x2, x3, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: subs x1, x2, x3, asr #64 +// CHECK-ERROR-NEXT: ^ + + cmn w9, w10, lsl #-1 + cmn w9, w10, lsl #32 + cmn w11, w12, lsr #-1 + cmn w11, w12, lsr #32 + cmn w19, wzr, asr #-1 + cmn wzr, wzr, asr #32 + cmn x9, x10, lsl #-1 + cmn x9, x10, lsl #64 + cmn x11, x12, lsr #-1 + cmn x11, x12, lsr #64 + cmn x19, xzr, asr #-1 + cmn xzr, xzr, asr #64 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmn w9, w10, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: cmn w9, w10, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmn w11, w12, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: cmn w11, w12, lsr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmn w19, wzr, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: cmn wzr, wzr, asr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmn x9, x10, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: cmn x9, x10, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmn x11, x12, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: cmn x11, x12, lsr #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmn x19, xzr, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: cmn xzr, xzr, asr #64 +// CHECK-ERROR-NEXT: ^ + + cmp w9, w10, lsl #-1 + cmp w9, w10, lsl #32 + cmp w11, w12, lsr #-1 + cmp w11, w12, lsr #32 + cmp w19, wzr, asr #-1 + cmp wzr, wzr, asr #32 + cmp x9, x10, lsl #-1 + cmp x9, x10, lsl #64 + cmp x11, x12, lsr #-1 + cmp x11, x12, lsr #64 + cmp x19, xzr, asr #-1 + cmp xzr, xzr, asr #64 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmp w9, w10, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: cmp w9, w10, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmp w11, w12, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: cmp w11, w12, lsr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmp w19, wzr, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: cmp wzr, wzr, asr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmp x9, x10, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: cmp x9, x10, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmp x11, x12, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4] +// CHECK-ERROR-NEXT: cmp x11, x12, lsr #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: cmp x19, xzr, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: cmp xzr, xzr, asr #64 +// CHECK-ERROR-NEXT: ^ + + neg w9, w10, lsl #-1 + neg w9, w10, lsl #32 + neg w11, w12, lsr #-1 + neg w11, w12, lsr #32 + neg w19, wzr, asr #-1 + neg wzr, wzr, asr #32 + neg x9, x10, lsl #-1 + neg x9, x10, lsl #64 + neg x11, x12, lsr #-1 + neg x11, x12, lsr #64 + neg x19, xzr, asr #-1 + neg xzr, xzr, asr #64 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: neg w9, w10, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: neg w9, w10, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: neg w11, w12, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: neg w11, w12, lsr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: neg w19, wzr, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: neg wzr, wzr, asr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: neg x9, x10, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: neg x9, x10, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: neg x11, x12, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: neg x11, x12, lsr #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: neg x19, xzr, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: neg xzr, xzr, asr #64 +// CHECK-ERROR-NEXT: ^ + + negs w9, w10, lsl #-1 + negs w9, w10, lsl #32 + negs w11, w12, lsr #-1 + negs w11, w12, lsr #32 + negs w19, wzr, asr #-1 + negs wzr, wzr, asr #32 + negs x9, x10, lsl #-1 + negs x9, x10, lsl #64 + negs x11, x12, lsr #-1 + negs x11, x12, lsr #64 + negs x19, xzr, asr #-1 + negs xzr, xzr, asr #64 +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: negs w9, w10, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: negs w9, w10, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: negs w11, w12, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: negs w11, w12, lsr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: negs w19, wzr, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: negs wzr, wzr, asr #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: negs x9, x10, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: negs x9, x10, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: negs x11, x12, lsr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: negs x11, x12, lsr #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: negs x19, xzr, asr #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: negs xzr, xzr, asr #64 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Add-subtract (shifted register) +//------------------------------------------------------------------------------ + + adc wsp, w3, w5 + adc w1, wsp, w2 + adc w0, w10, wsp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adc wsp, w3, w5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adc w1, wsp, w2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adc w0, w10, wsp +// CHECK-ERROR-NEXT: ^ + + adc sp, x3, x5 + adc x1, sp, x2 + adc x0, x10, sp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adc sp, x3, x5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adc x1, sp, x2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adc x0, x10, sp +// CHECK-ERROR-NEXT: ^ + + adcs wsp, w3, w5 + adcs w1, wsp, w2 + adcs w0, w10, wsp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adcs wsp, w3, w5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adcs w1, wsp, w2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adcs w0, w10, wsp +// CHECK-ERROR-NEXT: ^ + + adcs sp, x3, x5 + adcs x1, sp, x2 + adcs x0, x10, sp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adcs sp, x3, x5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adcs x1, sp, x2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adcs x0, x10, sp +// CHECK-ERROR-NEXT: ^ + + sbc wsp, w3, w5 + sbc w1, wsp, w2 + sbc w0, w10, wsp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbc wsp, w3, w5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbc w1, wsp, w2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbc w0, w10, wsp +// CHECK-ERROR-NEXT: ^ + + sbc sp, x3, x5 + sbc x1, sp, x2 + sbc x0, x10, sp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbc sp, x3, x5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbc x1, sp, x2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbc x0, x10, sp +// CHECK-ERROR-NEXT: ^ + + sbcs wsp, w3, w5 + sbcs w1, wsp, w2 + sbcs w0, w10, wsp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbcs wsp, w3, w5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbcs w1, wsp, w2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbcs w0, w10, wsp +// CHECK-ERROR-NEXT: ^ + + sbcs sp, x3, x5 + sbcs x1, sp, x2 + sbcs x0, x10, sp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbcs sp, x3, x5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbcs x1, sp, x2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbcs x0, x10, sp +// CHECK-ERROR-NEXT: ^ + + ngc wsp, w3 + ngc w9, wsp + ngc sp, x9 + ngc x2, sp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ngc wsp, w3 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ngc w9, wsp +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ngc sp, x9 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ngc x2, sp +// CHECK-ERROR-NEXT: ^ + + ngcs wsp, w3 + ngcs w9, wsp + ngcs sp, x9 + ngcs x2, sp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ngcs wsp, w3 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ngcs w9, wsp +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ngcs sp, x9 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ngcs x2, sp +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Bitfield +//------------------------------------------------------------------------------ + + sbfm x3, w13, #0, #0 + sbfm w12, x9, #0, #0 + sbfm sp, x3, #3, #5 + sbfm w3, wsp, #1, #9 + sbfm x9, x5, #-1, #0 + sbfm x9, x5, #0, #-1 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfm x3, w13, #0, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfm w12, x9, #0, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfm sp, x3, #3, #5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfm w3, wsp, #1, #9 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: sbfm x9, x5, #-1, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: sbfm x9, x5, #0, #-1 +// CHECK-ERROR-NEXT: ^ + + sbfm w3, w5, #32, #1 + sbfm w7, w11, #19, #32 + sbfm x29, x30, #64, #0 + sbfm x10, x20, #63, #64 +// CHECK-ERROR: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: sbfm w3, w5, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: sbfm w7, w11, #19, #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: sbfm x29, x30, #64, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: sbfm x10, x20, #63, #64 +// CHECK-ERROR-NEXT: ^ + + ubfm w3, w5, #32, #1 + ubfm w7, w11, #19, #32 + ubfm x29, x30, #64, #0 + ubfm x10, x20, #63, #64 +// CHECK-ERROR: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ubfm w3, w5, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ubfm w7, w11, #19, #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: ubfm x29, x30, #64, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: ubfm x10, x20, #63, #64 +// CHECK-ERROR-NEXT: ^ + + bfm w3, w5, #32, #1 + bfm w7, w11, #19, #32 + bfm x29, x30, #64, #0 + bfm x10, x20, #63, #64 +// CHECK-ERROR: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: bfm w3, w5, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: bfm w7, w11, #19, #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: bfm x29, x30, #64, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: bfm x10, x20, #63, #64 +// CHECK-ERROR-NEXT: ^ + + sxtb x3, x2 + sxth xzr, xzr + sxtw x3, x5 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sxtb x3, x2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sxth xzr, xzr +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sxtw x3, x5 +// CHECK-ERROR-NEXT: ^ + + uxtb x3, x12 + uxth x5, x9 + uxtw x3, x5 + uxtb x2, sp + uxtb sp, xzr +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: uxtb x3, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: uxth x5, x9 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid instruction +// CHECK-ERROR-NEXT: uxtw x3, x5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: uxtb x2, sp +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: uxtb sp, xzr +// CHECK-ERROR-NEXT: ^ + + asr x3, w2, #1 + asr sp, x2, #1 + asr x25, x26, #-1 + asr x25, x26, #64 + asr w9, w8, #32 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: asr x3, w2, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: asr sp, x2, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: asr x25, x26, #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: asr x25, x26, #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: asr w9, w8, #32 +// CHECK-ERROR-NEXT: ^ + + sbfiz w1, w2, #0, #0 + sbfiz wsp, w9, #0, #1 + sbfiz w9, w10, #32, #1 + sbfiz w11, w12, #32, #0 + sbfiz w9, w10, #10, #23 + sbfiz x3, x5, #12, #53 + sbfiz sp, x3, #5, #6 + sbfiz w3, wsp, #7, #8 +// CHECK-ERROR: error: expected integer in range [<lsb>, 31] +// CHECK-ERROR-NEXT: sbfiz w1, w2, #0, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfiz wsp, w9, #0, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: sbfiz w9, w10, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: sbfiz w11, w12, #32, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested insert overflows register +// CHECK-ERROR-NEXT: sbfiz w9, w10, #10, #23 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested insert overflows register +// CHECK-ERROR-NEXT: sbfiz x3, x5, #12, #53 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfiz sp, x3, #5, #6 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfiz w3, wsp, #7, #8 +// CHECK-ERROR-NEXT: ^ + + sbfx w1, w2, #0, #0 + sbfx wsp, w9, #0, #1 + sbfx w9, w10, #32, #1 + sbfx w11, w12, #32, #0 + sbfx w9, w10, #10, #23 + sbfx x3, x5, #12, #53 + sbfx sp, x3, #5, #6 + sbfx w3, wsp, #7, #8 +// CHECK-ERROR: error: expected integer in range [<lsb>, 31] +// CHECK-ERROR-NEXT: sbfx w1, w2, #0, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfx wsp, w9, #0, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: sbfx w9, w10, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: sbfx w11, w12, #32, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested extract overflows register +// CHECK-ERROR-NEXT: sbfx w9, w10, #10, #23 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested extract overflows register +// CHECK-ERROR-NEXT: sbfx x3, x5, #12, #53 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfx sp, x3, #5, #6 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sbfx w3, wsp, #7, #8 +// CHECK-ERROR-NEXT: ^ + + bfi w1, w2, #0, #0 + bfi wsp, w9, #0, #1 + bfi w9, w10, #32, #1 + bfi w11, w12, #32, #0 + bfi w9, w10, #10, #23 + bfi x3, x5, #12, #53 + bfi sp, x3, #5, #6 + bfi w3, wsp, #7, #8 +// CHECK-ERROR: error: expected integer in range [<lsb>, 31] +// CHECK-ERROR-NEXT: bfi w1, w2, #0, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: bfi wsp, w9, #0, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: bfi w9, w10, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: bfi w11, w12, #32, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested insert overflows register +// CHECK-ERROR-NEXT: bfi w9, w10, #10, #23 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested insert overflows register +// CHECK-ERROR-NEXT: bfi x3, x5, #12, #53 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: bfi sp, x3, #5, #6 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: bfi w3, wsp, #7, #8 +// CHECK-ERROR-NEXT: ^ + + bfxil w1, w2, #0, #0 + bfxil wsp, w9, #0, #1 + bfxil w9, w10, #32, #1 + bfxil w11, w12, #32, #0 + bfxil w9, w10, #10, #23 + bfxil x3, x5, #12, #53 + bfxil sp, x3, #5, #6 + bfxil w3, wsp, #7, #8 +// CHECK-ERROR: error: expected integer in range [<lsb>, 31] +// CHECK-ERROR-NEXT: bfxil w1, w2, #0, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: bfxil wsp, w9, #0, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: bfxil w9, w10, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: bfxil w11, w12, #32, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested extract overflows register +// CHECK-ERROR-NEXT: bfxil w9, w10, #10, #23 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested extract overflows register +// CHECK-ERROR-NEXT: bfxil x3, x5, #12, #53 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: bfxil sp, x3, #5, #6 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: bfxil w3, wsp, #7, #8 +// CHECK-ERROR-NEXT: ^ + + ubfiz w1, w2, #0, #0 + ubfiz wsp, w9, #0, #1 + ubfiz w9, w10, #32, #1 + ubfiz w11, w12, #32, #0 + ubfiz w9, w10, #10, #23 + ubfiz x3, x5, #12, #53 + ubfiz sp, x3, #5, #6 + ubfiz w3, wsp, #7, #8 +// CHECK-ERROR: error: expected integer in range [<lsb>, 31] +// CHECK-ERROR-NEXT: ubfiz w1, w2, #0, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ubfiz wsp, w9, #0, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ubfiz w9, w10, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ubfiz w11, w12, #32, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested insert overflows register +// CHECK-ERROR-NEXT: ubfiz w9, w10, #10, #23 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested insert overflows register +// CHECK-ERROR-NEXT: ubfiz x3, x5, #12, #53 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ubfiz sp, x3, #5, #6 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ubfiz w3, wsp, #7, #8 +// CHECK-ERROR-NEXT: ^ + + ubfx w1, w2, #0, #0 + ubfx wsp, w9, #0, #1 + ubfx w9, w10, #32, #1 + ubfx w11, w12, #32, #0 + ubfx w9, w10, #10, #23 + ubfx x3, x5, #12, #53 + ubfx sp, x3, #5, #6 + ubfx w3, wsp, #7, #8 +// CHECK-ERROR: error: expected integer in range [<lsb>, 31] +// CHECK-ERROR-NEXT: ubfx w1, w2, #0, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ubfx wsp, w9, #0, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ubfx w9, w10, #32, #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ubfx w11, w12, #32, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested extract overflows register +// CHECK-ERROR-NEXT: ubfx w9, w10, #10, #23 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: requested extract overflows register +// CHECK-ERROR-NEXT: ubfx x3, x5, #12, #53 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ubfx sp, x3, #5, #6 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ubfx w3, wsp, #7, #8 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Compare & branch (immediate) +//------------------------------------------------------------------------------ + + cbnz wsp, lbl + cbz sp, lbl + cbz x3, x5 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cbnz wsp, lbl +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cbz sp, lbl +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: cbz x3, x5 +// CHECK-ERROR-NEXT: ^ + + cbz w20, #1048576 + cbnz xzr, #-1048580 + cbz x29, #1 +// CHECK-ERROR: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: cbz w20, #1048576 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: cbnz xzr, #-1048580 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: cbz x29, #1 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Conditional branch (immediate) +//------------------------------------------------------------------------------ + + b.zf lbl +// CHECK-ERROR: error: invalid condition code +// CHECK-ERROR-NEXT: b.zf lbl +// CHECK-ERROR-NEXT: ^ + + b.eq #1048576 + b.ge #-1048580 + b.cc #1 +// CHECK-ERROR: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: b.eq #1048576 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: b.ge #-1048580 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: b.cc #1 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Conditional compare (immediate) +//------------------------------------------------------------------------------ + + ccmp wsp, #4, #2, ne + ccmp w25, #-1, #15, hs + ccmp w3, #32, #0, ge + ccmp w19, #5, #-1, lt + ccmp w20, #7, #16, hs +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ccmp wsp, #4, #2, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmp w25, #-1, #15, hs +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmp w3, #32, #0, ge +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmp w19, #5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmp w20, #7, #16, hs +// CHECK-ERROR-NEXT: ^ + + ccmp sp, #4, #2, ne + ccmp x25, #-1, #15, hs + ccmp x3, #32, #0, ge + ccmp x19, #5, #-1, lt + ccmp x20, #7, #16, hs +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ccmp sp, #4, #2, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmp x25, #-1, #15, hs +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmp x3, #32, #0, ge +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmp x19, #5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmp x20, #7, #16, hs +// CHECK-ERROR-NEXT: ^ + + ccmn wsp, #4, #2, ne + ccmn w25, #-1, #15, hs + ccmn w3, #32, #0, ge + ccmn w19, #5, #-1, lt + ccmn w20, #7, #16, hs +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ccmn wsp, #4, #2, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmn w25, #-1, #15, hs +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmn w3, #32, #0, ge +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmn w19, #5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmn w20, #7, #16, hs +// CHECK-ERROR-NEXT: ^ + + ccmn sp, #4, #2, ne + ccmn x25, #-1, #15, hs + ccmn x3, #32, #0, ge + ccmn x19, #5, #-1, lt + ccmn x20, #7, #16, hs +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ccmn sp, #4, #2, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmn x25, #-1, #15, hs +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmn x3, #32, #0, ge +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmn x19, #5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmn x20, #7, #16, hs +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Conditional compare (register) +//------------------------------------------------------------------------------ + + ccmp wsp, w4, #2, ne + ccmp w3, wsp, #0, ge + ccmp w19, w5, #-1, lt + ccmp w20, w7, #16, hs +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ccmp wsp, w4, #2, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmp w3, wsp, #0, ge +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmp w19, w5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmp w20, w7, #16, hs +// CHECK-ERROR-NEXT: ^ + + ccmp sp, x4, #2, ne + ccmp x25, sp, #15, hs + ccmp x19, x5, #-1, lt + ccmp x20, x7, #16, hs +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ccmp sp, x4, #2, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmp x25, sp, #15, hs +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmp x19, x5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmp x20, x7, #16, hs +// CHECK-ERROR-NEXT: ^ + + ccmn wsp, w4, #2, ne + ccmn w25, wsp, #15, hs + ccmn w19, w5, #-1, lt + ccmn w20, w7, #16, hs +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ccmn wsp, w4, #2, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmn w25, wsp, #15, hs +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmn w19, w5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmn w20, w7, #16, hs +// CHECK-ERROR-NEXT: ^ + + ccmn sp, x4, #2, ne + ccmn x25, sp, #15, hs + ccmn x19, x5, #-1, lt + ccmn x20, x7, #16, hs +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ccmn sp, x4, #2, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ccmn x25, sp, #15, hs +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmn x19, x5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: ccmn x20, x7, #16, hs +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Conditional select +//------------------------------------------------------------------------------ + + csel w4, wsp, w9, eq + csel wsp, w2, w3, ne + csel w10, w11, wsp, ge + csel w1, w2, w3, #3 + csel x4, sp, x9, eq + csel sp, x2, x3, ne + csel x10, x11, sp, ge + csel x1, x2, x3, #3 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csel w4, wsp, w9, eq +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csel wsp, w2, w3, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csel w10, w11, wsp, ge +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected AArch64 condition code +// CHECK-ERROR-NEXT: csel w1, w2, w3, #3 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csel x4, sp, x9, eq +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csel sp, x2, x3, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csel x10, x11, sp, ge +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected AArch64 condition code +// CHECK-ERROR-NEXT: csel x1, x2, x3, #3 +// CHECK-ERROR-NEXT: ^ + + csinc w20, w21, wsp, mi + csinc sp, x30, x29, eq +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csinc w20, w21, wsp, mi +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csinc sp, x30, x29, eq +// CHECK-ERROR-NEXT: ^ + + csinv w20, wsp, wsp, mi + csinv sp, x30, x29, le +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csinv w20, wsp, wsp, mi +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csinv sp, x30, x29, le +// CHECK-ERROR-NEXT: ^ + + csneg w20, w21, wsp, mi + csneg x0, sp, x29, le +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csneg w20, w21, wsp, mi +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csneg x0, sp, x29, le +// CHECK-ERROR-NEXT: ^ + + cset wsp, lt + csetm sp, ge +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cset wsp, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: csetm sp, ge +// CHECK-ERROR-NEXT: ^ + + cinc w3, wsp, ne + cinc sp, x9, eq +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cinc w3, wsp, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cinc sp, x9, eq +// CHECK-ERROR-NEXT: ^ + + cinv w3, wsp, ne + cinv sp, x9, eq +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cinv w3, wsp, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cinv sp, x9, eq +// CHECK-ERROR-NEXT: ^ + + cneg w3, wsp, ne + cneg sp, x9, eq +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cneg w3, wsp, ne +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: cneg sp, x9, eq +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Data Processing (1 source) +//------------------------------------------------------------------------------ + rbit x23, w2 +//CHECK-ERROR: error: invalid operand for instruction +//CHECK-ERROR-NEXT: rbit x23, w2 + + cls sp, x2 +//CHECK-ERROR: error: invalid operand for instruction +//CHECK-ERROR-NEXT: cls sp, x2 + + clz wsp, w3 +//CHECK-ERROR: error: invalid operand for instruction +//CHECK-ERROR-NEXT: clz wsp, w3 + +//------------------------------------------------------------------------------ +// Data Processing (2 sources) +//------------------------------------------------------------------------------ + udiv x23, w2, x18 +//CHECK-ERROR: error: invalid operand for instruction +//CHECK-ERROR-NEXT: udiv x23, w2, x18 + + lsl sp, x2, x4 +//CHECK-ERROR: error: invalid operand for instruction +//CHECK-ERROR-NEXT: lsl sp, x2, x4 + + asr wsp, w3, w9 +//CHECK-ERROR: error: invalid operand for instruction +//CHECK-ERROR-NEXT: asr wsp, w3, w9 + +//------------------------------------------------------------------------------ +// Data Processing (3 sources) +//------------------------------------------------------------------------------ + + madd sp, x3, x9, x10 +//CHECK-ERROR: error: invalid operand for instruction +//CHECK-ERROR-NEXT: madd sp, x3, x9, x10 + +//------------------------------------------------------------------------------ +// Exception generation +//------------------------------------------------------------------------------ + svc #-1 + hlt #65536 + dcps4 #43 + dcps4 +// CHECK-ERROR: error: expected integer in range [0, 65535] +// CHECK-ERROR-NEXT: svc #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 65535] +// CHECK-ERROR-NEXT: hlt #65536 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid instruction +// CHECK-ERROR-NEXT: dcps4 #43 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid instruction +// CHECK-ERROR-NEXT: dcps4 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Extract (immediate) +//------------------------------------------------------------------------------ + + extr w2, w20, w30, #-1 + extr w9, w19, w20, #32 +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: extr w2, w20, w30, #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: extr w9, w19, w20, #32 +// CHECK-ERROR-NEXT: ^ + + extr x10, x15, x20, #-1 + extr x20, x25, x30, #64 +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: extr x10, x15, x20, #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: extr x20, x25, x30, #64 +// CHECK-ERROR-NEXT: ^ + + ror w9, w10, #32 + ror x10, x11, #64 +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: ror w9, w10, #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: ror x10, x11, #64 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Floating-point compare +//------------------------------------------------------------------------------ + + fcmp s3, d2 +// CHECK-ERROR: error: expected floating-point constant #0.0 +// CHECK-ERROR-NEXT: fcmp s3, d2 +// CHECK-ERROR-NEXT: ^ + + fcmp s9, #-0.0 + fcmp d3, #-0.0 + fcmp s1, #1.0 + fcmpe s30, #-0.0 +// CHECK-ERROR: error: expected floating-point constant #0.0 +// CHECK-ERROR-NEXT: fcmp s9, #-0.0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected floating-point constant #0.0 +// CHECK-ERROR-NEXT: fcmp d3, #-0.0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected floating-point constant #0.0 +// CHECK-ERROR-NEXT: fcmp s1, #1.0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected floating-point constant #0.0 +// CHECK-ERROR-NEXT: fcmpe s30, #-0.0 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Floating-point conditional compare +//------------------------------------------------------------------------------ + + fccmp s19, s5, #-1, lt + fccmp s20, s7, #16, hs +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: fccmp s19, s5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: fccmp s20, s7, #16, hs +// CHECK-ERROR-NEXT: ^ + + fccmp d19, d5, #-1, lt + fccmp d20, d7, #16, hs +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: fccmp d19, d5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: fccmp d20, d7, #16, hs +// CHECK-ERROR-NEXT: ^ + + fccmpe s19, s5, #-1, lt + fccmpe s20, s7, #16, hs +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: fccmpe s19, s5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: fccmpe s20, s7, #16, hs +// CHECK-ERROR-NEXT: ^ + + fccmpe d19, d5, #-1, lt + fccmpe d20, d7, #16, hs +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: fccmpe d19, d5, #-1, lt +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: fccmpe d20, d7, #16, hs +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Floating-point conditional compare +//------------------------------------------------------------------------------ + + fcsel q3, q20, q9, pl + fcsel h9, h10, h11, mi + fcsel b9, b10, b11, mi +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcsel q3, q20, q9, pl +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcsel h9, h10, h11, mi +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcsel b9, b10, b11, mi +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Floating-point data-processing (1 source) +//------------------------------------------------------------------------------ + + fmov d0, s3 + fcvt d0, d1 +// CHECK-ERROR: error: expected compatible register or floating-point constant +// CHECK-ERROR-NEXT: fmov d0, s3 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcvt d0, d1 +// CHECK-ERROR-NEXT: ^ + + +//------------------------------------------------------------------------------ +// Floating-point data-processing (2 sources) +//------------------------------------------------------------------------------ + + fadd s0, d3, d7 + fmaxnm d3, s19, d12 + fnmul d1, d9, s18 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fadd s0, d3, d7 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fmaxnm d3, s19, d12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fnmul d1, d9, s18 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Floating-point data-processing (3 sources) +//------------------------------------------------------------------------------ + + fmadd b3, b4, b5, b6 + fmsub h1, h2, h3, h4 + fnmadd q3, q5, q6, q7 + fnmsub s2, s4, d5, h9 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fmadd b3, b4, b5, b6 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fmsub h1, h2, h3, h4 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fnmadd q3, q5, q6, q7 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fnmsub s2, s4, d5, h9 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Floating-point conditional compare +//------------------------------------------------------------------------------ + + fcvtzs w13, s31, #0 + fcvtzs w19, s20, #33 + fcvtzs wsp, s19, #14 +// CHECK-ERROR-NEXT: error: expected integer in range [1, 32] +// CHECK-ERROR-NEXT: fcvtzs w13, s31, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [1, 32] +// CHECK-ERROR-NEXT: fcvtzs w19, s20, #33 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcvtzs wsp, s19, #14 +// CHECK-ERROR-NEXT: ^ + + fcvtzs x13, s31, #0 + fcvtzs x19, s20, #65 + fcvtzs sp, s19, #14 +// CHECK-ERROR-NEXT: error: expected integer in range [1, 64] +// CHECK-ERROR-NEXT: fcvtzs x13, s31, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [1, 64] +// CHECK-ERROR-NEXT: fcvtzs x19, s20, #65 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcvtzs sp, s19, #14 +// CHECK-ERROR-NEXT: ^ + + fcvtzu w13, s31, #0 + fcvtzu w19, s20, #33 + fcvtzu wsp, s19, #14 +// CHECK-ERROR-NEXT: error: expected integer in range [1, 32] +// CHECK-ERROR-NEXT: fcvtzu w13, s31, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [1, 32] +// CHECK-ERROR-NEXT: fcvtzu w19, s20, #33 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcvtzu wsp, s19, #14 +// CHECK-ERROR-NEXT: ^ + + fcvtzu x13, s31, #0 + fcvtzu x19, s20, #65 + fcvtzu sp, s19, #14 +// CHECK-ERROR-NEXT: error: expected integer in range [1, 64] +// CHECK-ERROR-NEXT: fcvtzu x13, s31, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [1, 64] +// CHECK-ERROR-NEXT: fcvtzu x19, s20, #65 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcvtzu sp, s19, #14 +// CHECK-ERROR-NEXT: ^ + + scvtf w13, s31, #0 + scvtf w19, s20, #33 + scvtf wsp, s19, #14 +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: scvtf w13, s31, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: scvtf w19, s20, #33 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: scvtf wsp, s19, #14 +// CHECK-ERROR-NEXT: ^ + + scvtf x13, s31, #0 + scvtf x19, s20, #65 + scvtf sp, s19, #14 +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: scvtf x13, s31, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: scvtf x19, s20, #65 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: scvtf sp, s19, #14 +// CHECK-ERROR-NEXT: ^ + + ucvtf w13, s31, #0 + ucvtf w19, s20, #33 + ucvtf wsp, s19, #14 +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ucvtf w13, s31, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ucvtf w19, s20, #33 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ucvtf wsp, s19, #14 +// CHECK-ERROR-NEXT: ^ + + ucvtf x13, s31, #0 + ucvtf x19, s20, #65 + ucvtf sp, s19, #14 +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ucvtf x13, s31, #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ucvtf x19, s20, #65 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ucvtf sp, s19, #14 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Floating-point immediate +//------------------------------------------------------------------------------ + ;; Exponent too large + fmov d3, #0.0625 + fmov s2, #32.0 +// CHECK-ERROR: error: expected compatible register or floating-point constant +// CHECK-ERROR-NEXT: fmov d3, #0.0625 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register or floating-point constant +// CHECK-ERROR-NEXT: fmov s2, #32.0 +// CHECK-ERROR-NEXT: ^ + + ;; Fraction too precise + fmov s9, #1.03125 + fmov s28, #1.96875 +// CHECK-ERROR: error: expected compatible register or floating-point constant +// CHECK-ERROR-NEXT: fmov s9, #1.03125 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register or floating-point constant +// CHECK-ERROR-NEXT: fmov s28, #1.96875 +// CHECK-ERROR-NEXT: ^ + + ;; No particular reason, but a striking omission + fmov d0, #0.0 +// CHECK-ERROR: error: expected compatible register or floating-point constant +// CHECK-ERROR-NEXT: fmov d0, #0.0 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Floating-point <-> integer conversion +//------------------------------------------------------------------------------ + + fmov x3, v0.d[0] + fmov v29.1d[1], x2 + fmov x7, v0.d[2] + fcvtns sp, s5 + scvtf s6, wsp +// CHECK-ERROR: error: expected lane specifier '[1]' +// CHECK-ERROR-NEXT: fmov x3, v0.d[0] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: lane number incompatible with layout +// CHECK-ERROR-NEXT: fmov v29.1d[1], x2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: lane number incompatible with layout +// CHECK-ERROR-NEXT: fmov x7, v0.d[2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: fcvtns sp, s5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: scvtf s6, wsp +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load-register (literal) +//------------------------------------------------------------------------------ + + ldr sp, some_label + ldrsw w3, somewhere +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr sp, some_label +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrsw w3, somewhere +// CHECK-ERROR-NEXT: ^ + + ldrsw x2, #1048576 + ldr q0, #-1048580 + ldr x0, #2 +// CHECK-ERROR: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: ldrsw x2, #1048576 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: ldr q0, #-1048580 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: ldr x0, #2 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load/store exclusive +//------------------------------------------------------------------------------ + + stxrb w2, x3, [x4, #20] + stlxrh w10, w11, [w2] +// CHECK-ERROR: error: expected '#0' +// CHECK-ERROR-NEXT: stxrb w2, x3, [x4, #20] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stlxrh w10, w11, [w2] +// CHECK-ERROR-NEXT: ^ + + stlxr x20, w21, [sp] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stlxr x20, w21, [sp] +// CHECK-ERROR-NEXT: ^ + + ldxr sp, [sp] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldxr sp, [sp] +// CHECK-ERROR-NEXT: ^ + + stxp x1, x2, x3, [x4] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stxp x1, x2, x3, [x4] +// CHECK-ERROR-NEXT: ^ + + stlxp w5, x1, w4, [x5] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stlxp w5, x1, w4, [x5] +// CHECK-ERROR-NEXT: ^ + + stlxp w17, w6, x7, [x22] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stlxp w17, w6, x7, [x22] +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load/store (unscaled immediate) +//------------------------------------------------------------------------------ + + ldurb w2, [sp, #256] + sturh w17, [x1, #256] + ldursw x20, [x1, #256] + ldur x12, [sp, #256] +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldurb w2, [sp, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: sturh w17, [x1, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldursw x20, [x1, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldur x12, [sp, #256] +// CHECK-ERROR-NEXT: ^ + + stur h2, [x2, #-257] + stur b2, [x2, #-257] + ldursb x9, [sp, #-257] + ldur w2, [x30, #-257] + stur q9, [x20, #-257] +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: stur h2, [x2, #-257] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: stur b2, [x2, #-257] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldursb x9, [sp, #-257] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldur w2, [x30, #-257] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: stur q9, [x20, #-257] +// CHECK-ERROR-NEXT: ^ + + prfum pstl3strm, [xzr] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: prfum pstl3strm, [xzr] +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load-store register (immediate post-indexed) +//------------------------------------------------------------------------------ + ldr x3, [x4, #25], #0 + ldr x4, [x9, #0], #4 +// CHECK-ERROR: error: expected symbolic reference or integer in range [0, 32760] +// CHECK-ERROR-NEXT: ldr x3, [x4, #25], #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr x4, [x9, #0], #4 +// CHECK-ERROR-NEXT: ^ + + strb w1, [x19], #256 + strb w9, [sp], #-257 + strh w1, [x19], #256 + strh w9, [sp], #-257 + str w1, [x19], #256 + str w9, [sp], #-257 +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: strb w1, [x19], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: strb w9, [sp], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: strh w1, [x19], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: strh w9, [sp], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str w1, [x19], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str w9, [sp], #-257 +// CHECK-ERROR-NEXT: ^ + + ldrb w1, [x19], #256 + ldrb w9, [sp], #-257 + ldrh w1, [x19], #256 + ldrh w9, [sp], #-257 + ldr w1, [x19], #256 + ldr w9, [sp], #-257 +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrb w1, [x19], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrb w9, [sp], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrh w1, [x19], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrh w9, [sp], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr w1, [x19], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr w9, [sp], #-257 +// CHECK-ERROR-NEXT: ^ + + ldrsb x2, [x3], #256 + ldrsb x22, [x13], #-257 + ldrsh x2, [x3], #256 + ldrsh x22, [x13], #-257 + ldrsw x2, [x3], #256 + ldrsw x22, [x13], #-257 +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsb x2, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsb x22, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsh x2, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsh x22, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsw x2, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsw x22, [x13], #-257 +// CHECK-ERROR-NEXT: ^ + + ldrsb w2, [x3], #256 + ldrsb w22, [x13], #-257 + ldrsh w2, [x3], #256 + ldrsh w22, [x13], #-257 +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsb w2, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsb w22, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsh w2, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsh w22, [x13], #-257 +// CHECK-ERROR-NEXT: ^ + + str b3, [x3], #256 + str b3, [x13], #-257 + str h3, [x3], #256 + str h3, [x13], #-257 + str s3, [x3], #256 + str s3, [x13], #-257 + str d3, [x3], #256 + str d3, [x13], #-257 + str q3, [x3], #256 + str q3, [x13], #-257 +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str b3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str b3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str h3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str h3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str s3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str s3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str d3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str d3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str q3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str q3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ + + ldr b3, [x3], #256 + ldr b3, [x13], #-257 + ldr h3, [x3], #256 + ldr h3, [x13], #-257 + ldr s3, [x3], #256 + ldr s3, [x13], #-257 + ldr d3, [x3], #256 + ldr d3, [x13], #-257 + ldr q3, [x3], #256 + ldr q3, [x13], #-257 +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr b3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr b3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr h3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr h3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr s3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr s3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr d3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr d3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr q3, [x3], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr q3, [x13], #-257 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load-store register (immediate pre-indexed) +//------------------------------------------------------------------------------ + + ldr x3, [x4]! +// CHECK-ERROR: error: +// CHECK-ERROR-NEXT: ldr x3, [x4]! +// CHECK-ERROR-NEXT: ^ + + strb w1, [x19, #256]! + strb w9, [sp, #-257]! + strh w1, [x19, #256]! + strh w9, [sp, #-257]! + str w1, [x19, #256]! + str w9, [sp, #-257]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: strb w1, [x19, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: strb w9, [sp, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: strh w1, [x19, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: strh w9, [sp, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: str w1, [x19, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str w9, [sp, #-257]! +// CHECK-ERROR-NEXT: ^ + + ldrb w1, [x19, #256]! + ldrb w9, [sp, #-257]! + ldrh w1, [x19, #256]! + ldrh w9, [sp, #-257]! + ldr w1, [x19, #256]! + ldr w9, [sp, #-257]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrb w1, [x19, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrb w9, [sp, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrh w1, [x19, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrh w9, [sp, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr w1, [x19, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr w9, [sp, #-257]! +// CHECK-ERROR-NEXT: ^ + + ldrsb x2, [x3, #256]! + ldrsb x22, [x13, #-257]! + ldrsh x2, [x3, #256]! + ldrsh x22, [x13, #-257]! + ldrsw x2, [x3, #256]! + ldrsw x22, [x13, #-257]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrsb x2, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsb x22, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrsh x2, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsh x22, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrsw x2, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsw x22, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ + + ldrsb w2, [x3, #256]! + ldrsb w22, [x13, #-257]! + ldrsh w2, [x3, #256]! + ldrsh w22, [x13, #-257]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrsb w2, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsb w22, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrsh w2, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrsh w22, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ + + str b3, [x3, #256]! + str b3, [x13, #-257]! + str h3, [x3, #256]! + str h3, [x13, #-257]! + str s3, [x3, #256]! + str s3, [x13, #-257]! + str d3, [x3, #256]! + str d3, [x13, #-257]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: str b3, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str b3, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: str h3, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str h3, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: str s3, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str s3, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: str d3, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str d3, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ + + ldr b3, [x3, #256]! + ldr b3, [x13, #-257]! + ldr h3, [x3, #256]! + ldr h3, [x13, #-257]! + ldr s3, [x3, #256]! + ldr s3, [x13, #-257]! + ldr d3, [x3, #256]! + ldr d3, [x13, #-257]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr b3, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr b3, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr h3, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr h3, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr s3, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr s3, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr d3, [x3, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr d3, [x13, #-257]! +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load/store (unprivileged) +//------------------------------------------------------------------------------ + + ldtrb w2, [sp, #256] + sttrh w17, [x1, #256] + ldtrsw x20, [x1, #256] + ldtr x12, [sp, #256] +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldtrb w2, [sp, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: sttrh w17, [x1, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldtrsw x20, [x1, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldtr x12, [sp, #256] +// CHECK-ERROR-NEXT: ^ + + sttr h2, [x2, #-257] + sttr b2, [x2, #-257] + ldtrsb x9, [sp, #-257] + ldtr w2, [x30, #-257] + sttr q9, [x20, #-257] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sttr h2, [x2, #-257] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sttr b2, [x2, #-257] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldtrsb x9, [sp, #-257] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldtr w2, [x30, #-257] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: sttr q9, [x20, #-257] +// CHECK-ERROR-NEXT: ^ + + +//------------------------------------------------------------------------------ +// Load/store (unsigned immediate) +//------------------------------------------------------------------------------ + +//// Out of range immediates + ldr q0, [x11, #65536] + ldr x0, [sp, #32768] + ldr w0, [x4, #16384] + ldrh w2, [x21, #8192] + ldrb w3, [x12, #4096] +// CHECK-ERROR: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr q0, [x11, #65536] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr x0, [sp, #32768] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldr w0, [x4, #16384] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrh w2, [x21, #8192] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: ldrb w3, [x12, #4096] +// CHECK-ERROR-NEXT: ^ + +//// Misaligned addresses + ldr w0, [x0, #2] + ldrsh w2, [x0, #123] + str q0, [x0, #8] +// CHECK-ERROR: error: too few operands for instruction +// CHECK-ERROR-NEXT: ldr w0, [x0, #2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: too few operands for instruction +// CHECK-ERROR-NEXT: ldrsh w2, [x0, #123] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: too few operands for instruction +// CHECK-ERROR-NEXT: str q0, [x0, #8] +// CHECK-ERROR-NEXT: ^ + +//// 32-bit addresses + ldr w0, [w20] + ldrsh x3, [wsp] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr w0, [w20] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldrsh x3, [wsp] +// CHECK-ERROR-NEXT: ^ + +//// Store things + strb w0, [wsp] + strh w31, [x23, #1] + str x5, [x22, #12] + str w7, [x12, #16384] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: strb w0, [wsp] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: strh w31, [x23, #1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: too few operands for instruction +// CHECK-ERROR-NEXT: str x5, [x22, #12] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [-256, 255] +// CHECK-ERROR-NEXT: str w7, [x12, #16384] +// CHECK-ERROR-NEXT: ^ + +//// Bad PRFMs + prfm #-1, [sp] + prfm #32, [sp, #8] + prfm pldl1strm, [w3, #8] + prfm wibble, [sp] +// CHECK-ERROR: error: Invalid immediate for instruction +// CHECK-ERROR-NEXT: prfm #-1, [sp] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Invalid immediate for instruction +// CHECK-ERROR-NEXT: prfm #32, [sp, #8] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: prfm pldl1strm, [w3, #8] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: operand specifier not recognised +// CHECK-ERROR-NEXT: prfm wibble, [sp] +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load/store register (register offset) +//------------------------------------------------------------------------------ + + ldr w3, [xzr, x3] + ldr w4, [x0, x4, lsl] + ldr w9, [x5, x5, uxtw] + ldr w10, [x6, x9, sxtw #2] + ldr w11, [x7, w2, lsl #2] + ldr w12, [x8, w1, sxtx] +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldr w3, [xzr, x3] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected #imm after shift specifier +// CHECK-ERROR-NEXT: ldr w4, [x0, x4, lsl] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl' or 'sxtx' with optional shift of #0 or #2 +// CHECK-ERROR-NEXT: ldr w9, [x5, x5, uxtw] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl' or 'sxtx' with optional shift of #0 or #2 +// CHECK-ERROR-NEXT: ldr w10, [x6, x9, sxtw #2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'uxtw' or 'sxtw' with optional shift of #0 or #2 +// CHECK-ERROR-NEXT: ldr w11, [x7, w2, lsl #2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'uxtw' or 'sxtw' with optional shift of #0 or #2 +// CHECK-ERROR-NEXT: ldr w12, [x8, w1, sxtx] +// CHECK-ERROR-NEXT: ^ + + ldrsb w9, [x4, x2, lsl #-1] + strb w9, [x4, x2, lsl #1] +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: ldrsb w9, [x4, x2, lsl #-1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl' or 'sxtx' with optional shift of #0 +// CHECK-ERROR-NEXT: strb w9, [x4, x2, lsl #1] +// CHECK-ERROR-NEXT: ^ + + ldrsh w9, [x4, x2, lsl #-1] + ldr h13, [x4, w2, uxtw #2] +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: ldrsh w9, [x4, x2, lsl #-1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'uxtw' or 'sxtw' with optional shift of #0 or #1 +// CHECK-ERROR-NEXT: ldr h13, [x4, w2, uxtw #2] +// CHECK-ERROR-NEXT: ^ + + str w9, [x5, w9, sxtw #-1] + str s3, [sp, w9, uxtw #1] + ldrsw x9, [x15, x4, sxtx #3] +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: str w9, [x5, w9, sxtw #-1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'uxtw' or 'sxtw' with optional shift of #0 or #2 +// CHECK-ERROR-NEXT: str s3, [sp, w9, uxtw #1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl' or 'sxtx' with optional shift of #0 or #2 +// CHECK-ERROR-NEXT: ldrsw x9, [x15, x4, sxtx #3] +// CHECK-ERROR-NEXT: ^ + + str xzr, [x5, x9, sxtx #-1] + prfm pldl3keep, [sp, x20, lsl #2] + ldr d3, [x20, wzr, uxtw #4] +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: str xzr, [x5, x9, sxtx #-1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl' or 'sxtx' with optional shift of #0 or #3 +// CHECK-ERROR-NEXT: prfm pldl3keep, [sp, x20, lsl #2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'uxtw' or 'sxtw' with optional shift of #0 or #3 +// CHECK-ERROR-NEXT: ldr d3, [x20, wzr, uxtw #4] +// CHECK-ERROR-NEXT: ^ + + ldr q5, [sp, x2, lsl #-1] + ldr q10, [x20, w4, uxtw #2] + str q21, [x20, w4, uxtw #5] +// CHECK-ERROR-NEXT: error: expected integer shift amount +// CHECK-ERROR-NEXT: ldr q5, [sp, x2, lsl #-1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl' or 'sxtw' with optional shift of #0 or #4 +// CHECK-ERROR-NEXT: ldr q10, [x20, w4, uxtw #2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl' or 'sxtw' with optional shift of #0 or #4 +// CHECK-ERROR-NEXT: str q21, [x20, w4, uxtw #5] +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load/store register pair (offset) +//------------------------------------------------------------------------------ + ldp w3, w2, [x4, #1] + stp w1, w2, [x3, #253] + stp w9, w10, [x5, #256] + ldp w11, w12, [x9, #-260] + stp wsp, w9, [sp] +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp w3, w2, [x4, #1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp w1, w2, [x3, #253] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp w9, w10, [x5, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp w11, w12, [x9, #-260] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stp wsp, w9, [sp] +// CHECK-ERROR-NEXT: ^ + + ldpsw x9, x2, [sp, #2] + ldpsw x1, x2, [x10, #256] + ldpsw x3, x4, [x11, #-260] +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x9, x2, [sp, #2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x1, x2, [x10, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x3, x4, [x11, #-260] +// CHECK-ERROR-NEXT: ^ + + ldp x2, x5, [sp, #4] + ldp x5, x6, [x9, #512] + stp x7, x8, [x10, #-520] +// CHECK-ERROR: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp x2, x5, [sp, #4] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp x5, x6, [x9, #512] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: stp x7, x8, [x10, #-520] +// CHECK-ERROR-NEXT: ^ + + ldp sp, x3, [x10] + stp x3, sp, [x9] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp sp, x3, [x10] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stp x3, sp, [x9] +// CHECK-ERROR-NEXT: ^ + + stp s3, s5, [sp, #-2] + ldp s6, s26, [x4, #-260] + stp s13, s19, [x5, #256] +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp s3, s5, [sp, #-2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp s6, s26, [x4, #-260] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp s13, s19, [x5, #256] +// CHECK-ERROR-NEXT: ^ + + ldp d3, d4, [xzr] + ldp d5, d6, [x0, #512] + stp d7, d8, [x0, #-520] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp d3, d4, [xzr] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp d5, d6, [x0, #512] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: stp d7, d8, [x0, #-520] +// CHECK-ERROR-NEXT: ^ + + ldp d3, q2, [sp] + ldp q3, q5, [sp, #8] + stp q20, q25, [x5, #1024] + ldp q30, q15, [x23, #-1040] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp d3, q2, [sp] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: ldp q3, q5, [sp, #8] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: stp q20, q25, [x5, #1024] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: ldp q30, q15, [x23, #-1040] +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load/store register pair (post-indexed) +//------------------------------------------------------------------------------ + + ldp w3, w2, [x4], #1 + stp w1, w2, [x3], #253 + stp w9, w10, [x5], #256 + ldp w11, w12, [x9], #-260 + stp wsp, w9, [sp], #0 +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp w3, w2, [x4], #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp w1, w2, [x3], #253 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp w9, w10, [x5], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp w11, w12, [x9], #-260 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stp wsp, w9, [sp], #0 +// CHECK-ERROR-NEXT: ^ + + ldpsw x9, x2, [sp], #2 + ldpsw x1, x2, [x10], #256 + ldpsw x3, x4, [x11], #-260 +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x9, x2, [sp], #2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x1, x2, [x10], #256 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x3, x4, [x11], #-260 +// CHECK-ERROR-NEXT: ^ + + ldp x2, x5, [sp], #4 + ldp x5, x6, [x9], #512 + stp x7, x8, [x10], #-520 +// CHECK-ERROR: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp x2, x5, [sp], #4 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp x5, x6, [x9], #512 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: stp x7, x8, [x10], #-520 +// CHECK-ERROR-NEXT: ^ + + ldp sp, x3, [x10], #0 + stp x3, sp, [x9], #0 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp sp, x3, [x10], #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stp x3, sp, [x9], #0 +// CHECK-ERROR-NEXT: ^ + + stp s3, s5, [sp], #-2 + ldp s6, s26, [x4], #-260 + stp s13, s19, [x5], #256 +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp s3, s5, [sp], #-2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp s6, s26, [x4], #-260 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp s13, s19, [x5], #256 +// CHECK-ERROR-NEXT: ^ + + ldp d3, d4, [xzr], #0 + ldp d5, d6, [x0], #512 + stp d7, d8, [x0], #-520 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp d3, d4, [xzr], #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp d5, d6, [x0], #512 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: stp d7, d8, [x0], #-520 +// CHECK-ERROR-NEXT: ^ + + ldp d3, q2, [sp], #0 + ldp q3, q5, [sp], #8 + stp q20, q25, [x5], #1024 + ldp q30, q15, [x23], #-1040 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp d3, q2, [sp], #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: ldp q3, q5, [sp], #8 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: stp q20, q25, [x5], #1024 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: ldp q30, q15, [x23], #-1040 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load/store register pair (pre-indexed) +//------------------------------------------------------------------------------ + + ldp w3, w2, [x4, #1]! + stp w1, w2, [x3, #253]! + stp w9, w10, [x5, #256]! + ldp w11, w12, [x9, #-260]! + stp wsp, w9, [sp, #0]! +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp w3, w2, [x4, #1]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp w1, w2, [x3, #253]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp w9, w10, [x5, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp w11, w12, [x9, #-260]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stp wsp, w9, [sp, #0]! +// CHECK-ERROR-NEXT: ^ + + ldpsw x9, x2, [sp, #2]! + ldpsw x1, x2, [x10, #256]! + ldpsw x3, x4, [x11, #-260]! +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x9, x2, [sp, #2]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x1, x2, [x10, #256]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldpsw x3, x4, [x11, #-260]! +// CHECK-ERROR-NEXT: ^ + + ldp x2, x5, [sp, #4]! + ldp x5, x6, [x9, #512]! + stp x7, x8, [x10, #-520]! +// CHECK-ERROR: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp x2, x5, [sp, #4]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp x5, x6, [x9, #512]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: stp x7, x8, [x10, #-520]! +// CHECK-ERROR-NEXT: ^ + + ldp sp, x3, [x10, #0]! + stp x3, sp, [x9, #0]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp sp, x3, [x10, #0]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stp x3, sp, [x9, #0]! +// CHECK-ERROR-NEXT: ^ + + stp s3, s5, [sp, #-2]! + ldp s6, s26, [x4, #-260]! + stp s13, s19, [x5, #256]! +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp s3, s5, [sp, #-2]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldp s6, s26, [x4, #-260]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stp s13, s19, [x5, #256]! +// CHECK-ERROR-NEXT: ^ + + ldp d3, d4, [xzr, #0]! + ldp d5, d6, [x0, #512]! + stp d7, d8, [x0, #-520]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp d3, d4, [xzr, #0]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldp d5, d6, [x0, #512]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: stp d7, d8, [x0, #-520]! +// CHECK-ERROR-NEXT: ^ + + ldp d3, q2, [sp, #0]! + ldp q3, q5, [sp, #8]! + stp q20, q25, [x5, #1024]! + ldp q30, q15, [x23, #-1040]! +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldp d3, q2, [sp, #0]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: ldp q3, q5, [sp, #8]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: stp q20, q25, [x5, #1024]! +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: ldp q30, q15, [x23, #-1040]! +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Load/store register pair (offset) +//------------------------------------------------------------------------------ + ldnp w3, w2, [x4, #1] + stnp w1, w2, [x3, #253] + stnp w9, w10, [x5, #256] + ldnp w11, w12, [x9, #-260] + stnp wsp, w9, [sp] +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldnp w3, w2, [x4, #1] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stnp w1, w2, [x3, #253] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stnp w9, w10, [x5, #256] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldnp w11, w12, [x9, #-260] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stnp wsp, w9, [sp] +// CHECK-ERROR-NEXT: ^ + + ldnp x2, x5, [sp, #4] + ldnp x5, x6, [x9, #512] + stnp x7, x8, [x10, #-520] +// CHECK-ERROR: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldnp x2, x5, [sp, #4] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldnp x5, x6, [x9, #512] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: stnp x7, x8, [x10, #-520] +// CHECK-ERROR-NEXT: ^ + + ldnp sp, x3, [x10] + stnp x3, sp, [x9] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldnp sp, x3, [x10] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: stnp x3, sp, [x9] +// CHECK-ERROR-NEXT: ^ + + stnp s3, s5, [sp, #-2] + ldnp s6, s26, [x4, #-260] + stnp s13, s19, [x5, #256] +// CHECK-ERROR: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stnp s3, s5, [sp, #-2] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: ldnp s6, s26, [x4, #-260] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 4 in range [-256, 252] +// CHECK-ERROR-NEXT: stnp s13, s19, [x5, #256] +// CHECK-ERROR-NEXT: ^ + + ldnp d3, d4, [xzr] + ldnp d5, d6, [x0, #512] + stnp d7, d8, [x0, #-520] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldnp d3, d4, [xzr] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: ldnp d5, d6, [x0, #512] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 8 in range [-512, 508] +// CHECK-ERROR-NEXT: stnp d7, d8, [x0, #-520] +// CHECK-ERROR-NEXT: ^ + + ldnp d3, q2, [sp] + ldnp q3, q5, [sp, #8] + stnp q20, q25, [x5, #1024] + ldnp q30, q15, [x23, #-1040] +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ldnp d3, q2, [sp] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: ldnp q3, q5, [sp, #8] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: stnp q20, q25, [x5, #1024] +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer multiple of 16 in range [-1024, 1016] +// CHECK-ERROR-NEXT: ldnp q30, q15, [x23, #-1040] +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Logical (shifted register) +//------------------------------------------------------------------------------ + orr w0, w1, #0xffffffff + and x3, x5, #0xffffffffffffffff +// CHECK-ERROR: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: orr w0, w1, #0xffffffff +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: and x3, x5, #0xffffffffffffffff +// CHECK-ERROR-NEXT: ^ + + ands w3, w9, #0x0 + eor x2, x0, #0x0 +// CHECK-ERROR: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: ands w3, w9, #0x0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: eor x2, x0, #0x0 +// CHECK-ERROR-NEXT: ^ + + eor w3, w5, #0x83 + eor x9, x20, #0x1234 +// CHECK-ERROR: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: eor w3, w5, #0x83 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: eor x9, x20, #0x1234 +// CHECK-ERROR-NEXT: ^ + + and wzr, w4, 0xffff0000 + eor xzr, x9, #0xffff0000ffff0000 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: and wzr, w4, 0xffff0000 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: eor xzr, x9, #0xffff0000ffff0000 +// CHECK-ERROR-NEXT: ^ + + orr w3, wsp, #0xf0f0f0f0 + ands x3, sp, #0xaaaaaaaaaaaaaaaa +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: orr w3, wsp, #0xf0f0f0f0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ands x3, sp, #0xaaaaaaaaaaaaaaaa +// CHECK-ERROR-NEXT: ^ + + tst sp, #0xe0e0e0e0e0e0e0e0 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: tst sp, #0xe0e0e0e0e0e0e0e0 +// CHECK-ERROR-NEXT: ^ + + // movi has been removed from the specification. Make sure it's really gone. + movi wzr, #0x44444444 + movi w3, #0xffff + movi x9, #0x0000ffff00000000 +// CHECK-ERROR: error: invalid instruction +// CHECK-ERROR-NEXT: movi wzr, #0x44444444 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR: error: invalid instruction +// CHECK-ERROR-NEXT: movi w3, #0xffff +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR: error: invalid instruction +// CHECK-ERROR-NEXT: movi x9, #0x0000ffff00000000 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Logical (shifted register) +//------------------------------------------------------------------------------ + + //// Out of range shifts + and w2, w24, w6, lsl #-1 + and w4, w6, w12, lsl #32 + and x4, x6, x12, lsl #64 + and x2, x5, x11, asr +// CHECK-ERROR: error: expected integer shift amount +// CHECK-ERROR-NEXT: and w2, w24, w6, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31] +// CHECK-ERROR-NEXT: and w4, w6, w12, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63] +// CHECK-ERROR-NEXT: and x4, x6, x12, lsl #64 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected #imm after shift specifier +// CHECK-ERROR-NEXT: and x2, x5, x11, asr +// CHECK-ERROR-NEXT: ^ + + //// sp not allowed + orn wsp, w3, w5 + bics x20, sp, x9, lsr #0 + orn x2, x6, sp, lsl #3 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: orn wsp, w3, w5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: bics x20, sp, x9, lsr #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: orn x2, x6, sp, lsl #3 +// CHECK-ERROR-NEXT: ^ + + //// Mismatched registers + and x3, w2, w1 + ands w1, x12, w2 + and x4, x5, w6, lsl #12 + orr w2, w5, x7, asr #0 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: and x3, w2, w1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: ands w1, x12, w2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: and x4, x5, w6, lsl #12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected compatible register or logical immediate +// CHECK-ERROR-NEXT: orr w2, w5, x7, asr #0 +// CHECK-ERROR-NEXT: ^ + + //// Shifts should not be allowed on mov + mov w3, w7, lsl #13 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: mov w3, w7, lsl #13 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Move wide (immediate) +//------------------------------------------------------------------------------ + + movz w3, #65536, lsl #0 + movz w4, #65536 + movn w1, #2, lsl #1 + movk w3, #0, lsl #-1 + movn w2, #-1, lsl #0 + movz x3, #-1 + movk w3, #1, lsl #32 + movn x2, #12, lsl #64 +// CHECK-ERROR: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz w3, #65536, lsl #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz w4, #65536 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w1, #2, lsl #1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: only 'lsl #+N' valid after immediate +// CHECK-ERROR-NEXT: movk w3, #0, lsl #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w2, #-1, lsl #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x3, #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w3, #1, lsl #32 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn x2, #12, lsl #64 +// CHECK-ERROR-NEXT: ^ + + movz x12, #:abs_g0:sym, lsl #16 + movz x12, #:abs_g0:sym, lsl #0 + movn x2, #:abs_g0:sym + movk w3, #:abs_g0:sym + movz x3, #:abs_g0_nc:sym + movn x4, #:abs_g0_nc:sym +// CHECK-ERROR: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x12, #:abs_g0:sym, lsl #16 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x12, #:abs_g0:sym, lsl #0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn x2, #:abs_g0:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w3, #:abs_g0:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x3, #:abs_g0_nc:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn x4, #:abs_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + + movn x2, #:abs_g1:sym + movk w3, #:abs_g1:sym + movz x3, #:abs_g1_nc:sym + movn x4, #:abs_g1_nc:sym +// CHECK-ERROR: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn x2, #:abs_g1:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w3, #:abs_g1:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x3, #:abs_g1_nc:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn x4, #:abs_g1_nc:sym +// CHECK-ERROR-NEXT: ^ + + movz w12, #:abs_g2:sym + movn x12, #:abs_g2:sym + movk x13, #:abs_g2:sym + movk w3, #:abs_g2_nc:sym + movz x13, #:abs_g2_nc:sym + movn x24, #:abs_g2_nc:sym +// CHECK-ERROR: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz w12, #:abs_g2:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn x12, #:abs_g2:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x13, #:abs_g2:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w3, #:abs_g2_nc:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x13, #:abs_g2_nc:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn x24, #:abs_g2_nc:sym +// CHECK-ERROR-NEXT: ^ + + movn x19, #:abs_g3:sym + movz w20, #:abs_g3:sym + movk w21, #:abs_g3:sym +// CHECK-ERROR: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn x19, #:abs_g3:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz w20, #:abs_g3:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w21, #:abs_g3:sym +// CHECK-ERROR-NEXT: ^ + + movk x19, #:abs_g0_s:sym + movk w23, #:abs_g0_s:sym +// CHECK-ERROR: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:abs_g0_s:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w23, #:abs_g0_s:sym +// CHECK-ERROR-NEXT: ^ + + movk x19, #:abs_g1_s:sym + movk w23, #:abs_g1_s:sym +// CHECK-ERROR: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:abs_g1_s:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w23, #:abs_g1_s:sym +// CHECK-ERROR-NEXT: ^ + + movz w2, #:abs_g2_s:sym + movn w29, #:abs_g2_s:sym + movk x19, #:abs_g2_s:sym + movk w23, #:abs_g2_s:sym +// CHECK-ERROR: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz w2, #:abs_g2_s:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:abs_g2_s:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:abs_g2_s:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected relocated symbol or integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w23, #:abs_g2_s:sym +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// PC-relative addressing +//------------------------------------------------------------------------------ + + adr sp, loc // expects xzr + adrp x3, #20 // Immediate unaligned + adrp w2, loc // 64-bit register needed +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adr sp, loc +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: adrp x3, #20 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: adrp w2, loc +// CHECK-ERROR-NEXT: ^ + + adr x9, #1048576 + adr x2, #-1048577 + adrp x9, #4294967296 + adrp x20, #-4294971392 +// CHECK-ERROR: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: adr x9, #1048576 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: adr x2, #-1048577 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: adrp x9, #4294967296 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: adrp x20, #-4294971392 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// System +//------------------------------------------------------------------------------ + + hint #-1 + hint #128 +// CHECK-ERROR: error: expected integer in range [0, 127] +// CHECK-ERROR-NEXT: hint #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 127] +// CHECK-ERROR-NEXT: hint #128 +// CHECK-ERROR-NEXT: ^ + + clrex #-1 + clrex #16 +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: clrex #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: clrex #16 +// CHECK-ERROR-NEXT: ^ + + dsb #-1 + dsb #16 + dmb #-1 + dmb #16 +// CHECK-ERROR-NEXT: error: Invalid immediate for instruction +// CHECK-ERROR-NEXT: dsb #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Invalid immediate for instruction +// CHECK-ERROR-NEXT: dsb #16 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Invalid immediate for instruction +// CHECK-ERROR-NEXT: dmb #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Invalid immediate for instruction +// CHECK-ERROR-NEXT: dmb #16 +// CHECK-ERROR-NEXT: ^ + + isb #-1 + isb #16 +// CHECK-ERROR-NEXT: error: Invalid immediate for instruction +// CHECK-ERROR-NEXT: isb #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Invalid immediate for instruction +// CHECK-ERROR-NEXT: isb #16 +// CHECK-ERROR-NEXT: ^ + + msr daifset, x4 + msr spsel, #-1 + msr spsel #-1 + msr daifclr, #16 +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: msr daifset, x4 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: msr spsel, #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected comma before next operand +// CHECK-ERROR-NEXT: msr spsel #-1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 15] +// CHECK-ERROR-NEXT: msr daifclr, #16 +// CHECK-ERROR-NEXT: ^ + + sys #8, c1, c2, #7, x9 + sys #3, c16, c2, #3, x10 + sys #2, c11, c16, #5 + sys #4, c9, c8, #8, xzr + sysl x11, #8, c1, c2, #7 + sysl x13, #3, c16, c2, #3 + sysl x9, #2, c11, c16, #5 + sysl x4, #4, c9, c8, #8 +// CHECK-ERROR-NEXT: error: expected integer in range [0, 7] +// CHECK-ERROR-NEXT: sys #8, c1, c2, #7, x9 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Expected cN operand where 0 <= N <= 15 +// CHECK-ERROR-NEXT: sys #3, c16, c2, #3, x10 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Expected cN operand where 0 <= N <= 15 +// CHECK-ERROR-NEXT: sys #2, c11, c16, #5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 7] +// CHECK-ERROR-NEXT: sys #4, c9, c8, #8, xzr +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 7] +// CHECK-ERROR-NEXT: sysl x11, #8, c1, c2, #7 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Expected cN operand where 0 <= N <= 15 +// CHECK-ERROR-NEXT: sysl x13, #3, c16, c2, #3 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: Expected cN operand where 0 <= N <= 15 +// CHECK-ERROR-NEXT: sysl x9, #2, c11, c16, #5 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 7] +// CHECK-ERROR-NEXT: sysl x4, #4, c9, c8, #8 +// CHECK-ERROR-NEXT: ^ + + ic ialluis, x2 + ic allu, x7 + ic ivau +// CHECK-ERROR-NEXT: error: specified IC op does not use a register +// CHECK-ERROR-NEXT: ic ialluis, x2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: operand specifier not recognised +// CHECK-ERROR-NEXT: ic allu, x7 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified IC op requires a register +// CHECK-ERROR-NEXT: ic ivau +// CHECK-ERROR-NEXT: ^ + + tlbi IPAS2E1IS + tlbi IPAS2LE1IS + tlbi VMALLE1IS, x12 + tlbi ALLE2IS, x11 + tlbi ALLE3IS, x20 + tlbi VAE1IS + tlbi VAE2IS + tlbi VAE3IS + tlbi ASIDE1IS + tlbi VAAE1IS + tlbi ALLE1IS, x0 + tlbi VALE1IS + tlbi VALE2IS + tlbi VALE3IS + tlbi VMALLS12E1IS, xzr + tlbi VAALE1IS + tlbi IPAS2E1 + tlbi IPAS2LE1 + tlbi VMALLE1, x9 + tlbi ALLE2, x10 + tlbi ALLE3, x11 + tlbi VAE1 + tlbi VAE2 + tlbi VAE3 + tlbi ASIDE1 + tlbi VAAE1 + tlbi ALLE1, x25 + tlbi VALE1 + tlbi VALE2 + tlbi VALE3 + tlbi VMALLS12E1, x15 + tlbi VAALE1 +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi IPAS2E1IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi IPAS2LE1IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi VMALLE1IS, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi ALLE2IS, x11 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi ALLE3IS, x20 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAE1IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAE2IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAE3IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi ASIDE1IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAAE1IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi ALLE1IS, x0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VALE1IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VALE2IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VALE3IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi VMALLS12E1IS, xzr +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAALE1IS +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi IPAS2E1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi IPAS2LE1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi VMALLE1, x9 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi ALLE2, x10 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi ALLE3, x11 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAE1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAE2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAE3 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi ASIDE1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAAE1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi ALLE1, x25 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VALE1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VALE2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VALE3 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op does not use a register +// CHECK-ERROR-NEXT: tlbi VMALLS12E1, x15 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: specified TLBI op requires a register +// CHECK-ERROR-NEXT: tlbi VAALE1 +// CHECK-ERROR-NEXT: ^ + +// For the MSR/MRS instructions, first make sure read-only and +// write-only registers actually are. + msr MDCCSR_EL0, x12 + msr DBGDTRRX_EL0, x12 + msr MDRAR_EL1, x12 + msr OSLSR_EL1, x12 + msr DBGAUTHSTATUS_EL1, x12 + msr MIDR_EL1, x12 + msr CCSIDR_EL1, x12 + msr CLIDR_EL1, x12 + msr CTR_EL0, x12 + msr MPIDR_EL1, x12 + msr REVIDR_EL1, x12 + msr AIDR_EL1, x12 + msr DCZID_EL0, x12 + msr ID_PFR0_EL1, x12 + msr ID_PFR1_EL1, x12 + msr ID_DFR0_EL1, x12 + msr ID_AFR0_EL1, x12 + msr ID_MMFR0_EL1, x12 + msr ID_MMFR1_EL1, x12 + msr ID_MMFR2_EL1, x12 + msr ID_MMFR3_EL1, x12 + msr ID_ISAR0_EL1, x12 + msr ID_ISAR1_EL1, x12 + msr ID_ISAR2_EL1, x12 + msr ID_ISAR3_EL1, x12 + msr ID_ISAR4_EL1, x12 + msr ID_ISAR5_EL1, x12 + msr MVFR0_EL1, x12 + msr MVFR1_EL1, x12 + msr MVFR2_EL1, x12 + msr ID_AA64PFR0_EL1, x12 + msr ID_AA64PFR1_EL1, x12 + msr ID_AA64DFR0_EL1, x12 + msr ID_AA64DFR1_EL1, x12 + msr ID_AA64AFR0_EL1, x12 + msr ID_AA64AFR1_EL1, x12 + msr ID_AA64ISAR0_EL1, x12 + msr ID_AA64ISAR1_EL1, x12 + msr ID_AA64MMFR0_EL1, x12 + msr ID_AA64MMFR1_EL1, x12 + msr PMCEID0_EL0, x12 + msr PMCEID1_EL0, x12 + msr RVBAR_EL1, x12 + msr RVBAR_EL2, x12 + msr RVBAR_EL3, x12 + msr ISR_EL1, x12 + msr CNTPCT_EL0, x12 + msr CNTVCT_EL0, x12 + msr PMEVCNTR31_EL0, x12 + msr PMEVTYPER31_EL0, x12 +// CHECK-ERROR: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr MDCCSR_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr DBGDTRRX_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr MDRAR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr OSLSR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr DBGAUTHSTATUS_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr MIDR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr CCSIDR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr CLIDR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr CTR_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr MPIDR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr REVIDR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr AIDR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr DCZID_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_PFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_PFR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_DFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_MMFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_MMFR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_MMFR2_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_MMFR3_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_ISAR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_ISAR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_ISAR2_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_ISAR3_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_ISAR4_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_ISAR5_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr MVFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr MVFR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr MVFR2_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64PFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64PFR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64DFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64DFR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64AFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64AFR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64ISAR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64ISAR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64MMFR0_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ID_AA64MMFR1_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr PMCEID0_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr PMCEID1_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr RVBAR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr RVBAR_EL2, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr RVBAR_EL3, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr ISR_EL1, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr CNTPCT_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr CNTVCT_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr PMEVCNTR31_EL0, x12 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected writable system register or pstate +// CHECK-ERROR-NEXT: msr PMEVTYPER31_EL0, x12 +// CHECK-ERROR-NEXT: ^ + + mrs x9, DBGDTRTX_EL0 + mrs x9, OSLAR_EL1 + mrs x9, PMSWINC_EL0 + mrs x9, PMEVCNTR31_EL0 + mrs x9, PMEVTYPER31_EL0 +// CHECK-ERROR: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x9, DBGDTRTX_EL0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x9, OSLAR_EL1 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x9, PMSWINC_EL0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x9, PMEVCNTR31_EL0 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x9, PMEVTYPER31_EL0 +// CHECK-ERROR-NEXT: ^ + +// Now check some invalid generic names + mrs xzr, s2_5_c11_c13_2 + mrs x12, s3_8_c11_c13_2 + mrs x13, s3_3_c12_c13_2 + mrs x19, s3_2_c15_c16_2 + mrs x30, s3_2_c15_c1_8 +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs xzr, s2_5_c11_c13_2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x12, s3_8_c11_c13_2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x13, s3_3_c12_c13_2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x19, s3_2_c15_c16_2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected readable system register +// CHECK-ERROR-NEXT: mrs x30, s3_2_c15_c1_8 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Test and branch (immediate) +//------------------------------------------------------------------------------ + + tbz w3, #-1, addr + tbz w3, #32, nowhere + tbz x9, #-1, there + tbz x20, #64, dont +// CHECK-ERROR: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: tbz w3, #-1, addr +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: tbz w3, #32, nowhere +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: tbz x9, #-1, there +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: tbz x20, #64, dont +// CHECK-ERROR-NEXT: ^ + + tbnz w3, #-1, addr + tbnz w3, #32, nowhere + tbnz x9, #-1, there + tbnz x20, #64, dont +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: tbnz w3, #-1, addr +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 31] +// CHECK-ERROR-NEXT: tbnz w3, #32, nowhere +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: tbnz x9, #-1, there +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected integer in range [0, 63] +// CHECK-ERROR-NEXT: tbnz x20, #64, dont + +//------------------------------------------------------------------------------ +// Unconditional branch (immediate) +//------------------------------------------------------------------------------ + + b #134217728 + b #-134217732 + b #1 +// CHECK-ERROR: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: b #134217728 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: b #-134217732 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: expected label or encodable integer pc offset +// CHECK-ERROR-NEXT: b #1 +// CHECK-ERROR-NEXT: ^ + +//------------------------------------------------------------------------------ +// Unconditional branch (register) +//------------------------------------------------------------------------------ + + br w2 + br sp +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: br w2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: br sp +// CHECK-ERROR-NEXT: ^ + + //// These ones shouldn't allow any registers + eret x2 + drps x2 +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR-NEXT: eret x2 +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: invalid operand for instruction +// CHECK-ERROR-NEXT: drps x2 +// CHECK-ERROR-NEXT: ^ + diff --git a/test/MC/AArch64/basic-a64-instructions.s b/test/MC/AArch64/basic-a64-instructions.s new file mode 100644 index 000000000000..ad3064e5e524 --- /dev/null +++ b/test/MC/AArch64/basic-a64-instructions.s @@ -0,0 +1,4819 @@ +// RUN: llvm-mc -triple=aarch64 -show-encoding < %s | FileCheck %s + .globl _func + +// Check that the assembler can handle the documented syntax from the ARM ARM. +// For complex constructs like shifter operands, check more thoroughly for them +// once then spot check that following instructions accept the form generally. +// This gives us good coverage while keeping the overall size of the test +// more reasonable. + + +_func: +// CHECK: _func + +//------------------------------------------------------------------------------ +// Add/sub (extended register) +//------------------------------------------------------------------------------ + // Basic extends 64-bit ops + add x2, x4, w5, uxtb + add x20, sp, w19, uxth + add x12, x1, w20, uxtw + add x20, x3, x13, uxtx + add x17, x25, w20, sxtb + add x18, x13, w19, sxth + add sp, x2, w3, sxtw + add x3, x5, x9, sxtx +// CHECK: add x2, x4, w5, uxtb // encoding: [0x82,0x00,0x25,0x8b] +// CHECK: add x20, sp, w19, uxth // encoding: [0xf4,0x23,0x33,0x8b] +// CHECK: add x12, x1, w20, uxtw // encoding: [0x2c,0x40,0x34,0x8b] +// CHECK: add x20, x3, x13, uxtx // encoding: [0x74,0x60,0x2d,0x8b] +// CHECK: add x17, x25, w20, sxtb // encoding: [0x31,0x83,0x34,0x8b] +// CHECK: add x18, x13, w19, sxth // encoding: [0xb2,0xa1,0x33,0x8b] +// CHECK: add sp, x2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0x8b] +// CHECK: add x3, x5, x9, sxtx // encoding: [0xa3,0xe0,0x29,0x8b] + + // Basic extends, 32-bit ops + add w2, w5, w7, uxtb + add w21, w15, w17, uxth + add w30, w29, wzr, uxtw + add w19, w17, w1, uxtx // Goodness knows what this means + add w2, w5, w1, sxtb + add w26, w17, w19, sxth + add w0, w2, w3, sxtw + add w2, w3, w5, sxtx +// CHECK: add w2, w5, w7, uxtb // encoding: [0xa2,0x00,0x27,0x0b] +// CHECK: add w21, w15, w17, uxth // encoding: [0xf5,0x21,0x31,0x0b] +// CHECK: add w30, w29, wzr, uxtw // encoding: [0xbe,0x43,0x3f,0x0b] +// CHECK: add w19, w17, w1, uxtx // encoding: [0x33,0x62,0x21,0x0b] +// CHECK: add w2, w5, w1, sxtb // encoding: [0xa2,0x80,0x21,0x0b] +// CHECK: add w26, w17, w19, sxth // encoding: [0x3a,0xa2,0x33,0x0b] +// CHECK: add w0, w2, w3, sxtw // encoding: [0x40,0xc0,0x23,0x0b] +// CHECK: add w2, w3, w5, sxtx // encoding: [0x62,0xe0,0x25,0x0b] + + // Nonzero shift amounts + add x2, x3, w5, sxtb #0 + add x7, x11, w13, uxth #4 + add w17, w19, w23, uxtw #2 + add w29, w23, w17, uxtx #1 +// CHECK: add x2, x3, w5, sxtb // encoding: [0x62,0x80,0x25,0x8b] +// CHECK: add x7, x11, w13, uxth #4 // encoding: [0x67,0x31,0x2d,0x8b] +// CHECK: add w17, w19, w23, uxtw #2 // encoding: [0x71,0x4a,0x37,0x0b] +// CHECK: add w29, w23, w17, uxtx #1 // encoding: [0xfd,0x66,0x31,0x0b] + + // Sub + sub x2, x4, w5, uxtb #2 + sub x20, sp, w19, uxth #4 + sub x12, x1, w20, uxtw + sub x20, x3, x13, uxtx #0 + sub x17, x25, w20, sxtb + sub x18, x13, w19, sxth + sub sp, x2, w3, sxtw + sub x3, x5, x9, sxtx +// CHECK: sub x2, x4, w5, uxtb #2 // encoding: [0x82,0x08,0x25,0xcb] +// CHECK: sub x20, sp, w19, uxth #4 // encoding: [0xf4,0x33,0x33,0xcb] +// CHECK: sub x12, x1, w20, uxtw // encoding: [0x2c,0x40,0x34,0xcb] +// CHECK: sub x20, x3, x13, uxtx // encoding: [0x74,0x60,0x2d,0xcb] +// CHECK: sub x17, x25, w20, sxtb // encoding: [0x31,0x83,0x34,0xcb] +// CHECK: sub x18, x13, w19, sxth // encoding: [0xb2,0xa1,0x33,0xcb] +// CHECK: sub sp, x2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0xcb] +// CHECK: sub x3, x5, x9, sxtx // encoding: [0xa3,0xe0,0x29,0xcb] + + sub w2, w5, w7, uxtb + sub w21, w15, w17, uxth + sub w30, w29, wzr, uxtw + sub w19, w17, w1, uxtx // Goodness knows what this means + sub w2, w5, w1, sxtb + sub w26, wsp, w19, sxth + sub wsp, w2, w3, sxtw + sub w2, w3, w5, sxtx +// CHECK: sub w2, w5, w7, uxtb // encoding: [0xa2,0x00,0x27,0x4b] +// CHECK: sub w21, w15, w17, uxth // encoding: [0xf5,0x21,0x31,0x4b] +// CHECK: sub w30, w29, wzr, uxtw // encoding: [0xbe,0x43,0x3f,0x4b] +// CHECK: sub w19, w17, w1, uxtx // encoding: [0x33,0x62,0x21,0x4b] +// CHECK: sub w2, w5, w1, sxtb // encoding: [0xa2,0x80,0x21,0x4b] +// CHECK: sub w26, wsp, w19, sxth // encoding: [0xfa,0xa3,0x33,0x4b] +// CHECK: sub wsp, w2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0x4b] +// CHECK: sub w2, w3, w5, sxtx // encoding: [0x62,0xe0,0x25,0x4b] + + // Adds + adds x2, x4, w5, uxtb #2 + adds x20, sp, w19, uxth #4 + adds x12, x1, w20, uxtw + adds x20, x3, x13, uxtx #0 + adds xzr, x25, w20, sxtb #3 + adds x18, sp, w19, sxth + adds xzr, x2, w3, sxtw + adds x3, x5, x9, sxtx #2 +// CHECK: adds x2, x4, w5, uxtb #2 // encoding: [0x82,0x08,0x25,0xab] +// CHECK: adds x20, sp, w19, uxth #4 // encoding: [0xf4,0x33,0x33,0xab] +// CHECK: adds x12, x1, w20, uxtw // encoding: [0x2c,0x40,0x34,0xab] +// CHECK: adds x20, x3, x13, uxtx // encoding: [0x74,0x60,0x2d,0xab] +// CHECK: adds xzr, x25, w20, sxtb #3 // encoding: [0x3f,0x8f,0x34,0xab] +// CHECK: adds x18, sp, w19, sxth // encoding: [0xf2,0xa3,0x33,0xab] +// CHECK: adds xzr, x2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0xab] +// CHECK: adds x3, x5, x9, sxtx #2 // encoding: [0xa3,0xe8,0x29,0xab] + + adds w2, w5, w7, uxtb + adds w21, w15, w17, uxth + adds w30, w29, wzr, uxtw + adds w19, w17, w1, uxtx // Goodness knows what this means + adds w2, w5, w1, sxtb #1 + adds w26, wsp, w19, sxth + adds wzr, w2, w3, sxtw + adds w2, w3, w5, sxtx +// CHECK: adds w2, w5, w7, uxtb // encoding: [0xa2,0x00,0x27,0x2b] +// CHECK: adds w21, w15, w17, uxth // encoding: [0xf5,0x21,0x31,0x2b] +// CHECK: adds w30, w29, wzr, uxtw // encoding: [0xbe,0x43,0x3f,0x2b] +// CHECK: adds w19, w17, w1, uxtx // encoding: [0x33,0x62,0x21,0x2b] +// CHECK: adds w2, w5, w1, sxtb #1 // encoding: [0xa2,0x84,0x21,0x2b] +// CHECK: adds w26, wsp, w19, sxth // encoding: [0xfa,0xa3,0x33,0x2b] +// CHECK: adds wzr, w2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0x2b] +// CHECK: adds w2, w3, w5, sxtx // encoding: [0x62,0xe0,0x25,0x2b] + + // subs + subs x2, x4, w5, uxtb #2 + subs x20, sp, w19, uxth #4 + subs x12, x1, w20, uxtw + subs x20, x3, x13, uxtx #0 + subs xzr, x25, w20, sxtb #3 + subs x18, sp, w19, sxth + subs xzr, x2, w3, sxtw + subs x3, x5, x9, sxtx #2 +// CHECK: subs x2, x4, w5, uxtb #2 // encoding: [0x82,0x08,0x25,0xeb] +// CHECK: subs x20, sp, w19, uxth #4 // encoding: [0xf4,0x33,0x33,0xeb] +// CHECK: subs x12, x1, w20, uxtw // encoding: [0x2c,0x40,0x34,0xeb] +// CHECK: subs x20, x3, x13, uxtx // encoding: [0x74,0x60,0x2d,0xeb] +// CHECK: subs xzr, x25, w20, sxtb #3 // encoding: [0x3f,0x8f,0x34,0xeb] +// CHECK: subs x18, sp, w19, sxth // encoding: [0xf2,0xa3,0x33,0xeb] +// CHECK: subs xzr, x2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0xeb] +// CHECK: subs x3, x5, x9, sxtx #2 // encoding: [0xa3,0xe8,0x29,0xeb] + + subs w2, w5, w7, uxtb + subs w21, w15, w17, uxth + subs w30, w29, wzr, uxtw + subs w19, w17, w1, uxtx // Goodness knows what this means + subs w2, w5, w1, sxtb #1 + subs w26, wsp, w19, sxth + subs wzr, w2, w3, sxtw + subs w2, w3, w5, sxtx +// CHECK: subs w2, w5, w7, uxtb // encoding: [0xa2,0x00,0x27,0x6b] +// CHECK: subs w21, w15, w17, uxth // encoding: [0xf5,0x21,0x31,0x6b] +// CHECK: subs w30, w29, wzr, uxtw // encoding: [0xbe,0x43,0x3f,0x6b] +// CHECK: subs w19, w17, w1, uxtx // encoding: [0x33,0x62,0x21,0x6b] +// CHECK: subs w2, w5, w1, sxtb #1 // encoding: [0xa2,0x84,0x21,0x6b] +// CHECK: subs w26, wsp, w19, sxth // encoding: [0xfa,0xa3,0x33,0x6b] +// CHECK: subs wzr, w2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0x6b] +// CHECK: subs w2, w3, w5, sxtx // encoding: [0x62,0xe0,0x25,0x6b] + + // cmp + cmp x4, w5, uxtb #2 + cmp sp, w19, uxth #4 + cmp x1, w20, uxtw + cmp x3, x13, uxtx #0 + cmp x25, w20, sxtb #3 + cmp sp, w19, sxth + cmp x2, w3, sxtw + cmp x5, x9, sxtx #2 +// CHECK: cmp x4, w5, uxtb #2 // encoding: [0x9f,0x08,0x25,0xeb] +// CHECK: cmp sp, w19, uxth #4 // encoding: [0xff,0x33,0x33,0xeb] +// CHECK: cmp x1, w20, uxtw // encoding: [0x3f,0x40,0x34,0xeb] +// CHECK: cmp x3, x13, uxtx // encoding: [0x7f,0x60,0x2d,0xeb] +// CHECK: cmp x25, w20, sxtb #3 // encoding: [0x3f,0x8f,0x34,0xeb] +// CHECK: cmp sp, w19, sxth // encoding: [0xff,0xa3,0x33,0xeb] +// CHECK: cmp x2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0xeb] +// CHECK: cmp x5, x9, sxtx #2 // encoding: [0xbf,0xe8,0x29,0xeb] + + cmp w5, w7, uxtb + cmp w15, w17, uxth + cmp w29, wzr, uxtw + cmp w17, w1, uxtx // Goodness knows what this means + cmp w5, w1, sxtb #1 + cmp wsp, w19, sxth + cmp w2, w3, sxtw + cmp w3, w5, sxtx +// CHECK: cmp w5, w7, uxtb // encoding: [0xbf,0x00,0x27,0x6b] +// CHECK: cmp w15, w17, uxth // encoding: [0xff,0x21,0x31,0x6b] +// CHECK: cmp w29, wzr, uxtw // encoding: [0xbf,0x43,0x3f,0x6b] +// CHECK: cmp w17, w1, uxtx // encoding: [0x3f,0x62,0x21,0x6b] +// CHECK: cmp w5, w1, sxtb #1 // encoding: [0xbf,0x84,0x21,0x6b] +// CHECK: cmp wsp, w19, sxth // encoding: [0xff,0xa3,0x33,0x6b] +// CHECK: cmp w2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0x6b] +// CHECK: cmp w3, w5, sxtx // encoding: [0x7f,0xe0,0x25,0x6b] + + + // cmn + cmn x4, w5, uxtb #2 + cmn sp, w19, uxth #4 + cmn x1, w20, uxtw + cmn x3, x13, uxtx #0 + cmn x25, w20, sxtb #3 + cmn sp, w19, sxth + cmn x2, w3, sxtw + cmn x5, x9, sxtx #2 +// CHECK: cmn x4, w5, uxtb #2 // encoding: [0x9f,0x08,0x25,0xab] +// CHECK: cmn sp, w19, uxth #4 // encoding: [0xff,0x33,0x33,0xab] +// CHECK: cmn x1, w20, uxtw // encoding: [0x3f,0x40,0x34,0xab] +// CHECK: cmn x3, x13, uxtx // encoding: [0x7f,0x60,0x2d,0xab] +// CHECK: cmn x25, w20, sxtb #3 // encoding: [0x3f,0x8f,0x34,0xab] +// CHECK: cmn sp, w19, sxth // encoding: [0xff,0xa3,0x33,0xab] +// CHECK: cmn x2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0xab] +// CHECK: cmn x5, x9, sxtx #2 // encoding: [0xbf,0xe8,0x29,0xab] + + cmn w5, w7, uxtb + cmn w15, w17, uxth + cmn w29, wzr, uxtw + cmn w17, w1, uxtx // Goodness knows what this means + cmn w5, w1, sxtb #1 + cmn wsp, w19, sxth + cmn w2, w3, sxtw + cmn w3, w5, sxtx +// CHECK: cmn w5, w7, uxtb // encoding: [0xbf,0x00,0x27,0x2b] +// CHECK: cmn w15, w17, uxth // encoding: [0xff,0x21,0x31,0x2b] +// CHECK: cmn w29, wzr, uxtw // encoding: [0xbf,0x43,0x3f,0x2b] +// CHECK: cmn w17, w1, uxtx // encoding: [0x3f,0x62,0x21,0x2b] +// CHECK: cmn w5, w1, sxtb #1 // encoding: [0xbf,0x84,0x21,0x2b] +// CHECK: cmn wsp, w19, sxth // encoding: [0xff,0xa3,0x33,0x2b] +// CHECK: cmn w2, w3, sxtw // encoding: [0x5f,0xc0,0x23,0x2b] +// CHECK: cmn w3, w5, sxtx // encoding: [0x7f,0xe0,0x25,0x2b] + + // operands for cmp + cmp x20, w29, uxtb #3 + cmp x12, x13, uxtx #4 + cmp wsp, w1, uxtb + cmn wsp, wzr, sxtw +// CHECK: cmp x20, w29, uxtb #3 // encoding: [0x9f,0x0e,0x3d,0xeb] +// CHECK: cmp x12, x13, uxtx #4 // encoding: [0x9f,0x71,0x2d,0xeb] +// CHECK: cmp wsp, w1, uxtb // encoding: [0xff,0x03,0x21,0x6b] +// CHECK: cmn wsp, wzr, sxtw // encoding: [0xff,0xc3,0x3f,0x2b] + + // LSL variant if sp involved + sub sp, x3, x7, lsl #4 + add w2, wsp, w3, lsl #1 + cmp wsp, w9, lsl #0 + adds wzr, wsp, w3, lsl #4 + subs x3, sp, x9, lsl #2 +// CHECK: sub sp, x3, x7, lsl #4 // encoding: [0x7f,0x70,0x27,0xcb] +// CHECK: add w2, wsp, w3, lsl #1 // encoding: [0xe2,0x47,0x23,0x0b] +// CHECK: cmp wsp, w9 // encoding: [0xff,0x43,0x29,0x6b] +// CHECK: adds wzr, wsp, w3, lsl #4 // encoding: [0xff,0x53,0x23,0x2b] +// CHECK: subs x3, sp, x9, lsl #2 // encoding: [0xe3,0x6b,0x29,0xeb] + +//------------------------------------------------------------------------------ +// Add/sub (immediate) +//------------------------------------------------------------------------------ + +// Check basic immediate values: an unsigned 12-bit immediate, optionally +// shifted left by 12 bits. + add w4, w5, #0x0 + add w2, w3, #4095 + add w30, w29, #1, lsl #12 + add w13, w5, #4095, lsl #12 + add x5, x7, #1638 +// CHECK: add w4, w5, #0 // encoding: [0xa4,0x00,0x00,0x11] +// CHECK: add w2, w3, #4095 // encoding: [0x62,0xfc,0x3f,0x11] +// CHECK: add w30, w29, #1, lsl #12 // encoding: [0xbe,0x07,0x40,0x11] +// CHECK: add w13, w5, #4095, lsl #12 // encoding: [0xad,0xfc,0x7f,0x11] +// CHECK: add x5, x7, #1638 // encoding: [0xe5,0x98,0x19,0x91] + +// All registers involved in the non-S variants have 31 encoding sp rather than zr + add w20, wsp, #801, lsl #0 + add wsp, wsp, #1104 + add wsp, w30, #4084 +// CHECK: add w20, wsp, #801 // encoding: [0xf4,0x87,0x0c,0x11] +// CHECK: add wsp, wsp, #1104 // encoding: [0xff,0x43,0x11,0x11] +// CHECK: add wsp, w30, #4084 // encoding: [0xdf,0xd3,0x3f,0x11] + +// A few checks on the sanity of 64-bit versions + add x0, x24, #291 + add x3, x24, #4095, lsl #12 + add x8, sp, #1074 + add sp, x29, #3816 +// CHECK: add x0, x24, #291 // encoding: [0x00,0x8f,0x04,0x91] +// CHECK: add x3, x24, #4095, lsl #12 // encoding: [0x03,0xff,0x7f,0x91] +// CHECK: add x8, sp, #1074 // encoding: [0xe8,0xcb,0x10,0x91] +// CHECK: add sp, x29, #3816 // encoding: [0xbf,0xa3,0x3b,0x91] + +// And on sub + sub w0, wsp, #4077 + sub w4, w20, #546, lsl #12 + sub sp, sp, #288 + sub wsp, w19, #16 +// CHECK: sub w0, wsp, #4077 // encoding: [0xe0,0xb7,0x3f,0x51] +// CHECK: sub w4, w20, #546, lsl #12 // encoding: [0x84,0x8a,0x48,0x51] +// CHECK: sub sp, sp, #288 // encoding: [0xff,0x83,0x04,0xd1] +// CHECK: sub wsp, w19, #16 // encoding: [0x7f,0x42,0x00,0x51] + +// ADDS/SUBS accept zr in the Rd position but sp in the Rn position + adds w13, w23, #291, lsl #12 + adds wzr, w2, #4095 // FIXME: canonically should be cmn + adds w20, wsp, #0x0 + adds xzr, x3, #0x1, lsl #12 // FIXME: canonically should be cmn +// CHECK: adds w13, w23, #291, lsl #12 // encoding: [0xed,0x8e,0x44,0x31] +// CHECK: adds wzr, w2, #4095 // encoding: [0x5f,0xfc,0x3f,0x31] +// CHECK: adds w20, wsp, #0 // encoding: [0xf4,0x03,0x00,0x31] +// CHECK: adds xzr, x3, #1, lsl #12 // encoding: [0x7f,0x04,0x40,0xb1] + +// Checks for subs + subs xzr, sp, #20, lsl #12 // FIXME: canonically should be cmp + subs xzr, x30, #4095, lsl #0 // FIXME: canonically should be cmp + subs x4, sp, #3822 +// CHECK: subs xzr, sp, #20, lsl #12 // encoding: [0xff,0x53,0x40,0xf1] +// CHECK: subs xzr, x30, #4095 // encoding: [0xdf,0xff,0x3f,0xf1] +// CHECK: subs x4, sp, #3822 // encoding: [0xe4,0xbb,0x3b,0xf1] + +// cmn is an alias for adds zr, ... + cmn w3, #291, lsl #12 + cmn wsp, #1365, lsl #0 + cmn sp, #1092, lsl #12 +// CHECK: cmn w3, #291, lsl #12 // encoding: [0x7f,0x8c,0x44,0x31] +// CHECK: cmn wsp, #1365 // encoding: [0xff,0x57,0x15,0x31] +// CHECK: cmn sp, #1092, lsl #12 // encoding: [0xff,0x13,0x51,0xb1] + +// cmp is an alias for subs zr, ... (FIXME: should always disassemble as such too). + cmp x4, #300, lsl #12 + cmp wsp, #500 + cmp sp, #200, lsl #0 +// CHECK: cmp x4, #300, lsl #12 // encoding: [0x9f,0xb0,0x44,0xf1] +// CHECK: cmp wsp, #500 // encoding: [0xff,0xd3,0x07,0x71] +// CHECK: cmp sp, #200 // encoding: [0xff,0x23,0x03,0xf1] + +// A "MOV" involving sp is encoded in this manner: add Reg, Reg, #0 + mov sp, x30 + mov wsp, w20 + mov x11, sp + mov w24, wsp +// CHECK: mov sp, x30 // encoding: [0xdf,0x03,0x00,0x91] +// CHECK: mov wsp, w20 // encoding: [0x9f,0x02,0x00,0x11] +// CHECK: mov x11, sp // encoding: [0xeb,0x03,0x00,0x91] +// CHECK: mov w24, wsp // encoding: [0xf8,0x03,0x00,0x11] + +// A relocation check (default to lo12, which is the only sane relocation anyway really) + add x0, x4, #:lo12:var +// CHECK: add x0, x4, #:lo12:var // encoding: [0x80'A',A,A,0x91'A'] +// CHECK: // fixup A - offset: 0, value: :lo12:var, kind: fixup_a64_add_lo12 + +//------------------------------------------------------------------------------ +// Add-sub (shifted register) +//------------------------------------------------------------------------------ + +// As usual, we don't print the canonical forms of many instructions. + + add w3, w5, w7 + add wzr, w3, w5 + add w20, wzr, w4 + add w4, w6, wzr +// CHECK: add w3, w5, w7 // encoding: [0xa3,0x00,0x07,0x0b] +// CHECK: add wzr, w3, w5 // encoding: [0x7f,0x00,0x05,0x0b] +// CHECK: add w20, wzr, w4 // encoding: [0xf4,0x03,0x04,0x0b] +// CHECK: add w4, w6, wzr // encoding: [0xc4,0x00,0x1f,0x0b] + + add w11, w13, w15, lsl #0 + add w9, w3, wzr, lsl #10 + add w17, w29, w20, lsl #31 +// CHECK: add w11, w13, w15 // encoding: [0xab,0x01,0x0f,0x0b] +// CHECK: add w9, w3, wzr, lsl #10 // encoding: [0x69,0x28,0x1f,0x0b] +// CHECK: add w17, w29, w20, lsl #31 // encoding: [0xb1,0x7f,0x14,0x0b] + + add w21, w22, w23, lsr #0 + add w24, w25, w26, lsr #18 + add w27, w28, w29, lsr #31 +// CHECK: add w21, w22, w23, lsr #0 // encoding: [0xd5,0x02,0x57,0x0b] +// CHECK: add w24, w25, w26, lsr #18 // encoding: [0x38,0x4b,0x5a,0x0b] +// CHECK: add w27, w28, w29, lsr #31 // encoding: [0x9b,0x7f,0x5d,0x0b] + + add w2, w3, w4, asr #0 + add w5, w6, w7, asr #21 + add w8, w9, w10, asr #31 +// CHECK: add w2, w3, w4, asr #0 // encoding: [0x62,0x00,0x84,0x0b] +// CHECK: add w5, w6, w7, asr #21 // encoding: [0xc5,0x54,0x87,0x0b] +// CHECK: add w8, w9, w10, asr #31 // encoding: [0x28,0x7d,0x8a,0x0b] + + add x3, x5, x7 + add xzr, x3, x5 + add x20, xzr, x4 + add x4, x6, xzr +// CHECK: add x3, x5, x7 // encoding: [0xa3,0x00,0x07,0x8b] +// CHECK: add xzr, x3, x5 // encoding: [0x7f,0x00,0x05,0x8b] +// CHECK: add x20, xzr, x4 // encoding: [0xf4,0x03,0x04,0x8b] +// CHECK: add x4, x6, xzr // encoding: [0xc4,0x00,0x1f,0x8b] + + add x11, x13, x15, lsl #0 + add x9, x3, xzr, lsl #10 + add x17, x29, x20, lsl #63 +// CHECK: add x11, x13, x15 // encoding: [0xab,0x01,0x0f,0x8b] +// CHECK: add x9, x3, xzr, lsl #10 // encoding: [0x69,0x28,0x1f,0x8b] +// CHECK: add x17, x29, x20, lsl #63 // encoding: [0xb1,0xff,0x14,0x8b] + + add x21, x22, x23, lsr #0 + add x24, x25, x26, lsr #18 + add x27, x28, x29, lsr #63 +// CHECK: add x21, x22, x23, lsr #0 // encoding: [0xd5,0x02,0x57,0x8b] +// CHECK: add x24, x25, x26, lsr #18 // encoding: [0x38,0x4b,0x5a,0x8b] +// CHECK: add x27, x28, x29, lsr #63 // encoding: [0x9b,0xff,0x5d,0x8b] + + add x2, x3, x4, asr #0 + add x5, x6, x7, asr #21 + add x8, x9, x10, asr #63 +// CHECK: add x2, x3, x4, asr #0 // encoding: [0x62,0x00,0x84,0x8b] +// CHECK: add x5, x6, x7, asr #21 // encoding: [0xc5,0x54,0x87,0x8b] +// CHECK: add x8, x9, x10, asr #63 // encoding: [0x28,0xfd,0x8a,0x8b] + + adds w3, w5, w7 + adds wzr, w3, w5 + adds w20, wzr, w4 + adds w4, w6, wzr +// CHECK: adds w3, w5, w7 // encoding: [0xa3,0x00,0x07,0x2b] +// CHECK: adds wzr, w3, w5 // encoding: [0x7f,0x00,0x05,0x2b] +// CHECK: adds w20, wzr, w4 // encoding: [0xf4,0x03,0x04,0x2b] +// CHECK: adds w4, w6, wzr // encoding: [0xc4,0x00,0x1f,0x2b] + + adds w11, w13, w15, lsl #0 + adds w9, w3, wzr, lsl #10 + adds w17, w29, w20, lsl #31 +// CHECK: adds w11, w13, w15 // encoding: [0xab,0x01,0x0f,0x2b] +// CHECK: adds w9, w3, wzr, lsl #10 // encoding: [0x69,0x28,0x1f,0x2b] +// CHECK: adds w17, w29, w20, lsl #31 // encoding: [0xb1,0x7f,0x14,0x2b] + + adds w21, w22, w23, lsr #0 + adds w24, w25, w26, lsr #18 + adds w27, w28, w29, lsr #31 +// CHECK: adds w21, w22, w23, lsr #0 // encoding: [0xd5,0x02,0x57,0x2b] +// CHECK: adds w24, w25, w26, lsr #18 // encoding: [0x38,0x4b,0x5a,0x2b] +// CHECK: adds w27, w28, w29, lsr #31 // encoding: [0x9b,0x7f,0x5d,0x2b] + + adds w2, w3, w4, asr #0 + adds w5, w6, w7, asr #21 + adds w8, w9, w10, asr #31 +// CHECK: adds w2, w3, w4, asr #0 // encoding: [0x62,0x00,0x84,0x2b] +// CHECK: adds w5, w6, w7, asr #21 // encoding: [0xc5,0x54,0x87,0x2b] +// CHECK: adds w8, w9, w10, asr #31 // encoding: [0x28,0x7d,0x8a,0x2b] + + adds x3, x5, x7 + adds xzr, x3, x5 + adds x20, xzr, x4 + adds x4, x6, xzr +// CHECK: adds x3, x5, x7 // encoding: [0xa3,0x00,0x07,0xab] +// CHECK: adds xzr, x3, x5 // encoding: [0x7f,0x00,0x05,0xab] +// CHECK: adds x20, xzr, x4 // encoding: [0xf4,0x03,0x04,0xab] +// CHECK: adds x4, x6, xzr // encoding: [0xc4,0x00,0x1f,0xab] + + adds x11, x13, x15, lsl #0 + adds x9, x3, xzr, lsl #10 + adds x17, x29, x20, lsl #63 +// CHECK: adds x11, x13, x15 // encoding: [0xab,0x01,0x0f,0xab] +// CHECK: adds x9, x3, xzr, lsl #10 // encoding: [0x69,0x28,0x1f,0xab] +// CHECK: adds x17, x29, x20, lsl #63 // encoding: [0xb1,0xff,0x14,0xab] + + adds x21, x22, x23, lsr #0 + adds x24, x25, x26, lsr #18 + adds x27, x28, x29, lsr #63 +// CHECK: adds x21, x22, x23, lsr #0 // encoding: [0xd5,0x02,0x57,0xab] +// CHECK: adds x24, x25, x26, lsr #18 // encoding: [0x38,0x4b,0x5a,0xab] +// CHECK: adds x27, x28, x29, lsr #63 // encoding: [0x9b,0xff,0x5d,0xab] + + adds x2, x3, x4, asr #0 + adds x5, x6, x7, asr #21 + adds x8, x9, x10, asr #63 +// CHECK: adds x2, x3, x4, asr #0 // encoding: [0x62,0x00,0x84,0xab] +// CHECK: adds x5, x6, x7, asr #21 // encoding: [0xc5,0x54,0x87,0xab] +// CHECK: adds x8, x9, x10, asr #63 // encoding: [0x28,0xfd,0x8a,0xab] + + sub w3, w5, w7 + sub wzr, w3, w5 + sub w20, wzr, w4 + sub w4, w6, wzr +// CHECK: sub w3, w5, w7 // encoding: [0xa3,0x00,0x07,0x4b] +// CHECK: sub wzr, w3, w5 // encoding: [0x7f,0x00,0x05,0x4b] +// CHECK: sub w20, wzr, w4 // encoding: [0xf4,0x03,0x04,0x4b] +// CHECK: sub w4, w6, wzr // encoding: [0xc4,0x00,0x1f,0x4b] + + sub w11, w13, w15, lsl #0 + sub w9, w3, wzr, lsl #10 + sub w17, w29, w20, lsl #31 +// CHECK: sub w11, w13, w15 // encoding: [0xab,0x01,0x0f,0x4b] +// CHECK: sub w9, w3, wzr, lsl #10 // encoding: [0x69,0x28,0x1f,0x4b] +// CHECK: sub w17, w29, w20, lsl #31 // encoding: [0xb1,0x7f,0x14,0x4b] + + sub w21, w22, w23, lsr #0 + sub w24, w25, w26, lsr #18 + sub w27, w28, w29, lsr #31 +// CHECK: sub w21, w22, w23, lsr #0 // encoding: [0xd5,0x02,0x57,0x4b] +// CHECK: sub w24, w25, w26, lsr #18 // encoding: [0x38,0x4b,0x5a,0x4b] +// CHECK: sub w27, w28, w29, lsr #31 // encoding: [0x9b,0x7f,0x5d,0x4b] + + sub w2, w3, w4, asr #0 + sub w5, w6, w7, asr #21 + sub w8, w9, w10, asr #31 +// CHECK: sub w2, w3, w4, asr #0 // encoding: [0x62,0x00,0x84,0x4b] +// CHECK: sub w5, w6, w7, asr #21 // encoding: [0xc5,0x54,0x87,0x4b] +// CHECK: sub w8, w9, w10, asr #31 // encoding: [0x28,0x7d,0x8a,0x4b] + + sub x3, x5, x7 + sub xzr, x3, x5 + sub x20, xzr, x4 + sub x4, x6, xzr +// CHECK: sub x3, x5, x7 // encoding: [0xa3,0x00,0x07,0xcb] +// CHECK: sub xzr, x3, x5 // encoding: [0x7f,0x00,0x05,0xcb] +// CHECK: sub x20, xzr, x4 // encoding: [0xf4,0x03,0x04,0xcb] +// CHECK: sub x4, x6, xzr // encoding: [0xc4,0x00,0x1f,0xcb] + + sub x11, x13, x15, lsl #0 + sub x9, x3, xzr, lsl #10 + sub x17, x29, x20, lsl #63 +// CHECK: sub x11, x13, x15 // encoding: [0xab,0x01,0x0f,0xcb] +// CHECK: sub x9, x3, xzr, lsl #10 // encoding: [0x69,0x28,0x1f,0xcb] +// CHECK: sub x17, x29, x20, lsl #63 // encoding: [0xb1,0xff,0x14,0xcb] + + sub x21, x22, x23, lsr #0 + sub x24, x25, x26, lsr #18 + sub x27, x28, x29, lsr #63 +// CHECK: sub x21, x22, x23, lsr #0 // encoding: [0xd5,0x02,0x57,0xcb] +// CHECK: sub x24, x25, x26, lsr #18 // encoding: [0x38,0x4b,0x5a,0xcb] +// CHECK: sub x27, x28, x29, lsr #63 // encoding: [0x9b,0xff,0x5d,0xcb] + + sub x2, x3, x4, asr #0 + sub x5, x6, x7, asr #21 + sub x8, x9, x10, asr #63 +// CHECK: sub x2, x3, x4, asr #0 // encoding: [0x62,0x00,0x84,0xcb] +// CHECK: sub x5, x6, x7, asr #21 // encoding: [0xc5,0x54,0x87,0xcb] +// CHECK: sub x8, x9, x10, asr #63 // encoding: [0x28,0xfd,0x8a,0xcb] + + subs w3, w5, w7 + subs wzr, w3, w5 + subs w20, wzr, w4 + subs w4, w6, wzr +// CHECK: subs w3, w5, w7 // encoding: [0xa3,0x00,0x07,0x6b] +// CHECK: subs wzr, w3, w5 // encoding: [0x7f,0x00,0x05,0x6b] +// CHECK: subs w20, wzr, w4 // encoding: [0xf4,0x03,0x04,0x6b] +// CHECK: subs w4, w6, wzr // encoding: [0xc4,0x00,0x1f,0x6b] + + subs w11, w13, w15, lsl #0 + subs w9, w3, wzr, lsl #10 + subs w17, w29, w20, lsl #31 +// CHECK: subs w11, w13, w15 // encoding: [0xab,0x01,0x0f,0x6b] +// CHECK: subs w9, w3, wzr, lsl #10 // encoding: [0x69,0x28,0x1f,0x6b] +// CHECK: subs w17, w29, w20, lsl #31 // encoding: [0xb1,0x7f,0x14,0x6b] + + subs w21, w22, w23, lsr #0 + subs w24, w25, w26, lsr #18 + subs w27, w28, w29, lsr #31 +// CHECK: subs w21, w22, w23, lsr #0 // encoding: [0xd5,0x02,0x57,0x6b] +// CHECK: subs w24, w25, w26, lsr #18 // encoding: [0x38,0x4b,0x5a,0x6b] +// CHECK: subs w27, w28, w29, lsr #31 // encoding: [0x9b,0x7f,0x5d,0x6b] + + subs w2, w3, w4, asr #0 + subs w5, w6, w7, asr #21 + subs w8, w9, w10, asr #31 +// CHECK: subs w2, w3, w4, asr #0 // encoding: [0x62,0x00,0x84,0x6b] +// CHECK: subs w5, w6, w7, asr #21 // encoding: [0xc5,0x54,0x87,0x6b] +// CHECK: subs w8, w9, w10, asr #31 // encoding: [0x28,0x7d,0x8a,0x6b] + + subs x3, x5, x7 + subs xzr, x3, x5 + subs x20, xzr, x4 + subs x4, x6, xzr +// CHECK: subs x3, x5, x7 // encoding: [0xa3,0x00,0x07,0xeb] +// CHECK: subs xzr, x3, x5 // encoding: [0x7f,0x00,0x05,0xeb] +// CHECK: subs x20, xzr, x4 // encoding: [0xf4,0x03,0x04,0xeb] +// CHECK: subs x4, x6, xzr // encoding: [0xc4,0x00,0x1f,0xeb] + + subs x11, x13, x15, lsl #0 + subs x9, x3, xzr, lsl #10 + subs x17, x29, x20, lsl #63 +// CHECK: subs x11, x13, x15 // encoding: [0xab,0x01,0x0f,0xeb] +// CHECK: subs x9, x3, xzr, lsl #10 // encoding: [0x69,0x28,0x1f,0xeb] +// CHECK: subs x17, x29, x20, lsl #63 // encoding: [0xb1,0xff,0x14,0xeb] + + subs x21, x22, x23, lsr #0 + subs x24, x25, x26, lsr #18 + subs x27, x28, x29, lsr #63 +// CHECK: subs x21, x22, x23, lsr #0 // encoding: [0xd5,0x02,0x57,0xeb] +// CHECK: subs x24, x25, x26, lsr #18 // encoding: [0x38,0x4b,0x5a,0xeb] +// CHECK: subs x27, x28, x29, lsr #63 // encoding: [0x9b,0xff,0x5d,0xeb] + + subs x2, x3, x4, asr #0 + subs x5, x6, x7, asr #21 + subs x8, x9, x10, asr #63 +// CHECK: subs x2, x3, x4, asr #0 // encoding: [0x62,0x00,0x84,0xeb] +// CHECK: subs x5, x6, x7, asr #21 // encoding: [0xc5,0x54,0x87,0xeb] +// CHECK: subs x8, x9, x10, asr #63 // encoding: [0x28,0xfd,0x8a,0xeb] + + cmn w0, w3 + cmn wzr, w4 + cmn w5, wzr +// CHECK: cmn w0, w3 // encoding: [0x1f,0x00,0x03,0x2b] +// CHECK: cmn wzr, w4 // encoding: [0xff,0x03,0x04,0x2b] +// CHECK: cmn w5, wzr // encoding: [0xbf,0x00,0x1f,0x2b] + + cmn w6, w7, lsl #0 + cmn w8, w9, lsl #15 + cmn w10, w11, lsl #31 +// CHECK: cmn w6, w7 // encoding: [0xdf,0x00,0x07,0x2b] +// CHECK: cmn w8, w9, lsl #15 // encoding: [0x1f,0x3d,0x09,0x2b] +// CHECK: cmn w10, w11, lsl #31 // encoding: [0x5f,0x7d,0x0b,0x2b] + + cmn w12, w13, lsr #0 + cmn w14, w15, lsr #21 + cmn w16, w17, lsr #31 +// CHECK: cmn w12, w13, lsr #0 // encoding: [0x9f,0x01,0x4d,0x2b] +// CHECK: cmn w14, w15, lsr #21 // encoding: [0xdf,0x55,0x4f,0x2b] +// CHECK: cmn w16, w17, lsr #31 // encoding: [0x1f,0x7e,0x51,0x2b] + + cmn w18, w19, asr #0 + cmn w20, w21, asr #22 + cmn w22, w23, asr #31 +// CHECK: cmn w18, w19, asr #0 // encoding: [0x5f,0x02,0x93,0x2b] +// CHECK: cmn w20, w21, asr #22 // encoding: [0x9f,0x5a,0x95,0x2b] +// CHECK: cmn w22, w23, asr #31 // encoding: [0xdf,0x7e,0x97,0x2b] + + cmn x0, x3 + cmn xzr, x4 + cmn x5, xzr +// CHECK: cmn x0, x3 // encoding: [0x1f,0x00,0x03,0xab] +// CHECK: cmn xzr, x4 // encoding: [0xff,0x03,0x04,0xab] +// CHECK: cmn x5, xzr // encoding: [0xbf,0x00,0x1f,0xab] + + cmn x6, x7, lsl #0 + cmn x8, x9, lsl #15 + cmn x10, x11, lsl #63 +// CHECK: cmn x6, x7 // encoding: [0xdf,0x00,0x07,0xab] +// CHECK: cmn x8, x9, lsl #15 // encoding: [0x1f,0x3d,0x09,0xab] +// CHECK: cmn x10, x11, lsl #63 // encoding: [0x5f,0xfd,0x0b,0xab] + + cmn x12, x13, lsr #0 + cmn x14, x15, lsr #41 + cmn x16, x17, lsr #63 +// CHECK: cmn x12, x13, lsr #0 // encoding: [0x9f,0x01,0x4d,0xab] +// CHECK: cmn x14, x15, lsr #41 // encoding: [0xdf,0xa5,0x4f,0xab] +// CHECK: cmn x16, x17, lsr #63 // encoding: [0x1f,0xfe,0x51,0xab] + + cmn x18, x19, asr #0 + cmn x20, x21, asr #55 + cmn x22, x23, asr #63 +// CHECK: cmn x18, x19, asr #0 // encoding: [0x5f,0x02,0x93,0xab] +// CHECK: cmn x20, x21, asr #55 // encoding: [0x9f,0xde,0x95,0xab] +// CHECK: cmn x22, x23, asr #63 // encoding: [0xdf,0xfe,0x97,0xab] + + cmp w0, w3 + cmp wzr, w4 + cmp w5, wzr +// CHECK: cmp w0, w3 // encoding: [0x1f,0x00,0x03,0x6b] +// CHECK: cmp wzr, w4 // encoding: [0xff,0x03,0x04,0x6b] +// CHECK: cmp w5, wzr // encoding: [0xbf,0x00,0x1f,0x6b] + + cmp w6, w7, lsl #0 + cmp w8, w9, lsl #15 + cmp w10, w11, lsl #31 +// CHECK: cmp w6, w7 // encoding: [0xdf,0x00,0x07,0x6b] +// CHECK: cmp w8, w9, lsl #15 // encoding: [0x1f,0x3d,0x09,0x6b] +// CHECK: cmp w10, w11, lsl #31 // encoding: [0x5f,0x7d,0x0b,0x6b] + + cmp w12, w13, lsr #0 + cmp w14, w15, lsr #21 + cmp w16, w17, lsr #31 +// CHECK: cmp w12, w13, lsr #0 // encoding: [0x9f,0x01,0x4d,0x6b] +// CHECK: cmp w14, w15, lsr #21 // encoding: [0xdf,0x55,0x4f,0x6b] +// CHECK: cmp w16, w17, lsr #31 // encoding: [0x1f,0x7e,0x51,0x6b] + + cmp w18, w19, asr #0 + cmp w20, w21, asr #22 + cmp w22, w23, asr #31 +// CHECK: cmp w18, w19, asr #0 // encoding: [0x5f,0x02,0x93,0x6b] +// CHECK: cmp w20, w21, asr #22 // encoding: [0x9f,0x5a,0x95,0x6b] +// CHECK: cmp w22, w23, asr #31 // encoding: [0xdf,0x7e,0x97,0x6b] + + cmp x0, x3 + cmp xzr, x4 + cmp x5, xzr +// CHECK: cmp x0, x3 // encoding: [0x1f,0x00,0x03,0xeb] +// CHECK: cmp xzr, x4 // encoding: [0xff,0x03,0x04,0xeb] +// CHECK: cmp x5, xzr // encoding: [0xbf,0x00,0x1f,0xeb] + + cmp x6, x7, lsl #0 + cmp x8, x9, lsl #15 + cmp x10, x11, lsl #63 +// CHECK: cmp x6, x7 // encoding: [0xdf,0x00,0x07,0xeb] +// CHECK: cmp x8, x9, lsl #15 // encoding: [0x1f,0x3d,0x09,0xeb] +// CHECK: cmp x10, x11, lsl #63 // encoding: [0x5f,0xfd,0x0b,0xeb] + + cmp x12, x13, lsr #0 + cmp x14, x15, lsr #41 + cmp x16, x17, lsr #63 +// CHECK: cmp x12, x13, lsr #0 // encoding: [0x9f,0x01,0x4d,0xeb] +// CHECK: cmp x14, x15, lsr #41 // encoding: [0xdf,0xa5,0x4f,0xeb] +// CHECK: cmp x16, x17, lsr #63 // encoding: [0x1f,0xfe,0x51,0xeb] + + cmp x18, x19, asr #0 + cmp x20, x21, asr #55 + cmp x22, x23, asr #63 +// CHECK: cmp x18, x19, asr #0 // encoding: [0x5f,0x02,0x93,0xeb] +// CHECK: cmp x20, x21, asr #55 // encoding: [0x9f,0xde,0x95,0xeb] +// CHECK: cmp x22, x23, asr #63 // encoding: [0xdf,0xfe,0x97,0xeb] + + neg w29, w30 + neg w30, wzr + neg wzr, w0 +// CHECK: sub w29, wzr, w30 // encoding: [0xfd,0x03,0x1e,0x4b] +// CHECK: sub w30, wzr, wzr // encoding: [0xfe,0x03,0x1f,0x4b] +// CHECK: sub wzr, wzr, w0 // encoding: [0xff,0x03,0x00,0x4b] + + neg w28, w27, lsl #0 + neg w26, w25, lsl #29 + neg w24, w23, lsl #31 +// CHECK: sub w28, wzr, w27 // encoding: [0xfc,0x03,0x1b,0x4b] +// CHECK: sub w26, wzr, w25, lsl #29 // encoding: [0xfa,0x77,0x19,0x4b] +// CHECK: sub w24, wzr, w23, lsl #31 // encoding: [0xf8,0x7f,0x17,0x4b] + + neg w22, w21, lsr #0 + neg w20, w19, lsr #1 + neg w18, w17, lsr #31 +// CHECK: sub w22, wzr, w21, lsr #0 // encoding: [0xf6,0x03,0x55,0x4b] +// CHECK: sub w20, wzr, w19, lsr #1 // encoding: [0xf4,0x07,0x53,0x4b] +// CHECK: sub w18, wzr, w17, lsr #31 // encoding: [0xf2,0x7f,0x51,0x4b] + + neg w16, w15, asr #0 + neg w14, w13, asr #12 + neg w12, w11, asr #31 +// CHECK: sub w16, wzr, w15, asr #0 // encoding: [0xf0,0x03,0x8f,0x4b] +// CHECK: sub w14, wzr, w13, asr #12 // encoding: [0xee,0x33,0x8d,0x4b] +// CHECK: sub w12, wzr, w11, asr #31 // encoding: [0xec,0x7f,0x8b,0x4b] + + neg x29, x30 + neg x30, xzr + neg xzr, x0 +// CHECK: sub x29, xzr, x30 // encoding: [0xfd,0x03,0x1e,0xcb] +// CHECK: sub x30, xzr, xzr // encoding: [0xfe,0x03,0x1f,0xcb] +// CHECK: sub xzr, xzr, x0 // encoding: [0xff,0x03,0x00,0xcb] + + neg x28, x27, lsl #0 + neg x26, x25, lsl #29 + neg x24, x23, lsl #31 +// CHECK: sub x28, xzr, x27 // encoding: [0xfc,0x03,0x1b,0xcb] +// CHECK: sub x26, xzr, x25, lsl #29 // encoding: [0xfa,0x77,0x19,0xcb] +// CHECK: sub x24, xzr, x23, lsl #31 // encoding: [0xf8,0x7f,0x17,0xcb] + + neg x22, x21, lsr #0 + neg x20, x19, lsr #1 + neg x18, x17, lsr #31 +// CHECK: sub x22, xzr, x21, lsr #0 // encoding: [0xf6,0x03,0x55,0xcb] +// CHECK: sub x20, xzr, x19, lsr #1 // encoding: [0xf4,0x07,0x53,0xcb] +// CHECK: sub x18, xzr, x17, lsr #31 // encoding: [0xf2,0x7f,0x51,0xcb] + + neg x16, x15, asr #0 + neg x14, x13, asr #12 + neg x12, x11, asr #31 +// CHECK: sub x16, xzr, x15, asr #0 // encoding: [0xf0,0x03,0x8f,0xcb] +// CHECK: sub x14, xzr, x13, asr #12 // encoding: [0xee,0x33,0x8d,0xcb] +// CHECK: sub x12, xzr, x11, asr #31 // encoding: [0xec,0x7f,0x8b,0xcb] + + negs w29, w30 + negs w30, wzr + negs wzr, w0 +// CHECK: subs w29, wzr, w30 // encoding: [0xfd,0x03,0x1e,0x6b] +// CHECK: subs w30, wzr, wzr // encoding: [0xfe,0x03,0x1f,0x6b] +// CHECK: subs wzr, wzr, w0 // encoding: [0xff,0x03,0x00,0x6b] + + negs w28, w27, lsl #0 + negs w26, w25, lsl #29 + negs w24, w23, lsl #31 +// CHECK: subs w28, wzr, w27 // encoding: [0xfc,0x03,0x1b,0x6b] +// CHECK: subs w26, wzr, w25, lsl #29 // encoding: [0xfa,0x77,0x19,0x6b] +// CHECK: subs w24, wzr, w23, lsl #31 // encoding: [0xf8,0x7f,0x17,0x6b] + + negs w22, w21, lsr #0 + negs w20, w19, lsr #1 + negs w18, w17, lsr #31 +// CHECK: subs w22, wzr, w21, lsr #0 // encoding: [0xf6,0x03,0x55,0x6b] +// CHECK: subs w20, wzr, w19, lsr #1 // encoding: [0xf4,0x07,0x53,0x6b] +// CHECK: subs w18, wzr, w17, lsr #31 // encoding: [0xf2,0x7f,0x51,0x6b] + + negs w16, w15, asr #0 + negs w14, w13, asr #12 + negs w12, w11, asr #31 +// CHECK: subs w16, wzr, w15, asr #0 // encoding: [0xf0,0x03,0x8f,0x6b] +// CHECK: subs w14, wzr, w13, asr #12 // encoding: [0xee,0x33,0x8d,0x6b] +// CHECK: subs w12, wzr, w11, asr #31 // encoding: [0xec,0x7f,0x8b,0x6b] + + negs x29, x30 + negs x30, xzr + negs xzr, x0 +// CHECK: subs x29, xzr, x30 // encoding: [0xfd,0x03,0x1e,0xeb] +// CHECK: subs x30, xzr, xzr // encoding: [0xfe,0x03,0x1f,0xeb] +// CHECK: subs xzr, xzr, x0 // encoding: [0xff,0x03,0x00,0xeb] + + negs x28, x27, lsl #0 + negs x26, x25, lsl #29 + negs x24, x23, lsl #31 +// CHECK: subs x28, xzr, x27 // encoding: [0xfc,0x03,0x1b,0xeb] +// CHECK: subs x26, xzr, x25, lsl #29 // encoding: [0xfa,0x77,0x19,0xeb] +// CHECK: subs x24, xzr, x23, lsl #31 // encoding: [0xf8,0x7f,0x17,0xeb] + + negs x22, x21, lsr #0 + negs x20, x19, lsr #1 + negs x18, x17, lsr #31 +// CHECK: subs x22, xzr, x21, lsr #0 // encoding: [0xf6,0x03,0x55,0xeb] +// CHECK: subs x20, xzr, x19, lsr #1 // encoding: [0xf4,0x07,0x53,0xeb] +// CHECK: subs x18, xzr, x17, lsr #31 // encoding: [0xf2,0x7f,0x51,0xeb] + + negs x16, x15, asr #0 + negs x14, x13, asr #12 + negs x12, x11, asr #31 +// CHECK: subs x16, xzr, x15, asr #0 // encoding: [0xf0,0x03,0x8f,0xeb] +// CHECK: subs x14, xzr, x13, asr #12 // encoding: [0xee,0x33,0x8d,0xeb] +// CHECK: subs x12, xzr, x11, asr #31 // encoding: [0xec,0x7f,0x8b,0xeb] + +//------------------------------------------------------------------------------ +// Add-sub (shifted register) +//------------------------------------------------------------------------------ + adc w29, w27, w25 + adc wzr, w3, w4 + adc w9, wzr, w10 + adc w20, w0, wzr +// CHECK: adc w29, w27, w25 // encoding: [0x7d,0x03,0x19,0x1a] +// CHECK: adc wzr, w3, w4 // encoding: [0x7f,0x00,0x04,0x1a] +// CHECK: adc w9, wzr, w10 // encoding: [0xe9,0x03,0x0a,0x1a] +// CHECK: adc w20, w0, wzr // encoding: [0x14,0x00,0x1f,0x1a] + + adc x29, x27, x25 + adc xzr, x3, x4 + adc x9, xzr, x10 + adc x20, x0, xzr +// CHECK: adc x29, x27, x25 // encoding: [0x7d,0x03,0x19,0x9a] +// CHECK: adc xzr, x3, x4 // encoding: [0x7f,0x00,0x04,0x9a] +// CHECK: adc x9, xzr, x10 // encoding: [0xe9,0x03,0x0a,0x9a] +// CHECK: adc x20, x0, xzr // encoding: [0x14,0x00,0x1f,0x9a] + + adcs w29, w27, w25 + adcs wzr, w3, w4 + adcs w9, wzr, w10 + adcs w20, w0, wzr +// CHECK: adcs w29, w27, w25 // encoding: [0x7d,0x03,0x19,0x3a] +// CHECK: adcs wzr, w3, w4 // encoding: [0x7f,0x00,0x04,0x3a] +// CHECK: adcs w9, wzr, w10 // encoding: [0xe9,0x03,0x0a,0x3a] +// CHECK: adcs w20, w0, wzr // encoding: [0x14,0x00,0x1f,0x3a] + + adcs x29, x27, x25 + adcs xzr, x3, x4 + adcs x9, xzr, x10 + adcs x20, x0, xzr +// CHECK: adcs x29, x27, x25 // encoding: [0x7d,0x03,0x19,0xba] +// CHECK: adcs xzr, x3, x4 // encoding: [0x7f,0x00,0x04,0xba] +// CHECK: adcs x9, xzr, x10 // encoding: [0xe9,0x03,0x0a,0xba] +// CHECK: adcs x20, x0, xzr // encoding: [0x14,0x00,0x1f,0xba] + + sbc w29, w27, w25 + sbc wzr, w3, w4 + sbc w9, wzr, w10 + sbc w20, w0, wzr +// CHECK: sbc w29, w27, w25 // encoding: [0x7d,0x03,0x19,0x5a] +// CHECK: sbc wzr, w3, w4 // encoding: [0x7f,0x00,0x04,0x5a] +// CHECK: ngc w9, w10 // encoding: [0xe9,0x03,0x0a,0x5a] +// CHECK: sbc w20, w0, wzr // encoding: [0x14,0x00,0x1f,0x5a] + + sbc x29, x27, x25 + sbc xzr, x3, x4 + sbc x9, xzr, x10 + sbc x20, x0, xzr +// CHECK: sbc x29, x27, x25 // encoding: [0x7d,0x03,0x19,0xda] +// CHECK: sbc xzr, x3, x4 // encoding: [0x7f,0x00,0x04,0xda] +// CHECK: ngc x9, x10 // encoding: [0xe9,0x03,0x0a,0xda] +// CHECK: sbc x20, x0, xzr // encoding: [0x14,0x00,0x1f,0xda] + + sbcs w29, w27, w25 + sbcs wzr, w3, w4 + sbcs w9, wzr, w10 + sbcs w20, w0, wzr +// CHECK: sbcs w29, w27, w25 // encoding: [0x7d,0x03,0x19,0x7a] +// CHECK: sbcs wzr, w3, w4 // encoding: [0x7f,0x00,0x04,0x7a] +// CHECK: ngcs w9, w10 // encoding: [0xe9,0x03,0x0a,0x7a] +// CHECK: sbcs w20, w0, wzr // encoding: [0x14,0x00,0x1f,0x7a] + + sbcs x29, x27, x25 + sbcs xzr, x3, x4 + sbcs x9, xzr, x10 + sbcs x20, x0, xzr +// CHECK: sbcs x29, x27, x25 // encoding: [0x7d,0x03,0x19,0xfa] +// CHECK: sbcs xzr, x3, x4 // encoding: [0x7f,0x00,0x04,0xfa] +// CHECK: ngcs x9, x10 // encoding: [0xe9,0x03,0x0a,0xfa] +// CHECK: sbcs x20, x0, xzr // encoding: [0x14,0x00,0x1f,0xfa] + + ngc w3, w12 + ngc wzr, w9 + ngc w23, wzr +// CHECK: ngc w3, w12 // encoding: [0xe3,0x03,0x0c,0x5a] +// CHECK: ngc wzr, w9 // encoding: [0xff,0x03,0x09,0x5a] +// CHECK: ngc w23, wzr // encoding: [0xf7,0x03,0x1f,0x5a] + + ngc x29, x30 + ngc xzr, x0 + ngc x0, xzr +// CHECK: ngc x29, x30 // encoding: [0xfd,0x03,0x1e,0xda] +// CHECK: ngc xzr, x0 // encoding: [0xff,0x03,0x00,0xda] +// CHECK: ngc x0, xzr // encoding: [0xe0,0x03,0x1f,0xda] + + ngcs w3, w12 + ngcs wzr, w9 + ngcs w23, wzr +// CHECK: ngcs w3, w12 // encoding: [0xe3,0x03,0x0c,0x7a] +// CHECK: ngcs wzr, w9 // encoding: [0xff,0x03,0x09,0x7a] +// CHECK: ngcs w23, wzr // encoding: [0xf7,0x03,0x1f,0x7a] + + ngcs x29, x30 + ngcs xzr, x0 + ngcs x0, xzr +// CHECK: ngcs x29, x30 // encoding: [0xfd,0x03,0x1e,0xfa] +// CHECK: ngcs xzr, x0 // encoding: [0xff,0x03,0x00,0xfa] +// CHECK: ngcs x0, xzr // encoding: [0xe0,0x03,0x1f,0xfa] + +//------------------------------------------------------------------------------ +// Bitfield +//------------------------------------------------------------------------------ + + sbfm x1, x2, #3, #4 + sbfm x3, x4, #63, #63 + sbfm wzr, wzr, #31, #31 + sbfm w12, w9, #0, #0 +// CHECK: sbfm x1, x2, #3, #4 // encoding: [0x41,0x10,0x43,0x93] +// CHECK: sbfm x3, x4, #63, #63 // encoding: [0x83,0xfc,0x7f,0x93] +// CHECK: sbfm wzr, wzr, #31, #31 // encoding: [0xff,0x7f,0x1f,0x13] +// CHECK: sbfm w12, w9, #0, #0 // encoding: [0x2c,0x01,0x00,0x13] + + ubfm x4, x5, #12, #10 + ubfm xzr, x4, #0, #0 + ubfm x4, xzr, #63, #5 + ubfm x5, x6, #12, #63 +// CHECK: ubfm x4, x5, #12, #10 // encoding: [0xa4,0x28,0x4c,0xd3] +// CHECK: ubfm xzr, x4, #0, #0 // encoding: [0x9f,0x00,0x40,0xd3] +// CHECK: ubfm x4, xzr, #63, #5 // encoding: [0xe4,0x17,0x7f,0xd3] +// CHECK: ubfm x5, x6, #12, #63 // encoding: [0xc5,0xfc,0x4c,0xd3] + + bfm x4, x5, #12, #10 + bfm xzr, x4, #0, #0 + bfm x4, xzr, #63, #5 + bfm x5, x6, #12, #63 +// CHECK: bfm x4, x5, #12, #10 // encoding: [0xa4,0x28,0x4c,0xb3] +// CHECK: bfm xzr, x4, #0, #0 // encoding: [0x9f,0x00,0x40,0xb3] +// CHECK: bfm x4, xzr, #63, #5 // encoding: [0xe4,0x17,0x7f,0xb3] +// CHECK: bfm x5, x6, #12, #63 // encoding: [0xc5,0xfc,0x4c,0xb3] + + sxtb w1, w2 + sxtb xzr, w3 + sxth w9, w10 + sxth x0, w1 + sxtw x3, w30 +// CHECK: sxtb w1, w2 // encoding: [0x41,0x1c,0x00,0x13] +// CHECK: sxtb xzr, w3 // encoding: [0x7f,0x1c,0x40,0x93] +// CHECK: sxth w9, w10 // encoding: [0x49,0x3d,0x00,0x13] +// CHECK: sxth x0, w1 // encoding: [0x20,0x3c,0x40,0x93] +// CHECK: sxtw x3, w30 // encoding: [0xc3,0x7f,0x40,0x93] + + uxtb w1, w2 + uxtb xzr, w3 + uxth w9, w10 + uxth x0, w1 +// CHECK: uxtb w1, w2 // encoding: [0x41,0x1c,0x00,0x53] +// CHECK: uxtb xzr, w3 // encoding: [0x7f,0x1c,0x00,0x53] +// CHECK: uxth w9, w10 // encoding: [0x49,0x3d,0x00,0x53] +// CHECK: uxth x0, w1 // encoding: [0x20,0x3c,0x00,0x53] + + asr w3, w2, #0 + asr w9, w10, #31 + asr x20, x21, #63 + asr w1, wzr, #3 +// CHECK: asr w3, w2, #0 // encoding: [0x43,0x7c,0x00,0x13] +// CHECK: asr w9, w10, #31 // encoding: [0x49,0x7d,0x1f,0x13] +// CHECK: asr x20, x21, #63 // encoding: [0xb4,0xfe,0x7f,0x93] +// CHECK: asr w1, wzr, #3 // encoding: [0xe1,0x7f,0x03,0x13] + + lsr w3, w2, #0 + lsr w9, w10, #31 + lsr x20, x21, #63 + lsr wzr, wzr, #3 +// CHECK: lsr w3, w2, #0 // encoding: [0x43,0x7c,0x00,0x53] +// CHECK: lsr w9, w10, #31 // encoding: [0x49,0x7d,0x1f,0x53] +// CHECK: lsr x20, x21, #63 // encoding: [0xb4,0xfe,0x7f,0xd3] +// CHECK: lsr wzr, wzr, #3 // encoding: [0xff,0x7f,0x03,0x53] + + lsl w3, w2, #0 + lsl w9, w10, #31 + lsl x20, x21, #63 + lsl w1, wzr, #3 +// CHECK: lsl w3, w2, #0 // encoding: [0x43,0x7c,0x00,0x53] +// CHECK: lsl w9, w10, #31 // encoding: [0x49,0x01,0x01,0x53] +// CHECK: lsl x20, x21, #63 // encoding: [0xb4,0x02,0x41,0xd3] +// CHECK: lsl w1, wzr, #3 // encoding: [0xe1,0x73,0x1d,0x53] + + sbfiz w9, w10, #0, #1 + sbfiz x2, x3, #63, #1 + sbfiz x19, x20, #0, #64 + sbfiz x9, x10, #5, #59 + sbfiz w9, w10, #0, #32 + sbfiz w11, w12, #31, #1 + sbfiz w13, w14, #29, #3 + sbfiz xzr, xzr, #10, #11 +// CHECK: sbfiz w9, w10, #0, #1 // encoding: [0x49,0x01,0x00,0x13] +// CHECK: sbfiz x2, x3, #63, #1 // encoding: [0x62,0x00,0x41,0x93] +// CHECK: sbfiz x19, x20, #0, #64 // encoding: [0x93,0xfe,0x40,0x93] +// CHECK: sbfiz x9, x10, #5, #59 // encoding: [0x49,0xe9,0x7b,0x93] +// CHECK: sbfiz w9, w10, #0, #32 // encoding: [0x49,0x7d,0x00,0x13] +// CHECK: sbfiz w11, w12, #31, #1 // encoding: [0x8b,0x01,0x01,0x13] +// CHECK: sbfiz w13, w14, #29, #3 // encoding: [0xcd,0x09,0x03,0x13] +// CHECK: sbfiz xzr, xzr, #10, #11 // encoding: [0xff,0x2b,0x76,0x93] + + sbfx w9, w10, #0, #1 + sbfx x2, x3, #63, #1 + sbfx x19, x20, #0, #64 + sbfx x9, x10, #5, #59 + sbfx w9, w10, #0, #32 + sbfx w11, w12, #31, #1 + sbfx w13, w14, #29, #3 + sbfx xzr, xzr, #10, #11 +// CHECK: sbfx w9, w10, #0, #1 // encoding: [0x49,0x01,0x00,0x13] +// CHECK: sbfx x2, x3, #63, #1 // encoding: [0x62,0xfc,0x7f,0x93] +// CHECK: sbfx x19, x20, #0, #64 // encoding: [0x93,0xfe,0x40,0x93] +// CHECK: sbfx x9, x10, #5, #59 // encoding: [0x49,0xfd,0x45,0x93] +// CHECK: sbfx w9, w10, #0, #32 // encoding: [0x49,0x7d,0x00,0x13] +// CHECK: sbfx w11, w12, #31, #1 // encoding: [0x8b,0x7d,0x1f,0x13] +// CHECK: sbfx w13, w14, #29, #3 // encoding: [0xcd,0x7d,0x1d,0x13] +// CHECK: sbfx xzr, xzr, #10, #11 // encoding: [0xff,0x53,0x4a,0x93] + + bfi w9, w10, #0, #1 + bfi x2, x3, #63, #1 + bfi x19, x20, #0, #64 + bfi x9, x10, #5, #59 + bfi w9, w10, #0, #32 + bfi w11, w12, #31, #1 + bfi w13, w14, #29, #3 + bfi xzr, xzr, #10, #11 +// CHECK: bfi w9, w10, #0, #1 // encoding: [0x49,0x01,0x00,0x33] +// CHECK: bfi x2, x3, #63, #1 // encoding: [0x62,0x00,0x41,0xb3] +// CHECK: bfi x19, x20, #0, #64 // encoding: [0x93,0xfe,0x40,0xb3] +// CHECK: bfi x9, x10, #5, #59 // encoding: [0x49,0xe9,0x7b,0xb3] +// CHECK: bfi w9, w10, #0, #32 // encoding: [0x49,0x7d,0x00,0x33] +// CHECK: bfi w11, w12, #31, #1 // encoding: [0x8b,0x01,0x01,0x33] +// CHECK: bfi w13, w14, #29, #3 // encoding: [0xcd,0x09,0x03,0x33] +// CHECK: bfi xzr, xzr, #10, #11 // encoding: [0xff,0x2b,0x76,0xb3] + + bfxil w9, w10, #0, #1 + bfxil x2, x3, #63, #1 + bfxil x19, x20, #0, #64 + bfxil x9, x10, #5, #59 + bfxil w9, w10, #0, #32 + bfxil w11, w12, #31, #1 + bfxil w13, w14, #29, #3 + bfxil xzr, xzr, #10, #11 +// CHECK: bfxil w9, w10, #0, #1 // encoding: [0x49,0x01,0x00,0x33] +// CHECK: bfxil x2, x3, #63, #1 // encoding: [0x62,0xfc,0x7f,0xb3] +// CHECK: bfxil x19, x20, #0, #64 // encoding: [0x93,0xfe,0x40,0xb3] +// CHECK: bfxil x9, x10, #5, #59 // encoding: [0x49,0xfd,0x45,0xb3] +// CHECK: bfxil w9, w10, #0, #32 // encoding: [0x49,0x7d,0x00,0x33] +// CHECK: bfxil w11, w12, #31, #1 // encoding: [0x8b,0x7d,0x1f,0x33] +// CHECK: bfxil w13, w14, #29, #3 // encoding: [0xcd,0x7d,0x1d,0x33] +// CHECK: bfxil xzr, xzr, #10, #11 // encoding: [0xff,0x53,0x4a,0xb3] + + ubfiz w9, w10, #0, #1 + ubfiz x2, x3, #63, #1 + ubfiz x19, x20, #0, #64 + ubfiz x9, x10, #5, #59 + ubfiz w9, w10, #0, #32 + ubfiz w11, w12, #31, #1 + ubfiz w13, w14, #29, #3 + ubfiz xzr, xzr, #10, #11 +// CHECK: ubfiz w9, w10, #0, #1 // encoding: [0x49,0x01,0x00,0x53] +// CHECK: ubfiz x2, x3, #63, #1 // encoding: [0x62,0x00,0x41,0xd3] +// CHECK: ubfiz x19, x20, #0, #64 // encoding: [0x93,0xfe,0x40,0xd3] +// CHECK: ubfiz x9, x10, #5, #59 // encoding: [0x49,0xe9,0x7b,0xd3] +// CHECK: ubfiz w9, w10, #0, #32 // encoding: [0x49,0x7d,0x00,0x53] +// CHECK: ubfiz w11, w12, #31, #1 // encoding: [0x8b,0x01,0x01,0x53] +// CHECK: ubfiz w13, w14, #29, #3 // encoding: [0xcd,0x09,0x03,0x53] +// CHECK: ubfiz xzr, xzr, #10, #11 // encoding: [0xff,0x2b,0x76,0xd3] + + ubfx w9, w10, #0, #1 + ubfx x2, x3, #63, #1 + ubfx x19, x20, #0, #64 + ubfx x9, x10, #5, #59 + ubfx w9, w10, #0, #32 + ubfx w11, w12, #31, #1 + ubfx w13, w14, #29, #3 + ubfx xzr, xzr, #10, #11 +// CHECK: ubfx w9, w10, #0, #1 // encoding: [0x49,0x01,0x00,0x53] +// CHECK: ubfx x2, x3, #63, #1 // encoding: [0x62,0xfc,0x7f,0xd3] +// CHECK: ubfx x19, x20, #0, #64 // encoding: [0x93,0xfe,0x40,0xd3] +// CHECK: ubfx x9, x10, #5, #59 // encoding: [0x49,0xfd,0x45,0xd3] +// CHECK: ubfx w9, w10, #0, #32 // encoding: [0x49,0x7d,0x00,0x53] +// CHECK: ubfx w11, w12, #31, #1 // encoding: [0x8b,0x7d,0x1f,0x53] +// CHECK: ubfx w13, w14, #29, #3 // encoding: [0xcd,0x7d,0x1d,0x53] +// CHECK: ubfx xzr, xzr, #10, #11 // encoding: [0xff,0x53,0x4a,0xd3] + +//------------------------------------------------------------------------------ +// Compare & branch (immediate) +//------------------------------------------------------------------------------ + + cbz w5, lbl + cbz x5, lbl + cbnz x2, lbl + cbnz x26, lbl +// CHECK: cbz w5, lbl // encoding: [0x05'A',A,A,0x34'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: cbz x5, lbl // encoding: [0x05'A',A,A,0xb4'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: cbnz x2, lbl // encoding: [0x02'A',A,A,0xb5'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: cbnz x26, lbl // encoding: [0x1a'A',A,A,0xb5'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr + + cbz wzr, lbl + cbnz xzr, lbl +// CHECK: cbz wzr, lbl // encoding: [0x1f'A',A,A,0x34'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: cbnz xzr, lbl // encoding: [0x1f'A',A,A,0xb5'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr + + cbz w5, #0 + cbnz x3, #-4 + cbz w20, #1048572 + cbnz xzr, #-1048576 +// CHECK: cbz w5, #0 // encoding: [0x05,0x00,0x00,0x34] +// CHECK: cbnz x3, #-4 // encoding: [0xe3,0xff,0xff,0xb5] +// CHECK: cbz w20, #1048572 // encoding: [0xf4,0xff,0x7f,0x34] +// CHECK: cbnz xzr, #-1048576 // encoding: [0x1f,0x00,0x80,0xb5] + +//------------------------------------------------------------------------------ +// Conditional branch (immediate) +//------------------------------------------------------------------------------ + + b.eq lbl + b.ne lbl + b.cs lbl + b.hs lbl + b.lo lbl + b.cc lbl + b.mi lbl + b.pl lbl + b.vs lbl + b.vc lbl + b.hi lbl + b.ls lbl + b.ge lbl + b.lt lbl + b.gt lbl + b.le lbl + b.al lbl +// CHECK: b.eq lbl // encoding: [A,A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.ne lbl // encoding: [0x01'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.hs lbl // encoding: [0x02'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.hs lbl // encoding: [0x02'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.lo lbl // encoding: [0x03'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.lo lbl // encoding: [0x03'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.mi lbl // encoding: [0x04'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.pl lbl // encoding: [0x05'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.vs lbl // encoding: [0x06'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.vc lbl // encoding: [0x07'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.hi lbl // encoding: [0x08'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.ls lbl // encoding: [0x09'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.ge lbl // encoding: [0x0a'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.lt lbl // encoding: [0x0b'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.gt lbl // encoding: [0x0c'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.le lbl // encoding: [0x0d'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr +// CHECK: b.al lbl // encoding: [0x0e'A',A,A,0x54'A'] +// CHECK: // fixup A - offset: 0, value: lbl, kind: fixup_a64_condbr + + b.eq #0 + b.lt #-4 + b.cc #1048572 +// CHECK: b.eq #0 // encoding: [0x00,0x00,0x00,0x54] +// CHECK: b.lt #-4 // encoding: [0xeb,0xff,0xff,0x54] +// CHECK: b.lo #1048572 // encoding: [0xe3,0xff,0x7f,0x54] + +//------------------------------------------------------------------------------ +// Conditional compare (immediate) +//------------------------------------------------------------------------------ + + ccmp w1, #31, #0, eq + ccmp w3, #0, #15, hs + ccmp wzr, #15, #13, cs +// CHECK: ccmp w1, #31, #0, eq // encoding: [0x20,0x08,0x5f,0x7a] +// CHECK: ccmp w3, #0, #15, hs // encoding: [0x6f,0x28,0x40,0x7a] +// CHECK: ccmp wzr, #15, #13, hs // encoding: [0xed,0x2b,0x4f,0x7a] + + ccmp x9, #31, #0, le + ccmp x3, #0, #15, gt + ccmp xzr, #5, #7, ne +// CHECK: ccmp x9, #31, #0, le // encoding: [0x20,0xd9,0x5f,0xfa] +// CHECK: ccmp x3, #0, #15, gt // encoding: [0x6f,0xc8,0x40,0xfa] +// CHECK: ccmp xzr, #5, #7, ne // encoding: [0xe7,0x1b,0x45,0xfa] + + ccmn w1, #31, #0, eq + ccmn w3, #0, #15, hs + ccmn wzr, #15, #13, cs +// CHECK: ccmn w1, #31, #0, eq // encoding: [0x20,0x08,0x5f,0x3a] +// CHECK: ccmn w3, #0, #15, hs // encoding: [0x6f,0x28,0x40,0x3a] +// CHECK: ccmn wzr, #15, #13, hs // encoding: [0xed,0x2b,0x4f,0x3a] + + ccmn x9, #31, #0, le + ccmn x3, #0, #15, gt + ccmn xzr, #5, #7, ne +// CHECK: ccmn x9, #31, #0, le // encoding: [0x20,0xd9,0x5f,0xba] +// CHECK: ccmn x3, #0, #15, gt // encoding: [0x6f,0xc8,0x40,0xba] +// CHECK: ccmn xzr, #5, #7, ne // encoding: [0xe7,0x1b,0x45,0xba] + +//------------------------------------------------------------------------------ +// Conditional compare (register) +//------------------------------------------------------------------------------ + + ccmp w1, wzr, #0, eq + ccmp w3, w0, #15, hs + ccmp wzr, w15, #13, cs +// CHECK: ccmp w1, wzr, #0, eq // encoding: [0x20,0x00,0x5f,0x7a] +// CHECK: ccmp w3, w0, #15, hs // encoding: [0x6f,0x20,0x40,0x7a] +// CHECK: ccmp wzr, w15, #13, hs // encoding: [0xed,0x23,0x4f,0x7a] + + ccmp x9, xzr, #0, le + ccmp x3, x0, #15, gt + ccmp xzr, x5, #7, ne +// CHECK: ccmp x9, xzr, #0, le // encoding: [0x20,0xd1,0x5f,0xfa] +// CHECK: ccmp x3, x0, #15, gt // encoding: [0x6f,0xc0,0x40,0xfa] +// CHECK: ccmp xzr, x5, #7, ne // encoding: [0xe7,0x13,0x45,0xfa] + + ccmn w1, wzr, #0, eq + ccmn w3, w0, #15, hs + ccmn wzr, w15, #13, cs +// CHECK: ccmn w1, wzr, #0, eq // encoding: [0x20,0x00,0x5f,0x3a] +// CHECK: ccmn w3, w0, #15, hs // encoding: [0x6f,0x20,0x40,0x3a] +// CHECK: ccmn wzr, w15, #13, hs // encoding: [0xed,0x23,0x4f,0x3a] + + ccmn x9, xzr, #0, le + ccmn x3, x0, #15, gt + ccmn xzr, x5, #7, ne +// CHECK: ccmn x9, xzr, #0, le // encoding: [0x20,0xd1,0x5f,0xba] +// CHECK: ccmn x3, x0, #15, gt // encoding: [0x6f,0xc0,0x40,0xba] +// CHECK: ccmn xzr, x5, #7, ne // encoding: [0xe7,0x13,0x45,0xba] + +//------------------------------------------------------------------------------ +// Conditional select +//------------------------------------------------------------------------------ + csel w1, w0, w19, ne + csel wzr, w5, w9, eq + csel w9, wzr, w30, gt + csel w1, w28, wzr, mi +// CHECK: csel w1, w0, w19, ne // encoding: [0x01,0x10,0x93,0x1a] +// CHECK: csel wzr, w5, w9, eq // encoding: [0xbf,0x00,0x89,0x1a] +// CHECK: csel w9, wzr, w30, gt // encoding: [0xe9,0xc3,0x9e,0x1a] +// CHECK: csel w1, w28, wzr, mi // encoding: [0x81,0x43,0x9f,0x1a] + + csel x19, x23, x29, lt + csel xzr, x3, x4, ge + csel x5, xzr, x6, cs + csel x7, x8, xzr, cc +// CHECK: csel x19, x23, x29, lt // encoding: [0xf3,0xb2,0x9d,0x9a] +// CHECK: csel xzr, x3, x4, ge // encoding: [0x7f,0xa0,0x84,0x9a] +// CHECK: csel x5, xzr, x6, hs // encoding: [0xe5,0x23,0x86,0x9a] +// CHECK: csel x7, x8, xzr, lo // encoding: [0x07,0x31,0x9f,0x9a] + + csinc w1, w0, w19, ne + csinc wzr, w5, w9, eq + csinc w9, wzr, w30, gt + csinc w1, w28, wzr, mi +// CHECK: csinc w1, w0, w19, ne // encoding: [0x01,0x14,0x93,0x1a] +// CHECK: csinc wzr, w5, w9, eq // encoding: [0xbf,0x04,0x89,0x1a] +// CHECK: csinc w9, wzr, w30, gt // encoding: [0xe9,0xc7,0x9e,0x1a] +// CHECK: csinc w1, w28, wzr, mi // encoding: [0x81,0x47,0x9f,0x1a] + + csinc x19, x23, x29, lt + csinc xzr, x3, x4, ge + csinc x5, xzr, x6, cs + csinc x7, x8, xzr, cc +// CHECK: csinc x19, x23, x29, lt // encoding: [0xf3,0xb6,0x9d,0x9a] +// CHECK: csinc xzr, x3, x4, ge // encoding: [0x7f,0xa4,0x84,0x9a] +// CHECK: csinc x5, xzr, x6, hs // encoding: [0xe5,0x27,0x86,0x9a] +// CHECK: csinc x7, x8, xzr, lo // encoding: [0x07,0x35,0x9f,0x9a] + + csinv w1, w0, w19, ne + csinv wzr, w5, w9, eq + csinv w9, wzr, w30, gt + csinv w1, w28, wzr, mi +// CHECK: csinv w1, w0, w19, ne // encoding: [0x01,0x10,0x93,0x5a] +// CHECK: csinv wzr, w5, w9, eq // encoding: [0xbf,0x00,0x89,0x5a] +// CHECK: csinv w9, wzr, w30, gt // encoding: [0xe9,0xc3,0x9e,0x5a] +// CHECK: csinv w1, w28, wzr, mi // encoding: [0x81,0x43,0x9f,0x5a] + + csinv x19, x23, x29, lt + csinv xzr, x3, x4, ge + csinv x5, xzr, x6, cs + csinv x7, x8, xzr, cc +// CHECK: csinv x19, x23, x29, lt // encoding: [0xf3,0xb2,0x9d,0xda] +// CHECK: csinv xzr, x3, x4, ge // encoding: [0x7f,0xa0,0x84,0xda] +// CHECK: csinv x5, xzr, x6, hs // encoding: [0xe5,0x23,0x86,0xda] +// CHECK: csinv x7, x8, xzr, lo // encoding: [0x07,0x31,0x9f,0xda] + + csneg w1, w0, w19, ne + csneg wzr, w5, w9, eq + csneg w9, wzr, w30, gt + csneg w1, w28, wzr, mi +// CHECK: csneg w1, w0, w19, ne // encoding: [0x01,0x14,0x93,0x5a] +// CHECK: csneg wzr, w5, w9, eq // encoding: [0xbf,0x04,0x89,0x5a] +// CHECK: csneg w9, wzr, w30, gt // encoding: [0xe9,0xc7,0x9e,0x5a] +// CHECK: csneg w1, w28, wzr, mi // encoding: [0x81,0x47,0x9f,0x5a] + + csneg x19, x23, x29, lt + csneg xzr, x3, x4, ge + csneg x5, xzr, x6, cs + csneg x7, x8, xzr, cc +// CHECK: csneg x19, x23, x29, lt // encoding: [0xf3,0xb6,0x9d,0xda] +// CHECK: csneg xzr, x3, x4, ge // encoding: [0x7f,0xa4,0x84,0xda] +// CHECK: csneg x5, xzr, x6, hs // encoding: [0xe5,0x27,0x86,0xda] +// CHECK: csneg x7, x8, xzr, lo // encoding: [0x07,0x35,0x9f,0xda] + + cset w3, eq + cset x9, pl +// CHECK: csinc w3, wzr, wzr, ne // encoding: [0xe3,0x17,0x9f,0x1a] +// CHECK: csinc x9, xzr, xzr, mi // encoding: [0xe9,0x47,0x9f,0x9a] + + csetm w20, ne + csetm x30, ge +// CHECK: csinv w20, wzr, wzr, eq // encoding: [0xf4,0x03,0x9f,0x5a] +// CHECK: csinv x30, xzr, xzr, lt // encoding: [0xfe,0xb3,0x9f,0xda] + + cinc w3, w5, gt + cinc wzr, w4, le + cinc w9, wzr, lt +// CHECK: csinc w3, w5, w5, le // encoding: [0xa3,0xd4,0x85,0x1a] +// CHECK: csinc wzr, w4, w4, gt // encoding: [0x9f,0xc4,0x84,0x1a] +// CHECK: csinc w9, wzr, wzr, ge // encoding: [0xe9,0xa7,0x9f,0x1a] + + cinc x3, x5, gt + cinc xzr, x4, le + cinc x9, xzr, lt +// CHECK: csinc x3, x5, x5, le // encoding: [0xa3,0xd4,0x85,0x9a] +// CHECK: csinc xzr, x4, x4, gt // encoding: [0x9f,0xc4,0x84,0x9a] +// CHECK: csinc x9, xzr, xzr, ge // encoding: [0xe9,0xa7,0x9f,0x9a] + + cinv w3, w5, gt + cinv wzr, w4, le + cinv w9, wzr, lt +// CHECK: csinv w3, w5, w5, le // encoding: [0xa3,0xd0,0x85,0x5a] +// CHECK: csinv wzr, w4, w4, gt // encoding: [0x9f,0xc0,0x84,0x5a] +// CHECK: csinv w9, wzr, wzr, ge // encoding: [0xe9,0xa3,0x9f,0x5a] + + cinv x3, x5, gt + cinv xzr, x4, le + cinv x9, xzr, lt +// CHECK: csinv x3, x5, x5, le // encoding: [0xa3,0xd0,0x85,0xda] +// CHECK: csinv xzr, x4, x4, gt // encoding: [0x9f,0xc0,0x84,0xda] +// CHECK: csinv x9, xzr, xzr, ge // encoding: [0xe9,0xa3,0x9f,0xda] + + cneg w3, w5, gt + cneg wzr, w4, le + cneg w9, wzr, lt +// CHECK: csneg w3, w5, w5, le // encoding: [0xa3,0xd4,0x85,0x5a] +// CHECK: csneg wzr, w4, w4, gt // encoding: [0x9f,0xc4,0x84,0x5a] +// CHECK: csneg w9, wzr, wzr, ge // encoding: [0xe9,0xa7,0x9f,0x5a] + + cneg x3, x5, gt + cneg xzr, x4, le + cneg x9, xzr, lt +// CHECK: csneg x3, x5, x5, le // encoding: [0xa3,0xd4,0x85,0xda] +// CHECK: csneg xzr, x4, x4, gt // encoding: [0x9f,0xc4,0x84,0xda] +// CHECK: csneg x9, xzr, xzr, ge // encoding: [0xe9,0xa7,0x9f,0xda] + +//------------------------------------------------------------------------------ +// Data-processing (1 source) +//------------------------------------------------------------------------------ + + rbit w0, w7 + rbit x18, x3 + rev16 w17, w1 + rev16 x5, x2 + rev w18, w0 + rev32 x20, x1 + rev32 x20, xzr +// CHECK: rbit w0, w7 // encoding: [0xe0,0x00,0xc0,0x5a] +// CHECK: rbit x18, x3 // encoding: [0x72,0x00,0xc0,0xda] +// CHECK: rev16 w17, w1 // encoding: [0x31,0x04,0xc0,0x5a] +// CHECK: rev16 x5, x2 // encoding: [0x45,0x04,0xc0,0xda] +// CHECK: rev w18, w0 // encoding: [0x12,0x08,0xc0,0x5a] +// CHECK: rev32 x20, x1 // encoding: [0x34,0x08,0xc0,0xda] +// CHECK: rev32 x20, xzr // encoding: [0xf4,0x0b,0xc0,0xda] + + rev x22, x2 + rev x18, xzr + rev w7, wzr + clz w24, w3 + clz x26, x4 + cls w3, w5 + cls x20, x5 +// CHECK: rev x22, x2 // encoding: [0x56,0x0c,0xc0,0xda] +// CHECK: rev x18, xzr // encoding: [0xf2,0x0f,0xc0,0xda] +// CHECK: rev w7, wzr // encoding: [0xe7,0x0b,0xc0,0x5a] +// CHECK: clz w24, w3 // encoding: [0x78,0x10,0xc0,0x5a] +// CHECK: clz x26, x4 // encoding: [0x9a,0x10,0xc0,0xda] +// CHECK: cls w3, w5 // encoding: [0xa3,0x14,0xc0,0x5a] +// CHECK: cls x20, x5 // encoding: [0xb4,0x14,0xc0,0xda] + + clz w24, wzr + rev x22, xzr +// CHECK: clz w24, wzr // encoding: [0xf8,0x13,0xc0,0x5a] +// CHECK: rev x22, xzr // encoding: [0xf6,0x0f,0xc0,0xda] + +//------------------------------------------------------------------------------ +// Data-processing (2 source) +//------------------------------------------------------------------------------ + + crc32b w5, w7, w20 + crc32h w28, wzr, w30 + crc32w w0, w1, w2 + crc32x w7, w9, x20 + crc32cb w9, w5, w4 + crc32ch w13, w17, w25 + crc32cw wzr, w3, w5 + crc32cx w18, w16, xzr +// CHECK: crc32b w5, w7, w20 // encoding: [0xe5,0x40,0xd4,0x1a] +// CHECK: crc32h w28, wzr, w30 // encoding: [0xfc,0x47,0xde,0x1a] +// CHECK: crc32w w0, w1, w2 // encoding: [0x20,0x48,0xc2,0x1a] +// CHECK: crc32x w7, w9, x20 // encoding: [0x27,0x4d,0xd4,0x9a] +// CHECK: crc32cb w9, w5, w4 // encoding: [0xa9,0x50,0xc4,0x1a] +// CHECK: crc32ch w13, w17, w25 // encoding: [0x2d,0x56,0xd9,0x1a] +// CHECK: crc32cw wzr, w3, w5 // encoding: [0x7f,0x58,0xc5,0x1a] +// CHECK: crc32cx w18, w16, xzr // encoding: [0x12,0x5e,0xdf,0x9a] + + udiv w0, w7, w10 + udiv x9, x22, x4 + sdiv w12, w21, w0 + sdiv x13, x2, x1 + lslv w11, w12, w13 + lslv x14, x15, x16 + lsrv w17, w18, w19 + lsrv x20, x21, x22 + asrv w23, w24, w25 + asrv x26, x27, x28 + rorv w0, w1, w2 + rorv x3, x4, x5 + + +// CHECK: udiv w0, w7, w10 // encoding: [0xe0,0x08,0xca,0x1a] +// CHECK: udiv x9, x22, x4 // encoding: [0xc9,0x0a,0xc4,0x9a] +// CHECK: sdiv w12, w21, w0 // encoding: [0xac,0x0e,0xc0,0x1a] +// CHECK: sdiv x13, x2, x1 // encoding: [0x4d,0x0c,0xc1,0x9a] +// CHECK: lsl w11, w12, w13 // encoding: [0x8b,0x21,0xcd,0x1a] +// CHECK: lsl x14, x15, x16 // encoding: [0xee,0x21,0xd0,0x9a] +// CHECK: lsr w17, w18, w19 // encoding: [0x51,0x26,0xd3,0x1a] +// CHECK: lsr x20, x21, x22 // encoding: [0xb4,0x26,0xd6,0x9a] +// CHECK: asr w23, w24, w25 // encoding: [0x17,0x2b,0xd9,0x1a] +// CHECK: asr x26, x27, x28 // encoding: [0x7a,0x2b,0xdc,0x9a] +// CHECK: ror w0, w1, w2 // encoding: [0x20,0x2c,0xc2,0x1a] +// CHECK: ror x3, x4, x5 // encoding: [0x83,0x2c,0xc5,0x9a] + + + lsl w6, w7, w8 + lsl x9, x10, x11 + lsr w12, w13, w14 + lsr x15, x16, x17 + asr w18, w19, w20 + asr x21, x22, x23 + ror w24, w25, w26 + ror x27, x28, x29 +// CHECK: lsl w6, w7, w8 // encoding: [0xe6,0x20,0xc8,0x1a] +// CHECK: lsl x9, x10, x11 // encoding: [0x49,0x21,0xcb,0x9a] +// CHECK: lsr w12, w13, w14 // encoding: [0xac,0x25,0xce,0x1a] +// CHECK: lsr x15, x16, x17 // encoding: [0x0f,0x26,0xd1,0x9a] +// CHECK: asr w18, w19, w20 // encoding: [0x72,0x2a,0xd4,0x1a] +// CHECK: asr x21, x22, x23 // encoding: [0xd5,0x2a,0xd7,0x9a] +// CHECK: ror w24, w25, w26 // encoding: [0x38,0x2f,0xda,0x1a] +// CHECK: ror x27, x28, x29 // encoding: [0x9b,0x2f,0xdd,0x9a] + + madd w1, w3, w7, w4 + madd wzr, w0, w9, w11 + madd w13, wzr, w4, w4 + madd w19, w30, wzr, w29 + madd w4, w5, w6, wzr +// CHECK: madd w1, w3, w7, w4 // encoding: [0x61,0x10,0x07,0x1b] +// CHECK: madd wzr, w0, w9, w11 // encoding: [0x1f,0x2c,0x09,0x1b] +// CHECK: madd w13, wzr, w4, w4 // encoding: [0xed,0x13,0x04,0x1b] +// CHECK: madd w19, w30, wzr, w29 // encoding: [0xd3,0x77,0x1f,0x1b] +// CHECK: mul w4, w5, w6 // encoding: [0xa4,0x7c,0x06,0x1b] + + madd x1, x3, x7, x4 + madd xzr, x0, x9, x11 + madd x13, xzr, x4, x4 + madd x19, x30, xzr, x29 + madd x4, x5, x6, xzr +// CHECK: madd x1, x3, x7, x4 // encoding: [0x61,0x10,0x07,0x9b] +// CHECK: madd xzr, x0, x9, x11 // encoding: [0x1f,0x2c,0x09,0x9b] +// CHECK: madd x13, xzr, x4, x4 // encoding: [0xed,0x13,0x04,0x9b] +// CHECK: madd x19, x30, xzr, x29 // encoding: [0xd3,0x77,0x1f,0x9b] +// CHECK: mul x4, x5, x6 // encoding: [0xa4,0x7c,0x06,0x9b] + + msub w1, w3, w7, w4 + msub wzr, w0, w9, w11 + msub w13, wzr, w4, w4 + msub w19, w30, wzr, w29 + msub w4, w5, w6, wzr +// CHECK: msub w1, w3, w7, w4 // encoding: [0x61,0x90,0x07,0x1b] +// CHECK: msub wzr, w0, w9, w11 // encoding: [0x1f,0xac,0x09,0x1b] +// CHECK: msub w13, wzr, w4, w4 // encoding: [0xed,0x93,0x04,0x1b] +// CHECK: msub w19, w30, wzr, w29 // encoding: [0xd3,0xf7,0x1f,0x1b] +// CHECK: mneg w4, w5, w6 // encoding: [0xa4,0xfc,0x06,0x1b] + + msub x1, x3, x7, x4 + msub xzr, x0, x9, x11 + msub x13, xzr, x4, x4 + msub x19, x30, xzr, x29 + msub x4, x5, x6, xzr +// CHECK: msub x1, x3, x7, x4 // encoding: [0x61,0x90,0x07,0x9b] +// CHECK: msub xzr, x0, x9, x11 // encoding: [0x1f,0xac,0x09,0x9b] +// CHECK: msub x13, xzr, x4, x4 // encoding: [0xed,0x93,0x04,0x9b] +// CHECK: msub x19, x30, xzr, x29 // encoding: [0xd3,0xf7,0x1f,0x9b] +// CHECK: mneg x4, x5, x6 // encoding: [0xa4,0xfc,0x06,0x9b] + + smaddl x3, w5, w2, x9 + smaddl xzr, w10, w11, x12 + smaddl x13, wzr, w14, x15 + smaddl x16, w17, wzr, x18 + smaddl x19, w20, w21, xzr +// CHECK: smaddl x3, w5, w2, x9 // encoding: [0xa3,0x24,0x22,0x9b] +// CHECK: smaddl xzr, w10, w11, x12 // encoding: [0x5f,0x31,0x2b,0x9b] +// CHECK: smaddl x13, wzr, w14, x15 // encoding: [0xed,0x3f,0x2e,0x9b] +// CHECK: smaddl x16, w17, wzr, x18 // encoding: [0x30,0x4a,0x3f,0x9b] +// CHECK: smull x19, w20, w21 // encoding: [0x93,0x7e,0x35,0x9b] + + smsubl x3, w5, w2, x9 + smsubl xzr, w10, w11, x12 + smsubl x13, wzr, w14, x15 + smsubl x16, w17, wzr, x18 + smsubl x19, w20, w21, xzr +// CHECK: smsubl x3, w5, w2, x9 // encoding: [0xa3,0xa4,0x22,0x9b] +// CHECK: smsubl xzr, w10, w11, x12 // encoding: [0x5f,0xb1,0x2b,0x9b] +// CHECK: smsubl x13, wzr, w14, x15 // encoding: [0xed,0xbf,0x2e,0x9b] +// CHECK: smsubl x16, w17, wzr, x18 // encoding: [0x30,0xca,0x3f,0x9b] +// CHECK: smnegl x19, w20, w21 // encoding: [0x93,0xfe,0x35,0x9b] + + umaddl x3, w5, w2, x9 + umaddl xzr, w10, w11, x12 + umaddl x13, wzr, w14, x15 + umaddl x16, w17, wzr, x18 + umaddl x19, w20, w21, xzr +// CHECK: umaddl x3, w5, w2, x9 // encoding: [0xa3,0x24,0xa2,0x9b] +// CHECK: umaddl xzr, w10, w11, x12 // encoding: [0x5f,0x31,0xab,0x9b] +// CHECK: umaddl x13, wzr, w14, x15 // encoding: [0xed,0x3f,0xae,0x9b] +// CHECK: umaddl x16, w17, wzr, x18 // encoding: [0x30,0x4a,0xbf,0x9b] +// CHECK: umull x19, w20, w21 // encoding: [0x93,0x7e,0xb5,0x9b] + + + + umsubl x3, w5, w2, x9 + umsubl xzr, w10, w11, x12 + umsubl x13, wzr, w14, x15 + umsubl x16, w17, wzr, x18 + umsubl x19, w20, w21, xzr +// CHECK: umsubl x3, w5, w2, x9 // encoding: [0xa3,0xa4,0xa2,0x9b] +// CHECK: umsubl xzr, w10, w11, x12 // encoding: [0x5f,0xb1,0xab,0x9b] +// CHECK: umsubl x13, wzr, w14, x15 // encoding: [0xed,0xbf,0xae,0x9b] +// CHECK: umsubl x16, w17, wzr, x18 // encoding: [0x30,0xca,0xbf,0x9b] +// CHECK: umnegl x19, w20, w21 // encoding: [0x93,0xfe,0xb5,0x9b] + + smulh x30, x29, x28 + smulh xzr, x27, x26 + smulh x25, xzr, x24 + smulh x23, x22, xzr +// CHECK: smulh x30, x29, x28 // encoding: [0xbe,0x7f,0x5c,0x9b] +// CHECK: smulh xzr, x27, x26 // encoding: [0x7f,0x7f,0x5a,0x9b] +// CHECK: smulh x25, xzr, x24 // encoding: [0xf9,0x7f,0x58,0x9b] +// CHECK: smulh x23, x22, xzr // encoding: [0xd7,0x7e,0x5f,0x9b] + + umulh x30, x29, x28 + umulh xzr, x27, x26 + umulh x25, xzr, x24 + umulh x23, x22, xzr +// CHECK: umulh x30, x29, x28 // encoding: [0xbe,0x7f,0xdc,0x9b] +// CHECK: umulh xzr, x27, x26 // encoding: [0x7f,0x7f,0xda,0x9b] +// CHECK: umulh x25, xzr, x24 // encoding: [0xf9,0x7f,0xd8,0x9b] +// CHECK: umulh x23, x22, xzr // encoding: [0xd7,0x7e,0xdf,0x9b] + + mul w3, w4, w5 + mul wzr, w6, w7 + mul w8, wzr, w9 + mul w10, w11, wzr + + mul x12, x13, x14 + mul xzr, x15, x16 + mul x17, xzr, x18 + mul x19, x20, xzr + + mneg w21, w22, w23 + mneg wzr, w24, w25 + mneg w26, wzr, w27 + mneg w28, w29, wzr + + smull x11, w13, w17 + umull x11, w13, w17 + smnegl x11, w13, w17 + umnegl x11, w13, w17 +// CHECK: mul w3, w4, w5 // encoding: [0x83,0x7c,0x05,0x1b] +// CHECK: mul wzr, w6, w7 // encoding: [0xdf,0x7c,0x07,0x1b] +// CHECK: mul w8, wzr, w9 // encoding: [0xe8,0x7f,0x09,0x1b] +// CHECK: mul w10, w11, wzr // encoding: [0x6a,0x7d,0x1f,0x1b] +// CHECK: mul x12, x13, x14 // encoding: [0xac,0x7d,0x0e,0x9b] +// CHECK: mul xzr, x15, x16 // encoding: [0xff,0x7d,0x10,0x9b] +// CHECK: mul x17, xzr, x18 // encoding: [0xf1,0x7f,0x12,0x9b] +// CHECK: mul x19, x20, xzr // encoding: [0x93,0x7e,0x1f,0x9b] +// CHECK: mneg w21, w22, w23 // encoding: [0xd5,0xfe,0x17,0x1b] +// CHECK: mneg wzr, w24, w25 // encoding: [0x1f,0xff,0x19,0x1b] +// CHECK: mneg w26, wzr, w27 // encoding: [0xfa,0xff,0x1b,0x1b] +// CHECK: mneg w28, w29, wzr // encoding: [0xbc,0xff,0x1f,0x1b] +// CHECK: smull x11, w13, w17 // encoding: [0xab,0x7d,0x31,0x9b] +// CHECK: umull x11, w13, w17 // encoding: [0xab,0x7d,0xb1,0x9b] +// CHECK: smnegl x11, w13, w17 // encoding: [0xab,0xfd,0x31,0x9b] +// CHECK: umnegl x11, w13, w17 // encoding: [0xab,0xfd,0xb1,0x9b] + +//------------------------------------------------------------------------------ +// Exception generation +//------------------------------------------------------------------------------ + svc #0 + svc #65535 +// CHECK: svc #0 // encoding: [0x01,0x00,0x00,0xd4] +// CHECK: svc #65535 // encoding: [0xe1,0xff,0x1f,0xd4] + + hvc #1 + smc #12000 + brk #12 + hlt #123 +// CHECK: hvc #1 // encoding: [0x22,0x00,0x00,0xd4] +// CHECK: smc #12000 // encoding: [0x03,0xdc,0x05,0xd4] +// CHECK: brk #12 // encoding: [0x80,0x01,0x20,0xd4] +// CHECK: hlt #123 // encoding: [0x60,0x0f,0x40,0xd4] + + dcps1 #42 + dcps2 #9 + dcps3 #1000 +// CHECK: dcps1 #42 // encoding: [0x41,0x05,0xa0,0xd4] +// CHECK: dcps2 #9 // encoding: [0x22,0x01,0xa0,0xd4] +// CHECK: dcps3 #1000 // encoding: [0x03,0x7d,0xa0,0xd4] + + dcps1 + dcps2 + dcps3 +// CHECK: dcps1 // encoding: [0x01,0x00,0xa0,0xd4] +// CHECK: dcps2 // encoding: [0x02,0x00,0xa0,0xd4] +// CHECK: dcps3 // encoding: [0x03,0x00,0xa0,0xd4] + +//------------------------------------------------------------------------------ +// Extract (immediate) +//------------------------------------------------------------------------------ + + extr w3, w5, w7, #0 + extr w11, w13, w17, #31 +// CHECK: extr w3, w5, w7, #0 // encoding: [0xa3,0x00,0x87,0x13] +// CHECK: extr w11, w13, w17, #31 // encoding: [0xab,0x7d,0x91,0x13] + + extr x3, x5, x7, #15 + extr x11, x13, x17, #63 +// CHECK: extr x3, x5, x7, #15 // encoding: [0xa3,0x3c,0xc7,0x93] +// CHECK: extr x11, x13, x17, #63 // encoding: [0xab,0xfd,0xd1,0x93] + + ror x19, x23, #24 + ror x29, xzr, #63 +// CHECK: extr x19, x23, x23, #24 // encoding: [0xf3,0x62,0xd7,0x93] +// CHECK: extr x29, xzr, xzr, #63 // encoding: [0xfd,0xff,0xdf,0x93] + + ror w9, w13, #31 +// CHECK: extr w9, w13, w13, #31 // encoding: [0xa9,0x7d,0x8d,0x13] + +//------------------------------------------------------------------------------ +// Floating-point compare +//------------------------------------------------------------------------------ + + fcmp s3, s5 + fcmp s31, #0.0 +// CHECK: fcmp s3, s5 // encoding: [0x60,0x20,0x25,0x1e] +// CHECK: fcmp s31, #0.0 // encoding: [0xe8,0x23,0x20,0x1e] + + fcmpe s29, s30 + fcmpe s15, #0.0 +// CHECK: fcmpe s29, s30 // encoding: [0xb0,0x23,0x3e,0x1e] +// CHECK: fcmpe s15, #0.0 // encoding: [0xf8,0x21,0x20,0x1e] + + fcmp d4, d12 + fcmp d23, #0.0 +// CHECK: fcmp d4, d12 // encoding: [0x80,0x20,0x6c,0x1e] +// CHECK: fcmp d23, #0.0 // encoding: [0xe8,0x22,0x60,0x1e] + + fcmpe d26, d22 + fcmpe d29, #0.0 +// CHECK: fcmpe d26, d22 // encoding: [0x50,0x23,0x76,0x1e] +// CHECK: fcmpe d29, #0.0 // encoding: [0xb8,0x23,0x60,0x1e] + +//------------------------------------------------------------------------------ +// Floating-point conditional compare +//------------------------------------------------------------------------------ + + fccmp s1, s31, #0, eq + fccmp s3, s0, #15, hs + fccmp s31, s15, #13, cs +// CHECK: fccmp s1, s31, #0, eq // encoding: [0x20,0x04,0x3f,0x1e] +// CHECK: fccmp s3, s0, #15, hs // encoding: [0x6f,0x24,0x20,0x1e] +// CHECK: fccmp s31, s15, #13, hs // encoding: [0xed,0x27,0x2f,0x1e] + + fccmp d9, d31, #0, le + fccmp d3, d0, #15, gt + fccmp d31, d5, #7, ne +// CHECK: fccmp d9, d31, #0, le // encoding: [0x20,0xd5,0x7f,0x1e] +// CHECK: fccmp d3, d0, #15, gt // encoding: [0x6f,0xc4,0x60,0x1e] +// CHECK: fccmp d31, d5, #7, ne // encoding: [0xe7,0x17,0x65,0x1e] + + fccmpe s1, s31, #0, eq + fccmpe s3, s0, #15, hs + fccmpe s31, s15, #13, cs +// CHECK: fccmpe s1, s31, #0, eq // encoding: [0x30,0x04,0x3f,0x1e] +// CHECK: fccmpe s3, s0, #15, hs // encoding: [0x7f,0x24,0x20,0x1e] +// CHECK: fccmpe s31, s15, #13, hs // encoding: [0xfd,0x27,0x2f,0x1e] + + fccmpe d9, d31, #0, le + fccmpe d3, d0, #15, gt + fccmpe d31, d5, #7, ne +// CHECK: fccmpe d9, d31, #0, le // encoding: [0x30,0xd5,0x7f,0x1e] +// CHECK: fccmpe d3, d0, #15, gt // encoding: [0x7f,0xc4,0x60,0x1e] +// CHECK: fccmpe d31, d5, #7, ne // encoding: [0xf7,0x17,0x65,0x1e] + +//------------------------------------------------------------------------------ +// Floating-point conditional compare +//------------------------------------------------------------------------------ + + fcsel s3, s20, s9, pl + fcsel d9, d10, d11, mi +// CHECK: fcsel s3, s20, s9, pl // encoding: [0x83,0x5e,0x29,0x1e] +// CHECK: fcsel d9, d10, d11, mi // encoding: [0x49,0x4d,0x6b,0x1e] + +//------------------------------------------------------------------------------ +// Floating-point data-processing (1 source) +//------------------------------------------------------------------------------ + + fmov s0, s1 + fabs s2, s3 + fneg s4, s5 + fsqrt s6, s7 + fcvt d8, s9 + fcvt h10, s11 + frintn s12, s13 + frintp s14, s15 + frintm s16, s17 + frintz s18, s19 + frinta s20, s21 + frintx s22, s23 + frinti s24, s25 +// CHECK: fmov s0, s1 // encoding: [0x20,0x40,0x20,0x1e] +// CHECK: fabs s2, s3 // encoding: [0x62,0xc0,0x20,0x1e] +// CHECK: fneg s4, s5 // encoding: [0xa4,0x40,0x21,0x1e] +// CHECK: fsqrt s6, s7 // encoding: [0xe6,0xc0,0x21,0x1e] +// CHECK: fcvt d8, s9 // encoding: [0x28,0xc1,0x22,0x1e] +// CHECK: fcvt h10, s11 // encoding: [0x6a,0xc1,0x23,0x1e] +// CHECK: frintn s12, s13 // encoding: [0xac,0x41,0x24,0x1e] +// CHECK: frintp s14, s15 // encoding: [0xee,0xc1,0x24,0x1e] +// CHECK: frintm s16, s17 // encoding: [0x30,0x42,0x25,0x1e] +// CHECK: frintz s18, s19 // encoding: [0x72,0xc2,0x25,0x1e] +// CHECK: frinta s20, s21 // encoding: [0xb4,0x42,0x26,0x1e] +// CHECK: frintx s22, s23 // encoding: [0xf6,0x42,0x27,0x1e] +// CHECK: frinti s24, s25 // encoding: [0x38,0xc3,0x27,0x1e] + + fmov d0, d1 + fabs d2, d3 + fneg d4, d5 + fsqrt d6, d7 + fcvt s8, d9 + fcvt h10, d11 + frintn d12, d13 + frintp d14, d15 + frintm d16, d17 + frintz d18, d19 + frinta d20, d21 + frintx d22, d23 + frinti d24, d25 +// CHECK: fmov d0, d1 // encoding: [0x20,0x40,0x60,0x1e] +// CHECK: fabs d2, d3 // encoding: [0x62,0xc0,0x60,0x1e] +// CHECK: fneg d4, d5 // encoding: [0xa4,0x40,0x61,0x1e] +// CHECK: fsqrt d6, d7 // encoding: [0xe6,0xc0,0x61,0x1e] +// CHECK: fcvt s8, d9 // encoding: [0x28,0x41,0x62,0x1e] +// CHECK: fcvt h10, d11 // encoding: [0x6a,0xc1,0x63,0x1e] +// CHECK: frintn d12, d13 // encoding: [0xac,0x41,0x64,0x1e] +// CHECK: frintp d14, d15 // encoding: [0xee,0xc1,0x64,0x1e] +// CHECK: frintm d16, d17 // encoding: [0x30,0x42,0x65,0x1e] +// CHECK: frintz d18, d19 // encoding: [0x72,0xc2,0x65,0x1e] +// CHECK: frinta d20, d21 // encoding: [0xb4,0x42,0x66,0x1e] +// CHECK: frintx d22, d23 // encoding: [0xf6,0x42,0x67,0x1e] +// CHECK: frinti d24, d25 // encoding: [0x38,0xc3,0x67,0x1e] + + fcvt s26, h27 + fcvt d28, h29 +// CHECK: fcvt s26, h27 // encoding: [0x7a,0x43,0xe2,0x1e] +// CHECK: fcvt d28, h29 // encoding: [0xbc,0xc3,0xe2,0x1e] + +//------------------------------------------------------------------------------ +// Floating-point data-processing (2 sources) +//------------------------------------------------------------------------------ + + fmul s20, s19, s17 + fdiv s1, s2, s3 + fadd s4, s5, s6 + fsub s7, s8, s9 + fmax s10, s11, s12 + fmin s13, s14, s15 + fmaxnm s16, s17, s18 + fminnm s19, s20, s21 + fnmul s22, s23, s24 +// CHECK: fmul s20, s19, s17 // encoding: [0x74,0x0a,0x31,0x1e] +// CHECK: fdiv s1, s2, s3 // encoding: [0x41,0x18,0x23,0x1e] +// CHECK: fadd s4, s5, s6 // encoding: [0xa4,0x28,0x26,0x1e] +// CHECK: fsub s7, s8, s9 // encoding: [0x07,0x39,0x29,0x1e] +// CHECK: fmax s10, s11, s12 // encoding: [0x6a,0x49,0x2c,0x1e] +// CHECK: fmin s13, s14, s15 // encoding: [0xcd,0x59,0x2f,0x1e] +// CHECK: fmaxnm s16, s17, s18 // encoding: [0x30,0x6a,0x32,0x1e] +// CHECK: fminnm s19, s20, s21 // encoding: [0x93,0x7a,0x35,0x1e] +// CHECK: fnmul s22, s23, s24 // encoding: [0xf6,0x8a,0x38,0x1e] + + fmul d20, d19, d17 + fdiv d1, d2, d3 + fadd d4, d5, d6 + fsub d7, d8, d9 + fmax d10, d11, d12 + fmin d13, d14, d15 + fmaxnm d16, d17, d18 + fminnm d19, d20, d21 + fnmul d22, d23, d24 +// CHECK: fmul d20, d19, d17 // encoding: [0x74,0x0a,0x71,0x1e] +// CHECK: fdiv d1, d2, d3 // encoding: [0x41,0x18,0x63,0x1e] +// CHECK: fadd d4, d5, d6 // encoding: [0xa4,0x28,0x66,0x1e] +// CHECK: fsub d7, d8, d9 // encoding: [0x07,0x39,0x69,0x1e] +// CHECK: fmax d10, d11, d12 // encoding: [0x6a,0x49,0x6c,0x1e] +// CHECK: fmin d13, d14, d15 // encoding: [0xcd,0x59,0x6f,0x1e] +// CHECK: fmaxnm d16, d17, d18 // encoding: [0x30,0x6a,0x72,0x1e] +// CHECK: fminnm d19, d20, d21 // encoding: [0x93,0x7a,0x75,0x1e] +// CHECK: fnmul d22, d23, d24 // encoding: [0xf6,0x8a,0x78,0x1e] + +//------------------------------------------------------------------------------ +// Floating-point data-processing (3 sources) +//------------------------------------------------------------------------------ + + fmadd s3, s5, s6, s31 + fmadd d3, d13, d0, d23 + fmsub s3, s5, s6, s31 + fmsub d3, d13, d0, d23 + fnmadd s3, s5, s6, s31 + fnmadd d3, d13, d0, d23 + fnmsub s3, s5, s6, s31 + fnmsub d3, d13, d0, d23 +// CHECK: fmadd s3, s5, s6, s31 // encoding: [0xa3,0x7c,0x06,0x1f] +// CHECK: fmadd d3, d13, d0, d23 // encoding: [0xa3,0x5d,0x40,0x1f] +// CHECK: fmsub s3, s5, s6, s31 // encoding: [0xa3,0xfc,0x06,0x1f] +// CHECK: fmsub d3, d13, d0, d23 // encoding: [0xa3,0xdd,0x40,0x1f] +// CHECK: fnmadd s3, s5, s6, s31 // encoding: [0xa3,0x7c,0x26,0x1f] +// CHECK: fnmadd d3, d13, d0, d23 // encoding: [0xa3,0x5d,0x60,0x1f] +// CHECK: fnmsub s3, s5, s6, s31 // encoding: [0xa3,0xfc,0x26,0x1f] +// CHECK: fnmsub d3, d13, d0, d23 // encoding: [0xa3,0xdd,0x60,0x1f] + +//------------------------------------------------------------------------------ +// Floating-point <-> fixed-point conversion +//------------------------------------------------------------------------------ + + fcvtzs w3, s5, #1 + fcvtzs wzr, s20, #13 + fcvtzs w19, s0, #32 +// CHECK: fcvtzs w3, s5, #1 // encoding: [0xa3,0xfc,0x18,0x1e] +// CHECK: fcvtzs wzr, s20, #13 // encoding: [0x9f,0xce,0x18,0x1e] +// CHECK: fcvtzs w19, s0, #32 // encoding: [0x13,0x80,0x18,0x1e] + + fcvtzs x3, s5, #1 + fcvtzs x12, s30, #45 + fcvtzs x19, s0, #64 +// CHECK: fcvtzs x3, s5, #1 // encoding: [0xa3,0xfc,0x18,0x9e] +// CHECK: fcvtzs x12, s30, #45 // encoding: [0xcc,0x4f,0x18,0x9e] +// CHECK: fcvtzs x19, s0, #64 // encoding: [0x13,0x00,0x18,0x9e] + + fcvtzs w3, d5, #1 + fcvtzs wzr, d20, #13 + fcvtzs w19, d0, #32 +// CHECK: fcvtzs w3, d5, #1 // encoding: [0xa3,0xfc,0x58,0x1e] +// CHECK: fcvtzs wzr, d20, #13 // encoding: [0x9f,0xce,0x58,0x1e] +// CHECK: fcvtzs w19, d0, #32 // encoding: [0x13,0x80,0x58,0x1e] + + fcvtzs x3, d5, #1 + fcvtzs x12, d30, #45 + fcvtzs x19, d0, #64 +// CHECK: fcvtzs x3, d5, #1 // encoding: [0xa3,0xfc,0x58,0x9e] +// CHECK: fcvtzs x12, d30, #45 // encoding: [0xcc,0x4f,0x58,0x9e] +// CHECK: fcvtzs x19, d0, #64 // encoding: [0x13,0x00,0x58,0x9e] + + fcvtzu w3, s5, #1 + fcvtzu wzr, s20, #13 + fcvtzu w19, s0, #32 +// CHECK: fcvtzu w3, s5, #1 // encoding: [0xa3,0xfc,0x19,0x1e] +// CHECK: fcvtzu wzr, s20, #13 // encoding: [0x9f,0xce,0x19,0x1e] +// CHECK: fcvtzu w19, s0, #32 // encoding: [0x13,0x80,0x19,0x1e] + + fcvtzu x3, s5, #1 + fcvtzu x12, s30, #45 + fcvtzu x19, s0, #64 +// CHECK: fcvtzu x3, s5, #1 // encoding: [0xa3,0xfc,0x19,0x9e] +// CHECK: fcvtzu x12, s30, #45 // encoding: [0xcc,0x4f,0x19,0x9e] +// CHECK: fcvtzu x19, s0, #64 // encoding: [0x13,0x00,0x19,0x9e] + + fcvtzu w3, d5, #1 + fcvtzu wzr, d20, #13 + fcvtzu w19, d0, #32 +// CHECK: fcvtzu w3, d5, #1 // encoding: [0xa3,0xfc,0x59,0x1e] +// CHECK: fcvtzu wzr, d20, #13 // encoding: [0x9f,0xce,0x59,0x1e] +// CHECK: fcvtzu w19, d0, #32 // encoding: [0x13,0x80,0x59,0x1e] + + fcvtzu x3, d5, #1 + fcvtzu x12, d30, #45 + fcvtzu x19, d0, #64 +// CHECK: fcvtzu x3, d5, #1 // encoding: [0xa3,0xfc,0x59,0x9e] +// CHECK: fcvtzu x12, d30, #45 // encoding: [0xcc,0x4f,0x59,0x9e] +// CHECK: fcvtzu x19, d0, #64 // encoding: [0x13,0x00,0x59,0x9e] + + scvtf s23, w19, #1 + scvtf s31, wzr, #20 + scvtf s14, w0, #32 +// CHECK: scvtf s23, w19, #1 // encoding: [0x77,0xfe,0x02,0x1e] +// CHECK: scvtf s31, wzr, #20 // encoding: [0xff,0xb3,0x02,0x1e] +// CHECK: scvtf s14, w0, #32 // encoding: [0x0e,0x80,0x02,0x1e] + + scvtf s23, x19, #1 + scvtf s31, xzr, #20 + scvtf s14, x0, #64 +// CHECK: scvtf s23, x19, #1 // encoding: [0x77,0xfe,0x02,0x9e] +// CHECK: scvtf s31, xzr, #20 // encoding: [0xff,0xb3,0x02,0x9e] +// CHECK: scvtf s14, x0, #64 // encoding: [0x0e,0x00,0x02,0x9e] + + scvtf d23, w19, #1 + scvtf d31, wzr, #20 + scvtf d14, w0, #32 +// CHECK: scvtf d23, w19, #1 // encoding: [0x77,0xfe,0x42,0x1e] +// CHECK: scvtf d31, wzr, #20 // encoding: [0xff,0xb3,0x42,0x1e] +// CHECK: scvtf d14, w0, #32 // encoding: [0x0e,0x80,0x42,0x1e] + + scvtf d23, x19, #1 + scvtf d31, xzr, #20 + scvtf d14, x0, #64 +// CHECK: scvtf d23, x19, #1 // encoding: [0x77,0xfe,0x42,0x9e] +// CHECK: scvtf d31, xzr, #20 // encoding: [0xff,0xb3,0x42,0x9e] +// CHECK: scvtf d14, x0, #64 // encoding: [0x0e,0x00,0x42,0x9e] + + ucvtf s23, w19, #1 + ucvtf s31, wzr, #20 + ucvtf s14, w0, #32 +// CHECK: ucvtf s23, w19, #1 // encoding: [0x77,0xfe,0x03,0x1e] +// CHECK: ucvtf s31, wzr, #20 // encoding: [0xff,0xb3,0x03,0x1e] +// CHECK: ucvtf s14, w0, #32 // encoding: [0x0e,0x80,0x03,0x1e] + + ucvtf s23, x19, #1 + ucvtf s31, xzr, #20 + ucvtf s14, x0, #64 +// CHECK: ucvtf s23, x19, #1 // encoding: [0x77,0xfe,0x03,0x9e] +// CHECK: ucvtf s31, xzr, #20 // encoding: [0xff,0xb3,0x03,0x9e] +// CHECK: ucvtf s14, x0, #64 // encoding: [0x0e,0x00,0x03,0x9e] + + ucvtf d23, w19, #1 + ucvtf d31, wzr, #20 + ucvtf d14, w0, #32 +// CHECK: ucvtf d23, w19, #1 // encoding: [0x77,0xfe,0x43,0x1e] +// CHECK: ucvtf d31, wzr, #20 // encoding: [0xff,0xb3,0x43,0x1e] +// CHECK: ucvtf d14, w0, #32 // encoding: [0x0e,0x80,0x43,0x1e] + + ucvtf d23, x19, #1 + ucvtf d31, xzr, #20 + ucvtf d14, x0, #64 +// CHECK: ucvtf d23, x19, #1 // encoding: [0x77,0xfe,0x43,0x9e] +// CHECK: ucvtf d31, xzr, #20 // encoding: [0xff,0xb3,0x43,0x9e] +// CHECK: ucvtf d14, x0, #64 // encoding: [0x0e,0x00,0x43,0x9e] + +//------------------------------------------------------------------------------ +// Floating-point <-> integer conversion +//------------------------------------------------------------------------------ + fcvtns w3, s31 + fcvtns xzr, s12 + fcvtnu wzr, s12 + fcvtnu x0, s0 +// CHECK: fcvtns w3, s31 // encoding: [0xe3,0x03,0x20,0x1e] +// CHECK: fcvtns xzr, s12 // encoding: [0x9f,0x01,0x20,0x9e] +// CHECK: fcvtnu wzr, s12 // encoding: [0x9f,0x01,0x21,0x1e] +// CHECK: fcvtnu x0, s0 // encoding: [0x00,0x00,0x21,0x9e] + + fcvtps wzr, s9 + fcvtps x12, s20 + fcvtpu w30, s23 + fcvtpu x29, s3 +// CHECK: fcvtps wzr, s9 // encoding: [0x3f,0x01,0x28,0x1e] +// CHECK: fcvtps x12, s20 // encoding: [0x8c,0x02,0x28,0x9e] +// CHECK: fcvtpu w30, s23 // encoding: [0xfe,0x02,0x29,0x1e] +// CHECK: fcvtpu x29, s3 // encoding: [0x7d,0x00,0x29,0x9e] + + fcvtms w2, s3 + fcvtms x4, s5 + fcvtmu w6, s7 + fcvtmu x8, s9 +// CHECK: fcvtms w2, s3 // encoding: [0x62,0x00,0x30,0x1e] +// CHECK: fcvtms x4, s5 // encoding: [0xa4,0x00,0x30,0x9e] +// CHECK: fcvtmu w6, s7 // encoding: [0xe6,0x00,0x31,0x1e] +// CHECK: fcvtmu x8, s9 // encoding: [0x28,0x01,0x31,0x9e] + + fcvtzs w10, s11 + fcvtzs x12, s13 + fcvtzu w14, s15 + fcvtzu x15, s16 +// CHECK: fcvtzs w10, s11 // encoding: [0x6a,0x01,0x38,0x1e] +// CHECK: fcvtzs x12, s13 // encoding: [0xac,0x01,0x38,0x9e] +// CHECK: fcvtzu w14, s15 // encoding: [0xee,0x01,0x39,0x1e] +// CHECK: fcvtzu x15, s16 // encoding: [0x0f,0x02,0x39,0x9e] + + scvtf s17, w18 + scvtf s19, x20 + ucvtf s21, w22 + scvtf s23, x24 +// CHECK: scvtf s17, w18 // encoding: [0x51,0x02,0x22,0x1e] +// CHECK: scvtf s19, x20 // encoding: [0x93,0x02,0x22,0x9e] +// CHECK: ucvtf s21, w22 // encoding: [0xd5,0x02,0x23,0x1e] +// CHECK: scvtf s23, x24 // encoding: [0x17,0x03,0x22,0x9e] + + fcvtas w25, s26 + fcvtas x27, s28 + fcvtau w29, s30 + fcvtau xzr, s0 +// CHECK: fcvtas w25, s26 // encoding: [0x59,0x03,0x24,0x1e] +// CHECK: fcvtas x27, s28 // encoding: [0x9b,0x03,0x24,0x9e] +// CHECK: fcvtau w29, s30 // encoding: [0xdd,0x03,0x25,0x1e] +// CHECK: fcvtau xzr, s0 // encoding: [0x1f,0x00,0x25,0x9e] + + fcvtns w3, d31 + fcvtns xzr, d12 + fcvtnu wzr, d12 + fcvtnu x0, d0 +// CHECK: fcvtns w3, d31 // encoding: [0xe3,0x03,0x60,0x1e] +// CHECK: fcvtns xzr, d12 // encoding: [0x9f,0x01,0x60,0x9e] +// CHECK: fcvtnu wzr, d12 // encoding: [0x9f,0x01,0x61,0x1e] +// CHECK: fcvtnu x0, d0 // encoding: [0x00,0x00,0x61,0x9e] + + fcvtps wzr, d9 + fcvtps x12, d20 + fcvtpu w30, d23 + fcvtpu x29, d3 +// CHECK: fcvtps wzr, d9 // encoding: [0x3f,0x01,0x68,0x1e] +// CHECK: fcvtps x12, d20 // encoding: [0x8c,0x02,0x68,0x9e] +// CHECK: fcvtpu w30, d23 // encoding: [0xfe,0x02,0x69,0x1e] +// CHECK: fcvtpu x29, d3 // encoding: [0x7d,0x00,0x69,0x9e] + + fcvtms w2, d3 + fcvtms x4, d5 + fcvtmu w6, d7 + fcvtmu x8, d9 +// CHECK: fcvtms w2, d3 // encoding: [0x62,0x00,0x70,0x1e] +// CHECK: fcvtms x4, d5 // encoding: [0xa4,0x00,0x70,0x9e] +// CHECK: fcvtmu w6, d7 // encoding: [0xe6,0x00,0x71,0x1e] +// CHECK: fcvtmu x8, d9 // encoding: [0x28,0x01,0x71,0x9e] + + fcvtzs w10, d11 + fcvtzs x12, d13 + fcvtzu w14, d15 + fcvtzu x15, d16 +// CHECK: fcvtzs w10, d11 // encoding: [0x6a,0x01,0x78,0x1e] +// CHECK: fcvtzs x12, d13 // encoding: [0xac,0x01,0x78,0x9e] +// CHECK: fcvtzu w14, d15 // encoding: [0xee,0x01,0x79,0x1e] +// CHECK: fcvtzu x15, d16 // encoding: [0x0f,0x02,0x79,0x9e] + + scvtf d17, w18 + scvtf d19, x20 + ucvtf d21, w22 + ucvtf d23, x24 +// CHECK: scvtf d17, w18 // encoding: [0x51,0x02,0x62,0x1e] +// CHECK: scvtf d19, x20 // encoding: [0x93,0x02,0x62,0x9e] +// CHECK: ucvtf d21, w22 // encoding: [0xd5,0x02,0x63,0x1e] +// CHECK: ucvtf d23, x24 // encoding: [0x17,0x03,0x63,0x9e] + + fcvtas w25, d26 + fcvtas x27, d28 + fcvtau w29, d30 + fcvtau xzr, d0 +// CHECK: fcvtas w25, d26 // encoding: [0x59,0x03,0x64,0x1e] +// CHECK: fcvtas x27, d28 // encoding: [0x9b,0x03,0x64,0x9e] +// CHECK: fcvtau w29, d30 // encoding: [0xdd,0x03,0x65,0x1e] +// CHECK: fcvtau xzr, d0 // encoding: [0x1f,0x00,0x65,0x9e] + + fmov w3, s9 + fmov s9, w3 +// CHECK: fmov w3, s9 // encoding: [0x23,0x01,0x26,0x1e] +// CHECK: fmov s9, w3 // encoding: [0x69,0x00,0x27,0x1e] + + fmov x20, d31 + fmov d1, x15 +// CHECK: fmov x20, d31 // encoding: [0xf4,0x03,0x66,0x9e] +// CHECK: fmov d1, x15 // encoding: [0xe1,0x01,0x67,0x9e] + + fmov x3, v12.d[1] + fmov v1.d[1], x19 + fmov v3.2d[1], xzr +// CHECK: fmov x3, v12.d[1] // encoding: [0x83,0x01,0xae,0x9e] +// CHECK: fmov v1.d[1], x19 // encoding: [0x61,0x02,0xaf,0x9e] +// CHECK: fmov v3.d[1], xzr // encoding: [0xe3,0x03,0xaf,0x9e] + +//------------------------------------------------------------------------------ +// Floating-point immediate +//------------------------------------------------------------------------------ + + fmov s2, #0.125 + fmov s3, #1.0 + fmov d30, #16.0 +// CHECK: fmov s2, #0.12500000 // encoding: [0x02,0x10,0x28,0x1e] +// CHECK: fmov s3, #1.00000000 // encoding: [0x03,0x10,0x2e,0x1e] +// CHECK: fmov d30, #16.00000000 // encoding: [0x1e,0x10,0x66,0x1e] + + fmov s4, #1.0625 + fmov d10, #1.9375 +// CHECK: fmov s4, #1.06250000 // encoding: [0x04,0x30,0x2e,0x1e] +// CHECK: fmov d10, #1.93750000 // encoding: [0x0a,0xf0,0x6f,0x1e] + + fmov s12, #-1.0 +// CHECK: fmov s12, #-1.00000000 // encoding: [0x0c,0x10,0x3e,0x1e] + + fmov d16, #8.5 +// CHECK: fmov d16, #8.50000000 // encoding: [0x10,0x30,0x64,0x1e] + +//------------------------------------------------------------------------------ +// Load-register (literal) +//------------------------------------------------------------------------------ + ldr w3, here + ldr x29, there + ldrsw xzr, everywhere +// CHECK: ldr w3, here // encoding: [0x03'A',A,A,0x18'A'] +// CHECK: // fixup A - offset: 0, value: here, kind: fixup_a64_ld_prel +// CHECK: ldr x29, there // encoding: [0x1d'A',A,A,0x58'A'] +// CHECK: // fixup A - offset: 0, value: there, kind: fixup_a64_ld_prel +// CHECK: ldrsw xzr, everywhere // encoding: [0x1f'A',A,A,0x98'A'] +// CHECK: // fixup A - offset: 0, value: everywhere, kind: fixup_a64_ld_prel + + ldr s0, who_knows + ldr d0, i_dont + ldr q0, there_must_be_a_better_way +// CHECK: ldr s0, who_knows // encoding: [A,A,A,0x1c'A'] +// CHECK: // fixup A - offset: 0, value: who_knows, kind: fixup_a64_ld_prel +// CHECK: ldr d0, i_dont // encoding: [A,A,A,0x5c'A'] +// CHECK: // fixup A - offset: 0, value: i_dont, kind: fixup_a64_ld_prel +// CHECK: ldr q0, there_must_be_a_better_way // encoding: [A,A,A,0x9c'A'] +// CHECK: // fixup A - offset: 0, value: there_must_be_a_better_way, kind: fixup_a64_ld_prel + + ldr w0, #1048572 + ldr x10, #-1048576 +// CHECK: ldr w0, #1048572 // encoding: [0xe0,0xff,0x7f,0x18] +// CHECK: ldr x10, #-1048576 // encoding: [0x0a,0x00,0x80,0x58] + + prfm pldl1strm, nowhere + prfm #22, somewhere +// CHECK: prfm pldl1strm, nowhere // encoding: [0x01'A',A,A,0xd8'A'] +// CHECK: // fixup A - offset: 0, value: nowhere, kind: fixup_a64_ld_prel +// CHECK: prfm #22, somewhere // encoding: [0x16'A',A,A,0xd8'A'] +// CHECK: // fixup A - offset: 0, value: somewhere, kind: fixup_a64_ld_prel + +//------------------------------------------------------------------------------ +// Floating-point immediate +//------------------------------------------------------------------------------ + + fmov s2, #0.125 + fmov s3, #1.0 + fmov d30, #16.0 +// CHECK: fmov s2, #0.12500000 // encoding: [0x02,0x10,0x28,0x1e] +// CHECK: fmov s3, #1.00000000 // encoding: [0x03,0x10,0x2e,0x1e] +// CHECK: fmov d30, #16.00000000 // encoding: [0x1e,0x10,0x66,0x1e] + + fmov s4, #1.0625 + fmov d10, #1.9375 +// CHECK: fmov s4, #1.06250000 // encoding: [0x04,0x30,0x2e,0x1e] +// CHECK: fmov d10, #1.93750000 // encoding: [0x0a,0xf0,0x6f,0x1e] + + fmov s12, #-1.0 +// CHECK: fmov s12, #-1.00000000 // encoding: [0x0c,0x10,0x3e,0x1e] + + fmov d16, #8.5 +// CHECK: fmov d16, #8.50000000 // encoding: [0x10,0x30,0x64,0x1e] + +//------------------------------------------------------------------------------ +// Load/store exclusive +//------------------------------------------------------------------------------ + + stxrb w1, w2, [x3, #0] + stxrh w2, w3, [x4] + stxr wzr, w4, [sp] + stxr w5, x6, [x7] +// CHECK: stxrb w1, w2, [x3] // encoding: [0x62,0x7c,0x01,0x08] +// CHECK: stxrh w2, w3, [x4] // encoding: [0x83,0x7c,0x02,0x48] +// CHECK: stxr wzr, w4, [sp] // encoding: [0xe4,0x7f,0x1f,0x88] +// CHECK: stxr w5, x6, [x7] // encoding: [0xe6,0x7c,0x05,0xc8] + + ldxrb w7, [x9] + ldxrh wzr, [x10] + ldxr w9, [sp] + ldxr x10, [x11] +// CHECK: ldxrb w7, [x9] // encoding: [0x27,0x7d,0x5f,0x08] +// CHECK: ldxrh wzr, [x10] // encoding: [0x5f,0x7d,0x5f,0x48] +// CHECK: ldxr w9, [sp] // encoding: [0xe9,0x7f,0x5f,0x88] +// CHECK: ldxr x10, [x11] // encoding: [0x6a,0x7d,0x5f,0xc8] + + stxp w11, w12, w13, [x14] + stxp wzr, x23, x14, [x15] +// CHECK: stxp w11, w12, w13, [x14] // encoding: [0xcc,0x35,0x2b,0x88] +// CHECK: stxp wzr, x23, x14, [x15] // encoding: [0xf7,0x39,0x3f,0xc8] + + ldxp w12, wzr, [sp] + ldxp x13, x14, [x15] +// CHECK: ldxp w12, wzr, [sp] // encoding: [0xec,0x7f,0x7f,0x88] +// CHECK: ldxp x13, x14, [x15] // encoding: [0xed,0x39,0x7f,0xc8] + + stlxrb w14, w15, [x16] + stlxrh w15, w16, [x17,#0] + stlxr wzr, w17, [sp] + stlxr w18, x19, [x20] +// CHECK: stlxrb w14, w15, [x16] // encoding: [0x0f,0xfe,0x0e,0x08] +// CHECK: stlxrh w15, w16, [x17] // encoding: [0x30,0xfe,0x0f,0x48] +// CHECK: stlxr wzr, w17, [sp] // encoding: [0xf1,0xff,0x1f,0x88] +// CHECK: stlxr w18, x19, [x20] // encoding: [0x93,0xfe,0x12,0xc8] + + ldaxrb w19, [x21] + ldaxrh w20, [sp] + ldaxr wzr, [x22] + ldaxr x21, [x23] +// CHECK: ldaxrb w19, [x21] // encoding: [0xb3,0xfe,0x5f,0x08] +// CHECK: ldaxrh w20, [sp] // encoding: [0xf4,0xff,0x5f,0x48] +// CHECK: ldaxr wzr, [x22] // encoding: [0xdf,0xfe,0x5f,0x88] +// CHECK: ldaxr x21, [x23] // encoding: [0xf5,0xfe,0x5f,0xc8] + + stlxp wzr, w22, w23, [x24] + stlxp w25, x26, x27, [sp] +// CHECK: stlxp wzr, w22, w23, [x24] // encoding: [0x16,0xdf,0x3f,0x88] +// CHECK: stlxp w25, x26, x27, [sp] // encoding: [0xfa,0xef,0x39,0xc8] + + ldaxp w26, wzr, [sp] + ldaxp x27, x28, [x30] +// CHECK: ldaxp w26, wzr, [sp] // encoding: [0xfa,0xff,0x7f,0x88] +// CHECK: ldaxp x27, x28, [x30] // encoding: [0xdb,0xf3,0x7f,0xc8] + + stlrb w27, [sp] + stlrh w28, [x0] + stlr wzr, [x1] + stlr x30, [x2] +// CHECK: stlrb w27, [sp] // encoding: [0xfb,0xff,0x9f,0x08] +// CHECK: stlrh w28, [x0] // encoding: [0x1c,0xfc,0x9f,0x48] +// CHECK: stlr wzr, [x1] // encoding: [0x3f,0xfc,0x9f,0x88] +// CHECK: stlr x30, [x2] // encoding: [0x5e,0xfc,0x9f,0xc8] + + ldarb w29, [sp] + ldarh w30, [x0] + ldar wzr, [x1] + ldar x1, [x2] +// CHECK: ldarb w29, [sp] // encoding: [0xfd,0xff,0xdf,0x08] +// CHECK: ldarh w30, [x0] // encoding: [0x1e,0xfc,0xdf,0x48] +// CHECK: ldar wzr, [x1] // encoding: [0x3f,0xfc,0xdf,0x88] +// CHECK: ldar x1, [x2] // encoding: [0x41,0xfc,0xdf,0xc8] + + stlxp wzr, w22, w23, [x24,#0] +// CHECK: stlxp wzr, w22, w23, [x24] // encoding: [0x16,0xdf,0x3f,0x88] + +//------------------------------------------------------------------------------ +// Load/store (unaligned immediate) +//------------------------------------------------------------------------------ + + sturb w9, [sp, #0] + sturh wzr, [x12, #255] + stur w16, [x0, #-256] + stur x28, [x14, #1] +// CHECK: sturb w9, [sp] // encoding: [0xe9,0x03,0x00,0x38] +// CHECK: sturh wzr, [x12, #255] // encoding: [0x9f,0xf1,0x0f,0x78] +// CHECK: stur w16, [x0, #-256] // encoding: [0x10,0x00,0x10,0xb8] +// CHECK: stur x28, [x14, #1] // encoding: [0xdc,0x11,0x00,0xf8] + + ldurb w1, [x20, #255] + ldurh w20, [x1, #255] + ldur w12, [sp, #255] + ldur xzr, [x12, #255] +// CHECK: ldurb w1, [x20, #255] // encoding: [0x81,0xf2,0x4f,0x38] +// CHECK: ldurh w20, [x1, #255] // encoding: [0x34,0xf0,0x4f,0x78] +// CHECK: ldur w12, [sp, #255] // encoding: [0xec,0xf3,0x4f,0xb8] +// CHECK: ldur xzr, [x12, #255] // encoding: [0x9f,0xf1,0x4f,0xf8] + + ldursb x9, [x7, #-256] + ldursh x17, [x19, #-256] + ldursw x20, [x15, #-256] + ldursw x13, [x2] + prfum pldl2keep, [sp, #-256] + ldursb w19, [x1, #-256] + ldursh w15, [x21, #-256] +// CHECK: ldursb x9, [x7, #-256] // encoding: [0xe9,0x00,0x90,0x38] +// CHECK: ldursh x17, [x19, #-256] // encoding: [0x71,0x02,0x90,0x78] +// CHECK: ldursw x20, [x15, #-256] // encoding: [0xf4,0x01,0x90,0xb8] +// CHECK: ldursw x13, [x2] // encoding: [0x4d,0x00,0x80,0xb8] +// CHECK: prfum pldl2keep, [sp, #-256] // encoding: [0xe2,0x03,0x90,0xf8] +// CHECK: ldursb w19, [x1, #-256] // encoding: [0x33,0x00,0xd0,0x38] +// CHECK: ldursh w15, [x21, #-256] // encoding: [0xaf,0x02,0xd0,0x78] + + stur b0, [sp, #1] + stur h12, [x12, #-1] + stur s15, [x0, #255] + stur d31, [x5, #25] + stur q9, [x5] +// CHECK: stur b0, [sp, #1] // encoding: [0xe0,0x13,0x00,0x3c] +// CHECK: stur h12, [x12, #-1] // encoding: [0x8c,0xf1,0x1f,0x7c] +// CHECK: stur s15, [x0, #255] // encoding: [0x0f,0xf0,0x0f,0xbc] +// CHECK: stur d31, [x5, #25] // encoding: [0xbf,0x90,0x01,0xfc] +// CHECK: stur q9, [x5] // encoding: [0xa9,0x00,0x80,0x3c] + + ldur b3, [sp] + ldur h5, [x4, #-256] + ldur s7, [x12, #-1] + ldur d11, [x19, #4] + ldur q13, [x1, #2] +// CHECK: ldur b3, [sp] // encoding: [0xe3,0x03,0x40,0x3c] +// CHECK: ldur h5, [x4, #-256] // encoding: [0x85,0x00,0x50,0x7c] +// CHECK: ldur s7, [x12, #-1] // encoding: [0x87,0xf1,0x5f,0xbc] +// CHECK: ldur d11, [x19, #4] // encoding: [0x6b,0x42,0x40,0xfc] +// CHECK: ldur q13, [x1, #2] // encoding: [0x2d,0x20,0xc0,0x3c] + +//------------------------------------------------------------------------------ +// Load/store (unsigned immediate) +//------------------------------------------------------------------------------ + +//// Basic addressing mode limits: 8 byte access + ldr x0, [x0] + ldr x4, [x29, #0] + ldr x30, [x12, #32760] + ldr x20, [sp, #8] +// CHECK: ldr x0, [x0] // encoding: [0x00,0x00,0x40,0xf9] +// CHECK: ldr x4, [x29] // encoding: [0xa4,0x03,0x40,0xf9] +// CHECK: ldr x30, [x12, #32760] // encoding: [0x9e,0xfd,0x7f,0xf9] +// CHECK: ldr x20, [sp, #8] // encoding: [0xf4,0x07,0x40,0xf9] + +//// Rt treats 31 as zero-register + ldr xzr, [sp] +// CHECK: ldr xzr, [sp] // encoding: [0xff,0x03,0x40,0xf9] + + //// 4-byte load, check still 64-bit address, limits + ldr w2, [sp] + ldr w17, [sp, #16380] + ldr w13, [x2, #4] +// CHECK: ldr w2, [sp] // encoding: [0xe2,0x03,0x40,0xb9] +// CHECK: ldr w17, [sp, #16380] // encoding: [0xf1,0xff,0x7f,0xb9] +// CHECK: ldr w13, [x2, #4] // encoding: [0x4d,0x04,0x40,0xb9] + +//// Signed 4-byte load. Limits. + ldrsw x2, [x5,#4] + ldrsw x23, [sp, #16380] +// CHECK: ldrsw x2, [x5, #4] // encoding: [0xa2,0x04,0x80,0xb9] +// CHECK: ldrsw x23, [sp, #16380] // encoding: [0xf7,0xff,0xbf,0xb9] + +//// 2-byte loads + ldrh w2, [x4] + ldrsh w23, [x6, #8190] + ldrsh wzr, [sp, #2] + ldrsh x29, [x2, #2] +// CHECK: ldrh w2, [x4] // encoding: [0x82,0x00,0x40,0x79] +// CHECK: ldrsh w23, [x6, #8190] // encoding: [0xd7,0xfc,0xff,0x79] +// CHECK: ldrsh wzr, [sp, #2] // encoding: [0xff,0x07,0xc0,0x79] +// CHECK: ldrsh x29, [x2, #2] // encoding: [0x5d,0x04,0x80,0x79] + +//// 1-byte loads + ldrb w26, [x3, #121] + ldrb w12, [x2, #0] + ldrsb w27, [sp, #4095] + ldrsb xzr, [x15] +// CHECK: ldrb w26, [x3, #121] // encoding: [0x7a,0xe4,0x41,0x39] +// CHECK: ldrb w12, [x2] // encoding: [0x4c,0x00,0x40,0x39] +// CHECK: ldrsb w27, [sp, #4095] // encoding: [0xfb,0xff,0xff,0x39] +// CHECK: ldrsb xzr, [x15] // encoding: [0xff,0x01,0x80,0x39] + +//// Stores + str x30, [sp] + str w20, [x4, #16380] + strh w20, [x10, #14] + strh w17, [sp, #8190] + strb w23, [x3, #4095] + strb wzr, [x2] +// CHECK: str x30, [sp] // encoding: [0xfe,0x03,0x00,0xf9] +// CHECK: str w20, [x4, #16380] // encoding: [0x94,0xfc,0x3f,0xb9] +// CHECK: strh w20, [x10, #14] // encoding: [0x54,0x1d,0x00,0x79] +// CHECK: strh w17, [sp, #8190] // encoding: [0xf1,0xff,0x3f,0x79] +// CHECK: strb w23, [x3, #4095] // encoding: [0x77,0xfc,0x3f,0x39] +// CHECK: strb wzr, [x2] // encoding: [0x5f,0x00,0x00,0x39] + +//// Relocations + str x15, [x5, #:lo12:sym] + ldrb w15, [x5, #:lo12:sym] + ldrsh x15, [x5, #:lo12:sym] + ldrsw x15, [x5, #:lo12:sym] + ldr x15, [x5, #:lo12:sym] + ldr q3, [x2, #:lo12:sym] +// CHECK: str x15, [x5, #:lo12:sym] // encoding: [0xaf'A',A,A,0xf9'A'] +// CHECK: // fixup A - offset: 0, value: :lo12:sym, kind: fixup_a64_ldst64_lo12 +// CHECK: ldrb w15, [x5, #:lo12:sym] // encoding: [0xaf'A',A,0x40'A',0x39'A'] +// CHECK: // fixup A - offset: 0, value: :lo12:sym, kind: fixup_a64_ldst8_lo12 +// CHECK: ldrsh x15, [x5, #:lo12:sym] // encoding: [0xaf'A',A,0x80'A',0x79'A'] +// CHECK: // fixup A - offset: 0, value: :lo12:sym, kind: fixup_a64_ldst16_lo12 +// CHECK: ldrsw x15, [x5, #:lo12:sym] // encoding: [0xaf'A',A,0x80'A',0xb9'A'] +// CHECK: // fixup A - offset: 0, value: :lo12:sym, kind: fixup_a64_ldst32_lo12 +// CHECK: ldr x15, [x5, #:lo12:sym] // encoding: [0xaf'A',A,0x40'A',0xf9'A'] +// CHECK: // fixup A - offset: 0, value: :lo12:sym, kind: fixup_a64_ldst64_lo12 +// CHECK: ldr q3, [x2, #:lo12:sym] // encoding: [0x43'A',A,0xc0'A',0x3d'A'] +// CHECK: // fixup A - offset: 0, value: :lo12:sym, kind: fixup_a64_ldst128_lo12 + + prfm pldl1keep, [sp, #8] + prfm pldl1strm, [x3] + prfm pldl2keep, [x5,#16] + prfm pldl2strm, [x2] + prfm pldl3keep, [x5] + prfm pldl3strm, [x6] + prfm plil1keep, [sp, #8] + prfm plil1strm, [x3] + prfm plil2keep, [x5,#16] + prfm plil2strm, [x2] + prfm plil3keep, [x5] + prfm plil3strm, [x6] + prfm pstl1keep, [sp, #8] + prfm pstl1strm, [x3] + prfm pstl2keep, [x5,#16] + prfm pstl2strm, [x2] + prfm pstl3keep, [x5] + prfm pstl3strm, [x6] + prfm #15, [sp] +// CHECK: prfm pldl1keep, [sp, #8] // encoding: [0xe0,0x07,0x80,0xf9] +// CHECK: prfm pldl1strm, [x3, #0] // encoding: [0x61,0x00,0x80,0xf9] +// CHECK: prfm pldl2keep, [x5, #16] // encoding: [0xa2,0x08,0x80,0xf9] +// CHECK: prfm pldl2strm, [x2, #0] // encoding: [0x43,0x00,0x80,0xf9] +// CHECK: prfm pldl3keep, [x5, #0] // encoding: [0xa4,0x00,0x80,0xf9] +// CHECK: prfm pldl3strm, [x6, #0] // encoding: [0xc5,0x00,0x80,0xf9] +// CHECK: prfm plil1keep, [sp, #8] // encoding: [0xe8,0x07,0x80,0xf9] +// CHECK: prfm plil1strm, [x3, #0] // encoding: [0x69,0x00,0x80,0xf9] +// CHECK: prfm plil2keep, [x5, #16] // encoding: [0xaa,0x08,0x80,0xf9] +// CHECK: prfm plil2strm, [x2, #0] // encoding: [0x4b,0x00,0x80,0xf9] +// CHECK: prfm plil3keep, [x5, #0] // encoding: [0xac,0x00,0x80,0xf9] +// CHECK: prfm plil3strm, [x6, #0] // encoding: [0xcd,0x00,0x80,0xf9] +// CHECK: prfm pstl1keep, [sp, #8] // encoding: [0xf0,0x07,0x80,0xf9] +// CHECK: prfm pstl1strm, [x3, #0] // encoding: [0x71,0x00,0x80,0xf9] +// CHECK: prfm pstl2keep, [x5, #16] // encoding: [0xb2,0x08,0x80,0xf9] +// CHECK: prfm pstl2strm, [x2, #0] // encoding: [0x53,0x00,0x80,0xf9] +// CHECK: prfm pstl3keep, [x5, #0] // encoding: [0xb4,0x00,0x80,0xf9] +// CHECK: prfm pstl3strm, [x6, #0] // encoding: [0xd5,0x00,0x80,0xf9] +// CHECK: prfm #15, [sp, #0] // encoding: [0xef,0x03,0x80,0xf9] + +//// Floating-point versions + + ldr b31, [sp, #4095] + ldr h20, [x2, #8190] + ldr s10, [x19, #16380] + ldr d3, [x10, #32760] + str q12, [sp, #65520] +// CHECK: ldr b31, [sp, #4095] // encoding: [0xff,0xff,0x7f,0x3d] +// CHECK: ldr h20, [x2, #8190] // encoding: [0x54,0xfc,0x7f,0x7d] +// CHECK: ldr s10, [x19, #16380] // encoding: [0x6a,0xfe,0x7f,0xbd] +// CHECK: ldr d3, [x10, #32760] // encoding: [0x43,0xfd,0x7f,0xfd] +// CHECK: str q12, [sp, #65520] // encoding: [0xec,0xff,0xbf,0x3d] + +//------------------------------------------------------------------------------ +// Load/store register (register offset) +//------------------------------------------------------------------------------ + + ldrb w3, [sp, x5] + ldrb w9, [x27, x6, lsl #0] + ldrsb w10, [x30, x7] + ldrb w11, [x29, x3, sxtx] + strb w12, [x28, xzr, sxtx #0] + ldrb w14, [x26, w6, uxtw] + ldrsb w15, [x25, w7, uxtw #0] + ldrb w17, [x23, w9, sxtw] + ldrsb x18, [x22, w10, sxtw #0] +// CHECK: ldrb w3, [sp, x5] // encoding: [0xe3,0x6b,0x65,0x38] +// CHECK: ldrb w9, [x27, x6, lsl #0] // encoding: [0x69,0x7b,0x66,0x38] +// CHECK: ldrsb w10, [x30, x7] // encoding: [0xca,0x6b,0xe7,0x38] +// CHECK: ldrb w11, [x29, x3, sxtx] // encoding: [0xab,0xeb,0x63,0x38] +// CHECK: strb w12, [x28, xzr, sxtx #0] // encoding: [0x8c,0xfb,0x3f,0x38] +// CHECK: ldrb w14, [x26, w6, uxtw] // encoding: [0x4e,0x4b,0x66,0x38] +// CHECK: ldrsb w15, [x25, w7, uxtw #0] // encoding: [0x2f,0x5b,0xe7,0x38] +// CHECK: ldrb w17, [x23, w9, sxtw] // encoding: [0xf1,0xca,0x69,0x38] +// CHECK: ldrsb x18, [x22, w10, sxtw #0] // encoding: [0xd2,0xda,0xaa,0x38] + + ldrsh w3, [sp, x5] + ldrsh w9, [x27, x6, lsl #0] + ldrh w10, [x30, x7, lsl #1] + strh w11, [x29, x3, sxtx] + ldrh w12, [x28, xzr, sxtx #0] + ldrsh x13, [x27, x5, sxtx #1] + ldrh w14, [x26, w6, uxtw] + ldrh w15, [x25, w7, uxtw #0] + ldrsh w16, [x24, w8, uxtw #1] + ldrh w17, [x23, w9, sxtw] + ldrh w18, [x22, w10, sxtw #0] + strh w19, [x21, wzr, sxtw #1] +// CHECK: ldrsh w3, [sp, x5] // encoding: [0xe3,0x6b,0xe5,0x78] +// CHECK: ldrsh w9, [x27, x6] // encoding: [0x69,0x6b,0xe6,0x78] +// CHECK: ldrh w10, [x30, x7, lsl #1] // encoding: [0xca,0x7b,0x67,0x78] +// CHECK: strh w11, [x29, x3, sxtx] // encoding: [0xab,0xeb,0x23,0x78] +// CHECK: ldrh w12, [x28, xzr, sxtx] // encoding: [0x8c,0xeb,0x7f,0x78] +// CHECK: ldrsh x13, [x27, x5, sxtx #1] // encoding: [0x6d,0xfb,0xa5,0x78] +// CHECK: ldrh w14, [x26, w6, uxtw] // encoding: [0x4e,0x4b,0x66,0x78] +// CHECK: ldrh w15, [x25, w7, uxtw] // encoding: [0x2f,0x4b,0x67,0x78] +// CHECK: ldrsh w16, [x24, w8, uxtw #1] // encoding: [0x10,0x5b,0xe8,0x78] +// CHECK: ldrh w17, [x23, w9, sxtw] // encoding: [0xf1,0xca,0x69,0x78] +// CHECK: ldrh w18, [x22, w10, sxtw] // encoding: [0xd2,0xca,0x6a,0x78] +// CHECK: strh w19, [x21, wzr, sxtw #1] // encoding: [0xb3,0xda,0x3f,0x78] + + ldr w3, [sp, x5] + ldr s9, [x27, x6, lsl #0] + ldr w10, [x30, x7, lsl #2] + ldr w11, [x29, x3, sxtx] + str s12, [x28, xzr, sxtx #0] + str w13, [x27, x5, sxtx #2] + str w14, [x26, w6, uxtw] + ldr w15, [x25, w7, uxtw #0] + ldr w16, [x24, w8, uxtw #2] + ldrsw x17, [x23, w9, sxtw] + ldr w18, [x22, w10, sxtw #0] + ldrsw x19, [x21, wzr, sxtw #2] +// CHECK: ldr w3, [sp, x5] // encoding: [0xe3,0x6b,0x65,0xb8] +// CHECK: ldr s9, [x27, x6] // encoding: [0x69,0x6b,0x66,0xbc] +// CHECK: ldr w10, [x30, x7, lsl #2] // encoding: [0xca,0x7b,0x67,0xb8] +// CHECK: ldr w11, [x29, x3, sxtx] // encoding: [0xab,0xeb,0x63,0xb8] +// CHECK: str s12, [x28, xzr, sxtx] // encoding: [0x8c,0xeb,0x3f,0xbc] +// CHECK: str w13, [x27, x5, sxtx #2] // encoding: [0x6d,0xfb,0x25,0xb8] +// CHECK: str w14, [x26, w6, uxtw] // encoding: [0x4e,0x4b,0x26,0xb8] +// CHECK: ldr w15, [x25, w7, uxtw] // encoding: [0x2f,0x4b,0x67,0xb8] +// CHECK: ldr w16, [x24, w8, uxtw #2] // encoding: [0x10,0x5b,0x68,0xb8] +// CHECK: ldrsw x17, [x23, w9, sxtw] // encoding: [0xf1,0xca,0xa9,0xb8] +// CHECK: ldr w18, [x22, w10, sxtw] // encoding: [0xd2,0xca,0x6a,0xb8] +// CHECK: ldrsw x19, [x21, wzr, sxtw #2] // encoding: [0xb3,0xda,0xbf,0xb8] + + ldr x3, [sp, x5] + str x9, [x27, x6, lsl #0] + ldr d10, [x30, x7, lsl #3] + str x11, [x29, x3, sxtx] + ldr x12, [x28, xzr, sxtx #0] + ldr x13, [x27, x5, sxtx #3] + prfm pldl1keep, [x26, w6, uxtw] + ldr x15, [x25, w7, uxtw #0] + ldr x16, [x24, w8, uxtw #3] + ldr x17, [x23, w9, sxtw] + ldr x18, [x22, w10, sxtw #0] + str d19, [x21, wzr, sxtw #3] + prfm #6, [x0, x5] +// CHECK: ldr x3, [sp, x5] // encoding: [0xe3,0x6b,0x65,0xf8] +// CHECK: str x9, [x27, x6] // encoding: [0x69,0x6b,0x26,0xf8] +// CHECK: ldr d10, [x30, x7, lsl #3] // encoding: [0xca,0x7b,0x67,0xfc] +// CHECK: str x11, [x29, x3, sxtx] // encoding: [0xab,0xeb,0x23,0xf8] +// CHECK: ldr x12, [x28, xzr, sxtx] // encoding: [0x8c,0xeb,0x7f,0xf8] +// CHECK: ldr x13, [x27, x5, sxtx #3] // encoding: [0x6d,0xfb,0x65,0xf8] +// CHECK: prfm pldl1keep, [x26, w6, uxtw] // encoding: [0x40,0x4b,0xa6,0xf8] +// CHECK: ldr x15, [x25, w7, uxtw] // encoding: [0x2f,0x4b,0x67,0xf8] +// CHECK: ldr x16, [x24, w8, uxtw #3] // encoding: [0x10,0x5b,0x68,0xf8] +// CHECK: ldr x17, [x23, w9, sxtw] // encoding: [0xf1,0xca,0x69,0xf8] +// CHECK: ldr x18, [x22, w10, sxtw] // encoding: [0xd2,0xca,0x6a,0xf8] +// CHECK: str d19, [x21, wzr, sxtw #3] // encoding: [0xb3,0xda,0x3f,0xfc] +// CHECK: prfm #6, [x0, x5, lsl #0] // encoding: [0x06,0x68,0xa5,0xf8] + + ldr q3, [sp, x5] + ldr q9, [x27, x6, lsl #0] + ldr q10, [x30, x7, lsl #4] + str q11, [x29, x3, sxtx] + str q12, [x28, xzr, sxtx #0] + str q13, [x27, x5, sxtx #4] + ldr q14, [x26, w6, uxtw] + ldr q15, [x25, w7, uxtw #0] + ldr q16, [x24, w8, uxtw #4] + ldr q17, [x23, w9, sxtw] + str q18, [x22, w10, sxtw #0] + ldr q19, [x21, wzr, sxtw #4] +// CHECK: ldr q3, [sp, x5] // encoding: [0xe3,0x6b,0xe5,0x3c] +// CHECK: ldr q9, [x27, x6] // encoding: [0x69,0x6b,0xe6,0x3c] +// CHECK: ldr q10, [x30, x7, lsl #4] // encoding: [0xca,0x7b,0xe7,0x3c] +// CHECK: str q11, [x29, x3, sxtx] // encoding: [0xab,0xeb,0xa3,0x3c] +// CHECK: str q12, [x28, xzr, sxtx] // encoding: [0x8c,0xeb,0xbf,0x3c] +// CHECK: str q13, [x27, x5, sxtx #4] // encoding: [0x6d,0xfb,0xa5,0x3c] +// CHECK: ldr q14, [x26, w6, uxtw] // encoding: [0x4e,0x4b,0xe6,0x3c] +// CHECK: ldr q15, [x25, w7, uxtw] // encoding: [0x2f,0x4b,0xe7,0x3c] +// CHECK: ldr q16, [x24, w8, uxtw #4] // encoding: [0x10,0x5b,0xe8,0x3c] +// CHECK: ldr q17, [x23, w9, sxtw] // encoding: [0xf1,0xca,0xe9,0x3c] +// CHECK: str q18, [x22, w10, sxtw] // encoding: [0xd2,0xca,0xaa,0x3c] +// CHECK: ldr q19, [x21, wzr, sxtw #4] // encoding: [0xb3,0xda,0xff,0x3c] + +//------------------------------------------------------------------------------ +// Load/store register (immediate post-indexed) +//------------------------------------------------------------------------------ + + strb w9, [x2], #255 + strb w10, [x3], #1 + strb w10, [x3], #-256 + strh w9, [x2], #255 + strh w9, [x2], #1 + strh w10, [x3], #-256 +// CHECK: strb w9, [x2], #255 // encoding: [0x49,0xf4,0x0f,0x38] +// CHECK: strb w10, [x3], #1 // encoding: [0x6a,0x14,0x00,0x38] +// CHECK: strb w10, [x3], #-256 // encoding: [0x6a,0x04,0x10,0x38] +// CHECK: strh w9, [x2], #255 // encoding: [0x49,0xf4,0x0f,0x78] +// CHECK: strh w9, [x2], #1 // encoding: [0x49,0x14,0x00,0x78] +// CHECK: strh w10, [x3], #-256 // encoding: [0x6a,0x04,0x10,0x78] + + str w19, [sp], #255 + str w20, [x30], #1 + str w21, [x12], #-256 + str xzr, [x9], #255 + str x2, [x3], #1 + str x19, [x12], #-256 +// CHECK: str w19, [sp], #255 // encoding: [0xf3,0xf7,0x0f,0xb8] +// CHECK: str w20, [x30], #1 // encoding: [0xd4,0x17,0x00,0xb8] +// CHECK: str w21, [x12], #-256 // encoding: [0x95,0x05,0x10,0xb8] +// CHECK: str xzr, [x9], #255 // encoding: [0x3f,0xf5,0x0f,0xf8] +// CHECK: str x2, [x3], #1 // encoding: [0x62,0x14,0x00,0xf8] +// CHECK: str x19, [x12], #-256 // encoding: [0x93,0x05,0x10,0xf8] + + ldrb w9, [x2], #255 + ldrb w10, [x3], #1 + ldrb w10, [x3], #-256 + ldrh w9, [x2], #255 + ldrh w9, [x2], #1 + ldrh w10, [x3], #-256 +// CHECK: ldrb w9, [x2], #255 // encoding: [0x49,0xf4,0x4f,0x38] +// CHECK: ldrb w10, [x3], #1 // encoding: [0x6a,0x14,0x40,0x38] +// CHECK: ldrb w10, [x3], #-256 // encoding: [0x6a,0x04,0x50,0x38] +// CHECK: ldrh w9, [x2], #255 // encoding: [0x49,0xf4,0x4f,0x78] +// CHECK: ldrh w9, [x2], #1 // encoding: [0x49,0x14,0x40,0x78] +// CHECK: ldrh w10, [x3], #-256 // encoding: [0x6a,0x04,0x50,0x78] + + ldr w19, [sp], #255 + ldr w20, [x30], #1 + ldr w21, [x12], #-256 + ldr xzr, [x9], #255 + ldr x2, [x3], #1 + ldr x19, [x12], #-256 +// CHECK: ldr w19, [sp], #255 // encoding: [0xf3,0xf7,0x4f,0xb8] +// CHECK: ldr w20, [x30], #1 // encoding: [0xd4,0x17,0x40,0xb8] +// CHECK: ldr w21, [x12], #-256 // encoding: [0x95,0x05,0x50,0xb8] +// CHECK: ldr xzr, [x9], #255 // encoding: [0x3f,0xf5,0x4f,0xf8] +// CHECK: ldr x2, [x3], #1 // encoding: [0x62,0x14,0x40,0xf8] +// CHECK: ldr x19, [x12], #-256 // encoding: [0x93,0x05,0x50,0xf8] + + ldrsb xzr, [x9], #255 + ldrsb x2, [x3], #1 + ldrsb x19, [x12], #-256 + ldrsh xzr, [x9], #255 + ldrsh x2, [x3], #1 + ldrsh x19, [x12], #-256 + ldrsw xzr, [x9], #255 + ldrsw x2, [x3], #1 + ldrsw x19, [x12], #-256 +// CHECK: ldrsb xzr, [x9], #255 // encoding: [0x3f,0xf5,0x8f,0x38] +// CHECK: ldrsb x2, [x3], #1 // encoding: [0x62,0x14,0x80,0x38] +// CHECK: ldrsb x19, [x12], #-256 // encoding: [0x93,0x05,0x90,0x38] +// CHECK: ldrsh xzr, [x9], #255 // encoding: [0x3f,0xf5,0x8f,0x78] +// CHECK: ldrsh x2, [x3], #1 // encoding: [0x62,0x14,0x80,0x78] +// CHECK: ldrsh x19, [x12], #-256 // encoding: [0x93,0x05,0x90,0x78] +// CHECK: ldrsw xzr, [x9], #255 // encoding: [0x3f,0xf5,0x8f,0xb8] +// CHECK: ldrsw x2, [x3], #1 // encoding: [0x62,0x14,0x80,0xb8] +// CHECK: ldrsw x19, [x12], #-256 // encoding: [0x93,0x05,0x90,0xb8] + + ldrsb wzr, [x9], #255 + ldrsb w2, [x3], #1 + ldrsb w19, [x12], #-256 + ldrsh wzr, [x9], #255 + ldrsh w2, [x3], #1 + ldrsh w19, [x12], #-256 +// CHECK: ldrsb wzr, [x9], #255 // encoding: [0x3f,0xf5,0xcf,0x38] +// CHECK: ldrsb w2, [x3], #1 // encoding: [0x62,0x14,0xc0,0x38] +// CHECK: ldrsb w19, [x12], #-256 // encoding: [0x93,0x05,0xd0,0x38] +// CHECK: ldrsh wzr, [x9], #255 // encoding: [0x3f,0xf5,0xcf,0x78] +// CHECK: ldrsh w2, [x3], #1 // encoding: [0x62,0x14,0xc0,0x78] +// CHECK: ldrsh w19, [x12], #-256 // encoding: [0x93,0x05,0xd0,0x78] + + str b0, [x0], #255 + str b3, [x3], #1 + str b5, [sp], #-256 + str h10, [x10], #255 + str h13, [x23], #1 + str h15, [sp], #-256 + str s20, [x20], #255 + str s23, [x23], #1 + str s25, [x0], #-256 + str d20, [x20], #255 + str d23, [x23], #1 + str d25, [x0], #-256 +// CHECK: str b0, [x0], #255 // encoding: [0x00,0xf4,0x0f,0x3c] +// CHECK: str b3, [x3], #1 // encoding: [0x63,0x14,0x00,0x3c] +// CHECK: str b5, [sp], #-256 // encoding: [0xe5,0x07,0x10,0x3c] +// CHECK: str h10, [x10], #255 // encoding: [0x4a,0xf5,0x0f,0x7c] +// CHECK: str h13, [x23], #1 // encoding: [0xed,0x16,0x00,0x7c] +// CHECK: str h15, [sp], #-256 // encoding: [0xef,0x07,0x10,0x7c] +// CHECK: str s20, [x20], #255 // encoding: [0x94,0xf6,0x0f,0xbc] +// CHECK: str s23, [x23], #1 // encoding: [0xf7,0x16,0x00,0xbc] +// CHECK: str s25, [x0], #-256 // encoding: [0x19,0x04,0x10,0xbc] +// CHECK: str d20, [x20], #255 // encoding: [0x94,0xf6,0x0f,0xfc] +// CHECK: str d23, [x23], #1 // encoding: [0xf7,0x16,0x00,0xfc] +// CHECK: str d25, [x0], #-256 // encoding: [0x19,0x04,0x10,0xfc] + + ldr b0, [x0], #255 + ldr b3, [x3], #1 + ldr b5, [sp], #-256 + ldr h10, [x10], #255 + ldr h13, [x23], #1 + ldr h15, [sp], #-256 + ldr s20, [x20], #255 + ldr s23, [x23], #1 + ldr s25, [x0], #-256 + ldr d20, [x20], #255 + ldr d23, [x23], #1 + ldr d25, [x0], #-256 +// CHECK: ldr b0, [x0], #255 // encoding: [0x00,0xf4,0x4f,0x3c] +// CHECK: ldr b3, [x3], #1 // encoding: [0x63,0x14,0x40,0x3c] +// CHECK: ldr b5, [sp], #-256 // encoding: [0xe5,0x07,0x50,0x3c] +// CHECK: ldr h10, [x10], #255 // encoding: [0x4a,0xf5,0x4f,0x7c] +// CHECK: ldr h13, [x23], #1 // encoding: [0xed,0x16,0x40,0x7c] +// CHECK: ldr h15, [sp], #-256 // encoding: [0xef,0x07,0x50,0x7c] +// CHECK: ldr s20, [x20], #255 // encoding: [0x94,0xf6,0x4f,0xbc] +// CHECK: ldr s23, [x23], #1 // encoding: [0xf7,0x16,0x40,0xbc] +// CHECK: ldr s25, [x0], #-256 // encoding: [0x19,0x04,0x50,0xbc] +// CHECK: ldr d20, [x20], #255 // encoding: [0x94,0xf6,0x4f,0xfc] +// CHECK: ldr d23, [x23], #1 // encoding: [0xf7,0x16,0x40,0xfc] +// CHECK: ldr d25, [x0], #-256 // encoding: [0x19,0x04,0x50,0xfc] + + ldr q20, [x1], #255 + ldr q23, [x9], #1 + ldr q25, [x20], #-256 + str q10, [x1], #255 + str q22, [sp], #1 + str q21, [x20], #-256 +// CHECK: ldr q20, [x1], #255 // encoding: [0x34,0xf4,0xcf,0x3c] +// CHECK: ldr q23, [x9], #1 // encoding: [0x37,0x15,0xc0,0x3c] +// CHECK: ldr q25, [x20], #-256 // encoding: [0x99,0x06,0xd0,0x3c] +// CHECK: str q10, [x1], #255 // encoding: [0x2a,0xf4,0x8f,0x3c] +// CHECK: str q22, [sp], #1 // encoding: [0xf6,0x17,0x80,0x3c] +// CHECK: str q21, [x20], #-256 // encoding: [0x95,0x06,0x90,0x3c] + +//------------------------------------------------------------------------------ +// Load/store register (immediate pre-indexed) +//------------------------------------------------------------------------------ + + ldr x3, [x4, #0]! + ldr xzr, [sp, #0]! +// CHECK: ldr x3, [x4, #0]! // encoding: [0x83,0x0c,0x40,0xf8] +// CHECK: ldr xzr, [sp, #0]! // encoding: [0xff,0x0f,0x40,0xf8] + + strb w9, [x2, #255]! + strb w10, [x3, #1]! + strb w10, [x3, #-256]! + strh w9, [x2, #255]! + strh w9, [x2, #1]! + strh w10, [x3, #-256]! +// CHECK: strb w9, [x2, #255]! // encoding: [0x49,0xfc,0x0f,0x38] +// CHECK: strb w10, [x3, #1]! // encoding: [0x6a,0x1c,0x00,0x38] +// CHECK: strb w10, [x3, #-256]! // encoding: [0x6a,0x0c,0x10,0x38] +// CHECK: strh w9, [x2, #255]! // encoding: [0x49,0xfc,0x0f,0x78] +// CHECK: strh w9, [x2, #1]! // encoding: [0x49,0x1c,0x00,0x78] +// CHECK: strh w10, [x3, #-256]! // encoding: [0x6a,0x0c,0x10,0x78] + + str w19, [sp, #255]! + str w20, [x30, #1]! + str w21, [x12, #-256]! + str xzr, [x9, #255]! + str x2, [x3, #1]! + str x19, [x12, #-256]! +// CHECK: str w19, [sp, #255]! // encoding: [0xf3,0xff,0x0f,0xb8] +// CHECK: str w20, [x30, #1]! // encoding: [0xd4,0x1f,0x00,0xb8] +// CHECK: str w21, [x12, #-256]! // encoding: [0x95,0x0d,0x10,0xb8] +// CHECK: str xzr, [x9, #255]! // encoding: [0x3f,0xfd,0x0f,0xf8] +// CHECK: str x2, [x3, #1]! // encoding: [0x62,0x1c,0x00,0xf8] +// CHECK: str x19, [x12, #-256]! // encoding: [0x93,0x0d,0x10,0xf8] + + ldrb w9, [x2, #255]! + ldrb w10, [x3, #1]! + ldrb w10, [x3, #-256]! + ldrh w9, [x2, #255]! + ldrh w9, [x2, #1]! + ldrh w10, [x3, #-256]! +// CHECK: ldrb w9, [x2, #255]! // encoding: [0x49,0xfc,0x4f,0x38] +// CHECK: ldrb w10, [x3, #1]! // encoding: [0x6a,0x1c,0x40,0x38] +// CHECK: ldrb w10, [x3, #-256]! // encoding: [0x6a,0x0c,0x50,0x38] +// CHECK: ldrh w9, [x2, #255]! // encoding: [0x49,0xfc,0x4f,0x78] +// CHECK: ldrh w9, [x2, #1]! // encoding: [0x49,0x1c,0x40,0x78] +// CHECK: ldrh w10, [x3, #-256]! // encoding: [0x6a,0x0c,0x50,0x78] + + ldr w19, [sp, #255]! + ldr w20, [x30, #1]! + ldr w21, [x12, #-256]! + ldr xzr, [x9, #255]! + ldr x2, [x3, #1]! + ldr x19, [x12, #-256]! +// CHECK: ldr w19, [sp, #255]! // encoding: [0xf3,0xff,0x4f,0xb8] +// CHECK: ldr w20, [x30, #1]! // encoding: [0xd4,0x1f,0x40,0xb8] +// CHECK: ldr w21, [x12, #-256]! // encoding: [0x95,0x0d,0x50,0xb8] +// CHECK: ldr xzr, [x9, #255]! // encoding: [0x3f,0xfd,0x4f,0xf8] +// CHECK: ldr x2, [x3, #1]! // encoding: [0x62,0x1c,0x40,0xf8] +// CHECK: ldr x19, [x12, #-256]! // encoding: [0x93,0x0d,0x50,0xf8] + + ldrsb xzr, [x9, #255]! + ldrsb x2, [x3, #1]! + ldrsb x19, [x12, #-256]! + ldrsh xzr, [x9, #255]! + ldrsh x2, [x3, #1]! + ldrsh x19, [x12, #-256]! + ldrsw xzr, [x9, #255]! + ldrsw x2, [x3, #1]! + ldrsw x19, [x12, #-256]! +// CHECK: ldrsb xzr, [x9, #255]! // encoding: [0x3f,0xfd,0x8f,0x38] +// CHECK: ldrsb x2, [x3, #1]! // encoding: [0x62,0x1c,0x80,0x38] +// CHECK: ldrsb x19, [x12, #-256]! // encoding: [0x93,0x0d,0x90,0x38] +// CHECK: ldrsh xzr, [x9, #255]! // encoding: [0x3f,0xfd,0x8f,0x78] +// CHECK: ldrsh x2, [x3, #1]! // encoding: [0x62,0x1c,0x80,0x78] +// CHECK: ldrsh x19, [x12, #-256]! // encoding: [0x93,0x0d,0x90,0x78] +// CHECK: ldrsw xzr, [x9, #255]! // encoding: [0x3f,0xfd,0x8f,0xb8] +// CHECK: ldrsw x2, [x3, #1]! // encoding: [0x62,0x1c,0x80,0xb8] +// CHECK: ldrsw x19, [x12, #-256]! // encoding: [0x93,0x0d,0x90,0xb8] + + ldrsb wzr, [x9, #255]! + ldrsb w2, [x3, #1]! + ldrsb w19, [x12, #-256]! + ldrsh wzr, [x9, #255]! + ldrsh w2, [x3, #1]! + ldrsh w19, [x12, #-256]! +// CHECK: ldrsb wzr, [x9, #255]! // encoding: [0x3f,0xfd,0xcf,0x38] +// CHECK: ldrsb w2, [x3, #1]! // encoding: [0x62,0x1c,0xc0,0x38] +// CHECK: ldrsb w19, [x12, #-256]! // encoding: [0x93,0x0d,0xd0,0x38] +// CHECK: ldrsh wzr, [x9, #255]! // encoding: [0x3f,0xfd,0xcf,0x78] +// CHECK: ldrsh w2, [x3, #1]! // encoding: [0x62,0x1c,0xc0,0x78] +// CHECK: ldrsh w19, [x12, #-256]! // encoding: [0x93,0x0d,0xd0,0x78] + + str b0, [x0, #255]! + str b3, [x3, #1]! + str b5, [sp, #-256]! + str h10, [x10, #255]! + str h13, [x23, #1]! + str h15, [sp, #-256]! + str s20, [x20, #255]! + str s23, [x23, #1]! + str s25, [x0, #-256]! + str d20, [x20, #255]! + str d23, [x23, #1]! + str d25, [x0, #-256]! +// CHECK: str b0, [x0, #255]! // encoding: [0x00,0xfc,0x0f,0x3c] +// CHECK: str b3, [x3, #1]! // encoding: [0x63,0x1c,0x00,0x3c] +// CHECK: str b5, [sp, #-256]! // encoding: [0xe5,0x0f,0x10,0x3c] +// CHECK: str h10, [x10, #255]! // encoding: [0x4a,0xfd,0x0f,0x7c] +// CHECK: str h13, [x23, #1]! // encoding: [0xed,0x1e,0x00,0x7c] +// CHECK: str h15, [sp, #-256]! // encoding: [0xef,0x0f,0x10,0x7c] +// CHECK: str s20, [x20, #255]! // encoding: [0x94,0xfe,0x0f,0xbc] +// CHECK: str s23, [x23, #1]! // encoding: [0xf7,0x1e,0x00,0xbc] +// CHECK: str s25, [x0, #-256]! // encoding: [0x19,0x0c,0x10,0xbc] +// CHECK: str d20, [x20, #255]! // encoding: [0x94,0xfe,0x0f,0xfc] +// CHECK: str d23, [x23, #1]! // encoding: [0xf7,0x1e,0x00,0xfc] +// CHECK: str d25, [x0, #-256]! // encoding: [0x19,0x0c,0x10,0xfc] + + ldr b0, [x0, #255]! + ldr b3, [x3, #1]! + ldr b5, [sp, #-256]! + ldr h10, [x10, #255]! + ldr h13, [x23, #1]! + ldr h15, [sp, #-256]! + ldr s20, [x20, #255]! + ldr s23, [x23, #1]! + ldr s25, [x0, #-256]! + ldr d20, [x20, #255]! + ldr d23, [x23, #1]! + ldr d25, [x0, #-256]! +// CHECK: ldr b0, [x0, #255]! // encoding: [0x00,0xfc,0x4f,0x3c] +// CHECK: ldr b3, [x3, #1]! // encoding: [0x63,0x1c,0x40,0x3c] +// CHECK: ldr b5, [sp, #-256]! // encoding: [0xe5,0x0f,0x50,0x3c] +// CHECK: ldr h10, [x10, #255]! // encoding: [0x4a,0xfd,0x4f,0x7c] +// CHECK: ldr h13, [x23, #1]! // encoding: [0xed,0x1e,0x40,0x7c] +// CHECK: ldr h15, [sp, #-256]! // encoding: [0xef,0x0f,0x50,0x7c] +// CHECK: ldr s20, [x20, #255]! // encoding: [0x94,0xfe,0x4f,0xbc] +// CHECK: ldr s23, [x23, #1]! // encoding: [0xf7,0x1e,0x40,0xbc] +// CHECK: ldr s25, [x0, #-256]! // encoding: [0x19,0x0c,0x50,0xbc] +// CHECK: ldr d20, [x20, #255]! // encoding: [0x94,0xfe,0x4f,0xfc] +// CHECK: ldr d23, [x23, #1]! // encoding: [0xf7,0x1e,0x40,0xfc] +// CHECK: ldr d25, [x0, #-256]! // encoding: [0x19,0x0c,0x50,0xfc] + + ldr q20, [x1, #255]! + ldr q23, [x9, #1]! + ldr q25, [x20, #-256]! + str q10, [x1, #255]! + str q22, [sp, #1]! + str q21, [x20, #-256]! +// CHECK: ldr q20, [x1, #255]! // encoding: [0x34,0xfc,0xcf,0x3c] +// CHECK: ldr q23, [x9, #1]! // encoding: [0x37,0x1d,0xc0,0x3c] +// CHECK: ldr q25, [x20, #-256]! // encoding: [0x99,0x0e,0xd0,0x3c] +// CHECK: str q10, [x1, #255]! // encoding: [0x2a,0xfc,0x8f,0x3c] +// CHECK: str q22, [sp, #1]! // encoding: [0xf6,0x1f,0x80,0x3c] +// CHECK: str q21, [x20, #-256]! // encoding: [0x95,0x0e,0x90,0x3c] + +//------------------------------------------------------------------------------ +// Load/store (unprivileged) +//------------------------------------------------------------------------------ + + sttrb w9, [sp, #0] + sttrh wzr, [x12, #255] + sttr w16, [x0, #-256] + sttr x28, [x14, #1] +// CHECK: sttrb w9, [sp] // encoding: [0xe9,0x0b,0x00,0x38] +// CHECK: sttrh wzr, [x12, #255] // encoding: [0x9f,0xf9,0x0f,0x78] +// CHECK: sttr w16, [x0, #-256] // encoding: [0x10,0x08,0x10,0xb8] +// CHECK: sttr x28, [x14, #1] // encoding: [0xdc,0x19,0x00,0xf8] + + ldtrb w1, [x20, #255] + ldtrh w20, [x1, #255] + ldtr w12, [sp, #255] + ldtr xzr, [x12, #255] +// CHECK: ldtrb w1, [x20, #255] // encoding: [0x81,0xfa,0x4f,0x38] +// CHECK: ldtrh w20, [x1, #255] // encoding: [0x34,0xf8,0x4f,0x78] +// CHECK: ldtr w12, [sp, #255] // encoding: [0xec,0xfb,0x4f,0xb8] +// CHECK: ldtr xzr, [x12, #255] // encoding: [0x9f,0xf9,0x4f,0xf8] + + ldtrsb x9, [x7, #-256] + ldtrsh x17, [x19, #-256] + ldtrsw x20, [x15, #-256] + ldtrsb w19, [x1, #-256] + ldtrsh w15, [x21, #-256] +// CHECK: ldtrsb x9, [x7, #-256] // encoding: [0xe9,0x08,0x90,0x38] +// CHECK: ldtrsh x17, [x19, #-256] // encoding: [0x71,0x0a,0x90,0x78] +// CHECK: ldtrsw x20, [x15, #-256] // encoding: [0xf4,0x09,0x90,0xb8] +// CHECK: ldtrsb w19, [x1, #-256] // encoding: [0x33,0x08,0xd0,0x38] +// CHECK: ldtrsh w15, [x21, #-256] // encoding: [0xaf,0x0a,0xd0,0x78] + +//------------------------------------------------------------------------------ +// Load/store register pair (offset) +//------------------------------------------------------------------------------ + + ldp w3, w5, [sp] + stp wzr, w9, [sp, #252] + ldp w2, wzr, [sp, #-256] + ldp w9, w10, [sp, #4] +// CHECK: ldp w3, w5, [sp] // encoding: [0xe3,0x17,0x40,0x29] +// CHECK: stp wzr, w9, [sp, #252] // encoding: [0xff,0xa7,0x1f,0x29] +// CHECK: ldp w2, wzr, [sp, #-256] // encoding: [0xe2,0x7f,0x60,0x29] +// CHECK: ldp w9, w10, [sp, #4] // encoding: [0xe9,0xab,0x40,0x29] + + ldpsw x9, x10, [sp, #4] + ldpsw x9, x10, [x2, #-256] + ldpsw x20, x30, [sp, #252] +// CHECK: ldpsw x9, x10, [sp, #4] // encoding: [0xe9,0xab,0x40,0x69] +// CHECK: ldpsw x9, x10, [x2, #-256] // encoding: [0x49,0x28,0x60,0x69] +// CHECK: ldpsw x20, x30, [sp, #252] // encoding: [0xf4,0xfb,0x5f,0x69] + + ldp x21, x29, [x2, #504] + ldp x22, x23, [x3, #-512] + ldp x24, x25, [x4, #8] +// CHECK: ldp x21, x29, [x2, #504] // encoding: [0x55,0xf4,0x5f,0xa9] +// CHECK: ldp x22, x23, [x3, #-512] // encoding: [0x76,0x5c,0x60,0xa9] +// CHECK: ldp x24, x25, [x4, #8] // encoding: [0x98,0xe4,0x40,0xa9] + + ldp s29, s28, [sp, #252] + stp s27, s26, [sp, #-256] + ldp s1, s2, [x3, #44] +// CHECK: ldp s29, s28, [sp, #252] // encoding: [0xfd,0xf3,0x5f,0x2d] +// CHECK: stp s27, s26, [sp, #-256] // encoding: [0xfb,0x6b,0x20,0x2d] +// CHECK: ldp s1, s2, [x3, #44] // encoding: [0x61,0x88,0x45,0x2d] + + stp d3, d5, [x9, #504] + stp d7, d11, [x10, #-512] + ldp d2, d3, [x30, #-8] +// CHECK: stp d3, d5, [x9, #504] // encoding: [0x23,0x95,0x1f,0x6d] +// CHECK: stp d7, d11, [x10, #-512] // encoding: [0x47,0x2d,0x20,0x6d] +// CHECK: ldp d2, d3, [x30, #-8] // encoding: [0xc2,0x8f,0x7f,0x6d] + + stp q3, q5, [sp] + stp q17, q19, [sp, #1008] + ldp q23, q29, [x1, #-1024] +// CHECK: stp q3, q5, [sp] // encoding: [0xe3,0x17,0x00,0xad] +// CHECK: stp q17, q19, [sp, #1008] // encoding: [0xf1,0xcf,0x1f,0xad] +// CHECK: ldp q23, q29, [x1, #-1024] // encoding: [0x37,0x74,0x60,0xad] + +//------------------------------------------------------------------------------ +// Load/store register pair (post-indexed) +//------------------------------------------------------------------------------ + + ldp w3, w5, [sp], #0 + stp wzr, w9, [sp], #252 + ldp w2, wzr, [sp], #-256 + ldp w9, w10, [sp], #4 +// CHECK: ldp w3, w5, [sp], #0 // encoding: [0xe3,0x17,0xc0,0x28] +// CHECK: stp wzr, w9, [sp], #252 // encoding: [0xff,0xa7,0x9f,0x28] +// CHECK: ldp w2, wzr, [sp], #-256 // encoding: [0xe2,0x7f,0xe0,0x28] +// CHECK: ldp w9, w10, [sp], #4 // encoding: [0xe9,0xab,0xc0,0x28] + + ldpsw x9, x10, [sp], #4 + ldpsw x9, x10, [x2], #-256 + ldpsw x20, x30, [sp], #252 +// CHECK: ldpsw x9, x10, [sp], #4 // encoding: [0xe9,0xab,0xc0,0x68] +// CHECK: ldpsw x9, x10, [x2], #-256 // encoding: [0x49,0x28,0xe0,0x68] +// CHECK: ldpsw x20, x30, [sp], #252 // encoding: [0xf4,0xfb,0xdf,0x68] + + ldp x21, x29, [x2], #504 + ldp x22, x23, [x3], #-512 + ldp x24, x25, [x4], #8 +// CHECK: ldp x21, x29, [x2], #504 // encoding: [0x55,0xf4,0xdf,0xa8] +// CHECK: ldp x22, x23, [x3], #-512 // encoding: [0x76,0x5c,0xe0,0xa8] +// CHECK: ldp x24, x25, [x4], #8 // encoding: [0x98,0xe4,0xc0,0xa8] + + ldp s29, s28, [sp], #252 + stp s27, s26, [sp], #-256 + ldp s1, s2, [x3], #44 +// CHECK: ldp s29, s28, [sp], #252 // encoding: [0xfd,0xf3,0xdf,0x2c] +// CHECK: stp s27, s26, [sp], #-256 // encoding: [0xfb,0x6b,0xa0,0x2c] +// CHECK: ldp s1, s2, [x3], #44 // encoding: [0x61,0x88,0xc5,0x2c] + + stp d3, d5, [x9], #504 + stp d7, d11, [x10], #-512 + ldp d2, d3, [x30], #-8 +// CHECK: stp d3, d5, [x9], #504 // encoding: [0x23,0x95,0x9f,0x6c] +// CHECK: stp d7, d11, [x10], #-512 // encoding: [0x47,0x2d,0xa0,0x6c] +// CHECK: ldp d2, d3, [x30], #-8 // encoding: [0xc2,0x8f,0xff,0x6c] + + stp q3, q5, [sp], #0 + stp q17, q19, [sp], #1008 + ldp q23, q29, [x1], #-1024 +// CHECK: stp q3, q5, [sp], #0 // encoding: [0xe3,0x17,0x80,0xac] +// CHECK: stp q17, q19, [sp], #1008 // encoding: [0xf1,0xcf,0x9f,0xac] +// CHECK: ldp q23, q29, [x1], #-1024 // encoding: [0x37,0x74,0xe0,0xac] + +//------------------------------------------------------------------------------ +// Load/store register pair (pre-indexed) +//------------------------------------------------------------------------------ + ldp w3, w5, [sp, #0]! + stp wzr, w9, [sp, #252]! + ldp w2, wzr, [sp, #-256]! + ldp w9, w10, [sp, #4]! +// CHECK: ldp w3, w5, [sp, #0]! // encoding: [0xe3,0x17,0xc0,0x29] +// CHECK: stp wzr, w9, [sp, #252]! // encoding: [0xff,0xa7,0x9f,0x29] +// CHECK: ldp w2, wzr, [sp, #-256]! // encoding: [0xe2,0x7f,0xe0,0x29] +// CHECK: ldp w9, w10, [sp, #4]! // encoding: [0xe9,0xab,0xc0,0x29] + + ldpsw x9, x10, [sp, #4]! + ldpsw x9, x10, [x2, #-256]! + ldpsw x20, x30, [sp, #252]! +// CHECK: ldpsw x9, x10, [sp, #4]! // encoding: [0xe9,0xab,0xc0,0x69] +// CHECK: ldpsw x9, x10, [x2, #-256]! // encoding: [0x49,0x28,0xe0,0x69] +// CHECK: ldpsw x20, x30, [sp, #252]! // encoding: [0xf4,0xfb,0xdf,0x69] + + ldp x21, x29, [x2, #504]! + ldp x22, x23, [x3, #-512]! + ldp x24, x25, [x4, #8]! +// CHECK: ldp x21, x29, [x2, #504]! // encoding: [0x55,0xf4,0xdf,0xa9] +// CHECK: ldp x22, x23, [x3, #-512]! // encoding: [0x76,0x5c,0xe0,0xa9] +// CHECK: ldp x24, x25, [x4, #8]! // encoding: [0x98,0xe4,0xc0,0xa9] + + ldp s29, s28, [sp, #252]! + stp s27, s26, [sp, #-256]! + ldp s1, s2, [x3, #44]! +// CHECK: ldp s29, s28, [sp, #252]! // encoding: [0xfd,0xf3,0xdf,0x2d] +// CHECK: stp s27, s26, [sp, #-256]! // encoding: [0xfb,0x6b,0xa0,0x2d] +// CHECK: ldp s1, s2, [x3, #44]! // encoding: [0x61,0x88,0xc5,0x2d] + + stp d3, d5, [x9, #504]! + stp d7, d11, [x10, #-512]! + ldp d2, d3, [x30, #-8]! +// CHECK: stp d3, d5, [x9, #504]! // encoding: [0x23,0x95,0x9f,0x6d] +// CHECK: stp d7, d11, [x10, #-512]! // encoding: [0x47,0x2d,0xa0,0x6d] +// CHECK: ldp d2, d3, [x30, #-8]! // encoding: [0xc2,0x8f,0xff,0x6d] + + stp q3, q5, [sp, #0]! + stp q17, q19, [sp, #1008]! + ldp q23, q29, [x1, #-1024]! +// CHECK: stp q3, q5, [sp, #0]! // encoding: [0xe3,0x17,0x80,0xad] +// CHECK: stp q17, q19, [sp, #1008]! // encoding: [0xf1,0xcf,0x9f,0xad] +// CHECK: ldp q23, q29, [x1, #-1024]! // encoding: [0x37,0x74,0xe0,0xad] + +//------------------------------------------------------------------------------ +// Load/store non-temporal register pair (offset) +//------------------------------------------------------------------------------ + + ldnp w3, w5, [sp] + stnp wzr, w9, [sp, #252] + ldnp w2, wzr, [sp, #-256] + ldnp w9, w10, [sp, #4] +// CHECK: ldnp w3, w5, [sp] // encoding: [0xe3,0x17,0x40,0x28] +// CHECK: stnp wzr, w9, [sp, #252] // encoding: [0xff,0xa7,0x1f,0x28] +// CHECK: ldnp w2, wzr, [sp, #-256] // encoding: [0xe2,0x7f,0x60,0x28] +// CHECK: ldnp w9, w10, [sp, #4] // encoding: [0xe9,0xab,0x40,0x28] + + ldnp x21, x29, [x2, #504] + ldnp x22, x23, [x3, #-512] + ldnp x24, x25, [x4, #8] +// CHECK: ldnp x21, x29, [x2, #504] // encoding: [0x55,0xf4,0x5f,0xa8] +// CHECK: ldnp x22, x23, [x3, #-512] // encoding: [0x76,0x5c,0x60,0xa8] +// CHECK: ldnp x24, x25, [x4, #8] // encoding: [0x98,0xe4,0x40,0xa8] + + ldnp s29, s28, [sp, #252] + stnp s27, s26, [sp, #-256] + ldnp s1, s2, [x3, #44] +// CHECK: ldnp s29, s28, [sp, #252] // encoding: [0xfd,0xf3,0x5f,0x2c] +// CHECK: stnp s27, s26, [sp, #-256] // encoding: [0xfb,0x6b,0x20,0x2c] +// CHECK: ldnp s1, s2, [x3, #44] // encoding: [0x61,0x88,0x45,0x2c] + + stnp d3, d5, [x9, #504] + stnp d7, d11, [x10, #-512] + ldnp d2, d3, [x30, #-8] +// CHECK: stnp d3, d5, [x9, #504] // encoding: [0x23,0x95,0x1f,0x6c] +// CHECK: stnp d7, d11, [x10, #-512] // encoding: [0x47,0x2d,0x20,0x6c] +// CHECK: ldnp d2, d3, [x30, #-8] // encoding: [0xc2,0x8f,0x7f,0x6c] + + stnp q3, q5, [sp] + stnp q17, q19, [sp, #1008] + ldnp q23, q29, [x1, #-1024] +// CHECK: stnp q3, q5, [sp] // encoding: [0xe3,0x17,0x00,0xac] +// CHECK: stnp q17, q19, [sp, #1008] // encoding: [0xf1,0xcf,0x1f,0xac] +// CHECK: ldnp q23, q29, [x1, #-1024] // encoding: [0x37,0x74,0x60,0xac] + +//------------------------------------------------------------------------------ +// Logical (immediate) +//------------------------------------------------------------------------------ + // 32 bit replication-width + orr w3, w9, #0xffff0000 + orr wsp, w10, #0xe00000ff + orr w9, w10, #0x000003ff +// CHECK: orr w3, w9, #0xffff0000 // encoding: [0x23,0x3d,0x10,0x32] +// CHECK: orr wsp, w10, #0xe00000ff // encoding: [0x5f,0x29,0x03,0x32] +// CHECK: orr w9, w10, #0x3ff // encoding: [0x49,0x25,0x00,0x32] + + // 16 bit replication width + and w14, w15, #0x80008000 + and w12, w13, #0xffc3ffc3 + and w11, wzr, #0x00030003 +// CHECK: and w14, w15, #0x80008000 // encoding: [0xee,0x81,0x01,0x12] +// CHECK: and w12, w13, #0xffc3ffc3 // encoding: [0xac,0xad,0x0a,0x12] +// CHECK: and w11, wzr, #0x30003 // encoding: [0xeb,0x87,0x00,0x12] + + // 8 bit replication width + eor w3, w6, #0xe0e0e0e0 + eor wsp, wzr, #0x03030303 + eor w16, w17, #0x81818181 +// CHECK: eor w3, w6, #0xe0e0e0e0 // encoding: [0xc3,0xc8,0x03,0x52] +// CHECK: eor wsp, wzr, #0x3030303 // encoding: [0xff,0xc7,0x00,0x52] +// CHECK: eor w16, w17, #0x81818181 // encoding: [0x30,0xc6,0x01,0x52] + + // 4 bit replication width + ands wzr, w18, #0xcccccccc + ands w19, w20, #0x33333333 + ands w21, w22, #0x99999999 +// CHECK: ands wzr, w18, #0xcccccccc // encoding: [0x5f,0xe6,0x02,0x72] +// CHECK: ands w19, w20, #0x33333333 // encoding: [0x93,0xe6,0x00,0x72] +// CHECK: ands w21, w22, #0x99999999 // encoding: [0xd5,0xe6,0x01,0x72] + + // 2 bit replication width + tst w3, #0xaaaaaaaa + tst wzr, #0x55555555 +// CHECK: ands wzr, w3, #0xaaaaaaaa // encoding: [0x7f,0xf0,0x01,0x72] +// CHECK: ands wzr, wzr, #0x55555555 // encoding: [0xff,0xf3,0x00,0x72] + + // 64 bit replication-width + eor x3, x5, #0xffffffffc000000 + and x9, x10, #0x00007fffffffffff + orr x11, x12, #0x8000000000000fff +// CHECK: eor x3, x5, #0xffffffffc000000 // encoding: [0xa3,0x84,0x66,0xd2] +// CHECK: and x9, x10, #0x7fffffffffff // encoding: [0x49,0xb9,0x40,0x92] +// CHECK: orr x11, x12, #0x8000000000000fff // encoding: [0x8b,0x31,0x41,0xb2] + + // 32 bit replication-width + orr x3, x9, #0xffff0000ffff0000 + orr sp, x10, #0xe00000ffe00000ff + orr x9, x10, #0x000003ff000003ff +// CHECK: orr x3, x9, #0xffff0000ffff0000 // encoding: [0x23,0x3d,0x10,0xb2] +// CHECK: orr sp, x10, #0xe00000ffe00000ff // encoding: [0x5f,0x29,0x03,0xb2] +// CHECK: orr x9, x10, #0x3ff000003ff // encoding: [0x49,0x25,0x00,0xb2] + + // 16 bit replication-width + and x14, x15, #0x8000800080008000 + and x12, x13, #0xffc3ffc3ffc3ffc3 + and x11, xzr, #0x0003000300030003 +// CHECK: and x14, x15, #0x8000800080008000 // encoding: [0xee,0x81,0x01,0x92] +// CHECK: and x12, x13, #0xffc3ffc3ffc3ffc3 // encoding: [0xac,0xad,0x0a,0x92] +// CHECK: and x11, xzr, #0x3000300030003 // encoding: [0xeb,0x87,0x00,0x92] + + // 8 bit replication-width + eor x3, x6, #0xe0e0e0e0e0e0e0e0 + eor sp, xzr, #0x0303030303030303 + eor x16, x17, #0x8181818181818181 +// CHECK: eor x3, x6, #0xe0e0e0e0e0e0e0e0 // encoding: [0xc3,0xc8,0x03,0xd2] +// CHECK: eor sp, xzr, #0x303030303030303 // encoding: [0xff,0xc7,0x00,0xd2] +// CHECK: eor x16, x17, #0x8181818181818181 // encoding: [0x30,0xc6,0x01,0xd2] + + // 4 bit replication-width + ands xzr, x18, #0xcccccccccccccccc + ands x19, x20, #0x3333333333333333 + ands x21, x22, #0x9999999999999999 +// CHECK: ands xzr, x18, #0xcccccccccccccccc // encoding: [0x5f,0xe6,0x02,0xf2] +// CHECK: ands x19, x20, #0x3333333333333333 // encoding: [0x93,0xe6,0x00,0xf2] +// CHECK: ands x21, x22, #0x9999999999999999 // encoding: [0xd5,0xe6,0x01,0xf2] + + // 2 bit replication-width + tst x3, #0xaaaaaaaaaaaaaaaa + tst xzr, #0x5555555555555555 +// CHECK: ands xzr, x3, #0xaaaaaaaaaaaaaaaa // encoding: [0x7f,0xf0,0x01,0xf2] +// CHECK: ands xzr, xzr, #0x5555555555555555 // encoding: [0xff,0xf3,0x00,0xf2] + + mov w3, #0xf000f + mov x10, #0xaaaaaaaaaaaaaaaa +// CHECK: orr w3, wzr, #0xf000f // encoding: [0xe3,0x8f,0x00,0x32] +// CHECK: orr x10, xzr, #0xaaaaaaaaaaaaaaaa // encoding: [0xea,0xf3,0x01,0xb2] + +//------------------------------------------------------------------------------ +// Logical (shifted register) +//------------------------------------------------------------------------------ + + and w12, w23, w21 + and w16, w15, w1, lsl #1 + and w9, w4, w10, lsl #31 + and w3, w30, w11, lsl #0 + and x3, x5, x7, lsl #63 +// CHECK: and w12, w23, w21 // encoding: [0xec,0x02,0x15,0x0a] +// CHECK: and w16, w15, w1, lsl #1 // encoding: [0xf0,0x05,0x01,0x0a] +// CHECK: and w9, w4, w10, lsl #31 // encoding: [0x89,0x7c,0x0a,0x0a] +// CHECK: and w3, w30, w11 // encoding: [0xc3,0x03,0x0b,0x0a] +// CHECK: and x3, x5, x7, lsl #63 // encoding: [0xa3,0xfc,0x07,0x8a] + + and x5, x14, x19, asr #4 + and w3, w17, w19, ror #31 + and w0, w2, wzr, lsr #17 + and w3, w30, w11, asr #0 +// CHECK: and x5, x14, x19, asr #4 // encoding: [0xc5,0x11,0x93,0x8a] +// CHECK: and w3, w17, w19, ror #31 // encoding: [0x23,0x7e,0xd3,0x0a] +// CHECK: and w0, w2, wzr, lsr #17 // encoding: [0x40,0x44,0x5f,0x0a] +// CHECK: and w3, w30, w11, asr #0 // encoding: [0xc3,0x03,0x8b,0x0a] + + and xzr, x4, x26, lsl #0 + and w3, wzr, w20, ror #0 + and x7, x20, xzr, asr #63 +// CHECK: and xzr, x4, x26 // encoding: [0x9f,0x00,0x1a,0x8a] +// CHECK: and w3, wzr, w20, ror #0 // encoding: [0xe3,0x03,0xd4,0x0a] +// CHECK: and x7, x20, xzr, asr #63 // encoding: [0x87,0xfe,0x9f,0x8a] + + bic x13, x20, x14, lsl #47 + bic w2, w7, w9 + orr w2, w7, w0, asr #31 + orr x8, x9, x10, lsl #12 + orn x3, x5, x7, asr #0 + orn w2, w5, w29 +// CHECK: bic x13, x20, x14, lsl #47 // encoding: [0x8d,0xbe,0x2e,0x8a] +// CHECK: bic w2, w7, w9 // encoding: [0xe2,0x00,0x29,0x0a] +// CHECK: orr w2, w7, w0, asr #31 // encoding: [0xe2,0x7c,0x80,0x2a] +// CHECK: orr x8, x9, x10, lsl #12 // encoding: [0x28,0x31,0x0a,0xaa] +// CHECK: orn x3, x5, x7, asr #0 // encoding: [0xa3,0x00,0xa7,0xaa] +// CHECK: orn w2, w5, w29 // encoding: [0xa2,0x00,0x3d,0x2a] + + ands w7, wzr, w9, lsl #1 + ands x3, x5, x20, ror #63 + bics w3, w5, w7, lsl #0 + bics x3, xzr, x3, lsl #1 +// CHECK: ands w7, wzr, w9, lsl #1 // encoding: [0xe7,0x07,0x09,0x6a] +// CHECK: ands x3, x5, x20, ror #63 // encoding: [0xa3,0xfc,0xd4,0xea] +// CHECK: bics w3, w5, w7 // encoding: [0xa3,0x00,0x27,0x6a] +// CHECK: bics x3, xzr, x3, lsl #1 // encoding: [0xe3,0x07,0x23,0xea] + + tst w3, w7, lsl #31 + tst x2, x20, asr #0 +// CHECK: tst w3, w7, lsl #31 // encoding: [0x7f,0x7c,0x07,0x6a] +// CHECK: tst x2, x20, asr #0 // encoding: [0x5f,0x00,0x94,0xea] + + mov x3, x6 + mov x3, xzr + mov wzr, w2 + mov w3, w5 +// CHECK: mov x3, x6 // encoding: [0xe3,0x03,0x06,0xaa] +// CHECK: mov x3, xzr // encoding: [0xe3,0x03,0x1f,0xaa] +// CHECK: mov wzr, w2 // encoding: [0xff,0x03,0x02,0x2a] +// CHECK: mov w3, w5 // encoding: [0xe3,0x03,0x05,0x2a] + +//------------------------------------------------------------------------------ +// Move wide (immediate) +//------------------------------------------------------------------------------ + + movz w1, #65535, lsl #0 + movz w2, #0, lsl #16 + movn w2, #1234, lsl #0 +// CHECK: movz w1, #65535 // encoding: [0xe1,0xff,0x9f,0x52] +// CHECK: movz w2, #0, lsl #16 // encoding: [0x02,0x00,0xa0,0x52] +// CHECK: movn w2, #1234 // encoding: [0x42,0x9a,0x80,0x12] + + movz x2, #1234, lsl #32 + movk xzr, #4321, lsl #48 +// CHECK: movz x2, #1234, lsl #32 // encoding: [0x42,0x9a,0xc0,0xd2] +// CHECK: movk xzr, #4321, lsl #48 // encoding: [0x3f,0x1c,0xe2,0xf2] + + movz x2, #:abs_g0:sym + movk w3, #:abs_g0_nc:sym +// CHECK: movz x2, #:abs_g0:sym // encoding: [0x02'A',A,0x80'A',0xd2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g0:sym, kind: fixup_a64_movw_uabs_g0 +// CHECK: movk w3, #:abs_g0_nc:sym // encoding: [0x03'A',A,0x80'A',0x72'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g0_nc:sym, kind: fixup_a64_movw_uabs_g0_nc + + movz x4, #:abs_g1:sym + movk w5, #:abs_g1_nc:sym +// CHECK: movz x4, #:abs_g1:sym // encoding: [0x04'A',A,0xa0'A',0xd2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g1:sym, kind: fixup_a64_movw_uabs_g1 +// CHECK: movk w5, #:abs_g1_nc:sym // encoding: [0x05'A',A,0xa0'A',0x72'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g1_nc:sym, kind: fixup_a64_movw_uabs_g1_nc + + movz x6, #:abs_g2:sym + movk x7, #:abs_g2_nc:sym +// CHECK: movz x6, #:abs_g2:sym // encoding: [0x06'A',A,0xc0'A',0xd2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g2:sym, kind: fixup_a64_movw_uabs_g2 +// CHECK: movk x7, #:abs_g2_nc:sym // encoding: [0x07'A',A,0xc0'A',0xf2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g2_nc:sym, kind: fixup_a64_movw_uabs_g2_nc + + movz x8, #:abs_g3:sym + movk x9, #:abs_g3:sym +// CHECK: movz x8, #:abs_g3:sym // encoding: [0x08'A',A,0xe0'A',0xd2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g3:sym, kind: fixup_a64_movw_uabs_g3 +// CHECK: movk x9, #:abs_g3:sym // encoding: [0x09'A',A,0xe0'A',0xf2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g3:sym, kind: fixup_a64_movw_uabs_g3 + + movn x30, #:abs_g0_s:sym + movz x19, #:abs_g0_s:sym + movn w10, #:abs_g0_s:sym + movz w25, #:abs_g0_s:sym +// CHECK: movn x30, #:abs_g0_s:sym // encoding: [0x1e'A',A,0x80'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g0_s:sym, kind: fixup_a64_movw_sabs_g0 +// CHECK: movz x19, #:abs_g0_s:sym // encoding: [0x13'A',A,0x80'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g0_s:sym, kind: fixup_a64_movw_sabs_g0 +// CHECK: movn w10, #:abs_g0_s:sym // encoding: [0x0a'A',A,0x80'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g0_s:sym, kind: fixup_a64_movw_sabs_g0 +// CHECK: movz w25, #:abs_g0_s:sym // encoding: [0x19'A',A,0x80'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g0_s:sym, kind: fixup_a64_movw_sabs_g0 + + movn x30, #:abs_g1_s:sym + movz x19, #:abs_g1_s:sym + movn w10, #:abs_g1_s:sym + movz w25, #:abs_g1_s:sym +// CHECK: movn x30, #:abs_g1_s:sym // encoding: [0x1e'A',A,0xa0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g1_s:sym, kind: fixup_a64_movw_sabs_g1 +// CHECK: movz x19, #:abs_g1_s:sym // encoding: [0x13'A',A,0xa0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g1_s:sym, kind: fixup_a64_movw_sabs_g1 +// CHECK: movn w10, #:abs_g1_s:sym // encoding: [0x0a'A',A,0xa0'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g1_s:sym, kind: fixup_a64_movw_sabs_g1 +// CHECK: movz w25, #:abs_g1_s:sym // encoding: [0x19'A',A,0xa0'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g1_s:sym, kind: fixup_a64_movw_sabs_g1 + + movn x30, #:abs_g2_s:sym + movz x19, #:abs_g2_s:sym +// CHECK: movn x30, #:abs_g2_s:sym // encoding: [0x1e'A',A,0xc0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g2_s:sym, kind: fixup_a64_movw_sabs_g2 +// CHECK: movz x19, #:abs_g2_s:sym // encoding: [0x13'A',A,0xc0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :abs_g2_s:sym, kind: fixup_a64_movw_sabs_g2 + +//------------------------------------------------------------------------------ +// PC-relative addressing +//------------------------------------------------------------------------------ + + adr x2, loc + adr xzr, loc + // CHECK: adr x2, loc // encoding: [0x02'A',A,A,0x10'A'] + // CHECK: // fixup A - offset: 0, value: loc, kind: fixup_a64_adr_prel + // CHECK: adr xzr, loc // encoding: [0x1f'A',A,A,0x10'A'] + // CHECK: // fixup A - offset: 0, value: loc, kind: fixup_a64_adr_prel + + adrp x29, loc + // CHECK: adrp x29, loc // encoding: [0x1d'A',A,A,0x90'A'] + // CHECK: // fixup A - offset: 0, value: loc, kind: fixup_a64_adr_prel_page + + adrp x30, #4096 + adr x20, #0 + adr x9, #-1 + adr x5, #1048575 +// CHECK: adrp x30, #4096 // encoding: [0x1e,0x00,0x00,0xb0] +// CHECK: adr x20, #0 // encoding: [0x14,0x00,0x00,0x10] +// CHECK: adr x9, #-1 // encoding: [0xe9,0xff,0xff,0x70] +// CHECK: adr x5, #1048575 // encoding: [0xe5,0xff,0x7f,0x70] + + adr x9, #1048575 + adr x2, #-1048576 + adrp x9, #4294963200 + adrp x20, #-4294967296 +// CHECK: adr x9, #1048575 // encoding: [0xe9,0xff,0x7f,0x70] +// CHECK: adr x2, #-1048576 // encoding: [0x02,0x00,0x80,0x10] +// CHECK: adrp x9, #4294963200 // encoding: [0xe9,0xff,0x7f,0xf0] +// CHECK: adrp x20, #-4294967296 // encoding: [0x14,0x00,0x80,0x90] + +//------------------------------------------------------------------------------ +// System +//------------------------------------------------------------------------------ + + hint #0 + hint #127 +// CHECK: nop // encoding: [0x1f,0x20,0x03,0xd5] +// CHECK: hint #127 // encoding: [0xff,0x2f,0x03,0xd5] + + nop + yield + wfe + wfi + sev + sevl +// CHECK: nop // encoding: [0x1f,0x20,0x03,0xd5] +// CHECK: yield // encoding: [0x3f,0x20,0x03,0xd5] +// CHECK: wfe // encoding: [0x5f,0x20,0x03,0xd5] +// CHECK: wfi // encoding: [0x7f,0x20,0x03,0xd5] +// CHECK: sev // encoding: [0x9f,0x20,0x03,0xd5] +// CHECK: sevl // encoding: [0xbf,0x20,0x03,0xd5] + + clrex + clrex #0 + clrex #7 + clrex #15 +// CHECK: clrex // encoding: [0x5f,0x3f,0x03,0xd5] +// CHECK: clrex #0 // encoding: [0x5f,0x30,0x03,0xd5] +// CHECK: clrex #7 // encoding: [0x5f,0x37,0x03,0xd5] +// CHECK: clrex // encoding: [0x5f,0x3f,0x03,0xd5] + + dsb #0 + dsb #12 + dsb #15 + dsb oshld + dsb oshst + dsb osh + dsb nshld + dsb nshst + dsb nsh + dsb ishld + dsb ishst + dsb ish + dsb ld + dsb st + dsb sy +// CHECK: dsb #0 // encoding: [0x9f,0x30,0x03,0xd5] +// CHECK: dsb #12 // encoding: [0x9f,0x3c,0x03,0xd5] +// CHECK: dsb sy // encoding: [0x9f,0x3f,0x03,0xd5] +// CHECK: dsb oshld // encoding: [0x9f,0x31,0x03,0xd5] +// CHECK: dsb oshst // encoding: [0x9f,0x32,0x03,0xd5] +// CHECK: dsb osh // encoding: [0x9f,0x33,0x03,0xd5] +// CHECK: dsb nshld // encoding: [0x9f,0x35,0x03,0xd5] +// CHECK: dsb nshst // encoding: [0x9f,0x36,0x03,0xd5] +// CHECK: dsb nsh // encoding: [0x9f,0x37,0x03,0xd5] +// CHECK: dsb ishld // encoding: [0x9f,0x39,0x03,0xd5] +// CHECK: dsb ishst // encoding: [0x9f,0x3a,0x03,0xd5] +// CHECK: dsb ish // encoding: [0x9f,0x3b,0x03,0xd5] +// CHECK: dsb ld // encoding: [0x9f,0x3d,0x03,0xd5] +// CHECK: dsb st // encoding: [0x9f,0x3e,0x03,0xd5] +// CHECK: dsb sy // encoding: [0x9f,0x3f,0x03,0xd5] + + dmb #0 + dmb #12 + dmb #15 + dmb oshld + dmb oshst + dmb osh + dmb nshld + dmb nshst + dmb nsh + dmb ishld + dmb ishst + dmb ish + dmb ld + dmb st + dmb sy +// CHECK: dmb #0 // encoding: [0xbf,0x30,0x03,0xd5] +// CHECK: dmb #12 // encoding: [0xbf,0x3c,0x03,0xd5] +// CHECK: dmb sy // encoding: [0xbf,0x3f,0x03,0xd5] +// CHECK: dmb oshld // encoding: [0xbf,0x31,0x03,0xd5] +// CHECK: dmb oshst // encoding: [0xbf,0x32,0x03,0xd5] +// CHECK: dmb osh // encoding: [0xbf,0x33,0x03,0xd5] +// CHECK: dmb nshld // encoding: [0xbf,0x35,0x03,0xd5] +// CHECK: dmb nshst // encoding: [0xbf,0x36,0x03,0xd5] +// CHECK: dmb nsh // encoding: [0xbf,0x37,0x03,0xd5] +// CHECK: dmb ishld // encoding: [0xbf,0x39,0x03,0xd5] +// CHECK: dmb ishst // encoding: [0xbf,0x3a,0x03,0xd5] +// CHECK: dmb ish // encoding: [0xbf,0x3b,0x03,0xd5] +// CHECK: dmb ld // encoding: [0xbf,0x3d,0x03,0xd5] +// CHECK: dmb st // encoding: [0xbf,0x3e,0x03,0xd5] +// CHECK: dmb sy // encoding: [0xbf,0x3f,0x03,0xd5] + + isb sy + isb + isb #12 +// CHECK: isb // encoding: [0xdf,0x3f,0x03,0xd5] +// CHECK: isb // encoding: [0xdf,0x3f,0x03,0xd5] +// CHECK: isb #12 // encoding: [0xdf,0x3c,0x03,0xd5] + + + msr spsel, #0 + msr daifset, #15 + msr daifclr, #12 +// CHECK: msr spsel, #0 // encoding: [0xbf,0x40,0x00,0xd5] +// CHECK: msr daifset, #15 // encoding: [0xdf,0x4f,0x03,0xd5] +// CHECK: msr daifclr, #12 // encoding: [0xff,0x4c,0x03,0xd5] + + sys #7, c5, c9, #7, x5 + sys #0, c15, c15, #2 +// CHECK: sys #7, c5, c9, #7, x5 // encoding: [0xe5,0x59,0x0f,0xd5] +// CHECK: sys #0, c15, c15, #2, xzr // encoding: [0x5f,0xff,0x08,0xd5] + + sysl x9, #7, c5, c9, #7 + sysl x1, #0, c15, c15, #2 +// CHECK: sysl x9, #7, c5, c9, #7 // encoding: [0xe9,0x59,0x2f,0xd5] +// CHECK: sysl x1, #0, c15, c15, #2 // encoding: [0x41,0xff,0x28,0xd5] + + ic ialluis + ic iallu + ic ivau, x9 +// CHECK: ic ialluis // encoding: [0x1f,0x71,0x08,0xd5] +// CHECK: ic iallu // encoding: [0x1f,0x75,0x08,0xd5] +// CHECK: ic ivau, x9 // encoding: [0x29,0x75,0x0b,0xd5] + + dc zva, x12 + dc ivac, xzr + dc isw, x2 + dc cvac, x9 + dc csw, x10 + dc cvau, x0 + dc civac, x3 + dc cisw, x30 +// CHECK: dc zva, x12 // encoding: [0x2c,0x74,0x0b,0xd5] +// CHECK: dc ivac, xzr // encoding: [0x3f,0x76,0x08,0xd5] +// CHECK: dc isw, x2 // encoding: [0x42,0x76,0x08,0xd5] +// CHECK: dc cvac, x9 // encoding: [0x29,0x7a,0x0b,0xd5] +// CHECK: dc csw, x10 // encoding: [0x4a,0x7a,0x08,0xd5] +// CHECK: dc cvau, x0 // encoding: [0x20,0x7b,0x0b,0xd5] +// CHECK: dc civac, x3 // encoding: [0x23,0x7e,0x0b,0xd5] +// CHECK: dc cisw, x30 // encoding: [0x5e,0x7e,0x08,0xd5] + + at S1E1R, x19 + at S1E2R, x19 + at S1E3R, x19 + at S1E1W, x19 + at S1E2W, x19 + at S1E3W, x19 + at S1E0R, x19 + at S1E0W, x19 + at S12E1R, x20 + at S12E1W, x20 + at S12E0R, x20 + at S12E0W, x20 +// CHECK: at s1e1r, x19 // encoding: [0x13,0x78,0x08,0xd5] +// CHECK: at s1e2r, x19 // encoding: [0x13,0x78,0x0c,0xd5] +// CHECK: at s1e3r, x19 // encoding: [0x13,0x78,0x0e,0xd5] +// CHECK: at s1e1w, x19 // encoding: [0x33,0x78,0x08,0xd5] +// CHECK: at s1e2w, x19 // encoding: [0x33,0x78,0x0c,0xd5] +// CHECK: at s1e3w, x19 // encoding: [0x33,0x78,0x0e,0xd5] +// CHECK: at s1e0r, x19 // encoding: [0x53,0x78,0x08,0xd5] +// CHECK: at s1e0w, x19 // encoding: [0x73,0x78,0x08,0xd5] +// CHECK: at s12e1r, x20 // encoding: [0x94,0x78,0x0c,0xd5] +// CHECK: at s12e1w, x20 // encoding: [0xb4,0x78,0x0c,0xd5] +// CHECK: at s12e0r, x20 // encoding: [0xd4,0x78,0x0c,0xd5] +// CHECK: at s12e0w, x20 // encoding: [0xf4,0x78,0x0c,0xd5] + + tlbi IPAS2E1IS, x4 + tlbi IPAS2LE1IS, x9 + tlbi VMALLE1IS + tlbi ALLE2IS + tlbi ALLE3IS + tlbi VAE1IS, x1 + tlbi VAE2IS, x2 + tlbi VAE3IS, x3 + tlbi ASIDE1IS, x5 + tlbi VAAE1IS, x9 + tlbi ALLE1IS + tlbi VALE1IS, x10 + tlbi VALE2IS, x11 + tlbi VALE3IS, x13 + tlbi VMALLS12E1IS + tlbi VAALE1IS, x14 + tlbi IPAS2E1, x15 + tlbi IPAS2LE1, x16 + tlbi VMALLE1 + tlbi ALLE2 + tlbi ALLE3 + tlbi VAE1, x17 + tlbi VAE2, x18 + tlbi VAE3, x19 + tlbi ASIDE1, x20 + tlbi VAAE1, x21 + tlbi ALLE1 + tlbi VALE1, x22 + tlbi VALE2, x23 + tlbi VALE3, x24 + tlbi VMALLS12E1 + tlbi VAALE1, x25 +// CHECK: tlbi ipas2e1is, x4 // encoding: [0x24,0x80,0x0c,0xd5] +// CHECK: tlbi ipas2le1is, x9 // encoding: [0xa9,0x80,0x0c,0xd5] +// CHECK: tlbi vmalle1is // encoding: [0x1f,0x83,0x08,0xd5] +// CHECK: tlbi alle2is // encoding: [0x1f,0x83,0x0c,0xd5] +// CHECK: tlbi alle3is // encoding: [0x1f,0x83,0x0e,0xd5] +// CHECK: tlbi vae1is, x1 // encoding: [0x21,0x83,0x08,0xd5] +// CHECK: tlbi vae2is, x2 // encoding: [0x22,0x83,0x0c,0xd5] +// CHECK: tlbi vae3is, x3 // encoding: [0x23,0x83,0x0e,0xd5] +// CHECK: tlbi aside1is, x5 // encoding: [0x45,0x83,0x08,0xd5] +// CHECK: tlbi vaae1is, x9 // encoding: [0x69,0x83,0x08,0xd5] +// CHECK: tlbi alle1is // encoding: [0x9f,0x83,0x0c,0xd5] +// CHECK: tlbi vale1is, x10 // encoding: [0xaa,0x83,0x08,0xd5] +// CHECK: tlbi vale2is, x11 // encoding: [0xab,0x83,0x0c,0xd5] +// CHECK: tlbi vale3is, x13 // encoding: [0xad,0x83,0x0e,0xd5] +// CHECK: tlbi vmalls12e1is // encoding: [0xdf,0x83,0x0c,0xd5] +// CHECK: tlbi vaale1is, x14 // encoding: [0xee,0x83,0x08,0xd5] +// CHECK: tlbi ipas2e1, x15 // encoding: [0x2f,0x84,0x0c,0xd5] +// CHECK: tlbi ipas2le1, x16 // encoding: [0xb0,0x84,0x0c,0xd5] +// CHECK: tlbi vmalle1 // encoding: [0x1f,0x87,0x08,0xd5] +// CHECK: tlbi alle2 // encoding: [0x1f,0x87,0x0c,0xd5] +// CHECK: tlbi alle3 // encoding: [0x1f,0x87,0x0e,0xd5] +// CHECK: tlbi vae1, x17 // encoding: [0x31,0x87,0x08,0xd5] +// CHECK: tlbi vae2, x18 // encoding: [0x32,0x87,0x0c,0xd5] +// CHECK: tlbi vae3, x19 // encoding: [0x33,0x87,0x0e,0xd5] +// CHECK: tlbi aside1, x20 // encoding: [0x54,0x87,0x08,0xd5] +// CHECK: tlbi vaae1, x21 // encoding: [0x75,0x87,0x08,0xd5] +// CHECK: tlbi alle1 // encoding: [0x9f,0x87,0x0c,0xd5] +// CHECK: tlbi vale1, x22 // encoding: [0xb6,0x87,0x08,0xd5] +// CHECK: tlbi vale2, x23 // encoding: [0xb7,0x87,0x0c,0xd5] +// CHECK: tlbi vale3, x24 // encoding: [0xb8,0x87,0x0e,0xd5] +// CHECK: tlbi vmalls12e1 // encoding: [0xdf,0x87,0x0c,0xd5] +// CHECK: tlbi vaale1, x25 // encoding: [0xf9,0x87,0x08,0xd5] + + msr TEECR32_EL1, x12 + msr OSDTRRX_EL1, x12 + msr MDCCINT_EL1, x12 + msr MDSCR_EL1, x12 + msr OSDTRTX_EL1, x12 + msr DBGDTR_EL0, x12 + msr DBGDTRTX_EL0, x12 + msr OSECCR_EL1, x12 + msr DBGVCR32_EL2, x12 + msr DBGBVR0_EL1, x12 + msr DBGBVR1_EL1, x12 + msr DBGBVR2_EL1, x12 + msr DBGBVR3_EL1, x12 + msr DBGBVR4_EL1, x12 + msr DBGBVR5_EL1, x12 + msr DBGBVR6_EL1, x12 + msr DBGBVR7_EL1, x12 + msr DBGBVR8_EL1, x12 + msr DBGBVR9_EL1, x12 + msr DBGBVR10_EL1, x12 + msr DBGBVR11_EL1, x12 + msr DBGBVR12_EL1, x12 + msr DBGBVR13_EL1, x12 + msr DBGBVR14_EL1, x12 + msr DBGBVR15_EL1, x12 + msr DBGBCR0_EL1, x12 + msr DBGBCR1_EL1, x12 + msr DBGBCR2_EL1, x12 + msr DBGBCR3_EL1, x12 + msr DBGBCR4_EL1, x12 + msr DBGBCR5_EL1, x12 + msr DBGBCR6_EL1, x12 + msr DBGBCR7_EL1, x12 + msr DBGBCR8_EL1, x12 + msr DBGBCR9_EL1, x12 + msr DBGBCR10_EL1, x12 + msr DBGBCR11_EL1, x12 + msr DBGBCR12_EL1, x12 + msr DBGBCR13_EL1, x12 + msr DBGBCR14_EL1, x12 + msr DBGBCR15_EL1, x12 + msr DBGWVR0_EL1, x12 + msr DBGWVR1_EL1, x12 + msr DBGWVR2_EL1, x12 + msr DBGWVR3_EL1, x12 + msr DBGWVR4_EL1, x12 + msr DBGWVR5_EL1, x12 + msr DBGWVR6_EL1, x12 + msr DBGWVR7_EL1, x12 + msr DBGWVR8_EL1, x12 + msr DBGWVR9_EL1, x12 + msr DBGWVR10_EL1, x12 + msr DBGWVR11_EL1, x12 + msr DBGWVR12_EL1, x12 + msr DBGWVR13_EL1, x12 + msr DBGWVR14_EL1, x12 + msr DBGWVR15_EL1, x12 + msr DBGWCR0_EL1, x12 + msr DBGWCR1_EL1, x12 + msr DBGWCR2_EL1, x12 + msr DBGWCR3_EL1, x12 + msr DBGWCR4_EL1, x12 + msr DBGWCR5_EL1, x12 + msr DBGWCR6_EL1, x12 + msr DBGWCR7_EL1, x12 + msr DBGWCR8_EL1, x12 + msr DBGWCR9_EL1, x12 + msr DBGWCR10_EL1, x12 + msr DBGWCR11_EL1, x12 + msr DBGWCR12_EL1, x12 + msr DBGWCR13_EL1, x12 + msr DBGWCR14_EL1, x12 + msr DBGWCR15_EL1, x12 + msr TEEHBR32_EL1, x12 + msr OSLAR_EL1, x12 + msr OSDLR_EL1, x12 + msr DBGPRCR_EL1, x12 + msr DBGCLAIMSET_EL1, x12 + msr DBGCLAIMCLR_EL1, x12 + msr CSSELR_EL1, x12 + msr VPIDR_EL2, x12 + msr VMPIDR_EL2, x12 + msr SCTLR_EL1, x12 + msr SCTLR_EL2, x12 + msr SCTLR_EL3, x12 + msr ACTLR_EL1, x12 + msr ACTLR_EL2, x12 + msr ACTLR_EL3, x12 + msr CPACR_EL1, x12 + msr HCR_EL2, x12 + msr SCR_EL3, x12 + msr MDCR_EL2, x12 + msr SDER32_EL3, x12 + msr CPTR_EL2, x12 + msr CPTR_EL3, x12 + msr HSTR_EL2, x12 + msr HACR_EL2, x12 + msr MDCR_EL3, x12 + msr TTBR0_EL1, x12 + msr TTBR0_EL2, x12 + msr TTBR0_EL3, x12 + msr TTBR1_EL1, x12 + msr TCR_EL1, x12 + msr TCR_EL2, x12 + msr TCR_EL3, x12 + msr VTTBR_EL2, x12 + msr VTCR_EL2, x12 + msr DACR32_EL2, x12 + msr SPSR_EL1, x12 + msr SPSR_EL2, x12 + msr SPSR_EL3, x12 + msr ELR_EL1, x12 + msr ELR_EL2, x12 + msr ELR_EL3, x12 + msr SP_EL0, x12 + msr SP_EL1, x12 + msr SP_EL2, x12 + msr SPSel, x12 + msr NZCV, x12 + msr DAIF, x12 + msr CurrentEL, x12 + msr SPSR_irq, x12 + msr SPSR_abt, x12 + msr SPSR_und, x12 + msr SPSR_fiq, x12 + msr FPCR, x12 + msr FPSR, x12 + msr DSPSR_EL0, x12 + msr DLR_EL0, x12 + msr IFSR32_EL2, x12 + msr AFSR0_EL1, x12 + msr AFSR0_EL2, x12 + msr AFSR0_EL3, x12 + msr AFSR1_EL1, x12 + msr AFSR1_EL2, x12 + msr AFSR1_EL3, x12 + msr ESR_EL1, x12 + msr ESR_EL2, x12 + msr ESR_EL3, x12 + msr FPEXC32_EL2, x12 + msr FAR_EL1, x12 + msr FAR_EL2, x12 + msr FAR_EL3, x12 + msr HPFAR_EL2, x12 + msr PAR_EL1, x12 + msr PMCR_EL0, x12 + msr PMCNTENSET_EL0, x12 + msr PMCNTENCLR_EL0, x12 + msr PMOVSCLR_EL0, x12 + msr PMSELR_EL0, x12 + msr PMCCNTR_EL0, x12 + msr PMXEVTYPER_EL0, x12 + msr PMXEVCNTR_EL0, x12 + msr PMUSERENR_EL0, x12 + msr PMINTENSET_EL1, x12 + msr PMINTENCLR_EL1, x12 + msr PMOVSSET_EL0, x12 + msr MAIR_EL1, x12 + msr MAIR_EL2, x12 + msr MAIR_EL3, x12 + msr AMAIR_EL1, x12 + msr AMAIR_EL2, x12 + msr AMAIR_EL3, x12 + msr VBAR_EL1, x12 + msr VBAR_EL2, x12 + msr VBAR_EL3, x12 + msr RMR_EL1, x12 + msr RMR_EL2, x12 + msr RMR_EL3, x12 + msr CONTEXTIDR_EL1, x12 + msr TPIDR_EL0, x12 + msr TPIDR_EL2, x12 + msr TPIDR_EL3, x12 + msr TPIDRRO_EL0, x12 + msr TPIDR_EL1, x12 + msr CNTFRQ_EL0, x12 + msr CNTVOFF_EL2, x12 + msr CNTKCTL_EL1, x12 + msr CNTHCTL_EL2, x12 + msr CNTP_TVAL_EL0, x12 + msr CNTHP_TVAL_EL2, x12 + msr CNTPS_TVAL_EL1, x12 + msr CNTP_CTL_EL0, x12 + msr CNTHP_CTL_EL2, x12 + msr CNTPS_CTL_EL1, x12 + msr CNTP_CVAL_EL0, x12 + msr CNTHP_CVAL_EL2, x12 + msr CNTPS_CVAL_EL1, x12 + msr CNTV_TVAL_EL0, x12 + msr CNTV_CTL_EL0, x12 + msr CNTV_CVAL_EL0, x12 + msr PMEVCNTR0_EL0, x12 + msr PMEVCNTR1_EL0, x12 + msr PMEVCNTR2_EL0, x12 + msr PMEVCNTR3_EL0, x12 + msr PMEVCNTR4_EL0, x12 + msr PMEVCNTR5_EL0, x12 + msr PMEVCNTR6_EL0, x12 + msr PMEVCNTR7_EL0, x12 + msr PMEVCNTR8_EL0, x12 + msr PMEVCNTR9_EL0, x12 + msr PMEVCNTR10_EL0, x12 + msr PMEVCNTR11_EL0, x12 + msr PMEVCNTR12_EL0, x12 + msr PMEVCNTR13_EL0, x12 + msr PMEVCNTR14_EL0, x12 + msr PMEVCNTR15_EL0, x12 + msr PMEVCNTR16_EL0, x12 + msr PMEVCNTR17_EL0, x12 + msr PMEVCNTR18_EL0, x12 + msr PMEVCNTR19_EL0, x12 + msr PMEVCNTR20_EL0, x12 + msr PMEVCNTR21_EL0, x12 + msr PMEVCNTR22_EL0, x12 + msr PMEVCNTR23_EL0, x12 + msr PMEVCNTR24_EL0, x12 + msr PMEVCNTR25_EL0, x12 + msr PMEVCNTR26_EL0, x12 + msr PMEVCNTR27_EL0, x12 + msr PMEVCNTR28_EL0, x12 + msr PMEVCNTR29_EL0, x12 + msr PMEVCNTR30_EL0, x12 + msr PMCCFILTR_EL0, x12 + msr PMEVTYPER0_EL0, x12 + msr PMEVTYPER1_EL0, x12 + msr PMEVTYPER2_EL0, x12 + msr PMEVTYPER3_EL0, x12 + msr PMEVTYPER4_EL0, x12 + msr PMEVTYPER5_EL0, x12 + msr PMEVTYPER6_EL0, x12 + msr PMEVTYPER7_EL0, x12 + msr PMEVTYPER8_EL0, x12 + msr PMEVTYPER9_EL0, x12 + msr PMEVTYPER10_EL0, x12 + msr PMEVTYPER11_EL0, x12 + msr PMEVTYPER12_EL0, x12 + msr PMEVTYPER13_EL0, x12 + msr PMEVTYPER14_EL0, x12 + msr PMEVTYPER15_EL0, x12 + msr PMEVTYPER16_EL0, x12 + msr PMEVTYPER17_EL0, x12 + msr PMEVTYPER18_EL0, x12 + msr PMEVTYPER19_EL0, x12 + msr PMEVTYPER20_EL0, x12 + msr PMEVTYPER21_EL0, x12 + msr PMEVTYPER22_EL0, x12 + msr PMEVTYPER23_EL0, x12 + msr PMEVTYPER24_EL0, x12 + msr PMEVTYPER25_EL0, x12 + msr PMEVTYPER26_EL0, x12 + msr PMEVTYPER27_EL0, x12 + msr PMEVTYPER28_EL0, x12 + msr PMEVTYPER29_EL0, x12 + msr PMEVTYPER30_EL0, x12 +// CHECK: msr teecr32_el1, x12 // encoding: [0x0c,0x00,0x12,0xd5] +// CHECK: msr osdtrrx_el1, x12 // encoding: [0x4c,0x00,0x10,0xd5] +// CHECK: msr mdccint_el1, x12 // encoding: [0x0c,0x02,0x10,0xd5] +// CHECK: msr mdscr_el1, x12 // encoding: [0x4c,0x02,0x10,0xd5] +// CHECK: msr osdtrtx_el1, x12 // encoding: [0x4c,0x03,0x10,0xd5] +// CHECK: msr dbgdtr_el0, x12 // encoding: [0x0c,0x04,0x13,0xd5] +// CHECK: msr dbgdtrtx_el0, x12 // encoding: [0x0c,0x05,0x13,0xd5] +// CHECK: msr oseccr_el1, x12 // encoding: [0x4c,0x06,0x10,0xd5] +// CHECK: msr dbgvcr32_el2, x12 // encoding: [0x0c,0x07,0x14,0xd5] +// CHECK: msr dbgbvr0_el1, x12 // encoding: [0x8c,0x00,0x10,0xd5] +// CHECK: msr dbgbvr1_el1, x12 // encoding: [0x8c,0x01,0x10,0xd5] +// CHECK: msr dbgbvr2_el1, x12 // encoding: [0x8c,0x02,0x10,0xd5] +// CHECK: msr dbgbvr3_el1, x12 // encoding: [0x8c,0x03,0x10,0xd5] +// CHECK: msr dbgbvr4_el1, x12 // encoding: [0x8c,0x04,0x10,0xd5] +// CHECK: msr dbgbvr5_el1, x12 // encoding: [0x8c,0x05,0x10,0xd5] +// CHECK: msr dbgbvr6_el1, x12 // encoding: [0x8c,0x06,0x10,0xd5] +// CHECK: msr dbgbvr7_el1, x12 // encoding: [0x8c,0x07,0x10,0xd5] +// CHECK: msr dbgbvr8_el1, x12 // encoding: [0x8c,0x08,0x10,0xd5] +// CHECK: msr dbgbvr9_el1, x12 // encoding: [0x8c,0x09,0x10,0xd5] +// CHECK: msr dbgbvr10_el1, x12 // encoding: [0x8c,0x0a,0x10,0xd5] +// CHECK: msr dbgbvr11_el1, x12 // encoding: [0x8c,0x0b,0x10,0xd5] +// CHECK: msr dbgbvr12_el1, x12 // encoding: [0x8c,0x0c,0x10,0xd5] +// CHECK: msr dbgbvr13_el1, x12 // encoding: [0x8c,0x0d,0x10,0xd5] +// CHECK: msr dbgbvr14_el1, x12 // encoding: [0x8c,0x0e,0x10,0xd5] +// CHECK: msr dbgbvr15_el1, x12 // encoding: [0x8c,0x0f,0x10,0xd5] +// CHECK: msr dbgbcr0_el1, x12 // encoding: [0xac,0x00,0x10,0xd5] +// CHECK: msr dbgbcr1_el1, x12 // encoding: [0xac,0x01,0x10,0xd5] +// CHECK: msr dbgbcr2_el1, x12 // encoding: [0xac,0x02,0x10,0xd5] +// CHECK: msr dbgbcr3_el1, x12 // encoding: [0xac,0x03,0x10,0xd5] +// CHECK: msr dbgbcr4_el1, x12 // encoding: [0xac,0x04,0x10,0xd5] +// CHECK: msr dbgbcr5_el1, x12 // encoding: [0xac,0x05,0x10,0xd5] +// CHECK: msr dbgbcr6_el1, x12 // encoding: [0xac,0x06,0x10,0xd5] +// CHECK: msr dbgbcr7_el1, x12 // encoding: [0xac,0x07,0x10,0xd5] +// CHECK: msr dbgbcr8_el1, x12 // encoding: [0xac,0x08,0x10,0xd5] +// CHECK: msr dbgbcr9_el1, x12 // encoding: [0xac,0x09,0x10,0xd5] +// CHECK: msr dbgbcr10_el1, x12 // encoding: [0xac,0x0a,0x10,0xd5] +// CHECK: msr dbgbcr11_el1, x12 // encoding: [0xac,0x0b,0x10,0xd5] +// CHECK: msr dbgbcr12_el1, x12 // encoding: [0xac,0x0c,0x10,0xd5] +// CHECK: msr dbgbcr13_el1, x12 // encoding: [0xac,0x0d,0x10,0xd5] +// CHECK: msr dbgbcr14_el1, x12 // encoding: [0xac,0x0e,0x10,0xd5] +// CHECK: msr dbgbcr15_el1, x12 // encoding: [0xac,0x0f,0x10,0xd5] +// CHECK: msr dbgwvr0_el1, x12 // encoding: [0xcc,0x00,0x10,0xd5] +// CHECK: msr dbgwvr1_el1, x12 // encoding: [0xcc,0x01,0x10,0xd5] +// CHECK: msr dbgwvr2_el1, x12 // encoding: [0xcc,0x02,0x10,0xd5] +// CHECK: msr dbgwvr3_el1, x12 // encoding: [0xcc,0x03,0x10,0xd5] +// CHECK: msr dbgwvr4_el1, x12 // encoding: [0xcc,0x04,0x10,0xd5] +// CHECK: msr dbgwvr5_el1, x12 // encoding: [0xcc,0x05,0x10,0xd5] +// CHECK: msr dbgwvr6_el1, x12 // encoding: [0xcc,0x06,0x10,0xd5] +// CHECK: msr dbgwvr7_el1, x12 // encoding: [0xcc,0x07,0x10,0xd5] +// CHECK: msr dbgwvr8_el1, x12 // encoding: [0xcc,0x08,0x10,0xd5] +// CHECK: msr dbgwvr9_el1, x12 // encoding: [0xcc,0x09,0x10,0xd5] +// CHECK: msr dbgwvr10_el1, x12 // encoding: [0xcc,0x0a,0x10,0xd5] +// CHECK: msr dbgwvr11_el1, x12 // encoding: [0xcc,0x0b,0x10,0xd5] +// CHECK: msr dbgwvr12_el1, x12 // encoding: [0xcc,0x0c,0x10,0xd5] +// CHECK: msr dbgwvr13_el1, x12 // encoding: [0xcc,0x0d,0x10,0xd5] +// CHECK: msr dbgwvr14_el1, x12 // encoding: [0xcc,0x0e,0x10,0xd5] +// CHECK: msr dbgwvr15_el1, x12 // encoding: [0xcc,0x0f,0x10,0xd5] +// CHECK: msr dbgwcr0_el1, x12 // encoding: [0xec,0x00,0x10,0xd5] +// CHECK: msr dbgwcr1_el1, x12 // encoding: [0xec,0x01,0x10,0xd5] +// CHECK: msr dbgwcr2_el1, x12 // encoding: [0xec,0x02,0x10,0xd5] +// CHECK: msr dbgwcr3_el1, x12 // encoding: [0xec,0x03,0x10,0xd5] +// CHECK: msr dbgwcr4_el1, x12 // encoding: [0xec,0x04,0x10,0xd5] +// CHECK: msr dbgwcr5_el1, x12 // encoding: [0xec,0x05,0x10,0xd5] +// CHECK: msr dbgwcr6_el1, x12 // encoding: [0xec,0x06,0x10,0xd5] +// CHECK: msr dbgwcr7_el1, x12 // encoding: [0xec,0x07,0x10,0xd5] +// CHECK: msr dbgwcr8_el1, x12 // encoding: [0xec,0x08,0x10,0xd5] +// CHECK: msr dbgwcr9_el1, x12 // encoding: [0xec,0x09,0x10,0xd5] +// CHECK: msr dbgwcr10_el1, x12 // encoding: [0xec,0x0a,0x10,0xd5] +// CHECK: msr dbgwcr11_el1, x12 // encoding: [0xec,0x0b,0x10,0xd5] +// CHECK: msr dbgwcr12_el1, x12 // encoding: [0xec,0x0c,0x10,0xd5] +// CHECK: msr dbgwcr13_el1, x12 // encoding: [0xec,0x0d,0x10,0xd5] +// CHECK: msr dbgwcr14_el1, x12 // encoding: [0xec,0x0e,0x10,0xd5] +// CHECK: msr dbgwcr15_el1, x12 // encoding: [0xec,0x0f,0x10,0xd5] +// CHECK: msr teehbr32_el1, x12 // encoding: [0x0c,0x10,0x12,0xd5] +// CHECK: msr oslar_el1, x12 // encoding: [0x8c,0x10,0x10,0xd5] +// CHECK: msr osdlr_el1, x12 // encoding: [0x8c,0x13,0x10,0xd5] +// CHECK: msr dbgprcr_el1, x12 // encoding: [0x8c,0x14,0x10,0xd5] +// CHECK: msr dbgclaimset_el1, x12 // encoding: [0xcc,0x78,0x10,0xd5] +// CHECK: msr dbgclaimclr_el1, x12 // encoding: [0xcc,0x79,0x10,0xd5] +// CHECK: msr csselr_el1, x12 // encoding: [0x0c,0x00,0x1a,0xd5] +// CHECK: msr vpidr_el2, x12 // encoding: [0x0c,0x00,0x1c,0xd5] +// CHECK: msr vmpidr_el2, x12 // encoding: [0xac,0x00,0x1c,0xd5] +// CHECK: msr sctlr_el1, x12 // encoding: [0x0c,0x10,0x18,0xd5] +// CHECK: msr sctlr_el2, x12 // encoding: [0x0c,0x10,0x1c,0xd5] +// CHECK: msr sctlr_el3, x12 // encoding: [0x0c,0x10,0x1e,0xd5] +// CHECK: msr actlr_el1, x12 // encoding: [0x2c,0x10,0x18,0xd5] +// CHECK: msr actlr_el2, x12 // encoding: [0x2c,0x10,0x1c,0xd5] +// CHECK: msr actlr_el3, x12 // encoding: [0x2c,0x10,0x1e,0xd5] +// CHECK: msr cpacr_el1, x12 // encoding: [0x4c,0x10,0x18,0xd5] +// CHECK: msr hcr_el2, x12 // encoding: [0x0c,0x11,0x1c,0xd5] +// CHECK: msr scr_el3, x12 // encoding: [0x0c,0x11,0x1e,0xd5] +// CHECK: msr mdcr_el2, x12 // encoding: [0x2c,0x11,0x1c,0xd5] +// CHECK: msr sder32_el3, x12 // encoding: [0x2c,0x11,0x1e,0xd5] +// CHECK: msr cptr_el2, x12 // encoding: [0x4c,0x11,0x1c,0xd5] +// CHECK: msr cptr_el3, x12 // encoding: [0x4c,0x11,0x1e,0xd5] +// CHECK: msr hstr_el2, x12 // encoding: [0x6c,0x11,0x1c,0xd5] +// CHECK: msr hacr_el2, x12 // encoding: [0xec,0x11,0x1c,0xd5] +// CHECK: msr mdcr_el3, x12 // encoding: [0x2c,0x13,0x1e,0xd5] +// CHECK: msr ttbr0_el1, x12 // encoding: [0x0c,0x20,0x18,0xd5] +// CHECK: msr ttbr0_el2, x12 // encoding: [0x0c,0x20,0x1c,0xd5] +// CHECK: msr ttbr0_el3, x12 // encoding: [0x0c,0x20,0x1e,0xd5] +// CHECK: msr ttbr1_el1, x12 // encoding: [0x2c,0x20,0x18,0xd5] +// CHECK: msr tcr_el1, x12 // encoding: [0x4c,0x20,0x18,0xd5] +// CHECK: msr tcr_el2, x12 // encoding: [0x4c,0x20,0x1c,0xd5] +// CHECK: msr tcr_el3, x12 // encoding: [0x4c,0x20,0x1e,0xd5] +// CHECK: msr vttbr_el2, x12 // encoding: [0x0c,0x21,0x1c,0xd5] +// CHECK: msr vtcr_el2, x12 // encoding: [0x4c,0x21,0x1c,0xd5] +// CHECK: msr dacr32_el2, x12 // encoding: [0x0c,0x30,0x1c,0xd5] +// CHECK: msr spsr_el1, x12 // encoding: [0x0c,0x40,0x18,0xd5] +// CHECK: msr spsr_el2, x12 // encoding: [0x0c,0x40,0x1c,0xd5] +// CHECK: msr spsr_el3, x12 // encoding: [0x0c,0x40,0x1e,0xd5] +// CHECK: msr elr_el1, x12 // encoding: [0x2c,0x40,0x18,0xd5] +// CHECK: msr elr_el2, x12 // encoding: [0x2c,0x40,0x1c,0xd5] +// CHECK: msr elr_el3, x12 // encoding: [0x2c,0x40,0x1e,0xd5] +// CHECK: msr sp_el0, x12 // encoding: [0x0c,0x41,0x18,0xd5] +// CHECK: msr sp_el1, x12 // encoding: [0x0c,0x41,0x1c,0xd5] +// CHECK: msr sp_el2, x12 // encoding: [0x0c,0x41,0x1e,0xd5] +// CHECK: msr spsel, x12 // encoding: [0x0c,0x42,0x18,0xd5] +// CHECK: msr nzcv, x12 // encoding: [0x0c,0x42,0x1b,0xd5] +// CHECK: msr daif, x12 // encoding: [0x2c,0x42,0x1b,0xd5] +// CHECK: msr currentel, x12 // encoding: [0x4c,0x42,0x18,0xd5] +// CHECK: msr spsr_irq, x12 // encoding: [0x0c,0x43,0x1c,0xd5] +// CHECK: msr spsr_abt, x12 // encoding: [0x2c,0x43,0x1c,0xd5] +// CHECK: msr spsr_und, x12 // encoding: [0x4c,0x43,0x1c,0xd5] +// CHECK: msr spsr_fiq, x12 // encoding: [0x6c,0x43,0x1c,0xd5] +// CHECK: msr fpcr, x12 // encoding: [0x0c,0x44,0x1b,0xd5] +// CHECK: msr fpsr, x12 // encoding: [0x2c,0x44,0x1b,0xd5] +// CHECK: msr dspsr_el0, x12 // encoding: [0x0c,0x45,0x1b,0xd5] +// CHECK: msr dlr_el0, x12 // encoding: [0x2c,0x45,0x1b,0xd5] +// CHECK: msr ifsr32_el2, x12 // encoding: [0x2c,0x50,0x1c,0xd5] +// CHECK: msr afsr0_el1, x12 // encoding: [0x0c,0x51,0x18,0xd5] +// CHECK: msr afsr0_el2, x12 // encoding: [0x0c,0x51,0x1c,0xd5] +// CHECK: msr afsr0_el3, x12 // encoding: [0x0c,0x51,0x1e,0xd5] +// CHECK: msr afsr1_el1, x12 // encoding: [0x2c,0x51,0x18,0xd5] +// CHECK: msr afsr1_el2, x12 // encoding: [0x2c,0x51,0x1c,0xd5] +// CHECK: msr afsr1_el3, x12 // encoding: [0x2c,0x51,0x1e,0xd5] +// CHECK: msr esr_el1, x12 // encoding: [0x0c,0x52,0x18,0xd5] +// CHECK: msr esr_el2, x12 // encoding: [0x0c,0x52,0x1c,0xd5] +// CHECK: msr esr_el3, x12 // encoding: [0x0c,0x52,0x1e,0xd5] +// CHECK: msr fpexc32_el2, x12 // encoding: [0x0c,0x53,0x1c,0xd5] +// CHECK: msr far_el1, x12 // encoding: [0x0c,0x60,0x18,0xd5] +// CHECK: msr far_el2, x12 // encoding: [0x0c,0x60,0x1c,0xd5] +// CHECK: msr far_el3, x12 // encoding: [0x0c,0x60,0x1e,0xd5] +// CHECK: msr hpfar_el2, x12 // encoding: [0x8c,0x60,0x1c,0xd5] +// CHECK: msr par_el1, x12 // encoding: [0x0c,0x74,0x18,0xd5] +// CHECK: msr pmcr_el0, x12 // encoding: [0x0c,0x9c,0x1b,0xd5] +// CHECK: msr pmcntenset_el0, x12 // encoding: [0x2c,0x9c,0x1b,0xd5] +// CHECK: msr pmcntenclr_el0, x12 // encoding: [0x4c,0x9c,0x1b,0xd5] +// CHECK: msr pmovsclr_el0, x12 // encoding: [0x6c,0x9c,0x1b,0xd5] +// CHECK: msr pmselr_el0, x12 // encoding: [0xac,0x9c,0x1b,0xd5] +// CHECK: msr pmccntr_el0, x12 // encoding: [0x0c,0x9d,0x1b,0xd5] +// CHECK: msr pmxevtyper_el0, x12 // encoding: [0x2c,0x9d,0x1b,0xd5] +// CHECK: msr pmxevcntr_el0, x12 // encoding: [0x4c,0x9d,0x1b,0xd5] +// CHECK: msr pmuserenr_el0, x12 // encoding: [0x0c,0x9e,0x1b,0xd5] +// CHECK: msr pmintenset_el1, x12 // encoding: [0x2c,0x9e,0x18,0xd5] +// CHECK: msr pmintenclr_el1, x12 // encoding: [0x4c,0x9e,0x18,0xd5] +// CHECK: msr pmovsset_el0, x12 // encoding: [0x6c,0x9e,0x1b,0xd5] +// CHECK: msr mair_el1, x12 // encoding: [0x0c,0xa2,0x18,0xd5] +// CHECK: msr mair_el2, x12 // encoding: [0x0c,0xa2,0x1c,0xd5] +// CHECK: msr mair_el3, x12 // encoding: [0x0c,0xa2,0x1e,0xd5] +// CHECK: msr amair_el1, x12 // encoding: [0x0c,0xa3,0x18,0xd5] +// CHECK: msr amair_el2, x12 // encoding: [0x0c,0xa3,0x1c,0xd5] +// CHECK: msr amair_el3, x12 // encoding: [0x0c,0xa3,0x1e,0xd5] +// CHECK: msr vbar_el1, x12 // encoding: [0x0c,0xc0,0x18,0xd5] +// CHECK: msr vbar_el2, x12 // encoding: [0x0c,0xc0,0x1c,0xd5] +// CHECK: msr vbar_el3, x12 // encoding: [0x0c,0xc0,0x1e,0xd5] +// CHECK: msr rmr_el1, x12 // encoding: [0x4c,0xc0,0x18,0xd5] +// CHECK: msr rmr_el2, x12 // encoding: [0x4c,0xc0,0x1c,0xd5] +// CHECK: msr rmr_el3, x12 // encoding: [0x4c,0xc0,0x1e,0xd5] +// CHECK: msr contextidr_el1, x12 // encoding: [0x2c,0xd0,0x18,0xd5] +// CHECK: msr tpidr_el0, x12 // encoding: [0x4c,0xd0,0x1b,0xd5] +// CHECK: msr tpidr_el2, x12 // encoding: [0x4c,0xd0,0x1c,0xd5] +// CHECK: msr tpidr_el3, x12 // encoding: [0x4c,0xd0,0x1e,0xd5] +// CHECK: msr tpidrro_el0, x12 // encoding: [0x6c,0xd0,0x1b,0xd5] +// CHECK: msr tpidr_el1, x12 // encoding: [0x8c,0xd0,0x18,0xd5] +// CHECK: msr cntfrq_el0, x12 // encoding: [0x0c,0xe0,0x1b,0xd5] +// CHECK: msr cntvoff_el2, x12 // encoding: [0x6c,0xe0,0x1c,0xd5] +// CHECK: msr cntkctl_el1, x12 // encoding: [0x0c,0xe1,0x18,0xd5] +// CHECK: msr cnthctl_el2, x12 // encoding: [0x0c,0xe1,0x1c,0xd5] +// CHECK: msr cntp_tval_el0, x12 // encoding: [0x0c,0xe2,0x1b,0xd5] +// CHECK: msr cnthp_tval_el2, x12 // encoding: [0x0c,0xe2,0x1c,0xd5] +// CHECK: msr cntps_tval_el1, x12 // encoding: [0x0c,0xe2,0x1f,0xd5] +// CHECK: msr cntp_ctl_el0, x12 // encoding: [0x2c,0xe2,0x1b,0xd5] +// CHECK: msr cnthp_ctl_el2, x12 // encoding: [0x2c,0xe2,0x1c,0xd5] +// CHECK: msr cntps_ctl_el1, x12 // encoding: [0x2c,0xe2,0x1f,0xd5] +// CHECK: msr cntp_cval_el0, x12 // encoding: [0x4c,0xe2,0x1b,0xd5] +// CHECK: msr cnthp_cval_el2, x12 // encoding: [0x4c,0xe2,0x1c,0xd5] +// CHECK: msr cntps_cval_el1, x12 // encoding: [0x4c,0xe2,0x1f,0xd5] +// CHECK: msr cntv_tval_el0, x12 // encoding: [0x0c,0xe3,0x1b,0xd5] +// CHECK: msr cntv_ctl_el0, x12 // encoding: [0x2c,0xe3,0x1b,0xd5] +// CHECK: msr cntv_cval_el0, x12 // encoding: [0x4c,0xe3,0x1b,0xd5] +// CHECK: msr pmevcntr0_el0, x12 // encoding: [0x0c,0xe8,0x1b,0xd5] +// CHECK: msr pmevcntr1_el0, x12 // encoding: [0x2c,0xe8,0x1b,0xd5] +// CHECK: msr pmevcntr2_el0, x12 // encoding: [0x4c,0xe8,0x1b,0xd5] +// CHECK: msr pmevcntr3_el0, x12 // encoding: [0x6c,0xe8,0x1b,0xd5] +// CHECK: msr pmevcntr4_el0, x12 // encoding: [0x8c,0xe8,0x1b,0xd5] +// CHECK: msr pmevcntr5_el0, x12 // encoding: [0xac,0xe8,0x1b,0xd5] +// CHECK: msr pmevcntr6_el0, x12 // encoding: [0xcc,0xe8,0x1b,0xd5] +// CHECK: msr pmevcntr7_el0, x12 // encoding: [0xec,0xe8,0x1b,0xd5] +// CHECK: msr pmevcntr8_el0, x12 // encoding: [0x0c,0xe9,0x1b,0xd5] +// CHECK: msr pmevcntr9_el0, x12 // encoding: [0x2c,0xe9,0x1b,0xd5] +// CHECK: msr pmevcntr10_el0, x12 // encoding: [0x4c,0xe9,0x1b,0xd5] +// CHECK: msr pmevcntr11_el0, x12 // encoding: [0x6c,0xe9,0x1b,0xd5] +// CHECK: msr pmevcntr12_el0, x12 // encoding: [0x8c,0xe9,0x1b,0xd5] +// CHECK: msr pmevcntr13_el0, x12 // encoding: [0xac,0xe9,0x1b,0xd5] +// CHECK: msr pmevcntr14_el0, x12 // encoding: [0xcc,0xe9,0x1b,0xd5] +// CHECK: msr pmevcntr15_el0, x12 // encoding: [0xec,0xe9,0x1b,0xd5] +// CHECK: msr pmevcntr16_el0, x12 // encoding: [0x0c,0xea,0x1b,0xd5] +// CHECK: msr pmevcntr17_el0, x12 // encoding: [0x2c,0xea,0x1b,0xd5] +// CHECK: msr pmevcntr18_el0, x12 // encoding: [0x4c,0xea,0x1b,0xd5] +// CHECK: msr pmevcntr19_el0, x12 // encoding: [0x6c,0xea,0x1b,0xd5] +// CHECK: msr pmevcntr20_el0, x12 // encoding: [0x8c,0xea,0x1b,0xd5] +// CHECK: msr pmevcntr21_el0, x12 // encoding: [0xac,0xea,0x1b,0xd5] +// CHECK: msr pmevcntr22_el0, x12 // encoding: [0xcc,0xea,0x1b,0xd5] +// CHECK: msr pmevcntr23_el0, x12 // encoding: [0xec,0xea,0x1b,0xd5] +// CHECK: msr pmevcntr24_el0, x12 // encoding: [0x0c,0xeb,0x1b,0xd5] +// CHECK: msr pmevcntr25_el0, x12 // encoding: [0x2c,0xeb,0x1b,0xd5] +// CHECK: msr pmevcntr26_el0, x12 // encoding: [0x4c,0xeb,0x1b,0xd5] +// CHECK: msr pmevcntr27_el0, x12 // encoding: [0x6c,0xeb,0x1b,0xd5] +// CHECK: msr pmevcntr28_el0, x12 // encoding: [0x8c,0xeb,0x1b,0xd5] +// CHECK: msr pmevcntr29_el0, x12 // encoding: [0xac,0xeb,0x1b,0xd5] +// CHECK: msr pmevcntr30_el0, x12 // encoding: [0xcc,0xeb,0x1b,0xd5] +// CHECK: msr pmccfiltr_el0, x12 // encoding: [0xec,0xef,0x1b,0xd5] +// CHECK: msr pmevtyper0_el0, x12 // encoding: [0x0c,0xec,0x1b,0xd5] +// CHECK: msr pmevtyper1_el0, x12 // encoding: [0x2c,0xec,0x1b,0xd5] +// CHECK: msr pmevtyper2_el0, x12 // encoding: [0x4c,0xec,0x1b,0xd5] +// CHECK: msr pmevtyper3_el0, x12 // encoding: [0x6c,0xec,0x1b,0xd5] +// CHECK: msr pmevtyper4_el0, x12 // encoding: [0x8c,0xec,0x1b,0xd5] +// CHECK: msr pmevtyper5_el0, x12 // encoding: [0xac,0xec,0x1b,0xd5] +// CHECK: msr pmevtyper6_el0, x12 // encoding: [0xcc,0xec,0x1b,0xd5] +// CHECK: msr pmevtyper7_el0, x12 // encoding: [0xec,0xec,0x1b,0xd5] +// CHECK: msr pmevtyper8_el0, x12 // encoding: [0x0c,0xed,0x1b,0xd5] +// CHECK: msr pmevtyper9_el0, x12 // encoding: [0x2c,0xed,0x1b,0xd5] +// CHECK: msr pmevtyper10_el0, x12 // encoding: [0x4c,0xed,0x1b,0xd5] +// CHECK: msr pmevtyper11_el0, x12 // encoding: [0x6c,0xed,0x1b,0xd5] +// CHECK: msr pmevtyper12_el0, x12 // encoding: [0x8c,0xed,0x1b,0xd5] +// CHECK: msr pmevtyper13_el0, x12 // encoding: [0xac,0xed,0x1b,0xd5] +// CHECK: msr pmevtyper14_el0, x12 // encoding: [0xcc,0xed,0x1b,0xd5] +// CHECK: msr pmevtyper15_el0, x12 // encoding: [0xec,0xed,0x1b,0xd5] +// CHECK: msr pmevtyper16_el0, x12 // encoding: [0x0c,0xee,0x1b,0xd5] +// CHECK: msr pmevtyper17_el0, x12 // encoding: [0x2c,0xee,0x1b,0xd5] +// CHECK: msr pmevtyper18_el0, x12 // encoding: [0x4c,0xee,0x1b,0xd5] +// CHECK: msr pmevtyper19_el0, x12 // encoding: [0x6c,0xee,0x1b,0xd5] +// CHECK: msr pmevtyper20_el0, x12 // encoding: [0x8c,0xee,0x1b,0xd5] +// CHECK: msr pmevtyper21_el0, x12 // encoding: [0xac,0xee,0x1b,0xd5] +// CHECK: msr pmevtyper22_el0, x12 // encoding: [0xcc,0xee,0x1b,0xd5] +// CHECK: msr pmevtyper23_el0, x12 // encoding: [0xec,0xee,0x1b,0xd5] +// CHECK: msr pmevtyper24_el0, x12 // encoding: [0x0c,0xef,0x1b,0xd5] +// CHECK: msr pmevtyper25_el0, x12 // encoding: [0x2c,0xef,0x1b,0xd5] +// CHECK: msr pmevtyper26_el0, x12 // encoding: [0x4c,0xef,0x1b,0xd5] +// CHECK: msr pmevtyper27_el0, x12 // encoding: [0x6c,0xef,0x1b,0xd5] +// CHECK: msr pmevtyper28_el0, x12 // encoding: [0x8c,0xef,0x1b,0xd5] +// CHECK: msr pmevtyper29_el0, x12 // encoding: [0xac,0xef,0x1b,0xd5] +// CHECK: msr pmevtyper30_el0, x12 // encoding: [0xcc,0xef,0x1b,0xd5] + + mrs x9, TEECR32_EL1 + mrs x9, OSDTRRX_EL1 + mrs x9, MDCCSR_EL0 + mrs x9, MDCCINT_EL1 + mrs x9, MDSCR_EL1 + mrs x9, OSDTRTX_EL1 + mrs x9, DBGDTR_EL0 + mrs x9, DBGDTRRX_EL0 + mrs x9, OSECCR_EL1 + mrs x9, DBGVCR32_EL2 + mrs x9, DBGBVR0_EL1 + mrs x9, DBGBVR1_EL1 + mrs x9, DBGBVR2_EL1 + mrs x9, DBGBVR3_EL1 + mrs x9, DBGBVR4_EL1 + mrs x9, DBGBVR5_EL1 + mrs x9, DBGBVR6_EL1 + mrs x9, DBGBVR7_EL1 + mrs x9, DBGBVR8_EL1 + mrs x9, DBGBVR9_EL1 + mrs x9, DBGBVR10_EL1 + mrs x9, DBGBVR11_EL1 + mrs x9, DBGBVR12_EL1 + mrs x9, DBGBVR13_EL1 + mrs x9, DBGBVR14_EL1 + mrs x9, DBGBVR15_EL1 + mrs x9, DBGBCR0_EL1 + mrs x9, DBGBCR1_EL1 + mrs x9, DBGBCR2_EL1 + mrs x9, DBGBCR3_EL1 + mrs x9, DBGBCR4_EL1 + mrs x9, DBGBCR5_EL1 + mrs x9, DBGBCR6_EL1 + mrs x9, DBGBCR7_EL1 + mrs x9, DBGBCR8_EL1 + mrs x9, DBGBCR9_EL1 + mrs x9, DBGBCR10_EL1 + mrs x9, DBGBCR11_EL1 + mrs x9, DBGBCR12_EL1 + mrs x9, DBGBCR13_EL1 + mrs x9, DBGBCR14_EL1 + mrs x9, DBGBCR15_EL1 + mrs x9, DBGWVR0_EL1 + mrs x9, DBGWVR1_EL1 + mrs x9, DBGWVR2_EL1 + mrs x9, DBGWVR3_EL1 + mrs x9, DBGWVR4_EL1 + mrs x9, DBGWVR5_EL1 + mrs x9, DBGWVR6_EL1 + mrs x9, DBGWVR7_EL1 + mrs x9, DBGWVR8_EL1 + mrs x9, DBGWVR9_EL1 + mrs x9, DBGWVR10_EL1 + mrs x9, DBGWVR11_EL1 + mrs x9, DBGWVR12_EL1 + mrs x9, DBGWVR13_EL1 + mrs x9, DBGWVR14_EL1 + mrs x9, DBGWVR15_EL1 + mrs x9, DBGWCR0_EL1 + mrs x9, DBGWCR1_EL1 + mrs x9, DBGWCR2_EL1 + mrs x9, DBGWCR3_EL1 + mrs x9, DBGWCR4_EL1 + mrs x9, DBGWCR5_EL1 + mrs x9, DBGWCR6_EL1 + mrs x9, DBGWCR7_EL1 + mrs x9, DBGWCR8_EL1 + mrs x9, DBGWCR9_EL1 + mrs x9, DBGWCR10_EL1 + mrs x9, DBGWCR11_EL1 + mrs x9, DBGWCR12_EL1 + mrs x9, DBGWCR13_EL1 + mrs x9, DBGWCR14_EL1 + mrs x9, DBGWCR15_EL1 + mrs x9, MDRAR_EL1 + mrs x9, TEEHBR32_EL1 + mrs x9, OSLSR_EL1 + mrs x9, OSDLR_EL1 + mrs x9, DBGPRCR_EL1 + mrs x9, DBGCLAIMSET_EL1 + mrs x9, DBGCLAIMCLR_EL1 + mrs x9, DBGAUTHSTATUS_EL1 + mrs x9, MIDR_EL1 + mrs x9, CCSIDR_EL1 + mrs x9, CSSELR_EL1 + mrs x9, VPIDR_EL2 + mrs x9, CLIDR_EL1 + mrs x9, CTR_EL0 + mrs x9, MPIDR_EL1 + mrs x9, VMPIDR_EL2 + mrs x9, REVIDR_EL1 + mrs x9, AIDR_EL1 + mrs x9, DCZID_EL0 + mrs x9, ID_PFR0_EL1 + mrs x9, ID_PFR1_EL1 + mrs x9, ID_DFR0_EL1 + mrs x9, ID_AFR0_EL1 + mrs x9, ID_MMFR0_EL1 + mrs x9, ID_MMFR1_EL1 + mrs x9, ID_MMFR2_EL1 + mrs x9, ID_MMFR3_EL1 + mrs x9, ID_ISAR0_EL1 + mrs x9, ID_ISAR1_EL1 + mrs x9, ID_ISAR2_EL1 + mrs x9, ID_ISAR3_EL1 + mrs x9, ID_ISAR4_EL1 + mrs x9, ID_ISAR5_EL1 + mrs x9, MVFR0_EL1 + mrs x9, MVFR1_EL1 + mrs x9, MVFR2_EL1 + mrs x9, ID_AA64PFR0_EL1 + mrs x9, ID_AA64PFR1_EL1 + mrs x9, ID_AA64DFR0_EL1 + mrs x9, ID_AA64DFR1_EL1 + mrs x9, ID_AA64AFR0_EL1 + mrs x9, ID_AA64AFR1_EL1 + mrs x9, ID_AA64ISAR0_EL1 + mrs x9, ID_AA64ISAR1_EL1 + mrs x9, ID_AA64MMFR0_EL1 + mrs x9, ID_AA64MMFR1_EL1 + mrs x9, SCTLR_EL1 + mrs x9, SCTLR_EL2 + mrs x9, SCTLR_EL3 + mrs x9, ACTLR_EL1 + mrs x9, ACTLR_EL2 + mrs x9, ACTLR_EL3 + mrs x9, CPACR_EL1 + mrs x9, HCR_EL2 + mrs x9, SCR_EL3 + mrs x9, MDCR_EL2 + mrs x9, SDER32_EL3 + mrs x9, CPTR_EL2 + mrs x9, CPTR_EL3 + mrs x9, HSTR_EL2 + mrs x9, HACR_EL2 + mrs x9, MDCR_EL3 + mrs x9, TTBR0_EL1 + mrs x9, TTBR0_EL2 + mrs x9, TTBR0_EL3 + mrs x9, TTBR1_EL1 + mrs x9, TCR_EL1 + mrs x9, TCR_EL2 + mrs x9, TCR_EL3 + mrs x9, VTTBR_EL2 + mrs x9, VTCR_EL2 + mrs x9, DACR32_EL2 + mrs x9, SPSR_EL1 + mrs x9, SPSR_EL2 + mrs x9, SPSR_EL3 + mrs x9, ELR_EL1 + mrs x9, ELR_EL2 + mrs x9, ELR_EL3 + mrs x9, SP_EL0 + mrs x9, SP_EL1 + mrs x9, SP_EL2 + mrs x9, SPSel + mrs x9, NZCV + mrs x9, DAIF + mrs x9, CurrentEL + mrs x9, SPSR_irq + mrs x9, SPSR_abt + mrs x9, SPSR_und + mrs x9, SPSR_fiq + mrs x9, FPCR + mrs x9, FPSR + mrs x9, DSPSR_EL0 + mrs x9, DLR_EL0 + mrs x9, IFSR32_EL2 + mrs x9, AFSR0_EL1 + mrs x9, AFSR0_EL2 + mrs x9, AFSR0_EL3 + mrs x9, AFSR1_EL1 + mrs x9, AFSR1_EL2 + mrs x9, AFSR1_EL3 + mrs x9, ESR_EL1 + mrs x9, ESR_EL2 + mrs x9, ESR_EL3 + mrs x9, FPEXC32_EL2 + mrs x9, FAR_EL1 + mrs x9, FAR_EL2 + mrs x9, FAR_EL3 + mrs x9, HPFAR_EL2 + mrs x9, PAR_EL1 + mrs x9, PMCR_EL0 + mrs x9, PMCNTENSET_EL0 + mrs x9, PMCNTENCLR_EL0 + mrs x9, PMOVSCLR_EL0 + mrs x9, PMSELR_EL0 + mrs x9, PMCEID0_EL0 + mrs x9, PMCEID1_EL0 + mrs x9, PMCCNTR_EL0 + mrs x9, PMXEVTYPER_EL0 + mrs x9, PMXEVCNTR_EL0 + mrs x9, PMUSERENR_EL0 + mrs x9, PMINTENSET_EL1 + mrs x9, PMINTENCLR_EL1 + mrs x9, PMOVSSET_EL0 + mrs x9, MAIR_EL1 + mrs x9, MAIR_EL2 + mrs x9, MAIR_EL3 + mrs x9, AMAIR_EL1 + mrs x9, AMAIR_EL2 + mrs x9, AMAIR_EL3 + mrs x9, VBAR_EL1 + mrs x9, VBAR_EL2 + mrs x9, VBAR_EL3 + mrs x9, RVBAR_EL1 + mrs x9, RVBAR_EL2 + mrs x9, RVBAR_EL3 + mrs x9, RMR_EL1 + mrs x9, RMR_EL2 + mrs x9, RMR_EL3 + mrs x9, ISR_EL1 + mrs x9, CONTEXTIDR_EL1 + mrs x9, TPIDR_EL0 + mrs x9, TPIDR_EL2 + mrs x9, TPIDR_EL3 + mrs x9, TPIDRRO_EL0 + mrs x9, TPIDR_EL1 + mrs x9, CNTFRQ_EL0 + mrs x9, CNTPCT_EL0 + mrs x9, CNTVCT_EL0 + mrs x9, CNTVOFF_EL2 + mrs x9, CNTKCTL_EL1 + mrs x9, CNTHCTL_EL2 + mrs x9, CNTP_TVAL_EL0 + mrs x9, CNTHP_TVAL_EL2 + mrs x9, CNTPS_TVAL_EL1 + mrs x9, CNTP_CTL_EL0 + mrs x9, CNTHP_CTL_EL2 + mrs x9, CNTPS_CTL_EL1 + mrs x9, CNTP_CVAL_EL0 + mrs x9, CNTHP_CVAL_EL2 + mrs x9, CNTPS_CVAL_EL1 + mrs x9, CNTV_TVAL_EL0 + mrs x9, CNTV_CTL_EL0 + mrs x9, CNTV_CVAL_EL0 + mrs x9, PMEVCNTR0_EL0 + mrs x9, PMEVCNTR1_EL0 + mrs x9, PMEVCNTR2_EL0 + mrs x9, PMEVCNTR3_EL0 + mrs x9, PMEVCNTR4_EL0 + mrs x9, PMEVCNTR5_EL0 + mrs x9, PMEVCNTR6_EL0 + mrs x9, PMEVCNTR7_EL0 + mrs x9, PMEVCNTR8_EL0 + mrs x9, PMEVCNTR9_EL0 + mrs x9, PMEVCNTR10_EL0 + mrs x9, PMEVCNTR11_EL0 + mrs x9, PMEVCNTR12_EL0 + mrs x9, PMEVCNTR13_EL0 + mrs x9, PMEVCNTR14_EL0 + mrs x9, PMEVCNTR15_EL0 + mrs x9, PMEVCNTR16_EL0 + mrs x9, PMEVCNTR17_EL0 + mrs x9, PMEVCNTR18_EL0 + mrs x9, PMEVCNTR19_EL0 + mrs x9, PMEVCNTR20_EL0 + mrs x9, PMEVCNTR21_EL0 + mrs x9, PMEVCNTR22_EL0 + mrs x9, PMEVCNTR23_EL0 + mrs x9, PMEVCNTR24_EL0 + mrs x9, PMEVCNTR25_EL0 + mrs x9, PMEVCNTR26_EL0 + mrs x9, PMEVCNTR27_EL0 + mrs x9, PMEVCNTR28_EL0 + mrs x9, PMEVCNTR29_EL0 + mrs x9, PMEVCNTR30_EL0 + mrs x9, PMCCFILTR_EL0 + mrs x9, PMEVTYPER0_EL0 + mrs x9, PMEVTYPER1_EL0 + mrs x9, PMEVTYPER2_EL0 + mrs x9, PMEVTYPER3_EL0 + mrs x9, PMEVTYPER4_EL0 + mrs x9, PMEVTYPER5_EL0 + mrs x9, PMEVTYPER6_EL0 + mrs x9, PMEVTYPER7_EL0 + mrs x9, PMEVTYPER8_EL0 + mrs x9, PMEVTYPER9_EL0 + mrs x9, PMEVTYPER10_EL0 + mrs x9, PMEVTYPER11_EL0 + mrs x9, PMEVTYPER12_EL0 + mrs x9, PMEVTYPER13_EL0 + mrs x9, PMEVTYPER14_EL0 + mrs x9, PMEVTYPER15_EL0 + mrs x9, PMEVTYPER16_EL0 + mrs x9, PMEVTYPER17_EL0 + mrs x9, PMEVTYPER18_EL0 + mrs x9, PMEVTYPER19_EL0 + mrs x9, PMEVTYPER20_EL0 + mrs x9, PMEVTYPER21_EL0 + mrs x9, PMEVTYPER22_EL0 + mrs x9, PMEVTYPER23_EL0 + mrs x9, PMEVTYPER24_EL0 + mrs x9, PMEVTYPER25_EL0 + mrs x9, PMEVTYPER26_EL0 + mrs x9, PMEVTYPER27_EL0 + mrs x9, PMEVTYPER28_EL0 + mrs x9, PMEVTYPER29_EL0 + mrs x9, PMEVTYPER30_EL0 +// CHECK: mrs x9, teecr32_el1 // encoding: [0x09,0x00,0x32,0xd5] +// CHECK: mrs x9, osdtrrx_el1 // encoding: [0x49,0x00,0x30,0xd5] +// CHECK: mrs x9, mdccsr_el0 // encoding: [0x09,0x01,0x33,0xd5] +// CHECK: mrs x9, mdccint_el1 // encoding: [0x09,0x02,0x30,0xd5] +// CHECK: mrs x9, mdscr_el1 // encoding: [0x49,0x02,0x30,0xd5] +// CHECK: mrs x9, osdtrtx_el1 // encoding: [0x49,0x03,0x30,0xd5] +// CHECK: mrs x9, dbgdtr_el0 // encoding: [0x09,0x04,0x33,0xd5] +// CHECK: mrs x9, dbgdtrrx_el0 // encoding: [0x09,0x05,0x33,0xd5] +// CHECK: mrs x9, oseccr_el1 // encoding: [0x49,0x06,0x30,0xd5] +// CHECK: mrs x9, dbgvcr32_el2 // encoding: [0x09,0x07,0x34,0xd5] +// CHECK: mrs x9, dbgbvr0_el1 // encoding: [0x89,0x00,0x30,0xd5] +// CHECK: mrs x9, dbgbvr1_el1 // encoding: [0x89,0x01,0x30,0xd5] +// CHECK: mrs x9, dbgbvr2_el1 // encoding: [0x89,0x02,0x30,0xd5] +// CHECK: mrs x9, dbgbvr3_el1 // encoding: [0x89,0x03,0x30,0xd5] +// CHECK: mrs x9, dbgbvr4_el1 // encoding: [0x89,0x04,0x30,0xd5] +// CHECK: mrs x9, dbgbvr5_el1 // encoding: [0x89,0x05,0x30,0xd5] +// CHECK: mrs x9, dbgbvr6_el1 // encoding: [0x89,0x06,0x30,0xd5] +// CHECK: mrs x9, dbgbvr7_el1 // encoding: [0x89,0x07,0x30,0xd5] +// CHECK: mrs x9, dbgbvr8_el1 // encoding: [0x89,0x08,0x30,0xd5] +// CHECK: mrs x9, dbgbvr9_el1 // encoding: [0x89,0x09,0x30,0xd5] +// CHECK: mrs x9, dbgbvr10_el1 // encoding: [0x89,0x0a,0x30,0xd5] +// CHECK: mrs x9, dbgbvr11_el1 // encoding: [0x89,0x0b,0x30,0xd5] +// CHECK: mrs x9, dbgbvr12_el1 // encoding: [0x89,0x0c,0x30,0xd5] +// CHECK: mrs x9, dbgbvr13_el1 // encoding: [0x89,0x0d,0x30,0xd5] +// CHECK: mrs x9, dbgbvr14_el1 // encoding: [0x89,0x0e,0x30,0xd5] +// CHECK: mrs x9, dbgbvr15_el1 // encoding: [0x89,0x0f,0x30,0xd5] +// CHECK: mrs x9, dbgbcr0_el1 // encoding: [0xa9,0x00,0x30,0xd5] +// CHECK: mrs x9, dbgbcr1_el1 // encoding: [0xa9,0x01,0x30,0xd5] +// CHECK: mrs x9, dbgbcr2_el1 // encoding: [0xa9,0x02,0x30,0xd5] +// CHECK: mrs x9, dbgbcr3_el1 // encoding: [0xa9,0x03,0x30,0xd5] +// CHECK: mrs x9, dbgbcr4_el1 // encoding: [0xa9,0x04,0x30,0xd5] +// CHECK: mrs x9, dbgbcr5_el1 // encoding: [0xa9,0x05,0x30,0xd5] +// CHECK: mrs x9, dbgbcr6_el1 // encoding: [0xa9,0x06,0x30,0xd5] +// CHECK: mrs x9, dbgbcr7_el1 // encoding: [0xa9,0x07,0x30,0xd5] +// CHECK: mrs x9, dbgbcr8_el1 // encoding: [0xa9,0x08,0x30,0xd5] +// CHECK: mrs x9, dbgbcr9_el1 // encoding: [0xa9,0x09,0x30,0xd5] +// CHECK: mrs x9, dbgbcr10_el1 // encoding: [0xa9,0x0a,0x30,0xd5] +// CHECK: mrs x9, dbgbcr11_el1 // encoding: [0xa9,0x0b,0x30,0xd5] +// CHECK: mrs x9, dbgbcr12_el1 // encoding: [0xa9,0x0c,0x30,0xd5] +// CHECK: mrs x9, dbgbcr13_el1 // encoding: [0xa9,0x0d,0x30,0xd5] +// CHECK: mrs x9, dbgbcr14_el1 // encoding: [0xa9,0x0e,0x30,0xd5] +// CHECK: mrs x9, dbgbcr15_el1 // encoding: [0xa9,0x0f,0x30,0xd5] +// CHECK: mrs x9, dbgwvr0_el1 // encoding: [0xc9,0x00,0x30,0xd5] +// CHECK: mrs x9, dbgwvr1_el1 // encoding: [0xc9,0x01,0x30,0xd5] +// CHECK: mrs x9, dbgwvr2_el1 // encoding: [0xc9,0x02,0x30,0xd5] +// CHECK: mrs x9, dbgwvr3_el1 // encoding: [0xc9,0x03,0x30,0xd5] +// CHECK: mrs x9, dbgwvr4_el1 // encoding: [0xc9,0x04,0x30,0xd5] +// CHECK: mrs x9, dbgwvr5_el1 // encoding: [0xc9,0x05,0x30,0xd5] +// CHECK: mrs x9, dbgwvr6_el1 // encoding: [0xc9,0x06,0x30,0xd5] +// CHECK: mrs x9, dbgwvr7_el1 // encoding: [0xc9,0x07,0x30,0xd5] +// CHECK: mrs x9, dbgwvr8_el1 // encoding: [0xc9,0x08,0x30,0xd5] +// CHECK: mrs x9, dbgwvr9_el1 // encoding: [0xc9,0x09,0x30,0xd5] +// CHECK: mrs x9, dbgwvr10_el1 // encoding: [0xc9,0x0a,0x30,0xd5] +// CHECK: mrs x9, dbgwvr11_el1 // encoding: [0xc9,0x0b,0x30,0xd5] +// CHECK: mrs x9, dbgwvr12_el1 // encoding: [0xc9,0x0c,0x30,0xd5] +// CHECK: mrs x9, dbgwvr13_el1 // encoding: [0xc9,0x0d,0x30,0xd5] +// CHECK: mrs x9, dbgwvr14_el1 // encoding: [0xc9,0x0e,0x30,0xd5] +// CHECK: mrs x9, dbgwvr15_el1 // encoding: [0xc9,0x0f,0x30,0xd5] +// CHECK: mrs x9, dbgwcr0_el1 // encoding: [0xe9,0x00,0x30,0xd5] +// CHECK: mrs x9, dbgwcr1_el1 // encoding: [0xe9,0x01,0x30,0xd5] +// CHECK: mrs x9, dbgwcr2_el1 // encoding: [0xe9,0x02,0x30,0xd5] +// CHECK: mrs x9, dbgwcr3_el1 // encoding: [0xe9,0x03,0x30,0xd5] +// CHECK: mrs x9, dbgwcr4_el1 // encoding: [0xe9,0x04,0x30,0xd5] +// CHECK: mrs x9, dbgwcr5_el1 // encoding: [0xe9,0x05,0x30,0xd5] +// CHECK: mrs x9, dbgwcr6_el1 // encoding: [0xe9,0x06,0x30,0xd5] +// CHECK: mrs x9, dbgwcr7_el1 // encoding: [0xe9,0x07,0x30,0xd5] +// CHECK: mrs x9, dbgwcr8_el1 // encoding: [0xe9,0x08,0x30,0xd5] +// CHECK: mrs x9, dbgwcr9_el1 // encoding: [0xe9,0x09,0x30,0xd5] +// CHECK: mrs x9, dbgwcr10_el1 // encoding: [0xe9,0x0a,0x30,0xd5] +// CHECK: mrs x9, dbgwcr11_el1 // encoding: [0xe9,0x0b,0x30,0xd5] +// CHECK: mrs x9, dbgwcr12_el1 // encoding: [0xe9,0x0c,0x30,0xd5] +// CHECK: mrs x9, dbgwcr13_el1 // encoding: [0xe9,0x0d,0x30,0xd5] +// CHECK: mrs x9, dbgwcr14_el1 // encoding: [0xe9,0x0e,0x30,0xd5] +// CHECK: mrs x9, dbgwcr15_el1 // encoding: [0xe9,0x0f,0x30,0xd5] +// CHECK: mrs x9, mdrar_el1 // encoding: [0x09,0x10,0x30,0xd5] +// CHECK: mrs x9, teehbr32_el1 // encoding: [0x09,0x10,0x32,0xd5] +// CHECK: mrs x9, oslsr_el1 // encoding: [0x89,0x11,0x30,0xd5] +// CHECK: mrs x9, osdlr_el1 // encoding: [0x89,0x13,0x30,0xd5] +// CHECK: mrs x9, dbgprcr_el1 // encoding: [0x89,0x14,0x30,0xd5] +// CHECK: mrs x9, dbgclaimset_el1 // encoding: [0xc9,0x78,0x30,0xd5] +// CHECK: mrs x9, dbgclaimclr_el1 // encoding: [0xc9,0x79,0x30,0xd5] +// CHECK: mrs x9, dbgauthstatus_el1 // encoding: [0xc9,0x7e,0x30,0xd5] +// CHECK: mrs x9, midr_el1 // encoding: [0x09,0x00,0x38,0xd5] +// CHECK: mrs x9, ccsidr_el1 // encoding: [0x09,0x00,0x39,0xd5] +// CHECK: mrs x9, csselr_el1 // encoding: [0x09,0x00,0x3a,0xd5] +// CHECK: mrs x9, vpidr_el2 // encoding: [0x09,0x00,0x3c,0xd5] +// CHECK: mrs x9, clidr_el1 // encoding: [0x29,0x00,0x39,0xd5] +// CHECK: mrs x9, ctr_el0 // encoding: [0x29,0x00,0x3b,0xd5] +// CHECK: mrs x9, mpidr_el1 // encoding: [0xa9,0x00,0x38,0xd5] +// CHECK: mrs x9, vmpidr_el2 // encoding: [0xa9,0x00,0x3c,0xd5] +// CHECK: mrs x9, revidr_el1 // encoding: [0xc9,0x00,0x38,0xd5] +// CHECK: mrs x9, aidr_el1 // encoding: [0xe9,0x00,0x39,0xd5] +// CHECK: mrs x9, dczid_el0 // encoding: [0xe9,0x00,0x3b,0xd5] +// CHECK: mrs x9, id_pfr0_el1 // encoding: [0x09,0x01,0x38,0xd5] +// CHECK: mrs x9, id_pfr1_el1 // encoding: [0x29,0x01,0x38,0xd5] +// CHECK: mrs x9, id_dfr0_el1 // encoding: [0x49,0x01,0x38,0xd5] +// CHECK: mrs x9, id_afr0_el1 // encoding: [0x69,0x01,0x38,0xd5] +// CHECK: mrs x9, id_mmfr0_el1 // encoding: [0x89,0x01,0x38,0xd5] +// CHECK: mrs x9, id_mmfr1_el1 // encoding: [0xa9,0x01,0x38,0xd5] +// CHECK: mrs x9, id_mmfr2_el1 // encoding: [0xc9,0x01,0x38,0xd5] +// CHECK: mrs x9, id_mmfr3_el1 // encoding: [0xe9,0x01,0x38,0xd5] +// CHECK: mrs x9, id_isar0_el1 // encoding: [0x09,0x02,0x38,0xd5] +// CHECK: mrs x9, id_isar1_el1 // encoding: [0x29,0x02,0x38,0xd5] +// CHECK: mrs x9, id_isar2_el1 // encoding: [0x49,0x02,0x38,0xd5] +// CHECK: mrs x9, id_isar3_el1 // encoding: [0x69,0x02,0x38,0xd5] +// CHECK: mrs x9, id_isar4_el1 // encoding: [0x89,0x02,0x38,0xd5] +// CHECK: mrs x9, id_isar5_el1 // encoding: [0xa9,0x02,0x38,0xd5] +// CHECK: mrs x9, mvfr0_el1 // encoding: [0x09,0x03,0x38,0xd5] +// CHECK: mrs x9, mvfr1_el1 // encoding: [0x29,0x03,0x38,0xd5] +// CHECK: mrs x9, mvfr2_el1 // encoding: [0x49,0x03,0x38,0xd5] +// CHECK: mrs x9, id_aa64pfr0_el1 // encoding: [0x09,0x04,0x38,0xd5] +// CHECK: mrs x9, id_aa64pfr1_el1 // encoding: [0x29,0x04,0x38,0xd5] +// CHECK: mrs x9, id_aa64dfr0_el1 // encoding: [0x09,0x05,0x38,0xd5] +// CHECK: mrs x9, id_aa64dfr1_el1 // encoding: [0x29,0x05,0x38,0xd5] +// CHECK: mrs x9, id_aa64afr0_el1 // encoding: [0x89,0x05,0x38,0xd5] +// CHECK: mrs x9, id_aa64afr1_el1 // encoding: [0xa9,0x05,0x38,0xd5] +// CHECK: mrs x9, id_aa64isar0_el1 // encoding: [0x09,0x06,0x38,0xd5] +// CHECK: mrs x9, id_aa64isar1_el1 // encoding: [0x29,0x06,0x38,0xd5] +// CHECK: mrs x9, id_aa64mmfr0_el1 // encoding: [0x09,0x07,0x38,0xd5] +// CHECK: mrs x9, id_aa64mmfr1_el1 // encoding: [0x29,0x07,0x38,0xd5] +// CHECK: mrs x9, sctlr_el1 // encoding: [0x09,0x10,0x38,0xd5] +// CHECK: mrs x9, sctlr_el2 // encoding: [0x09,0x10,0x3c,0xd5] +// CHECK: mrs x9, sctlr_el3 // encoding: [0x09,0x10,0x3e,0xd5] +// CHECK: mrs x9, actlr_el1 // encoding: [0x29,0x10,0x38,0xd5] +// CHECK: mrs x9, actlr_el2 // encoding: [0x29,0x10,0x3c,0xd5] +// CHECK: mrs x9, actlr_el3 // encoding: [0x29,0x10,0x3e,0xd5] +// CHECK: mrs x9, cpacr_el1 // encoding: [0x49,0x10,0x38,0xd5] +// CHECK: mrs x9, hcr_el2 // encoding: [0x09,0x11,0x3c,0xd5] +// CHECK: mrs x9, scr_el3 // encoding: [0x09,0x11,0x3e,0xd5] +// CHECK: mrs x9, mdcr_el2 // encoding: [0x29,0x11,0x3c,0xd5] +// CHECK: mrs x9, sder32_el3 // encoding: [0x29,0x11,0x3e,0xd5] +// CHECK: mrs x9, cptr_el2 // encoding: [0x49,0x11,0x3c,0xd5] +// CHECK: mrs x9, cptr_el3 // encoding: [0x49,0x11,0x3e,0xd5] +// CHECK: mrs x9, hstr_el2 // encoding: [0x69,0x11,0x3c,0xd5] +// CHECK: mrs x9, hacr_el2 // encoding: [0xe9,0x11,0x3c,0xd5] +// CHECK: mrs x9, mdcr_el3 // encoding: [0x29,0x13,0x3e,0xd5] +// CHECK: mrs x9, ttbr0_el1 // encoding: [0x09,0x20,0x38,0xd5] +// CHECK: mrs x9, ttbr0_el2 // encoding: [0x09,0x20,0x3c,0xd5] +// CHECK: mrs x9, ttbr0_el3 // encoding: [0x09,0x20,0x3e,0xd5] +// CHECK: mrs x9, ttbr1_el1 // encoding: [0x29,0x20,0x38,0xd5] +// CHECK: mrs x9, tcr_el1 // encoding: [0x49,0x20,0x38,0xd5] +// CHECK: mrs x9, tcr_el2 // encoding: [0x49,0x20,0x3c,0xd5] +// CHECK: mrs x9, tcr_el3 // encoding: [0x49,0x20,0x3e,0xd5] +// CHECK: mrs x9, vttbr_el2 // encoding: [0x09,0x21,0x3c,0xd5] +// CHECK: mrs x9, vtcr_el2 // encoding: [0x49,0x21,0x3c,0xd5] +// CHECK: mrs x9, dacr32_el2 // encoding: [0x09,0x30,0x3c,0xd5] +// CHECK: mrs x9, spsr_el1 // encoding: [0x09,0x40,0x38,0xd5] +// CHECK: mrs x9, spsr_el2 // encoding: [0x09,0x40,0x3c,0xd5] +// CHECK: mrs x9, spsr_el3 // encoding: [0x09,0x40,0x3e,0xd5] +// CHECK: mrs x9, elr_el1 // encoding: [0x29,0x40,0x38,0xd5] +// CHECK: mrs x9, elr_el2 // encoding: [0x29,0x40,0x3c,0xd5] +// CHECK: mrs x9, elr_el3 // encoding: [0x29,0x40,0x3e,0xd5] +// CHECK: mrs x9, sp_el0 // encoding: [0x09,0x41,0x38,0xd5] +// CHECK: mrs x9, sp_el1 // encoding: [0x09,0x41,0x3c,0xd5] +// CHECK: mrs x9, sp_el2 // encoding: [0x09,0x41,0x3e,0xd5] +// CHECK: mrs x9, spsel // encoding: [0x09,0x42,0x38,0xd5] +// CHECK: mrs x9, nzcv // encoding: [0x09,0x42,0x3b,0xd5] +// CHECK: mrs x9, daif // encoding: [0x29,0x42,0x3b,0xd5] +// CHECK: mrs x9, currentel // encoding: [0x49,0x42,0x38,0xd5] +// CHECK: mrs x9, spsr_irq // encoding: [0x09,0x43,0x3c,0xd5] +// CHECK: mrs x9, spsr_abt // encoding: [0x29,0x43,0x3c,0xd5] +// CHECK: mrs x9, spsr_und // encoding: [0x49,0x43,0x3c,0xd5] +// CHECK: mrs x9, spsr_fiq // encoding: [0x69,0x43,0x3c,0xd5] +// CHECK: mrs x9, fpcr // encoding: [0x09,0x44,0x3b,0xd5] +// CHECK: mrs x9, fpsr // encoding: [0x29,0x44,0x3b,0xd5] +// CHECK: mrs x9, dspsr_el0 // encoding: [0x09,0x45,0x3b,0xd5] +// CHECK: mrs x9, dlr_el0 // encoding: [0x29,0x45,0x3b,0xd5] +// CHECK: mrs x9, ifsr32_el2 // encoding: [0x29,0x50,0x3c,0xd5] +// CHECK: mrs x9, afsr0_el1 // encoding: [0x09,0x51,0x38,0xd5] +// CHECK: mrs x9, afsr0_el2 // encoding: [0x09,0x51,0x3c,0xd5] +// CHECK: mrs x9, afsr0_el3 // encoding: [0x09,0x51,0x3e,0xd5] +// CHECK: mrs x9, afsr1_el1 // encoding: [0x29,0x51,0x38,0xd5] +// CHECK: mrs x9, afsr1_el2 // encoding: [0x29,0x51,0x3c,0xd5] +// CHECK: mrs x9, afsr1_el3 // encoding: [0x29,0x51,0x3e,0xd5] +// CHECK: mrs x9, esr_el1 // encoding: [0x09,0x52,0x38,0xd5] +// CHECK: mrs x9, esr_el2 // encoding: [0x09,0x52,0x3c,0xd5] +// CHECK: mrs x9, esr_el3 // encoding: [0x09,0x52,0x3e,0xd5] +// CHECK: mrs x9, fpexc32_el2 // encoding: [0x09,0x53,0x3c,0xd5] +// CHECK: mrs x9, far_el1 // encoding: [0x09,0x60,0x38,0xd5] +// CHECK: mrs x9, far_el2 // encoding: [0x09,0x60,0x3c,0xd5] +// CHECK: mrs x9, far_el3 // encoding: [0x09,0x60,0x3e,0xd5] +// CHECK: mrs x9, hpfar_el2 // encoding: [0x89,0x60,0x3c,0xd5] +// CHECK: mrs x9, par_el1 // encoding: [0x09,0x74,0x38,0xd5] +// CHECK: mrs x9, pmcr_el0 // encoding: [0x09,0x9c,0x3b,0xd5] +// CHECK: mrs x9, pmcntenset_el0 // encoding: [0x29,0x9c,0x3b,0xd5] +// CHECK: mrs x9, pmcntenclr_el0 // encoding: [0x49,0x9c,0x3b,0xd5] +// CHECK: mrs x9, pmovsclr_el0 // encoding: [0x69,0x9c,0x3b,0xd5] +// CHECK: mrs x9, pmselr_el0 // encoding: [0xa9,0x9c,0x3b,0xd5] +// CHECK: mrs x9, pmceid0_el0 // encoding: [0xc9,0x9c,0x3b,0xd5] +// CHECK: mrs x9, pmceid1_el0 // encoding: [0xe9,0x9c,0x3b,0xd5] +// CHECK: mrs x9, pmccntr_el0 // encoding: [0x09,0x9d,0x3b,0xd5] +// CHECK: mrs x9, pmxevtyper_el0 // encoding: [0x29,0x9d,0x3b,0xd5] +// CHECK: mrs x9, pmxevcntr_el0 // encoding: [0x49,0x9d,0x3b,0xd5] +// CHECK: mrs x9, pmuserenr_el0 // encoding: [0x09,0x9e,0x3b,0xd5] +// CHECK: mrs x9, pmintenset_el1 // encoding: [0x29,0x9e,0x38,0xd5] +// CHECK: mrs x9, pmintenclr_el1 // encoding: [0x49,0x9e,0x38,0xd5] +// CHECK: mrs x9, pmovsset_el0 // encoding: [0x69,0x9e,0x3b,0xd5] +// CHECK: mrs x9, mair_el1 // encoding: [0x09,0xa2,0x38,0xd5] +// CHECK: mrs x9, mair_el2 // encoding: [0x09,0xa2,0x3c,0xd5] +// CHECK: mrs x9, mair_el3 // encoding: [0x09,0xa2,0x3e,0xd5] +// CHECK: mrs x9, amair_el1 // encoding: [0x09,0xa3,0x38,0xd5] +// CHECK: mrs x9, amair_el2 // encoding: [0x09,0xa3,0x3c,0xd5] +// CHECK: mrs x9, amair_el3 // encoding: [0x09,0xa3,0x3e,0xd5] +// CHECK: mrs x9, vbar_el1 // encoding: [0x09,0xc0,0x38,0xd5] +// CHECK: mrs x9, vbar_el2 // encoding: [0x09,0xc0,0x3c,0xd5] +// CHECK: mrs x9, vbar_el3 // encoding: [0x09,0xc0,0x3e,0xd5] +// CHECK: mrs x9, rvbar_el1 // encoding: [0x29,0xc0,0x38,0xd5] +// CHECK: mrs x9, rvbar_el2 // encoding: [0x29,0xc0,0x3c,0xd5] +// CHECK: mrs x9, rvbar_el3 // encoding: [0x29,0xc0,0x3e,0xd5] +// CHECK: mrs x9, rmr_el1 // encoding: [0x49,0xc0,0x38,0xd5] +// CHECK: mrs x9, rmr_el2 // encoding: [0x49,0xc0,0x3c,0xd5] +// CHECK: mrs x9, rmr_el3 // encoding: [0x49,0xc0,0x3e,0xd5] +// CHECK: mrs x9, isr_el1 // encoding: [0x09,0xc1,0x38,0xd5] +// CHECK: mrs x9, contextidr_el1 // encoding: [0x29,0xd0,0x38,0xd5] +// CHECK: mrs x9, tpidr_el0 // encoding: [0x49,0xd0,0x3b,0xd5] +// CHECK: mrs x9, tpidr_el2 // encoding: [0x49,0xd0,0x3c,0xd5] +// CHECK: mrs x9, tpidr_el3 // encoding: [0x49,0xd0,0x3e,0xd5] +// CHECK: mrs x9, tpidrro_el0 // encoding: [0x69,0xd0,0x3b,0xd5] +// CHECK: mrs x9, tpidr_el1 // encoding: [0x89,0xd0,0x38,0xd5] +// CHECK: mrs x9, cntfrq_el0 // encoding: [0x09,0xe0,0x3b,0xd5] +// CHECK: mrs x9, cntpct_el0 // encoding: [0x29,0xe0,0x3b,0xd5] +// CHECK: mrs x9, cntvct_el0 // encoding: [0x49,0xe0,0x3b,0xd5] +// CHECK: mrs x9, cntvoff_el2 // encoding: [0x69,0xe0,0x3c,0xd5] +// CHECK: mrs x9, cntkctl_el1 // encoding: [0x09,0xe1,0x38,0xd5] +// CHECK: mrs x9, cnthctl_el2 // encoding: [0x09,0xe1,0x3c,0xd5] +// CHECK: mrs x9, cntp_tval_el0 // encoding: [0x09,0xe2,0x3b,0xd5] +// CHECK: mrs x9, cnthp_tval_el2 // encoding: [0x09,0xe2,0x3c,0xd5] +// CHECK: mrs x9, cntps_tval_el1 // encoding: [0x09,0xe2,0x3f,0xd5] +// CHECK: mrs x9, cntp_ctl_el0 // encoding: [0x29,0xe2,0x3b,0xd5] +// CHECK: mrs x9, cnthp_ctl_el2 // encoding: [0x29,0xe2,0x3c,0xd5] +// CHECK: mrs x9, cntps_ctl_el1 // encoding: [0x29,0xe2,0x3f,0xd5] +// CHECK: mrs x9, cntp_cval_el0 // encoding: [0x49,0xe2,0x3b,0xd5] +// CHECK: mrs x9, cnthp_cval_el2 // encoding: [0x49,0xe2,0x3c,0xd5] +// CHECK: mrs x9, cntps_cval_el1 // encoding: [0x49,0xe2,0x3f,0xd5] +// CHECK: mrs x9, cntv_tval_el0 // encoding: [0x09,0xe3,0x3b,0xd5] +// CHECK: mrs x9, cntv_ctl_el0 // encoding: [0x29,0xe3,0x3b,0xd5] +// CHECK: mrs x9, cntv_cval_el0 // encoding: [0x49,0xe3,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr0_el0 // encoding: [0x09,0xe8,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr1_el0 // encoding: [0x29,0xe8,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr2_el0 // encoding: [0x49,0xe8,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr3_el0 // encoding: [0x69,0xe8,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr4_el0 // encoding: [0x89,0xe8,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr5_el0 // encoding: [0xa9,0xe8,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr6_el0 // encoding: [0xc9,0xe8,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr7_el0 // encoding: [0xe9,0xe8,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr8_el0 // encoding: [0x09,0xe9,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr9_el0 // encoding: [0x29,0xe9,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr10_el0 // encoding: [0x49,0xe9,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr11_el0 // encoding: [0x69,0xe9,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr12_el0 // encoding: [0x89,0xe9,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr13_el0 // encoding: [0xa9,0xe9,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr14_el0 // encoding: [0xc9,0xe9,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr15_el0 // encoding: [0xe9,0xe9,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr16_el0 // encoding: [0x09,0xea,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr17_el0 // encoding: [0x29,0xea,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr18_el0 // encoding: [0x49,0xea,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr19_el0 // encoding: [0x69,0xea,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr20_el0 // encoding: [0x89,0xea,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr21_el0 // encoding: [0xa9,0xea,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr22_el0 // encoding: [0xc9,0xea,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr23_el0 // encoding: [0xe9,0xea,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr24_el0 // encoding: [0x09,0xeb,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr25_el0 // encoding: [0x29,0xeb,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr26_el0 // encoding: [0x49,0xeb,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr27_el0 // encoding: [0x69,0xeb,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr28_el0 // encoding: [0x89,0xeb,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr29_el0 // encoding: [0xa9,0xeb,0x3b,0xd5] +// CHECK: mrs x9, pmevcntr30_el0 // encoding: [0xc9,0xeb,0x3b,0xd5] +// CHECK: mrs x9, pmccfiltr_el0 // encoding: [0xe9,0xef,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper0_el0 // encoding: [0x09,0xec,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper1_el0 // encoding: [0x29,0xec,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper2_el0 // encoding: [0x49,0xec,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper3_el0 // encoding: [0x69,0xec,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper4_el0 // encoding: [0x89,0xec,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper5_el0 // encoding: [0xa9,0xec,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper6_el0 // encoding: [0xc9,0xec,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper7_el0 // encoding: [0xe9,0xec,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper8_el0 // encoding: [0x09,0xed,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper9_el0 // encoding: [0x29,0xed,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper10_el0 // encoding: [0x49,0xed,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper11_el0 // encoding: [0x69,0xed,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper12_el0 // encoding: [0x89,0xed,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper13_el0 // encoding: [0xa9,0xed,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper14_el0 // encoding: [0xc9,0xed,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper15_el0 // encoding: [0xe9,0xed,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper16_el0 // encoding: [0x09,0xee,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper17_el0 // encoding: [0x29,0xee,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper18_el0 // encoding: [0x49,0xee,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper19_el0 // encoding: [0x69,0xee,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper20_el0 // encoding: [0x89,0xee,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper21_el0 // encoding: [0xa9,0xee,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper22_el0 // encoding: [0xc9,0xee,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper23_el0 // encoding: [0xe9,0xee,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper24_el0 // encoding: [0x09,0xef,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper25_el0 // encoding: [0x29,0xef,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper26_el0 // encoding: [0x49,0xef,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper27_el0 // encoding: [0x69,0xef,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper28_el0 // encoding: [0x89,0xef,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper29_el0 // encoding: [0xa9,0xef,0x3b,0xd5] +// CHECK: mrs x9, pmevtyper30_el0 // encoding: [0xc9,0xef,0x3b,0xd5] + + mrs x12, s3_7_c15_c1_5 + mrs x13, s3_2_c11_c15_7 + msr s3_0_c15_c0_0, x12 + msr s3_7_c11_c13_7, x5 +// CHECK: mrs x12, s3_7_c15_c1_5 // encoding: [0xac,0xf1,0x3f,0xd5] +// CHECK: mrs x13, s3_2_c11_c15_7 // encoding: [0xed,0xbf,0x3a,0xd5] +// CHECK: msr s3_0_c15_c0_0, x12 // encoding: [0x0c,0xf0,0x18,0xd5] +// CHECK: msr s3_7_c11_c13_7, x5 // encoding: [0xe5,0xbd,0x1f,0xd5] + +//------------------------------------------------------------------------------ +// Unconditional branch (immediate) +//------------------------------------------------------------------------------ + + tbz x5, #0, somewhere + tbz xzr, #63, elsewhere + tbnz x5, #45, nowhere +// CHECK: tbz x5, #0, somewhere // encoding: [0x05'A',A,A,0x36'A'] +// CHECK: // fixup A - offset: 0, value: somewhere, kind: fixup_a64_tstbr +// CHECK: tbz xzr, #63, elsewhere // encoding: [0x1f'A',A,0xf8'A',0xb6'A'] +// CHECK: // fixup A - offset: 0, value: elsewhere, kind: fixup_a64_tstbr +// CHECK: tbnz x5, #45, nowhere // encoding: [0x05'A',A,0x68'A',0xb7'A'] +// CHECK: // fixup A - offset: 0, value: nowhere, kind: fixup_a64_tstbr + + tbnz w3, #2, there + tbnz wzr, #31, nowhere + tbz w5, #12, anywhere +// CHECK: tbnz w3, #2, there // encoding: [0x03'A',A,0x10'A',0x37'A'] +// CHECK: // fixup A - offset: 0, value: there, kind: fixup_a64_tstbr +// CHECK: tbnz wzr, #31, nowhere // encoding: [0x1f'A',A,0xf8'A',0x37'A'] +// CHECK: // fixup A - offset: 0, value: nowhere, kind: fixup_a64_tstbr +// CHECK: tbz w5, #12, anywhere // encoding: [0x05'A',A,0x60'A',0x36'A'] +// CHECK: // fixup A - offset: 0, value: anywhere, kind: fixup_a64_tstbr + +//------------------------------------------------------------------------------ +// Unconditional branch (immediate) +//------------------------------------------------------------------------------ + + b somewhere + bl elsewhere +// CHECK: b somewhere // encoding: [A,A,A,0x14'A'] +// CHECK: // fixup A - offset: 0, value: somewhere, kind: fixup_a64_uncondbr +// CHECK: bl elsewhere // encoding: [A,A,A,0x94'A'] +// CHECK: // fixup A - offset: 0, value: elsewhere, kind: fixup_a64_call + + b #4 + bl #0 + b #134217724 + bl #-134217728 +// CHECK: b #4 // encoding: [0x01,0x00,0x00,0x14] +// CHECK: bl #0 // encoding: [0x00,0x00,0x00,0x94] +// CHECK: b #134217724 // encoding: [0xff,0xff,0xff,0x15] +// CHECK: bl #-134217728 // encoding: [0x00,0x00,0x00,0x96] + +//------------------------------------------------------------------------------ +// Unconditional branch (register) +//------------------------------------------------------------------------------ + + br x20 + blr xzr + ret x10 +// CHECK: br x20 // encoding: [0x80,0x02,0x1f,0xd6] +// CHECK: blr xzr // encoding: [0xe0,0x03,0x3f,0xd6] +// CHECK: ret x10 // encoding: [0x40,0x01,0x5f,0xd6] + + ret + eret + drps +// CHECK: ret // encoding: [0xc0,0x03,0x5f,0xd6] +// CHECK: eret // encoding: [0xe0,0x03,0x9f,0xd6] +// CHECK: drps // encoding: [0xe0,0x03,0xbf,0xd6] + diff --git a/test/MC/AArch64/elf-globaladdress.ll b/test/MC/AArch64/elf-globaladdress.ll new file mode 100644 index 000000000000..190439d8fe48 --- /dev/null +++ b/test/MC/AArch64/elf-globaladdress.ll @@ -0,0 +1,111 @@ +;; RUN: llc -mtriple=aarch64-none-linux-gnu -filetype=obj %s -o - | \ +;; RUN: elf-dump | FileCheck -check-prefix=OBJ %s + +; Also take it on a round-trip through llvm-mc to stretch assembly-parsing's legs: +;; RUN: llc -mtriple=aarch64-none-linux-gnu %s -o - | \ +;; RUN: llvm-mc -arch=aarch64 -filetype=obj -o - | \ +;; RUN: elf-dump | FileCheck -check-prefix=OBJ %s + +@var8 = global i8 0 +@var16 = global i16 0 +@var32 = global i32 0 +@var64 = global i64 0 + +define void @loadstore() { + %val8 = load i8* @var8 + store volatile i8 %val8, i8* @var8 + + %val16 = load i16* @var16 + store volatile i16 %val16, i16* @var16 + + %val32 = load i32* @var32 + store volatile i32 %val32, i32* @var32 + + %val64 = load i64* @var64 + store volatile i64 %val64, i64* @var64 + + ret void +} + +@globaddr = global i64* null + +define void @address() { + store i64* @var64, i64** @globaddr + ret void +} + +; Check we're using EM_AARCH64 +; OBJ: 'e_machine', 0x00 + +; OBJ: .rela.text + +; var8 +; R_AARCH64_ADR_PREL_PG_HI21 against var8 +; OBJ: 'r_sym', 0x0000000f +; OBJ-NEXT: 'r_type', 0x00000113 + +; R_AARCH64_LDST8_ABS_LO12_NC against var8 +; OBJ: 'r_sym', 0x0000000f +; OBJ-NEXT: 'r_type', 0x00000116 + + +; var16 +; R_AARCH64_ADR_PREL_PG_HI21 against var16 +; OBJ: 'r_sym', 0x0000000c +; OBJ-NEXT: 'r_type', 0x00000113 + +; R_AARCH64_LDST16_ABS_LO12_NC against var16 +; OBJ: 'r_sym', 0x0000000c +; OBJ-NEXT: 'r_type', 0x0000011c + + +; var32 +; R_AARCH64_ADR_PREL_PG_HI21 against var32 +; OBJ: 'r_sym', 0x0000000d +; OBJ-NEXT: 'r_type', 0x00000113 + +; R_AARCH64_LDST32_ABS_LO12_NC against var32 +; OBJ: 'r_sym', 0x0000000d +; OBJ-NEXT: 'r_type', 0x0000011d + + +; var64 +; R_AARCH64_ADR_PREL_PG_HI21 against var64 +; OBJ: 'r_sym', 0x0000000e +; OBJ-NEXT: 'r_type', 0x00000113 + +; R_AARCH64_LDST64_ABS_LO12_NC against var64 +; OBJ: 'r_sym', 0x0000000e +; OBJ-NEXT: 'r_type', 0x0000011e + +; This is on the store, so not really important, but it stops the next +; match working. +; R_AARCH64_LDST64_ABS_LO12_NC against var64 +; OBJ: 'r_sym', 0x0000000e +; OBJ-NEXT: 'r_type', 0x0000011e + + +; Pure address-calculation against var64 +; R_AARCH64_ADR_PREL_PG_HI21 against var64 +; OBJ: 'r_sym', 0x0000000e +; OBJ-NEXT: 'r_type', 0x00000113 + +; R_AARCH64_ADD_ABS_LO12_NC against var64 +; OBJ: 'r_sym', 0x0000000e +; OBJ-NEXT: 'r_type', 0x00000115 + + +; Make sure the symbols don't move around, otherwise relocation info +; will be wrong: + +; OBJ: Symbol 12 +; OBJ-NEXT: var16 + +; OBJ: Symbol 13 +; OBJ-NEXT: var32 + +; OBJ: Symbol 14 +; OBJ-NEXT: var64 + +; OBJ: Symbol 15 +; OBJ-NEXT: var8 diff --git a/test/MC/AArch64/elf-objdump.s b/test/MC/AArch64/elf-objdump.s new file mode 100644 index 000000000000..c5aa5b19899e --- /dev/null +++ b/test/MC/AArch64/elf-objdump.s @@ -0,0 +1,5 @@ +// 64 bit little endian +// RUN: llvm-mc -filetype=obj -arch=aarch64 -triple aarch64-none-linux-gnu %s -o - | llvm-objdump -d + +// We just want to see if llvm-objdump works at all. +// CHECK: .text diff --git a/test/MC/AArch64/elf-reloc-addsubimm.s b/test/MC/AArch64/elf-reloc-addsubimm.s new file mode 100644 index 000000000000..7fa6e90b5d0d --- /dev/null +++ b/test/MC/AArch64/elf-reloc-addsubimm.s @@ -0,0 +1,13 @@ +// RUN: llvm-mc -arch=aarch64 -filetype=obj %s -o - | \ +// RUN: elf-dump | FileCheck -check-prefix=OBJ %s + + add x2, x3, #:lo12:some_label +// OBJ: .rela.text + +// OBJ: 'r_offset', 0x0000000000000000 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000115 + +// OBJ: .symtab +// OBJ: Symbol 5 +// OBJ-NEXT: some_label
\ No newline at end of file diff --git a/test/MC/AArch64/elf-reloc-condbr.s b/test/MC/AArch64/elf-reloc-condbr.s new file mode 100644 index 000000000000..283d3b95d0db --- /dev/null +++ b/test/MC/AArch64/elf-reloc-condbr.s @@ -0,0 +1,13 @@ +// RUN: llvm-mc -arch=aarch64 -filetype=obj %s -o - | \ +// RUN: elf-dump | FileCheck -check-prefix=OBJ %s + + b.eq somewhere +// OBJ: .rela.text + +// OBJ: 'r_offset', 0x0000000000000000 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000118 + +// OBJ: .symtab +// OBJ: Symbol 5 +// OBJ-NEXT: somewhere
\ No newline at end of file diff --git a/test/MC/AArch64/elf-reloc-ldrlit.s b/test/MC/AArch64/elf-reloc-ldrlit.s new file mode 100644 index 000000000000..ce9ff49db448 --- /dev/null +++ b/test/MC/AArch64/elf-reloc-ldrlit.s @@ -0,0 +1,28 @@ +// RUN: llvm-mc -arch=aarch64 -filetype=obj %s -o - | \ +// RUN: elf-dump | FileCheck -check-prefix=OBJ %s + + ldr x0, some_label + ldr w3, some_label + ldrsw x9, some_label + prfm pldl3keep, some_label +// OBJ: .rela.text + +// OBJ: 'r_offset', 0x0000000000000000 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000111 + +// OBJ: 'r_offset', 0x0000000000000004 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000111 + +// OBJ: 'r_offset', 0x0000000000000008 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000111 + +// OBJ: 'r_offset', 0x000000000000000c +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000111 + +// OBJ: .symtab +// OBJ: Symbol 5 +// OBJ-NEXT: some_label
\ No newline at end of file diff --git a/test/MC/AArch64/elf-reloc-ldstunsimm.s b/test/MC/AArch64/elf-reloc-ldstunsimm.s new file mode 100644 index 000000000000..345fc8247d0e --- /dev/null +++ b/test/MC/AArch64/elf-reloc-ldstunsimm.s @@ -0,0 +1,34 @@ +// RUN: llvm-mc -arch=aarch64 -filetype=obj %s -o - | \ +// RUN: elf-dump | FileCheck -check-prefix=OBJ %s + + ldrb w0, [sp, #:lo12:some_label] + ldrh w0, [sp, #:lo12:some_label] + ldr w0, [sp, #:lo12:some_label] + ldr x0, [sp, #:lo12:some_label] + str q0, [sp, #:lo12:some_label] + +// OBJ: .rela.text + +// OBJ: 'r_offset', 0x0000000000000000 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000116 + +// OBJ: 'r_offset', 0x0000000000000004 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000011c + +// OBJ: 'r_offset', 0x0000000000000008 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000011d + +// OBJ: 'r_offset', 0x000000000000000c +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000011e + +// OBJ: 'r_offset', 0x0000000000000010 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000012b + +// OBJ: .symtab +// OBJ: Symbol 5 +// OBJ-NEXT: some_label diff --git a/test/MC/AArch64/elf-reloc-movw.s b/test/MC/AArch64/elf-reloc-movw.s new file mode 100644 index 000000000000..cb7dc6768e32 --- /dev/null +++ b/test/MC/AArch64/elf-reloc-movw.s @@ -0,0 +1,98 @@ +// RUN: llvm-mc -arch=aarch64 -filetype=obj %s -o - | \ +// RUN: elf-dump | FileCheck -check-prefix=OBJ %s + + movz x0, #:abs_g0:some_label + movk x0, #:abs_g0_nc:some_label + + movz x3, #:abs_g1:some_label + movk x5, #:abs_g1_nc:some_label + + movz x3, #:abs_g2:some_label + movk x5, #:abs_g2_nc:some_label + + movz x7, #:abs_g3:some_label + movk x11, #:abs_g3:some_label + + movz x13, #:abs_g0_s:some_label + movn x17, #:abs_g0_s:some_label + + movz x19, #:abs_g1_s:some_label + movn x19, #:abs_g1_s:some_label + + movz x19, #:abs_g2_s:some_label + movn x19, #:abs_g2_s:some_label +// OBJ: .rela.text + +// :abs_g0: => R_AARCH64_MOVW_UABS_G0 +// OBJ: 'r_offset', 0x0000000000000000 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000107 + +// :abs_g0_nc: => R_AARCH64_MOVW_UABS_G0_NC +// OBJ: 'r_offset', 0x0000000000000004 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000108 + +// :abs_g1: => R_AARCH64_MOVW_UABS_G1 +// OBJ: 'r_offset', 0x0000000000000008 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000109 + +// :abs_g1_nc: => R_AARCH64_MOVW_UABS_G1_NC +// OBJ: 'r_offset', 0x000000000000000c +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010a + +// :abs_g2: => R_AARCH64_MOVW_UABS_G2 +// OBJ: 'r_offset', 0x0000000000000010 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010b + +// :abs_g2_nc: => R_AARCH64_MOVW_UABS_G2_NC +// OBJ: 'r_offset', 0x0000000000000014 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010c + +// :abs_g3: => R_AARCH64_MOVW_UABS_G3 +// OBJ: 'r_offset', 0x0000000000000018 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010d + +// :abs_g3: => R_AARCH64_MOVW_UABS_G3 +// OBJ: 'r_offset', 0x000000000000001c +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010d + +// :abs_g0_s: => R_AARCH64_MOVW_SABS_G0 +// OBJ: 'r_offset', 0x0000000000000020 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010e + +// :abs_g0_s: => R_AARCH64_MOVW_SABS_G0 +// OBJ: 'r_offset', 0x0000000000000024 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010e + +// :abs_g1_s: => R_AARCH64_MOVW_SABS_G1 +// OBJ: 'r_offset', 0x0000000000000028 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010f + +// :abs_g1_s: => R_AARCH64_MOVW_SABS_G1 +// OBJ: 'r_offset', 0x000000000000002c +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000010f + +// :abs_g2_s: => R_AARCH64_MOVW_SABS_G2 +// OBJ: 'r_offset', 0x0000000000000030 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000110 + +// :abs_g2_s: => R_AARCH64_MOVW_SABS_G2 +// OBJ: 'r_offset', 0x0000000000000034 +// OBJ: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000110 + +// OBJ: .symtab +// OBJ: Symbol 5 +// OBJ-NEXT: some_label diff --git a/test/MC/AArch64/elf-reloc-pcreladdressing.s b/test/MC/AArch64/elf-reloc-pcreladdressing.s new file mode 100644 index 000000000000..39a8ba9402a8 --- /dev/null +++ b/test/MC/AArch64/elf-reloc-pcreladdressing.s @@ -0,0 +1,29 @@ +// RUN: llvm-mc -arch=aarch64 -filetype=obj %s -o - | \ +// RUN: elf-dump | FileCheck -check-prefix=OBJ %s + + adr x2, some_label + adrp x5, some_label + + adrp x5, :got:some_label + ldr x0, [x5, #:got_lo12:some_label] +// OBJ: .rela.text + +// OBJ: 'r_offset', 0x0000000000000000 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000112 + +// OBJ: 'r_offset', 0x0000000000000004 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000113 + +// OBJ: 'r_offset', 0x0000000000000008 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000137 + +// OBJ: 'r_offset', 0x000000000000000c +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000138 + +// OBJ: .symtab +// OBJ: Symbol 5 +// OBJ-NEXT: some_label
\ No newline at end of file diff --git a/test/MC/AArch64/elf-reloc-tstb.s b/test/MC/AArch64/elf-reloc-tstb.s new file mode 100644 index 000000000000..c5e2981a22ef --- /dev/null +++ b/test/MC/AArch64/elf-reloc-tstb.s @@ -0,0 +1,18 @@ +// RUN: llvm-mc -arch=aarch64 -filetype=obj %s -o - | \ +// RUN: elf-dump | FileCheck -check-prefix=OBJ %s + + tbz x6, #45, somewhere + tbnz w3, #15, somewhere +// OBJ: .rela.text + +// OBJ: 'r_offset', 0x0000000000000000 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000117 + +// OBJ: 'r_offset', 0x0000000000000004 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x00000117 + +// OBJ: .symtab +// OBJ: Symbol 5 +// OBJ-NEXT: somewhere diff --git a/test/MC/AArch64/elf-reloc-uncondbrimm.s b/test/MC/AArch64/elf-reloc-uncondbrimm.s new file mode 100644 index 000000000000..0e97bc66695f --- /dev/null +++ b/test/MC/AArch64/elf-reloc-uncondbrimm.s @@ -0,0 +1,18 @@ +// RUN: llvm-mc -arch=aarch64 -filetype=obj %s -o - | \ +// RUN: elf-dump | FileCheck -check-prefix=OBJ %s + + b somewhere + bl somewhere +// OBJ: .rela.text + +// OBJ: 'r_offset', 0x0000000000000000 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000011a + +// OBJ: 'r_offset', 0x0000000000000004 +// OBJ-NEXT: 'r_sym', 0x00000005 +// OBJ-NEXT: 'r_type', 0x0000011b + +// OBJ: .symtab +// OBJ: Symbol 5 +// OBJ-NEXT: somewhere
\ No newline at end of file diff --git a/test/MC/AArch64/gicv3-regs-diagnostics.s b/test/MC/AArch64/gicv3-regs-diagnostics.s new file mode 100644 index 000000000000..e891adbbb375 --- /dev/null +++ b/test/MC/AArch64/gicv3-regs-diagnostics.s @@ -0,0 +1,61 @@ +// RUN: llvm-mc -triple aarch64-none-linux-gnu < %s 2>&1 | FileCheck %s + + // Write-only + mrs x10, icc_eoir1_el1 + mrs x7, icc_eoir0_el1 + mrs x22, icc_dir_el1 + mrs x24, icc_sgi1r_el1 + mrs x8, icc_asgi1r_el1 + mrs x28, icc_sgi0r_el1 +// CHECK: error: expected readable system register +// CHECK-NEXT: mrs x10, icc_eoir1_el1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected readable system register +// CHECK-NEXT: mrs x7, icc_eoir0_el1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected readable system register +// CHECK-NEXT: mrs x22, icc_dir_el1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected readable system register +// CHECK-NEXT: mrs x24, icc_sgi1r_el1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected readable system register +// CHECK-NEXT: mrs x8, icc_asgi1r_el1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected readable system register +// CHECK-NEXT: mrs x28, icc_sgi0r_el1 +// CHECK-NEXT: ^ + + // Read-only + msr icc_iar1_el1, x16 + msr icc_iar0_el1, x19 + msr icc_hppir1_el1, x29 + msr icc_hppir0_el1, x14 + msr icc_rpr_el1, x6 + msr ich_vtr_el2, x8 + msr ich_eisr_el2, x22 + msr ich_elsr_el2, x8 +// CHECK: error: expected writable system register or pstate +// CHECK-NEXT: msr icc_iar1_el1, x16 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr icc_iar0_el1, x19 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr icc_hppir1_el1, x29 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr icc_hppir0_el1, x14 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr icc_rpr_el1, x6 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr ich_vtr_el2, x8 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr ich_eisr_el2, x22 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr ich_elsr_el2, x8 +// CHECK-NEXT: ^ diff --git a/test/MC/AArch64/gicv3-regs.s b/test/MC/AArch64/gicv3-regs.s new file mode 100644 index 000000000000..f7776514da09 --- /dev/null +++ b/test/MC/AArch64/gicv3-regs.s @@ -0,0 +1,223 @@ + // RUN: llvm-mc -triple aarch64-none-linux-gnu -show-encoding < %s | FileCheck %s + + mrs x8, icc_iar1_el1 + mrs x26, icc_iar0_el1 + mrs x2, icc_hppir1_el1 + mrs x17, icc_hppir0_el1 + mrs x29, icc_rpr_el1 + mrs x4, ich_vtr_el2 + mrs x24, ich_eisr_el2 + mrs x9, ich_elsr_el2 + mrs x24, icc_bpr1_el1 + mrs x14, icc_bpr0_el1 + mrs x19, icc_pmr_el1 + mrs x23, icc_ctlr_el1 + mrs x20, icc_ctlr_el3 + mrs x28, icc_sre_el1 + mrs x25, icc_sre_el2 + mrs x8, icc_sre_el3 + mrs x22, icc_igrpen0_el1 + mrs x5, icc_igrpen1_el1 + mrs x7, icc_igrpen1_el3 + mrs x22, icc_seien_el1 + mrs x4, icc_ap0r0_el1 + mrs x11, icc_ap0r1_el1 + mrs x27, icc_ap0r2_el1 + mrs x21, icc_ap0r3_el1 + mrs x2, icc_ap1r0_el1 + mrs x21, icc_ap1r1_el1 + mrs x10, icc_ap1r2_el1 + mrs x27, icc_ap1r3_el1 + mrs x20, ich_ap0r0_el2 + mrs x21, ich_ap0r1_el2 + mrs x5, ich_ap0r2_el2 + mrs x4, ich_ap0r3_el2 + mrs x15, ich_ap1r0_el2 + mrs x12, ich_ap1r1_el2 + mrs x27, ich_ap1r2_el2 + mrs x20, ich_ap1r3_el2 + mrs x10, ich_hcr_el2 + mrs x27, ich_misr_el2 + mrs x6, ich_vmcr_el2 + mrs x19, ich_vseir_el2 + mrs x3, ich_lr0_el2 + mrs x1, ich_lr1_el2 + mrs x22, ich_lr2_el2 + mrs x21, ich_lr3_el2 + mrs x6, ich_lr4_el2 + mrs x10, ich_lr5_el2 + mrs x11, ich_lr6_el2 + mrs x12, ich_lr7_el2 + mrs x0, ich_lr8_el2 + mrs x21, ich_lr9_el2 + mrs x13, ich_lr10_el2 + mrs x26, ich_lr11_el2 + mrs x1, ich_lr12_el2 + mrs x8, ich_lr13_el2 + mrs x2, ich_lr14_el2 + mrs x8, ich_lr15_el2 +// CHECK: mrs x8, icc_iar1_el1 // encoding: [0x08,0xcc,0x38,0xd5] +// CHECK: mrs x26, icc_iar0_el1 // encoding: [0x1a,0xc8,0x38,0xd5] +// CHECK: mrs x2, icc_hppir1_el1 // encoding: [0x42,0xcc,0x38,0xd5] +// CHECK: mrs x17, icc_hppir0_el1 // encoding: [0x51,0xc8,0x38,0xd5] +// CHECK: mrs x29, icc_rpr_el1 // encoding: [0x7d,0xcb,0x38,0xd5] +// CHECK: mrs x4, ich_vtr_el2 // encoding: [0x24,0xcb,0x3c,0xd5] +// CHECK: mrs x24, ich_eisr_el2 // encoding: [0x78,0xcb,0x3c,0xd5] +// CHECK: mrs x9, ich_elsr_el2 // encoding: [0xa9,0xcb,0x3c,0xd5] +// CHECK: mrs x24, icc_bpr1_el1 // encoding: [0x78,0xcc,0x38,0xd5] +// CHECK: mrs x14, icc_bpr0_el1 // encoding: [0x6e,0xc8,0x38,0xd5] +// CHECK: mrs x19, icc_pmr_el1 // encoding: [0x13,0x46,0x38,0xd5] +// CHECK: mrs x23, icc_ctlr_el1 // encoding: [0x97,0xcc,0x38,0xd5] +// CHECK: mrs x20, icc_ctlr_el3 // encoding: [0x94,0xcc,0x3e,0xd5] +// CHECK: mrs x28, icc_sre_el1 // encoding: [0xbc,0xcc,0x38,0xd5] +// CHECK: mrs x25, icc_sre_el2 // encoding: [0xb9,0xc9,0x3c,0xd5] +// CHECK: mrs x8, icc_sre_el3 // encoding: [0xa8,0xcc,0x3e,0xd5] +// CHECK: mrs x22, icc_igrpen0_el1 // encoding: [0xd6,0xcc,0x38,0xd5] +// CHECK: mrs x5, icc_igrpen1_el1 // encoding: [0xe5,0xcc,0x38,0xd5] +// CHECK: mrs x7, icc_igrpen1_el3 // encoding: [0xe7,0xcc,0x3e,0xd5] +// CHECK: mrs x22, icc_seien_el1 // encoding: [0x16,0xcd,0x38,0xd5] +// CHECK: mrs x4, icc_ap0r0_el1 // encoding: [0x84,0xc8,0x38,0xd5] +// CHECK: mrs x11, icc_ap0r1_el1 // encoding: [0xab,0xc8,0x38,0xd5] +// CHECK: mrs x27, icc_ap0r2_el1 // encoding: [0xdb,0xc8,0x38,0xd5] +// CHECK: mrs x21, icc_ap0r3_el1 // encoding: [0xf5,0xc8,0x38,0xd5] +// CHECK: mrs x2, icc_ap1r0_el1 // encoding: [0x02,0xc9,0x38,0xd5] +// CHECK: mrs x21, icc_ap1r1_el1 // encoding: [0x35,0xc9,0x38,0xd5] +// CHECK: mrs x10, icc_ap1r2_el1 // encoding: [0x4a,0xc9,0x38,0xd5] +// CHECK: mrs x27, icc_ap1r3_el1 // encoding: [0x7b,0xc9,0x38,0xd5] +// CHECK: mrs x20, ich_ap0r0_el2 // encoding: [0x14,0xc8,0x3c,0xd5] +// CHECK: mrs x21, ich_ap0r1_el2 // encoding: [0x35,0xc8,0x3c,0xd5] +// CHECK: mrs x5, ich_ap0r2_el2 // encoding: [0x45,0xc8,0x3c,0xd5] +// CHECK: mrs x4, ich_ap0r3_el2 // encoding: [0x64,0xc8,0x3c,0xd5] +// CHECK: mrs x15, ich_ap1r0_el2 // encoding: [0x0f,0xc9,0x3c,0xd5] +// CHECK: mrs x12, ich_ap1r1_el2 // encoding: [0x2c,0xc9,0x3c,0xd5] +// CHECK: mrs x27, ich_ap1r2_el2 // encoding: [0x5b,0xc9,0x3c,0xd5] +// CHECK: mrs x20, ich_ap1r3_el2 // encoding: [0x74,0xc9,0x3c,0xd5] +// CHECK: mrs x10, ich_hcr_el2 // encoding: [0x0a,0xcb,0x3c,0xd5] +// CHECK: mrs x27, ich_misr_el2 // encoding: [0x5b,0xcb,0x3c,0xd5] +// CHECK: mrs x6, ich_vmcr_el2 // encoding: [0xe6,0xcb,0x3c,0xd5] +// CHECK: mrs x19, ich_vseir_el2 // encoding: [0x93,0xc9,0x3c,0xd5] +// CHECK: mrs x3, ich_lr0_el2 // encoding: [0x03,0xcc,0x3c,0xd5] +// CHECK: mrs x1, ich_lr1_el2 // encoding: [0x21,0xcc,0x3c,0xd5] +// CHECK: mrs x22, ich_lr2_el2 // encoding: [0x56,0xcc,0x3c,0xd5] +// CHECK: mrs x21, ich_lr3_el2 // encoding: [0x75,0xcc,0x3c,0xd5] +// CHECK: mrs x6, ich_lr4_el2 // encoding: [0x86,0xcc,0x3c,0xd5] +// CHECK: mrs x10, ich_lr5_el2 // encoding: [0xaa,0xcc,0x3c,0xd5] +// CHECK: mrs x11, ich_lr6_el2 // encoding: [0xcb,0xcc,0x3c,0xd5] +// CHECK: mrs x12, ich_lr7_el2 // encoding: [0xec,0xcc,0x3c,0xd5] +// CHECK: mrs x0, ich_lr8_el2 // encoding: [0x00,0xcd,0x3c,0xd5] +// CHECK: mrs x21, ich_lr9_el2 // encoding: [0x35,0xcd,0x3c,0xd5] +// CHECK: mrs x13, ich_lr10_el2 // encoding: [0x4d,0xcd,0x3c,0xd5] +// CHECK: mrs x26, ich_lr11_el2 // encoding: [0x7a,0xcd,0x3c,0xd5] +// CHECK: mrs x1, ich_lr12_el2 // encoding: [0x81,0xcd,0x3c,0xd5] +// CHECK: mrs x8, ich_lr13_el2 // encoding: [0xa8,0xcd,0x3c,0xd5] +// CHECK: mrs x2, ich_lr14_el2 // encoding: [0xc2,0xcd,0x3c,0xd5] +// CHECK: mrs x8, ich_lr15_el2 // encoding: [0xe8,0xcd,0x3c,0xd5] + + msr icc_eoir1_el1, x27 + msr icc_eoir0_el1, x5 + msr icc_dir_el1, x13 + msr icc_sgi1r_el1, x21 + msr icc_asgi1r_el1, x25 + msr icc_sgi0r_el1, x28 + msr icc_bpr1_el1, x7 + msr icc_bpr0_el1, x9 + msr icc_pmr_el1, x29 + msr icc_ctlr_el1, x24 + msr icc_ctlr_el3, x0 + msr icc_sre_el1, x2 + msr icc_sre_el2, x5 + msr icc_sre_el3, x10 + msr icc_igrpen0_el1, x22 + msr icc_igrpen1_el1, x11 + msr icc_igrpen1_el3, x8 + msr icc_seien_el1, x4 + msr icc_ap0r0_el1, x27 + msr icc_ap0r1_el1, x5 + msr icc_ap0r2_el1, x20 + msr icc_ap0r3_el1, x0 + msr icc_ap1r0_el1, x2 + msr icc_ap1r1_el1, x29 + msr icc_ap1r2_el1, x23 + msr icc_ap1r3_el1, x11 + msr ich_ap0r0_el2, x2 + msr ich_ap0r1_el2, x27 + msr ich_ap0r2_el2, x7 + msr ich_ap0r3_el2, x1 + msr ich_ap1r0_el2, x7 + msr ich_ap1r1_el2, x12 + msr ich_ap1r2_el2, x14 + msr ich_ap1r3_el2, x13 + msr ich_hcr_el2, x1 + msr ich_misr_el2, x10 + msr ich_vmcr_el2, x24 + msr ich_vseir_el2, x29 + msr ich_lr0_el2, x26 + msr ich_lr1_el2, x9 + msr ich_lr2_el2, x18 + msr ich_lr3_el2, x26 + msr ich_lr4_el2, x22 + msr ich_lr5_el2, x26 + msr ich_lr6_el2, x27 + msr ich_lr7_el2, x8 + msr ich_lr8_el2, x17 + msr ich_lr9_el2, x19 + msr ich_lr10_el2, x17 + msr ich_lr11_el2, x5 + msr ich_lr12_el2, x29 + msr ich_lr13_el2, x2 + msr ich_lr14_el2, x13 + msr ich_lr15_el2, x27 +// CHECK: msr icc_eoir1_el1, x27 // encoding: [0x3b,0xcc,0x18,0xd5] +// CHECK: msr icc_eoir0_el1, x5 // encoding: [0x25,0xc8,0x18,0xd5] +// CHECK: msr icc_dir_el1, x13 // encoding: [0x2d,0xcb,0x18,0xd5] +// CHECK: msr icc_sgi1r_el1, x21 // encoding: [0xb5,0xcb,0x18,0xd5] +// CHECK: msr icc_asgi1r_el1, x25 // encoding: [0xd9,0xcb,0x18,0xd5] +// CHECK: msr icc_sgi0r_el1, x28 // encoding: [0xfc,0xcb,0x18,0xd5] +// CHECK: msr icc_bpr1_el1, x7 // encoding: [0x67,0xcc,0x18,0xd5] +// CHECK: msr icc_bpr0_el1, x9 // encoding: [0x69,0xc8,0x18,0xd5] +// CHECK: msr icc_pmr_el1, x29 // encoding: [0x1d,0x46,0x18,0xd5] +// CHECK: msr icc_ctlr_el1, x24 // encoding: [0x98,0xcc,0x18,0xd5] +// CHECK: msr icc_ctlr_el3, x0 // encoding: [0x80,0xcc,0x1e,0xd5] +// CHECK: msr icc_sre_el1, x2 // encoding: [0xa2,0xcc,0x18,0xd5] +// CHECK: msr icc_sre_el2, x5 // encoding: [0xa5,0xc9,0x1c,0xd5] +// CHECK: msr icc_sre_el3, x10 // encoding: [0xaa,0xcc,0x1e,0xd5] +// CHECK: msr icc_igrpen0_el1, x22 // encoding: [0xd6,0xcc,0x18,0xd5] +// CHECK: msr icc_igrpen1_el1, x11 // encoding: [0xeb,0xcc,0x18,0xd5] +// CHECK: msr icc_igrpen1_el3, x8 // encoding: [0xe8,0xcc,0x1e,0xd5] +// CHECK: msr icc_seien_el1, x4 // encoding: [0x04,0xcd,0x18,0xd5] +// CHECK: msr icc_ap0r0_el1, x27 // encoding: [0x9b,0xc8,0x18,0xd5] +// CHECK: msr icc_ap0r1_el1, x5 // encoding: [0xa5,0xc8,0x18,0xd5] +// CHECK: msr icc_ap0r2_el1, x20 // encoding: [0xd4,0xc8,0x18,0xd5] +// CHECK: msr icc_ap0r3_el1, x0 // encoding: [0xe0,0xc8,0x18,0xd5] +// CHECK: msr icc_ap1r0_el1, x2 // encoding: [0x02,0xc9,0x18,0xd5] +// CHECK: msr icc_ap1r1_el1, x29 // encoding: [0x3d,0xc9,0x18,0xd5] +// CHECK: msr icc_ap1r2_el1, x23 // encoding: [0x57,0xc9,0x18,0xd5] +// CHECK: msr icc_ap1r3_el1, x11 // encoding: [0x6b,0xc9,0x18,0xd5] +// CHECK: msr ich_ap0r0_el2, x2 // encoding: [0x02,0xc8,0x1c,0xd5] +// CHECK: msr ich_ap0r1_el2, x27 // encoding: [0x3b,0xc8,0x1c,0xd5] +// CHECK: msr ich_ap0r2_el2, x7 // encoding: [0x47,0xc8,0x1c,0xd5] +// CHECK: msr ich_ap0r3_el2, x1 // encoding: [0x61,0xc8,0x1c,0xd5] +// CHECK: msr ich_ap1r0_el2, x7 // encoding: [0x07,0xc9,0x1c,0xd5] +// CHECK: msr ich_ap1r1_el2, x12 // encoding: [0x2c,0xc9,0x1c,0xd5] +// CHECK: msr ich_ap1r2_el2, x14 // encoding: [0x4e,0xc9,0x1c,0xd5] +// CHECK: msr ich_ap1r3_el2, x13 // encoding: [0x6d,0xc9,0x1c,0xd5] +// CHECK: msr ich_hcr_el2, x1 // encoding: [0x01,0xcb,0x1c,0xd5] +// CHECK: msr ich_misr_el2, x10 // encoding: [0x4a,0xcb,0x1c,0xd5] +// CHECK: msr ich_vmcr_el2, x24 // encoding: [0xf8,0xcb,0x1c,0xd5] +// CHECK: msr ich_vseir_el2, x29 // encoding: [0x9d,0xc9,0x1c,0xd5] +// CHECK: msr ich_lr0_el2, x26 // encoding: [0x1a,0xcc,0x1c,0xd5] +// CHECK: msr ich_lr1_el2, x9 // encoding: [0x29,0xcc,0x1c,0xd5] +// CHECK: msr ich_lr2_el2, x18 // encoding: [0x52,0xcc,0x1c,0xd5] +// CHECK: msr ich_lr3_el2, x26 // encoding: [0x7a,0xcc,0x1c,0xd5] +// CHECK: msr ich_lr4_el2, x22 // encoding: [0x96,0xcc,0x1c,0xd5] +// CHECK: msr ich_lr5_el2, x26 // encoding: [0xba,0xcc,0x1c,0xd5] +// CHECK: msr ich_lr6_el2, x27 // encoding: [0xdb,0xcc,0x1c,0xd5] +// CHECK: msr ich_lr7_el2, x8 // encoding: [0xe8,0xcc,0x1c,0xd5] +// CHECK: msr ich_lr8_el2, x17 // encoding: [0x11,0xcd,0x1c,0xd5] +// CHECK: msr ich_lr9_el2, x19 // encoding: [0x33,0xcd,0x1c,0xd5] +// CHECK: msr ich_lr10_el2, x17 // encoding: [0x51,0xcd,0x1c,0xd5] +// CHECK: msr ich_lr11_el2, x5 // encoding: [0x65,0xcd,0x1c,0xd5] +// CHECK: msr ich_lr12_el2, x29 // encoding: [0x9d,0xcd,0x1c,0xd5] +// CHECK: msr ich_lr13_el2, x2 // encoding: [0xa2,0xcd,0x1c,0xd5] +// CHECK: msr ich_lr14_el2, x13 // encoding: [0xcd,0xcd,0x1c,0xd5] +// CHECK: msr ich_lr15_el2, x27 // encoding: [0xfb,0xcd,0x1c,0xd5] diff --git a/test/MC/AArch64/lit.local.cfg b/test/MC/AArch64/lit.local.cfg new file mode 100644 index 000000000000..cc02173c8ed4 --- /dev/null +++ b/test/MC/AArch64/lit.local.cfg @@ -0,0 +1,5 @@ +config.suffixes = ['.ll', '.c', '.cpp', '.s'] + +targets = set(config.root.targets_to_build.split()) +if not 'AArch64' in targets: + config.unsupported = True
\ No newline at end of file diff --git a/test/MC/AArch64/mapping-across-sections.s b/test/MC/AArch64/mapping-across-sections.s new file mode 100644 index 000000000000..3d32c1dfb400 --- /dev/null +++ b/test/MC/AArch64/mapping-across-sections.s @@ -0,0 +1,28 @@ +// RUN: llvm-mc -triple=aarch64-none-linux-gnu -filetype=obj < %s | llvm-objdump -t - | FileCheck %s + + .text + add w0, w0, w0 + +// .wibble should *not* inherit .text's mapping symbol. It's a completely different section. + .section .wibble + add w0, w0, w0 + +// A setion should be able to start with a $d + .section .starts_data + .word 42 + +// Changing back to .text should not emit a redundant $x + .text + add w0, w0, w0 + +// With all those constraints, we want: +// + .text to have $x at 0 and no others +// + .wibble to have $x at 0 +// + .starts_data to have $d at 0 + + +// CHECK: 00000000 .starts_data 00000000 $d +// CHECK-NEXT: 00000000 .text 00000000 $x +// CHECK-NEXT: 00000000 .wibble 00000000 $x +// CHECK-NOT: ${{[adtx]}} + diff --git a/test/MC/AArch64/mapping-within-section.s b/test/MC/AArch64/mapping-within-section.s new file mode 100644 index 000000000000..c8bd804fa0e3 --- /dev/null +++ b/test/MC/AArch64/mapping-within-section.s @@ -0,0 +1,23 @@ +// RUN: llvm-mc -triple=aarch64-none-linux-gnu -filetype=obj < %s | llvm-objdump -t - | FileCheck %s + + .text +// $x at 0x0000 + add w0, w0, w0 +// $d at 0x0004 + .ascii "012" + .byte 1 + .hword 2 + .word 4 + .xword 8 + .single 4.0 + .double 8.0 + .space 10 + .zero 3 + .fill 10, 2, 42 + .org 100, 12 +// $x at 0x0018 + add x0, x0, x0 + +// CHECK: 00000004 .text 00000000 $d +// CHECK-NEXT: 00000000 .text 00000000 $x +// CHECK-NEXT: 00000064 .text 00000000 $x diff --git a/test/MC/AArch64/tls-relocs.s b/test/MC/AArch64/tls-relocs.s new file mode 100644 index 000000000000..690fa8c00962 --- /dev/null +++ b/test/MC/AArch64/tls-relocs.s @@ -0,0 +1,662 @@ +// RUN: llvm-mc -arch=aarch64 -show-encoding < %s | FileCheck %s +// RUN: llvm-mc -arch=aarch64 -filetype=obj < %s -o %t +// RUN: elf-dump %t | FileCheck --check-prefix=CHECK-ELF %s +// RUN: llvm-objdump -r %t | FileCheck --check-prefix=CHECK-ELF-NAMES %s + +// CHECK-ELF: .rela.text + + // TLS local-dynamic forms + movz x1, #:dtprel_g2:var + movn x2, #:dtprel_g2:var + movz x3, #:dtprel_g2:var + movn x4, #:dtprel_g2:var +// CHECK: movz x1, #:dtprel_g2:var // encoding: [0x01'A',A,0xc0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g2:var, kind: fixup_a64_movw_dtprel_g2 +// CHECK-NEXT: movn x2, #:dtprel_g2:var // encoding: [0x02'A',A,0xc0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g2:var, kind: fixup_a64_movw_dtprel_g2 +// CHECK-NEXT: movz x3, #:dtprel_g2:var // encoding: [0x03'A',A,0xc0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g2:var, kind: fixup_a64_movw_dtprel_g2 +// CHECK-NEXT: movn x4, #:dtprel_g2:var // encoding: [0x04'A',A,0xc0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g2:var, kind: fixup_a64_movw_dtprel_g2 + +// CHECK-ELF: # Relocation 0 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000000) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM:0x[0-9a-f]+]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020b) +// CHECK-ELF: # Relocation 1 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000004) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020b) +// CHECK-ELF: # Relocation 2 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000008) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020b) +// CHECK-ELF: # Relocation 3 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000000c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020b) + +// CHECK-ELF-NAMES: 0 R_AARCH64_TLSLD_MOVW_DTPREL_G2 +// CHECK-ELF-NAMES: 4 R_AARCH64_TLSLD_MOVW_DTPREL_G2 +// CHECK-ELF-NAMES: 8 R_AARCH64_TLSLD_MOVW_DTPREL_G2 +// CHECK-ELF-NAMES: 12 R_AARCH64_TLSLD_MOVW_DTPREL_G2 + + movz x5, #:dtprel_g1:var + movn x6, #:dtprel_g1:var + movz w7, #:dtprel_g1:var + movn w8, #:dtprel_g1:var +// CHECK: movz x5, #:dtprel_g1:var // encoding: [0x05'A',A,0xa0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1:var, kind: fixup_a64_movw_dtprel_g1 +// CHECK-NEXT: movn x6, #:dtprel_g1:var // encoding: [0x06'A',A,0xa0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1:var, kind: fixup_a64_movw_dtprel_g1 +// CHECK-NEXT: movz w7, #:dtprel_g1:var // encoding: [0x07'A',A,0xa0'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1:var, kind: fixup_a64_movw_dtprel_g1 +// CHECK-NEXT: movn w8, #:dtprel_g1:var // encoding: [0x08'A',A,0xa0'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1:var, kind: fixup_a64_movw_dtprel_g1 + +// CHECK-ELF: # Relocation 4 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000010) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020c) +// CHECK-ELF: # Relocation 5 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000014) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020c) +// CHECK-ELF: # Relocation 6 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000018) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020c) +// CHECK-ELF: # Relocation 7 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000001c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020c) + +// CHECK-ELF-NAMES: 16 R_AARCH64_TLSLD_MOVW_DTPREL_G1 +// CHECK-ELF-NAMES: 20 R_AARCH64_TLSLD_MOVW_DTPREL_G1 +// CHECK-ELF-NAMES: 24 R_AARCH64_TLSLD_MOVW_DTPREL_G1 +// CHECK-ELF-NAMES: 28 R_AARCH64_TLSLD_MOVW_DTPREL_G1 + + movk x9, #:dtprel_g1_nc:var + movk w10, #:dtprel_g1_nc:var +// CHECK: movk x9, #:dtprel_g1_nc:var // encoding: [0x09'A',A,0xa0'A',0xf2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1_nc:var, kind: fixup_a64_movw_dtprel_g1_nc +// CHECK-NEXT: movk w10, #:dtprel_g1_nc:var // encoding: [0x0a'A',A,0xa0'A',0x72'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1_nc:var, kind: fixup_a64_movw_dtprel_g1_nc + +// CHECK-ELF: # Relocation 8 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000020) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020d) +// CHECK-ELF: # Relocation 9 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000024) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020d) + +// CHECK-ELF-NAMES: 32 R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC +// CHECK-ELF-NAMES: 36 R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC + + movz x11, #:dtprel_g0:var + movn x12, #:dtprel_g0:var + movz w13, #:dtprel_g0:var + movn w14, #:dtprel_g0:var +// CHECK: movz x11, #:dtprel_g0:var // encoding: [0x0b'A',A,0x80'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0:var, kind: fixup_a64_movw_dtprel_g0 +// CHECK-NEXT: movn x12, #:dtprel_g0:var // encoding: [0x0c'A',A,0x80'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0:var, kind: fixup_a64_movw_dtprel_g0 +// CHECK-NEXT: movz w13, #:dtprel_g0:var // encoding: [0x0d'A',A,0x80'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0:var, kind: fixup_a64_movw_dtprel_g0 +// CHECK-NEXT: movn w14, #:dtprel_g0:var // encoding: [0x0e'A',A,0x80'A',0x12'A'] + + +// CHECK-ELF: # Relocation 10 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000028) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020e) +// CHECK-ELF: # Relocation 11 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000002c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020e) +// CHECK-ELF: # Relocation 12 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000030) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020e) +// CHECK-ELF: # Relocation 13 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000034) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020e) + +// CHECK-ELF-NAMES: 40 R_AARCH64_TLSLD_MOVW_DTPREL_G0 +// CHECK-ELF-NAMES: 44 R_AARCH64_TLSLD_MOVW_DTPREL_G0 +// CHECK-ELF-NAMES: 48 R_AARCH64_TLSLD_MOVW_DTPREL_G0 +// CHECK-ELF-NAMES: 52 R_AARCH64_TLSLD_MOVW_DTPREL_G0 + + + movk x15, #:dtprel_g0_nc:var + movk w16, #:dtprel_g0_nc:var +// CHECK: movk x15, #:dtprel_g0_nc:var // encoding: [0x0f'A',A,0x80'A',0xf2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0_nc:var, kind: fixup_a64_movw_dtprel_g0_nc +// CHECK-NEXT: movk w16, #:dtprel_g0_nc:var // encoding: [0x10'A',A,0x80'A',0x72'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0_nc:var, kind: fixup_a64_movw_dtprel_g0_nc + +// CHECK-ELF: # Relocation 14 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000038) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020f) +// CHECK-ELF: # Relocation 15 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000003c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000020f) + +// CHECK-ELF-NAMES: 56 R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC +// CHECK-ELF-NAMES: 60 R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC + + add x17, x18, #:dtprel_hi12:var, lsl #12 + add w19, w20, #:dtprel_hi12:var, lsl #12 +// CHECK: add x17, x18, #:dtprel_hi12:var, lsl #12 // encoding: [0x51'A',0x02'A',0x40'A',0x91'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_hi12:var, kind: fixup_a64_add_dtprel_hi12 +// CHECK-NEXT: add w19, w20, #:dtprel_hi12:var, lsl #12 // encoding: [0x93'A',0x02'A',0x40'A',0x11'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_hi12:var, kind: fixup_a64_add_dtprel_hi12 + +// CHECK-ELF: # Relocation 16 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000040) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000210) +// CHECK-ELF: # Relocation 17 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000044) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000210) + +// CHECK-ELF-NAMES: 64 R_AARCH64_TLSLD_ADD_DTPREL_HI12 +// CHECK-ELF-NAMES: 68 R_AARCH64_TLSLD_ADD_DTPREL_HI12 + + + add x21, x22, #:dtprel_lo12:var + add w23, w24, #:dtprel_lo12:var +// CHECK: add x21, x22, #:dtprel_lo12:var // encoding: [0xd5'A',0x02'A',A,0x91'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_add_dtprel_lo12 +// CHECK-NEXT: add w23, w24, #:dtprel_lo12:var // encoding: [0x17'A',0x03'A',A,0x11'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_add_dtprel_lo12 + +// CHECK-ELF: # Relocation 18 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000048) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000211) +// CHECK-ELF: # Relocation 19 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000004c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000211) + +// CHECK-ELF-NAMES: 72 R_AARCH64_TLSLD_ADD_DTPREL_LO12 +// CHECK-ELF-NAMES: 76 R_AARCH64_TLSLD_ADD_DTPREL_LO12 + + add x25, x26, #:dtprel_lo12_nc:var + add w27, w28, #:dtprel_lo12_nc:var +// CHECK: add x25, x26, #:dtprel_lo12_nc:var // encoding: [0x59'A',0x03'A',A,0x91'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_add_dtprel_lo12_nc +// CHECK-NEXT: add w27, w28, #:dtprel_lo12_nc:var // encoding: [0x9b'A',0x03'A',A,0x11'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_add_dtprel_lo12_nc + +// CHECK-ELF: # Relocation 20 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000050) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000212) +// CHECK-ELF: # Relocation 21 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000054) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000212) + +// CHECK-ELF-NAMES: 80 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC +// CHECK-ELF-NAMES: 84 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC + + ldrb w29, [x30, #:dtprel_lo12:var] + ldrsb x29, [x28, #:dtprel_lo12_nc:var] +// CHECK: ldrb w29, [x30, #:dtprel_lo12:var] // encoding: [0xdd'A',0x03'A',0x40'A',0x39'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_ldst8_dtprel_lo12 +// CHECK-NEXT: ldrsb x29, [x28, #:dtprel_lo12_nc:var] // encoding: [0x9d'A',0x03'A',0x80'A',0x39'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_ldst8_dtprel_lo12_nc + +// CHECK-ELF: # Relocation 22 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000058) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000213) +// CHECK-ELF: # Relocation 23 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000005c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000214) + +// CHECK-ELF-NAMES: 88 R_AARCH64_TLSLD_LDST8_DTPREL_LO12 +// CHECK-ELF-NAMES: 92 R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC + + strh w27, [x26, #:dtprel_lo12:var] + ldrsh x25, [x24, #:dtprel_lo12_nc:var] +// CHECK: strh w27, [x26, #:dtprel_lo12:var] // encoding: [0x5b'A',0x03'A',A,0x79'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_ldst16_dtprel_lo12 +// CHECK-NEXT: ldrsh x25, [x24, #:dtprel_lo12_nc:var] // encoding: [0x19'A',0x03'A',0x80'A',0x79'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_ldst16_dtprel_lo12_n + +// CHECK-ELF: # Relocation 24 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000060) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000215) +// CHECK-ELF: # Relocation 25 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000064) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000216) + +// CHECK-ELF-NAMES: 96 R_AARCH64_TLSLD_LDST16_DTPREL_LO12 +// CHECK-ELF-NAMES: 100 R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC + + ldr w23, [x22, #:dtprel_lo12:var] + ldrsw x21, [x20, #:dtprel_lo12_nc:var] +// CHECK: ldr w23, [x22, #:dtprel_lo12:var] // encoding: [0xd7'A',0x02'A',0x40'A',0xb9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_ldst32_dtprel_lo12 +// CHECK-NEXT: ldrsw x21, [x20, #:dtprel_lo12_nc:var] // encoding: [0x95'A',0x02'A',0x80'A',0xb9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_ldst32_dtprel_lo12_n + +// CHECK-ELF: # Relocation 26 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000068) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000217) +// CHECK-ELF: # Relocation 27 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000006c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000218) + +// CHECK-ELF-NAMES: 104 R_AARCH64_TLSLD_LDST32_DTPREL_LO12 +// CHECK-ELF-NAMES: 108 R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC + + ldr x19, [x18, #:dtprel_lo12:var] + str x17, [x16, #:dtprel_lo12_nc:var] +// CHECK: ldr x19, [x18, #:dtprel_lo12:var] // encoding: [0x53'A',0x02'A',0x40'A',0xf9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_ldst64_dtprel_lo12 +// CHECK-NEXT: str x17, [x16, #:dtprel_lo12_nc:var] // encoding: [0x11'A',0x02'A',A,0xf9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_ldst64_dtprel_lo12_nc + + +// CHECK-ELF: # Relocation 28 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000070) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000219) +// CHECK-ELF: # Relocation 29 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000074) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000021a) + +// CHECK-ELF-NAMES: 112 R_AARCH64_TLSLD_LDST64_DTPREL_LO12 +// CHECK-ELF-NAMES: 116 R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC + + // TLS initial-exec forms + movz x15, #:gottprel_g1:var + movz w14, #:gottprel_g1:var +// CHECK: movz x15, #:gottprel_g1:var // encoding: [0x0f'A',A,0xa0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_g1:var, kind: fixup_a64_movw_gottprel_g1 +// CHECK-NEXT: movz w14, #:gottprel_g1:var // encoding: [0x0e'A',A,0xa0'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_g1:var, kind: fixup_a64_movw_gottprel_g1 + +// CHECK-ELF: # Relocation 30 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000078) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000021b) +// CHECK-ELF: # Relocation 31 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000007c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000021b) + +// CHECK-ELF-NAMES: 120 R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 +// CHECK-ELF-NAMES: 124 R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 + + movk x13, #:gottprel_g0_nc:var + movk w12, #:gottprel_g0_nc:var +// CHECK: movk x13, #:gottprel_g0_nc:var // encoding: [0x0d'A',A,0x80'A',0xf2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_g0_nc:var, kind: fixup_a64_movw_gottprel_g0_nc +// CHECK-NEXT: movk w12, #:gottprel_g0_nc:var // encoding: [0x0c'A',A,0x80'A',0x72'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_g0_nc:var, kind: fixup_a64_movw_gottprel_g0_nc + +// CHECK-ELF: # Relocation 32 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000080) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000021c) +// CHECK-ELF: # Relocation 33 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000084) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000021c) + +// CHECK-ELF-NAMES: 128 R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC +// CHECK-ELF-NAMES: 132 R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC + + adrp x11, :gottprel:var + ldr x10, [x0, #:gottprel_lo12:var] + ldr x9, :gottprel:var +// CHECK: adrp x11, :gottprel:var // encoding: [0x0b'A',A,A,0x90'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :gottprel:var, kind: fixup_a64_adr_gottprel_page +// CHECK-NEXT: ldr x10, [x0, #:gottprel_lo12:var] // encoding: [0x0a'A',A,0x40'A',0xf9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_lo12:var, kind: fixup_a64_ld64_gottprel_lo12_nc +// CHECK-NEXT: ldr x9, :gottprel:var // encoding: [0x09'A',A,A,0x58'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :gottprel:var, kind: fixup_a64_ld_gottprel_prel19 + +// CHECK-ELF: # Relocation 34 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000088) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000021d) +// CHECK-ELF: # Relocation 35 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000008c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000021e) +// CHECK-ELF: # Relocation 36 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000090) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000021f) + +// CHECK-ELF-NAMES: 136 R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE +// CHECK-ELF-NAMES: 140 R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC +// CHECK-ELF-NAMES: 144 R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 + + // TLS local-exec forms + movz x3, #:tprel_g2:var + movn x4, #:tprel_g2:var +// CHECK: movz x3, #:tprel_g2:var // encoding: [0x03'A',A,0xc0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g2:var, kind: fixup_a64_movw_tprel_g2 +// CHECK-NEXT: movn x4, #:tprel_g2:var // encoding: [0x04'A',A,0xc0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g2:var, kind: fixup_a64_movw_tprel_g2 + +// CHECK-ELF: # Relocation 37 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000094) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000220) +// CHECK-ELF: # Relocation 38 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000098) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000220) + +// CHECK-ELF-NAMES: 148 R_AARCH64_TLSLE_MOVW_TPREL_G2 +// CHECK-ELF-NAMES: 152 R_AARCH64_TLSLE_MOVW_TPREL_G2 + + movz x5, #:tprel_g1:var + movn x6, #:tprel_g1:var + movz w7, #:tprel_g1:var + movn w8, #:tprel_g1:var +// CHECK: movz x5, #:tprel_g1:var // encoding: [0x05'A',A,0xa0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1:var, kind: fixup_a64_movw_tprel_g1 +// CHECK-NEXT: movn x6, #:tprel_g1:var // encoding: [0x06'A',A,0xa0'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1:var, kind: fixup_a64_movw_tprel_g1 +// CHECK-NEXT: movz w7, #:tprel_g1:var // encoding: [0x07'A',A,0xa0'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1:var, kind: fixup_a64_movw_tprel_g1 +// CHECK-NEXT: movn w8, #:tprel_g1:var // encoding: [0x08'A',A,0xa0'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1:var, kind: fixup_a64_movw_tprel_g1 + +// CHECK-ELF: # Relocation 39 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000009c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000221) +// CHECK-ELF: # Relocation 40 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000a0) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000221) +// CHECK-ELF: # Relocation 41 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000a4) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000221) +// CHECK-ELF: # Relocation 42 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000a8) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000221) + +// CHECK-ELF-NAMES: 156 R_AARCH64_TLSLE_MOVW_TPREL_G1 +// CHECK-ELF-NAMES: 160 R_AARCH64_TLSLE_MOVW_TPREL_G1 +// CHECK-ELF-NAMES: 164 R_AARCH64_TLSLE_MOVW_TPREL_G1 +// CHECK-ELF-NAMES: 168 R_AARCH64_TLSLE_MOVW_TPREL_G1 + + movk x9, #:tprel_g1_nc:var + movk w10, #:tprel_g1_nc:var +// CHECK: movk x9, #:tprel_g1_nc:var // encoding: [0x09'A',A,0xa0'A',0xf2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1_nc:var, kind: fixup_a64_movw_tprel_g1_nc +// CHECK-NEXT: movk w10, #:tprel_g1_nc:var // encoding: [0x0a'A',A,0xa0'A',0x72'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1_nc:var, kind: fixup_a64_movw_tprel_g1_nc + +// CHECK-ELF: # Relocation 43 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000ac) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000222) +// CHECK-ELF: # Relocation 44 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000b0) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000222) + +// CHECK-ELF-NAMES: 172 R_AARCH64_TLSLE_MOVW_TPREL_G1_NC +// CHECK-ELF-NAMES: 176 R_AARCH64_TLSLE_MOVW_TPREL_G1_NC + + movz x11, #:tprel_g0:var + movn x12, #:tprel_g0:var + movz w13, #:tprel_g0:var + movn w14, #:tprel_g0:var +// CHECK: movz x11, #:tprel_g0:var // encoding: [0x0b'A',A,0x80'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0:var, kind: fixup_a64_movw_tprel_g0 +// CHECK-NEXT: movn x12, #:tprel_g0:var // encoding: [0x0c'A',A,0x80'A',0x92'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0:var, kind: fixup_a64_movw_tprel_g0 +// CHECK-NEXT: movz w13, #:tprel_g0:var // encoding: [0x0d'A',A,0x80'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0:var, kind: fixup_a64_movw_tprel_g0 +// CHECK-NEXT: movn w14, #:tprel_g0:var // encoding: [0x0e'A',A,0x80'A',0x12'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0:var, kind: fixup_a64_movw_tprel_g0 + +// CHECK-ELF: # Relocation 45 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000b4) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000223) +// CHECK-ELF: # Relocation 46 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000b8) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000223) +// CHECK-ELF: # Relocation 47 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000bc) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000223) +// CHECK-ELF: # Relocation 48 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000c0) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000223) + +// CHECK-ELF-NAMES: 180 R_AARCH64_TLSLE_MOVW_TPREL_G0 +// CHECK-ELF-NAMES: 184 R_AARCH64_TLSLE_MOVW_TPREL_G0 +// CHECK-ELF-NAMES: 188 R_AARCH64_TLSLE_MOVW_TPREL_G0 +// CHECK-ELF-NAMES: 192 R_AARCH64_TLSLE_MOVW_TPREL_G0 + + movk x15, #:tprel_g0_nc:var + movk w16, #:tprel_g0_nc:var +// CHECK: movk x15, #:tprel_g0_nc:var // encoding: [0x0f'A',A,0x80'A',0xf2'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0_nc:var, kind: fixup_a64_movw_tprel_g0_nc +// CHECK-NEXT: movk w16, #:tprel_g0_nc:var // encoding: [0x10'A',A,0x80'A',0x72'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0_nc:var, kind: fixup_a64_movw_tprel_g0_nc + +// CHECK-ELF: # Relocation 49 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000c4) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000224) +// CHECK-ELF: # Relocation 50 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000c8) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000224) + +// CHECK-ELF-NAMES: 196 R_AARCH64_TLSLE_MOVW_TPREL_G0_NC +// CHECK-ELF-NAMES: 200 R_AARCH64_TLSLE_MOVW_TPREL_G0_NC + + add x17, x18, #:tprel_hi12:var, lsl #12 + add w19, w20, #:tprel_hi12:var, lsl #12 +// CHECK: add x17, x18, #:tprel_hi12:var, lsl #12 // encoding: [0x51'A',0x02'A',0x40'A',0x91'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_hi12:var, kind: fixup_a64_add_tprel_hi12 +// CHECK-NEXT: add w19, w20, #:tprel_hi12:var, lsl #12 // encoding: [0x93'A',0x02'A',0x40'A',0x11'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_hi12:var, kind: fixup_a64_add_tprel_hi12 + +// CHECK-ELF: # Relocation 51 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000cc) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000225) +// CHECK-ELF: # Relocation 52 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000d0) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000225) + +// CHECK-ELF-NAMES: 204 R_AARCH64_TLSLE_ADD_TPREL_HI12 +// CHECK-ELF-NAMES: 208 R_AARCH64_TLSLE_ADD_TPREL_HI12 + + add x21, x22, #:tprel_lo12:var + add w23, w24, #:tprel_lo12:var +// CHECK: add x21, x22, #:tprel_lo12:var // encoding: [0xd5'A',0x02'A',A,0x91'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_add_tprel_lo12 +// CHECK-NEXT: add w23, w24, #:tprel_lo12:var // encoding: [0x17'A',0x03'A',A,0x11'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_add_tprel_lo12 + +// CHECK-ELF: # Relocation 53 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000d4) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000226) +// CHECK-ELF: # Relocation 54 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000d8) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000226) + +// CHECK-ELF-NAMES: 212 R_AARCH64_TLSLE_ADD_TPREL_LO12 +// CHECK-ELF-NAMES: 216 R_AARCH64_TLSLE_ADD_TPREL_LO12 + + add x25, x26, #:tprel_lo12_nc:var + add w27, w28, #:tprel_lo12_nc:var +// CHECK: add x25, x26, #:tprel_lo12_nc:var // encoding: [0x59'A',0x03'A',A,0x91'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_add_tprel_lo12_nc +// CHECK-NEXT: add w27, w28, #:tprel_lo12_nc:var // encoding: [0x9b'A',0x03'A',A,0x11'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_add_tprel_lo12_nc + +// CHECK-ELF: # Relocation 55 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000dc) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000227) +// CHECK-ELF: # Relocation 56 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000e0) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000227) + + +// CHECK-ELF-NAMES: 220 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC +// CHECK-ELF-NAMES: 224 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC + + ldrb w29, [x30, #:tprel_lo12:var] + ldrsb x29, [x28, #:tprel_lo12_nc:var] +// CHECK: ldrb w29, [x30, #:tprel_lo12:var] // encoding: [0xdd'A',0x03'A',0x40'A',0x39'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_ldst8_tprel_lo12 +// CHECK-NEXT: ldrsb x29, [x28, #:tprel_lo12_nc:var] // encoding: [0x9d'A',0x03'A',0x80'A',0x39'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_ldst8_tprel_lo12_nc + +// CHECK-ELF: # Relocation 57 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000e4) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000228) +// CHECK-ELF: # Relocation 58 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000e8) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000229) + +// CHECK-ELF-NAMES: 228 R_AARCH64_TLSLE_LDST8_TPREL_LO12 +// CHECK-ELF-NAMES: 232 R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC + + strh w27, [x26, #:tprel_lo12:var] + ldrsh x25, [x24, #:tprel_lo12_nc:var] +// CHECK: strh w27, [x26, #:tprel_lo12:var] // encoding: [0x5b'A',0x03'A',A,0x79'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_ldst16_tprel_lo12 +// CHECK-NEXT: ldrsh x25, [x24, #:tprel_lo12_nc:var] // encoding: [0x19'A',0x03'A',0x80'A',0x79'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_ldst16_tprel_lo12_n + +// CHECK-ELF: # Relocation 59 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000ec) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000022a) +// CHECK-ELF: # Relocation 60 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000f0) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000022b) + +// CHECK-ELF-NAMES: 236 R_AARCH64_TLSLE_LDST16_TPREL_LO12 +// CHECK-ELF-NAMES: 240 R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC + + ldr w23, [x22, #:tprel_lo12:var] + ldrsw x21, [x20, #:tprel_lo12_nc:var] +// CHECK: ldr w23, [x22, #:tprel_lo12:var] // encoding: [0xd7'A',0x02'A',0x40'A',0xb9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_ldst32_tprel_lo12 +// CHECK-NEXT: ldrsw x21, [x20, #:tprel_lo12_nc:var] // encoding: [0x95'A',0x02'A',0x80'A',0xb9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_ldst32_tprel_lo12_n + +// CHECK-ELF: # Relocation 61 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000f4) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000022c) +// CHECK-ELF: # Relocation 62 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000f8) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000022d) + +// CHECK-ELF-NAMES: 244 R_AARCH64_TLSLE_LDST32_TPREL_LO12 +// CHECK-ELF-NAMES: 248 R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC + + ldr x19, [x18, #:tprel_lo12:var] + str x17, [x16, #:tprel_lo12_nc:var] +// CHECK: ldr x19, [x18, #:tprel_lo12:var] // encoding: [0x53'A',0x02'A',0x40'A',0xf9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_ldst64_tprel_lo12 +// CHECK-NEXT: str x17, [x16, #:tprel_lo12_nc:var] // encoding: [0x11'A',0x02'A',A,0xf9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_ldst64_tprel_lo12_nc + +// CHECK-ELF: # Relocation 63 +// CHECK-ELF-NEXT: (('r_offset', 0x00000000000000fc) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000022e) +// CHECK-ELF: # Relocation 64 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000100) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x0000022f) + +// CHECK-ELF-NAMES: 252 R_AARCH64_TLSLE_LDST64_TPREL_LO12 +// CHECK-ELF-NAMES: 256 R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC + + // TLS descriptor forms + adrp x8, :tlsdesc:var + ldr x7, [x6, :tlsdesc_lo12:var] + add x5, x4, #:tlsdesc_lo12:var + .tlsdesccall var + blr x3 + +// CHECK: adrp x8, :tlsdesc:var // encoding: [0x08'A',A,A,0x90'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tlsdesc:var, kind: fixup_a64_tlsdesc_adr_page +// CHECK-NEXT: ldr x7, [x6, #:tlsdesc_lo12:var] // encoding: [0xc7'A',A,0x40'A',0xf9'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tlsdesc_lo12:var, kind: fixup_a64_tlsdesc_ld64_lo12_nc +// CHECK-NEXT: add x5, x4, #:tlsdesc_lo12:var // encoding: [0x85'A',A,A,0x91'A'] +// CHECK-NEXT: // fixup A - offset: 0, value: :tlsdesc_lo12:var, kind: fixup_a64_tlsdesc_add_lo12_nc +// CHECK-NEXT: .tlsdesccall var // encoding: [] +// CHECK-NEXT: // fixup A - offset: 0, value: :tlsdesc:var, kind: fixup_a64_tlsdesc_call +// CHECK: blr x3 // encoding: [0x60,0x00,0x3f,0xd6] + + +// CHECK-ELF: # Relocation 65 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000104) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000232) +// CHECK-ELF: # Relocation 66 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000108) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000233) +// CHECK-ELF: # Relocation 67 +// CHECK-ELF-NEXT: (('r_offset', 0x000000000000010c) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000234) +// CHECK-ELF: # Relocation 68 +// CHECK-ELF-NEXT: (('r_offset', 0x0000000000000110) +// CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) +// CHECK-ELF-NEXT: ('r_type', 0x00000239) + +// CHECK-ELF-NAMES: 260 R_AARCH64_TLSDESC_ADR_PAGE +// CHECK-ELF-NAMES: 264 R_AARCH64_TLSDESC_LD64_LO12_NC +// CHECK-ELF-NAMES: 268 R_AARCH64_TLSDESC_ADD_LO12_NC +// CHECK-ELF-NAMES: 272 R_AARCH64_TLSDESC_CALL + + +// Make sure symbol 5 has type STT_TLS: + +// CHECK-ELF: # Symbol 5 +// CHECK-ELF-NEXT: (('st_name', 0x00000006) # 'var' +// CHECK-ELF-NEXT: ('st_bind', 0x1) +// CHECK-ELF-NEXT: ('st_type', 0x6) diff --git a/test/MC/AArch64/trace-regs-diagnostics.s b/test/MC/AArch64/trace-regs-diagnostics.s new file mode 100644 index 000000000000..82ec7c0c745d --- /dev/null +++ b/test/MC/AArch64/trace-regs-diagnostics.s @@ -0,0 +1,156 @@ +// RUN: llvm-mc -triple aarch64-none-linux-gnu < %s 2>&1 | FileCheck %s + // Write-only + mrs x12, trcoslar + mrs x10, trclar +// CHECK: error: expected readable system register +// CHECK-NEXT: mrs x12, trcoslar +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected readable system register +// CHECK-NEXT: mrs x10, trclar +// CHECK-NEXT: ^ + + // Read-only + msr trcstatr, x0 + msr trcidr8, x13 + msr trcidr9, x25 + msr trcidr10, x2 + msr trcidr11, x19 + msr trcidr12, x15 + msr trcidr13, x24 + msr trcidr0, x20 + msr trcidr1, x5 + msr trcidr2, x18 + msr trcidr3, x10 + msr trcidr4, x1 + msr trcidr5, x10 + msr trcidr6, x4 + msr trcidr7, x0 + msr trcoslsr, x23 + msr trcpdsr, x21 + msr trcdevaff0, x4 + msr trcdevaff1, x17 + msr trclsr, x18 + msr trcauthstatus, x10 + msr trcdevarch, x8 + msr trcdevid, x11 + msr trcdevtype, x1 + msr trcpidr4, x2 + msr trcpidr5, x7 + msr trcpidr6, x17 + msr trcpidr7, x5 + msr trcpidr0, x0 + msr trcpidr1, x16 + msr trcpidr2, x29 + msr trcpidr3, x1 + msr trccidr0, x27 + msr trccidr1, x1 + msr trccidr2, x24 + msr trccidr3, x8 +// CHECK: error: expected writable system register or pstate +// CHECK-NEXT: msr trcstatr, x0 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr8, x13 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr9, x25 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr10, x2 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr11, x19 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr12, x15 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr13, x24 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr0, x20 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr1, x5 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr2, x18 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr3, x10 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr4, x1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr5, x10 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr6, x4 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcidr7, x0 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcoslsr, x23 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpdsr, x21 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcdevaff0, x4 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcdevaff1, x17 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trclsr, x18 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcauthstatus, x10 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcdevarch, x8 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcdevid, x11 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcdevtype, x1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpidr4, x2 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpidr5, x7 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpidr6, x17 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpidr7, x5 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpidr0, x0 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpidr1, x16 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpidr2, x29 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trcpidr3, x1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trccidr0, x27 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trccidr1, x1 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trccidr2, x24 +// CHECK-NEXT: ^ +// CHECK-NEXT: error: expected writable system register or pstate +// CHECK-NEXT: msr trccidr3, x8 +// CHECK-NEXT: ^ diff --git a/test/MC/AArch64/trace-regs.s b/test/MC/AArch64/trace-regs.s new file mode 100644 index 000000000000..f9ab4c9ad975 --- /dev/null +++ b/test/MC/AArch64/trace-regs.s @@ -0,0 +1,766 @@ +// RUN: llvm-mc -triple=aarch64-none-linux-gnu -show-encoding < %s | FileCheck %s + mrs x8, trcstatr + mrs x9, trcidr8 + mrs x11, trcidr9 + mrs x25, trcidr10 + mrs x7, trcidr11 + mrs x7, trcidr12 + mrs x6, trcidr13 + mrs x27, trcidr0 + mrs x29, trcidr1 + mrs x4, trcidr2 + mrs x8, trcidr3 + mrs x15, trcidr4 + mrs x20, trcidr5 + mrs x6, trcidr6 + mrs x6, trcidr7 + mrs x24, trcoslsr + mrs x18, trcpdsr + mrs x28, trcdevaff0 + mrs x5, trcdevaff1 + mrs x5, trclsr + mrs x11, trcauthstatus + mrs x13, trcdevarch + mrs x18, trcdevid + mrs x22, trcdevtype + mrs x14, trcpidr4 + mrs x5, trcpidr5 + mrs x5, trcpidr6 + mrs x9, trcpidr7 + mrs x15, trcpidr0 + mrs x6, trcpidr1 + mrs x11, trcpidr2 + mrs x20, trcpidr3 + mrs x17, trccidr0 + mrs x2, trccidr1 + mrs x20, trccidr2 + mrs x4, trccidr3 + mrs x11, trcprgctlr + mrs x23, trcprocselr + mrs x13, trcconfigr + mrs x23, trcauxctlr + mrs x9, trceventctl0r + mrs x16, trceventctl1r + mrs x4, trcstallctlr + mrs x14, trctsctlr + mrs x24, trcsyncpr + mrs x28, trcccctlr + mrs x15, trcbbctlr + mrs x1, trctraceidr + mrs x20, trcqctlr + mrs x2, trcvictlr + mrs x12, trcviiectlr + mrs x16, trcvissctlr + mrs x8, trcvipcssctlr + mrs x27, trcvdctlr + mrs x9, trcvdsacctlr + mrs x0, trcvdarcctlr + mrs x13, trcseqevr0 + mrs x11, trcseqevr1 + mrs x26, trcseqevr2 + mrs x14, trcseqrstevr + mrs x4, trcseqstr + mrs x17, trcextinselr + mrs x21, trccntrldvr0 + mrs x10, trccntrldvr1 + mrs x20, trccntrldvr2 + mrs x5, trccntrldvr3 + mrs x17, trccntctlr0 + mrs x1, trccntctlr1 + mrs x17, trccntctlr2 + mrs x6, trccntctlr3 + mrs x28, trccntvr0 + mrs x23, trccntvr1 + mrs x9, trccntvr2 + mrs x6, trccntvr3 + mrs x24, trcimspec0 + mrs x24, trcimspec1 + mrs x15, trcimspec2 + mrs x10, trcimspec3 + mrs x29, trcimspec4 + mrs x18, trcimspec5 + mrs x29, trcimspec6 + mrs x2, trcimspec7 + mrs x8, trcrsctlr2 + mrs x0, trcrsctlr3 + mrs x12, trcrsctlr4 + mrs x26, trcrsctlr5 + mrs x29, trcrsctlr6 + mrs x17, trcrsctlr7 + mrs x0, trcrsctlr8 + mrs x1, trcrsctlr9 + mrs x17, trcrsctlr10 + mrs x21, trcrsctlr11 + mrs x1, trcrsctlr12 + mrs x8, trcrsctlr13 + mrs x24, trcrsctlr14 + mrs x0, trcrsctlr15 + mrs x2, trcrsctlr16 + mrs x29, trcrsctlr17 + mrs x22, trcrsctlr18 + mrs x6, trcrsctlr19 + mrs x26, trcrsctlr20 + mrs x26, trcrsctlr21 + mrs x4, trcrsctlr22 + mrs x12, trcrsctlr23 + mrs x1, trcrsctlr24 + mrs x0, trcrsctlr25 + mrs x17, trcrsctlr26 + mrs x8, trcrsctlr27 + mrs x10, trcrsctlr28 + mrs x25, trcrsctlr29 + mrs x12, trcrsctlr30 + mrs x11, trcrsctlr31 + mrs x18, trcssccr0 + mrs x12, trcssccr1 + mrs x3, trcssccr2 + mrs x2, trcssccr3 + mrs x21, trcssccr4 + mrs x10, trcssccr5 + mrs x22, trcssccr6 + mrs x23, trcssccr7 + mrs x23, trcsscsr0 + mrs x19, trcsscsr1 + mrs x25, trcsscsr2 + mrs x17, trcsscsr3 + mrs x19, trcsscsr4 + mrs x11, trcsscsr5 + mrs x5, trcsscsr6 + mrs x9, trcsscsr7 + mrs x1, trcsspcicr0 + mrs x12, trcsspcicr1 + mrs x21, trcsspcicr2 + mrs x11, trcsspcicr3 + mrs x3, trcsspcicr4 + mrs x9, trcsspcicr5 + mrs x5, trcsspcicr6 + mrs x2, trcsspcicr7 + mrs x26, trcpdcr + mrs x8, trcacvr0 + mrs x15, trcacvr1 + mrs x19, trcacvr2 + mrs x8, trcacvr3 + mrs x28, trcacvr4 + mrs x3, trcacvr5 + mrs x25, trcacvr6 + mrs x24, trcacvr7 + mrs x6, trcacvr8 + mrs x3, trcacvr9 + mrs x24, trcacvr10 + mrs x3, trcacvr11 + mrs x12, trcacvr12 + mrs x9, trcacvr13 + mrs x14, trcacvr14 + mrs x3, trcacvr15 + mrs x21, trcacatr0 + mrs x26, trcacatr1 + mrs x8, trcacatr2 + mrs x22, trcacatr3 + mrs x6, trcacatr4 + mrs x29, trcacatr5 + mrs x5, trcacatr6 + mrs x18, trcacatr7 + mrs x2, trcacatr8 + mrs x19, trcacatr9 + mrs x13, trcacatr10 + mrs x25, trcacatr11 + mrs x18, trcacatr12 + mrs x29, trcacatr13 + mrs x9, trcacatr14 + mrs x18, trcacatr15 + mrs x29, trcdvcvr0 + mrs x15, trcdvcvr1 + mrs x15, trcdvcvr2 + mrs x15, trcdvcvr3 + mrs x19, trcdvcvr4 + mrs x22, trcdvcvr5 + mrs x27, trcdvcvr6 + mrs x1, trcdvcvr7 + mrs x29, trcdvcmr0 + mrs x9, trcdvcmr1 + mrs x1, trcdvcmr2 + mrs x2, trcdvcmr3 + mrs x5, trcdvcmr4 + mrs x21, trcdvcmr5 + mrs x5, trcdvcmr6 + mrs x1, trcdvcmr7 + mrs x21, trccidcvr0 + mrs x24, trccidcvr1 + mrs x24, trccidcvr2 + mrs x12, trccidcvr3 + mrs x10, trccidcvr4 + mrs x9, trccidcvr5 + mrs x6, trccidcvr6 + mrs x20, trccidcvr7 + mrs x20, trcvmidcvr0 + mrs x20, trcvmidcvr1 + mrs x26, trcvmidcvr2 + mrs x1, trcvmidcvr3 + mrs x14, trcvmidcvr4 + mrs x27, trcvmidcvr5 + mrs x29, trcvmidcvr6 + mrs x17, trcvmidcvr7 + mrs x10, trccidcctlr0 + mrs x4, trccidcctlr1 + mrs x9, trcvmidcctlr0 + mrs x11, trcvmidcctlr1 + mrs x22, trcitctrl + mrs x23, trcclaimset + mrs x14, trcclaimclr +// CHECK: mrs x8, trcstatr // encoding: [0x08,0x03,0x31,0xd5] +// CHECK: mrs x9, trcidr8 // encoding: [0xc9,0x00,0x31,0xd5] +// CHECK: mrs x11, trcidr9 // encoding: [0xcb,0x01,0x31,0xd5] +// CHECK: mrs x25, trcidr10 // encoding: [0xd9,0x02,0x31,0xd5] +// CHECK: mrs x7, trcidr11 // encoding: [0xc7,0x03,0x31,0xd5] +// CHECK: mrs x7, trcidr12 // encoding: [0xc7,0x04,0x31,0xd5] +// CHECK: mrs x6, trcidr13 // encoding: [0xc6,0x05,0x31,0xd5] +// CHECK: mrs x27, trcidr0 // encoding: [0xfb,0x08,0x31,0xd5] +// CHECK: mrs x29, trcidr1 // encoding: [0xfd,0x09,0x31,0xd5] +// CHECK: mrs x4, trcidr2 // encoding: [0xe4,0x0a,0x31,0xd5] +// CHECK: mrs x8, trcidr3 // encoding: [0xe8,0x0b,0x31,0xd5] +// CHECK: mrs x15, trcidr4 // encoding: [0xef,0x0c,0x31,0xd5] +// CHECK: mrs x20, trcidr5 // encoding: [0xf4,0x0d,0x31,0xd5] +// CHECK: mrs x6, trcidr6 // encoding: [0xe6,0x0e,0x31,0xd5] +// CHECK: mrs x6, trcidr7 // encoding: [0xe6,0x0f,0x31,0xd5] +// CHECK: mrs x24, trcoslsr // encoding: [0x98,0x11,0x31,0xd5] +// CHECK: mrs x18, trcpdsr // encoding: [0x92,0x15,0x31,0xd5] +// CHECK: mrs x28, trcdevaff0 // encoding: [0xdc,0x7a,0x31,0xd5] +// CHECK: mrs x5, trcdevaff1 // encoding: [0xc5,0x7b,0x31,0xd5] +// CHECK: mrs x5, trclsr // encoding: [0xc5,0x7d,0x31,0xd5] +// CHECK: mrs x11, trcauthstatus // encoding: [0xcb,0x7e,0x31,0xd5] +// CHECK: mrs x13, trcdevarch // encoding: [0xcd,0x7f,0x31,0xd5] +// CHECK: mrs x18, trcdevid // encoding: [0xf2,0x72,0x31,0xd5] +// CHECK: mrs x22, trcdevtype // encoding: [0xf6,0x73,0x31,0xd5] +// CHECK: mrs x14, trcpidr4 // encoding: [0xee,0x74,0x31,0xd5] +// CHECK: mrs x5, trcpidr5 // encoding: [0xe5,0x75,0x31,0xd5] +// CHECK: mrs x5, trcpidr6 // encoding: [0xe5,0x76,0x31,0xd5] +// CHECK: mrs x9, trcpidr7 // encoding: [0xe9,0x77,0x31,0xd5] +// CHECK: mrs x15, trcpidr0 // encoding: [0xef,0x78,0x31,0xd5] +// CHECK: mrs x6, trcpidr1 // encoding: [0xe6,0x79,0x31,0xd5] +// CHECK: mrs x11, trcpidr2 // encoding: [0xeb,0x7a,0x31,0xd5] +// CHECK: mrs x20, trcpidr3 // encoding: [0xf4,0x7b,0x31,0xd5] +// CHECK: mrs x17, trccidr0 // encoding: [0xf1,0x7c,0x31,0xd5] +// CHECK: mrs x2, trccidr1 // encoding: [0xe2,0x7d,0x31,0xd5] +// CHECK: mrs x20, trccidr2 // encoding: [0xf4,0x7e,0x31,0xd5] +// CHECK: mrs x4, trccidr3 // encoding: [0xe4,0x7f,0x31,0xd5] +// CHECK: mrs x11, trcprgctlr // encoding: [0x0b,0x01,0x31,0xd5] +// CHECK: mrs x23, trcprocselr // encoding: [0x17,0x02,0x31,0xd5] +// CHECK: mrs x13, trcconfigr // encoding: [0x0d,0x04,0x31,0xd5] +// CHECK: mrs x23, trcauxctlr // encoding: [0x17,0x06,0x31,0xd5] +// CHECK: mrs x9, trceventctl0r // encoding: [0x09,0x08,0x31,0xd5] +// CHECK: mrs x16, trceventctl1r // encoding: [0x10,0x09,0x31,0xd5] +// CHECK: mrs x4, trcstallctlr // encoding: [0x04,0x0b,0x31,0xd5] +// CHECK: mrs x14, trctsctlr // encoding: [0x0e,0x0c,0x31,0xd5] +// CHECK: mrs x24, trcsyncpr // encoding: [0x18,0x0d,0x31,0xd5] +// CHECK: mrs x28, trcccctlr // encoding: [0x1c,0x0e,0x31,0xd5] +// CHECK: mrs x15, trcbbctlr // encoding: [0x0f,0x0f,0x31,0xd5] +// CHECK: mrs x1, trctraceidr // encoding: [0x21,0x00,0x31,0xd5] +// CHECK: mrs x20, trcqctlr // encoding: [0x34,0x01,0x31,0xd5] +// CHECK: mrs x2, trcvictlr // encoding: [0x42,0x00,0x31,0xd5] +// CHECK: mrs x12, trcviiectlr // encoding: [0x4c,0x01,0x31,0xd5] +// CHECK: mrs x16, trcvissctlr // encoding: [0x50,0x02,0x31,0xd5] +// CHECK: mrs x8, trcvipcssctlr // encoding: [0x48,0x03,0x31,0xd5] +// CHECK: mrs x27, trcvdctlr // encoding: [0x5b,0x08,0x31,0xd5] +// CHECK: mrs x9, trcvdsacctlr // encoding: [0x49,0x09,0x31,0xd5] +// CHECK: mrs x0, trcvdarcctlr // encoding: [0x40,0x0a,0x31,0xd5] +// CHECK: mrs x13, trcseqevr0 // encoding: [0x8d,0x00,0x31,0xd5] +// CHECK: mrs x11, trcseqevr1 // encoding: [0x8b,0x01,0x31,0xd5] +// CHECK: mrs x26, trcseqevr2 // encoding: [0x9a,0x02,0x31,0xd5] +// CHECK: mrs x14, trcseqrstevr // encoding: [0x8e,0x06,0x31,0xd5] +// CHECK: mrs x4, trcseqstr // encoding: [0x84,0x07,0x31,0xd5] +// CHECK: mrs x17, trcextinselr // encoding: [0x91,0x08,0x31,0xd5] +// CHECK: mrs x21, trccntrldvr0 // encoding: [0xb5,0x00,0x31,0xd5] +// CHECK: mrs x10, trccntrldvr1 // encoding: [0xaa,0x01,0x31,0xd5] +// CHECK: mrs x20, trccntrldvr2 // encoding: [0xb4,0x02,0x31,0xd5] +// CHECK: mrs x5, trccntrldvr3 // encoding: [0xa5,0x03,0x31,0xd5] +// CHECK: mrs x17, trccntctlr0 // encoding: [0xb1,0x04,0x31,0xd5] +// CHECK: mrs x1, trccntctlr1 // encoding: [0xa1,0x05,0x31,0xd5] +// CHECK: mrs x17, trccntctlr2 // encoding: [0xb1,0x06,0x31,0xd5] +// CHECK: mrs x6, trccntctlr3 // encoding: [0xa6,0x07,0x31,0xd5] +// CHECK: mrs x28, trccntvr0 // encoding: [0xbc,0x08,0x31,0xd5] +// CHECK: mrs x23, trccntvr1 // encoding: [0xb7,0x09,0x31,0xd5] +// CHECK: mrs x9, trccntvr2 // encoding: [0xa9,0x0a,0x31,0xd5] +// CHECK: mrs x6, trccntvr3 // encoding: [0xa6,0x0b,0x31,0xd5] +// CHECK: mrs x24, trcimspec0 // encoding: [0xf8,0x00,0x31,0xd5] +// CHECK: mrs x24, trcimspec1 // encoding: [0xf8,0x01,0x31,0xd5] +// CHECK: mrs x15, trcimspec2 // encoding: [0xef,0x02,0x31,0xd5] +// CHECK: mrs x10, trcimspec3 // encoding: [0xea,0x03,0x31,0xd5] +// CHECK: mrs x29, trcimspec4 // encoding: [0xfd,0x04,0x31,0xd5] +// CHECK: mrs x18, trcimspec5 // encoding: [0xf2,0x05,0x31,0xd5] +// CHECK: mrs x29, trcimspec6 // encoding: [0xfd,0x06,0x31,0xd5] +// CHECK: mrs x2, trcimspec7 // encoding: [0xe2,0x07,0x31,0xd5] +// CHECK: mrs x8, trcrsctlr2 // encoding: [0x08,0x12,0x31,0xd5] +// CHECK: mrs x0, trcrsctlr3 // encoding: [0x00,0x13,0x31,0xd5] +// CHECK: mrs x12, trcrsctlr4 // encoding: [0x0c,0x14,0x31,0xd5] +// CHECK: mrs x26, trcrsctlr5 // encoding: [0x1a,0x15,0x31,0xd5] +// CHECK: mrs x29, trcrsctlr6 // encoding: [0x1d,0x16,0x31,0xd5] +// CHECK: mrs x17, trcrsctlr7 // encoding: [0x11,0x17,0x31,0xd5] +// CHECK: mrs x0, trcrsctlr8 // encoding: [0x00,0x18,0x31,0xd5] +// CHECK: mrs x1, trcrsctlr9 // encoding: [0x01,0x19,0x31,0xd5] +// CHECK: mrs x17, trcrsctlr10 // encoding: [0x11,0x1a,0x31,0xd5] +// CHECK: mrs x21, trcrsctlr11 // encoding: [0x15,0x1b,0x31,0xd5] +// CHECK: mrs x1, trcrsctlr12 // encoding: [0x01,0x1c,0x31,0xd5] +// CHECK: mrs x8, trcrsctlr13 // encoding: [0x08,0x1d,0x31,0xd5] +// CHECK: mrs x24, trcrsctlr14 // encoding: [0x18,0x1e,0x31,0xd5] +// CHECK: mrs x0, trcrsctlr15 // encoding: [0x00,0x1f,0x31,0xd5] +// CHECK: mrs x2, trcrsctlr16 // encoding: [0x22,0x10,0x31,0xd5] +// CHECK: mrs x29, trcrsctlr17 // encoding: [0x3d,0x11,0x31,0xd5] +// CHECK: mrs x22, trcrsctlr18 // encoding: [0x36,0x12,0x31,0xd5] +// CHECK: mrs x6, trcrsctlr19 // encoding: [0x26,0x13,0x31,0xd5] +// CHECK: mrs x26, trcrsctlr20 // encoding: [0x3a,0x14,0x31,0xd5] +// CHECK: mrs x26, trcrsctlr21 // encoding: [0x3a,0x15,0x31,0xd5] +// CHECK: mrs x4, trcrsctlr22 // encoding: [0x24,0x16,0x31,0xd5] +// CHECK: mrs x12, trcrsctlr23 // encoding: [0x2c,0x17,0x31,0xd5] +// CHECK: mrs x1, trcrsctlr24 // encoding: [0x21,0x18,0x31,0xd5] +// CHECK: mrs x0, trcrsctlr25 // encoding: [0x20,0x19,0x31,0xd5] +// CHECK: mrs x17, trcrsctlr26 // encoding: [0x31,0x1a,0x31,0xd5] +// CHECK: mrs x8, trcrsctlr27 // encoding: [0x28,0x1b,0x31,0xd5] +// CHECK: mrs x10, trcrsctlr28 // encoding: [0x2a,0x1c,0x31,0xd5] +// CHECK: mrs x25, trcrsctlr29 // encoding: [0x39,0x1d,0x31,0xd5] +// CHECK: mrs x12, trcrsctlr30 // encoding: [0x2c,0x1e,0x31,0xd5] +// CHECK: mrs x11, trcrsctlr31 // encoding: [0x2b,0x1f,0x31,0xd5] +// CHECK: mrs x18, trcssccr0 // encoding: [0x52,0x10,0x31,0xd5] +// CHECK: mrs x12, trcssccr1 // encoding: [0x4c,0x11,0x31,0xd5] +// CHECK: mrs x3, trcssccr2 // encoding: [0x43,0x12,0x31,0xd5] +// CHECK: mrs x2, trcssccr3 // encoding: [0x42,0x13,0x31,0xd5] +// CHECK: mrs x21, trcssccr4 // encoding: [0x55,0x14,0x31,0xd5] +// CHECK: mrs x10, trcssccr5 // encoding: [0x4a,0x15,0x31,0xd5] +// CHECK: mrs x22, trcssccr6 // encoding: [0x56,0x16,0x31,0xd5] +// CHECK: mrs x23, trcssccr7 // encoding: [0x57,0x17,0x31,0xd5] +// CHECK: mrs x23, trcsscsr0 // encoding: [0x57,0x18,0x31,0xd5] +// CHECK: mrs x19, trcsscsr1 // encoding: [0x53,0x19,0x31,0xd5] +// CHECK: mrs x25, trcsscsr2 // encoding: [0x59,0x1a,0x31,0xd5] +// CHECK: mrs x17, trcsscsr3 // encoding: [0x51,0x1b,0x31,0xd5] +// CHECK: mrs x19, trcsscsr4 // encoding: [0x53,0x1c,0x31,0xd5] +// CHECK: mrs x11, trcsscsr5 // encoding: [0x4b,0x1d,0x31,0xd5] +// CHECK: mrs x5, trcsscsr6 // encoding: [0x45,0x1e,0x31,0xd5] +// CHECK: mrs x9, trcsscsr7 // encoding: [0x49,0x1f,0x31,0xd5] +// CHECK: mrs x1, trcsspcicr0 // encoding: [0x61,0x10,0x31,0xd5] +// CHECK: mrs x12, trcsspcicr1 // encoding: [0x6c,0x11,0x31,0xd5] +// CHECK: mrs x21, trcsspcicr2 // encoding: [0x75,0x12,0x31,0xd5] +// CHECK: mrs x11, trcsspcicr3 // encoding: [0x6b,0x13,0x31,0xd5] +// CHECK: mrs x3, trcsspcicr4 // encoding: [0x63,0x14,0x31,0xd5] +// CHECK: mrs x9, trcsspcicr5 // encoding: [0x69,0x15,0x31,0xd5] +// CHECK: mrs x5, trcsspcicr6 // encoding: [0x65,0x16,0x31,0xd5] +// CHECK: mrs x2, trcsspcicr7 // encoding: [0x62,0x17,0x31,0xd5] +// CHECK: mrs x26, trcpdcr // encoding: [0x9a,0x14,0x31,0xd5] +// CHECK: mrs x8, trcacvr0 // encoding: [0x08,0x20,0x31,0xd5] +// CHECK: mrs x15, trcacvr1 // encoding: [0x0f,0x22,0x31,0xd5] +// CHECK: mrs x19, trcacvr2 // encoding: [0x13,0x24,0x31,0xd5] +// CHECK: mrs x8, trcacvr3 // encoding: [0x08,0x26,0x31,0xd5] +// CHECK: mrs x28, trcacvr4 // encoding: [0x1c,0x28,0x31,0xd5] +// CHECK: mrs x3, trcacvr5 // encoding: [0x03,0x2a,0x31,0xd5] +// CHECK: mrs x25, trcacvr6 // encoding: [0x19,0x2c,0x31,0xd5] +// CHECK: mrs x24, trcacvr7 // encoding: [0x18,0x2e,0x31,0xd5] +// CHECK: mrs x6, trcacvr8 // encoding: [0x26,0x20,0x31,0xd5] +// CHECK: mrs x3, trcacvr9 // encoding: [0x23,0x22,0x31,0xd5] +// CHECK: mrs x24, trcacvr10 // encoding: [0x38,0x24,0x31,0xd5] +// CHECK: mrs x3, trcacvr11 // encoding: [0x23,0x26,0x31,0xd5] +// CHECK: mrs x12, trcacvr12 // encoding: [0x2c,0x28,0x31,0xd5] +// CHECK: mrs x9, trcacvr13 // encoding: [0x29,0x2a,0x31,0xd5] +// CHECK: mrs x14, trcacvr14 // encoding: [0x2e,0x2c,0x31,0xd5] +// CHECK: mrs x3, trcacvr15 // encoding: [0x23,0x2e,0x31,0xd5] +// CHECK: mrs x21, trcacatr0 // encoding: [0x55,0x20,0x31,0xd5] +// CHECK: mrs x26, trcacatr1 // encoding: [0x5a,0x22,0x31,0xd5] +// CHECK: mrs x8, trcacatr2 // encoding: [0x48,0x24,0x31,0xd5] +// CHECK: mrs x22, trcacatr3 // encoding: [0x56,0x26,0x31,0xd5] +// CHECK: mrs x6, trcacatr4 // encoding: [0x46,0x28,0x31,0xd5] +// CHECK: mrs x29, trcacatr5 // encoding: [0x5d,0x2a,0x31,0xd5] +// CHECK: mrs x5, trcacatr6 // encoding: [0x45,0x2c,0x31,0xd5] +// CHECK: mrs x18, trcacatr7 // encoding: [0x52,0x2e,0x31,0xd5] +// CHECK: mrs x2, trcacatr8 // encoding: [0x62,0x20,0x31,0xd5] +// CHECK: mrs x19, trcacatr9 // encoding: [0x73,0x22,0x31,0xd5] +// CHECK: mrs x13, trcacatr10 // encoding: [0x6d,0x24,0x31,0xd5] +// CHECK: mrs x25, trcacatr11 // encoding: [0x79,0x26,0x31,0xd5] +// CHECK: mrs x18, trcacatr12 // encoding: [0x72,0x28,0x31,0xd5] +// CHECK: mrs x29, trcacatr13 // encoding: [0x7d,0x2a,0x31,0xd5] +// CHECK: mrs x9, trcacatr14 // encoding: [0x69,0x2c,0x31,0xd5] +// CHECK: mrs x18, trcacatr15 // encoding: [0x72,0x2e,0x31,0xd5] +// CHECK: mrs x29, trcdvcvr0 // encoding: [0x9d,0x20,0x31,0xd5] +// CHECK: mrs x15, trcdvcvr1 // encoding: [0x8f,0x24,0x31,0xd5] +// CHECK: mrs x15, trcdvcvr2 // encoding: [0x8f,0x28,0x31,0xd5] +// CHECK: mrs x15, trcdvcvr3 // encoding: [0x8f,0x2c,0x31,0xd5] +// CHECK: mrs x19, trcdvcvr4 // encoding: [0xb3,0x20,0x31,0xd5] +// CHECK: mrs x22, trcdvcvr5 // encoding: [0xb6,0x24,0x31,0xd5] +// CHECK: mrs x27, trcdvcvr6 // encoding: [0xbb,0x28,0x31,0xd5] +// CHECK: mrs x1, trcdvcvr7 // encoding: [0xa1,0x2c,0x31,0xd5] +// CHECK: mrs x29, trcdvcmr0 // encoding: [0xdd,0x20,0x31,0xd5] +// CHECK: mrs x9, trcdvcmr1 // encoding: [0xc9,0x24,0x31,0xd5] +// CHECK: mrs x1, trcdvcmr2 // encoding: [0xc1,0x28,0x31,0xd5] +// CHECK: mrs x2, trcdvcmr3 // encoding: [0xc2,0x2c,0x31,0xd5] +// CHECK: mrs x5, trcdvcmr4 // encoding: [0xe5,0x20,0x31,0xd5] +// CHECK: mrs x21, trcdvcmr5 // encoding: [0xf5,0x24,0x31,0xd5] +// CHECK: mrs x5, trcdvcmr6 // encoding: [0xe5,0x28,0x31,0xd5] +// CHECK: mrs x1, trcdvcmr7 // encoding: [0xe1,0x2c,0x31,0xd5] +// CHECK: mrs x21, trccidcvr0 // encoding: [0x15,0x30,0x31,0xd5] +// CHECK: mrs x24, trccidcvr1 // encoding: [0x18,0x32,0x31,0xd5] +// CHECK: mrs x24, trccidcvr2 // encoding: [0x18,0x34,0x31,0xd5] +// CHECK: mrs x12, trccidcvr3 // encoding: [0x0c,0x36,0x31,0xd5] +// CHECK: mrs x10, trccidcvr4 // encoding: [0x0a,0x38,0x31,0xd5] +// CHECK: mrs x9, trccidcvr5 // encoding: [0x09,0x3a,0x31,0xd5] +// CHECK: mrs x6, trccidcvr6 // encoding: [0x06,0x3c,0x31,0xd5] +// CHECK: mrs x20, trccidcvr7 // encoding: [0x14,0x3e,0x31,0xd5] +// CHECK: mrs x20, trcvmidcvr0 // encoding: [0x34,0x30,0x31,0xd5] +// CHECK: mrs x20, trcvmidcvr1 // encoding: [0x34,0x32,0x31,0xd5] +// CHECK: mrs x26, trcvmidcvr2 // encoding: [0x3a,0x34,0x31,0xd5] +// CHECK: mrs x1, trcvmidcvr3 // encoding: [0x21,0x36,0x31,0xd5] +// CHECK: mrs x14, trcvmidcvr4 // encoding: [0x2e,0x38,0x31,0xd5] +// CHECK: mrs x27, trcvmidcvr5 // encoding: [0x3b,0x3a,0x31,0xd5] +// CHECK: mrs x29, trcvmidcvr6 // encoding: [0x3d,0x3c,0x31,0xd5] +// CHECK: mrs x17, trcvmidcvr7 // encoding: [0x31,0x3e,0x31,0xd5] +// CHECK: mrs x10, trccidcctlr0 // encoding: [0x4a,0x30,0x31,0xd5] +// CHECK: mrs x4, trccidcctlr1 // encoding: [0x44,0x31,0x31,0xd5] +// CHECK: mrs x9, trcvmidcctlr0 // encoding: [0x49,0x32,0x31,0xd5] +// CHECK: mrs x11, trcvmidcctlr1 // encoding: [0x4b,0x33,0x31,0xd5] +// CHECK: mrs x22, trcitctrl // encoding: [0x96,0x70,0x31,0xd5] +// CHECK: mrs x23, trcclaimset // encoding: [0xd7,0x78,0x31,0xd5] +// CHECK: mrs x14, trcclaimclr // encoding: [0xce,0x79,0x31,0xd5] + + msr trcoslar, x28 + msr trclar, x14 + msr trcprgctlr, x10 + msr trcprocselr, x27 + msr trcconfigr, x24 + msr trcauxctlr, x8 + msr trceventctl0r, x16 + msr trceventctl1r, x27 + msr trcstallctlr, x26 + msr trctsctlr, x0 + msr trcsyncpr, x14 + msr trcccctlr, x8 + msr trcbbctlr, x6 + msr trctraceidr, x23 + msr trcqctlr, x5 + msr trcvictlr, x0 + msr trcviiectlr, x0 + msr trcvissctlr, x1 + msr trcvipcssctlr, x0 + msr trcvdctlr, x7 + msr trcvdsacctlr, x18 + msr trcvdarcctlr, x24 + msr trcseqevr0, x28 + msr trcseqevr1, x21 + msr trcseqevr2, x16 + msr trcseqrstevr, x16 + msr trcseqstr, x25 + msr trcextinselr, x29 + msr trccntrldvr0, x20 + msr trccntrldvr1, x20 + msr trccntrldvr2, x22 + msr trccntrldvr3, x12 + msr trccntctlr0, x20 + msr trccntctlr1, x4 + msr trccntctlr2, x8 + msr trccntctlr3, x16 + msr trccntvr0, x5 + msr trccntvr1, x27 + msr trccntvr2, x21 + msr trccntvr3, x8 + msr trcimspec0, x6 + msr trcimspec1, x27 + msr trcimspec2, x23 + msr trcimspec3, x15 + msr trcimspec4, x13 + msr trcimspec5, x25 + msr trcimspec6, x19 + msr trcimspec7, x27 + msr trcrsctlr2, x4 + msr trcrsctlr3, x0 + msr trcrsctlr4, x21 + msr trcrsctlr5, x8 + msr trcrsctlr6, x20 + msr trcrsctlr7, x11 + msr trcrsctlr8, x18 + msr trcrsctlr9, x24 + msr trcrsctlr10, x15 + msr trcrsctlr11, x21 + msr trcrsctlr12, x4 + msr trcrsctlr13, x28 + msr trcrsctlr14, x3 + msr trcrsctlr15, x20 + msr trcrsctlr16, x12 + msr trcrsctlr17, x17 + msr trcrsctlr18, x10 + msr trcrsctlr19, x11 + msr trcrsctlr20, x3 + msr trcrsctlr21, x18 + msr trcrsctlr22, x26 + msr trcrsctlr23, x5 + msr trcrsctlr24, x25 + msr trcrsctlr25, x5 + msr trcrsctlr26, x4 + msr trcrsctlr27, x20 + msr trcrsctlr28, x5 + msr trcrsctlr29, x10 + msr trcrsctlr30, x24 + msr trcrsctlr31, x20 + msr trcssccr0, x23 + msr trcssccr1, x27 + msr trcssccr2, x27 + msr trcssccr3, x6 + msr trcssccr4, x3 + msr trcssccr5, x12 + msr trcssccr6, x7 + msr trcssccr7, x6 + msr trcsscsr0, x20 + msr trcsscsr1, x17 + msr trcsscsr2, x11 + msr trcsscsr3, x4 + msr trcsscsr4, x14 + msr trcsscsr5, x22 + msr trcsscsr6, x3 + msr trcsscsr7, x11 + msr trcsspcicr0, x2 + msr trcsspcicr1, x3 + msr trcsspcicr2, x5 + msr trcsspcicr3, x7 + msr trcsspcicr4, x11 + msr trcsspcicr5, x13 + msr trcsspcicr6, x17 + msr trcsspcicr7, x23 + msr trcpdcr, x3 + msr trcacvr0, x6 + msr trcacvr1, x20 + msr trcacvr2, x25 + msr trcacvr3, x1 + msr trcacvr4, x28 + msr trcacvr5, x15 + msr trcacvr6, x25 + msr trcacvr7, x12 + msr trcacvr8, x5 + msr trcacvr9, x25 + msr trcacvr10, x13 + msr trcacvr11, x10 + msr trcacvr12, x19 + msr trcacvr13, x10 + msr trcacvr14, x19 + msr trcacvr15, x2 + msr trcacatr0, x15 + msr trcacatr1, x13 + msr trcacatr2, x8 + msr trcacatr3, x1 + msr trcacatr4, x11 + msr trcacatr5, x8 + msr trcacatr6, x24 + msr trcacatr7, x6 + msr trcacatr8, x23 + msr trcacatr9, x5 + msr trcacatr10, x11 + msr trcacatr11, x11 + msr trcacatr12, x3 + msr trcacatr13, x28 + msr trcacatr14, x25 + msr trcacatr15, x4 + msr trcdvcvr0, x6 + msr trcdvcvr1, x3 + msr trcdvcvr2, x5 + msr trcdvcvr3, x11 + msr trcdvcvr4, x9 + msr trcdvcvr5, x14 + msr trcdvcvr6, x10 + msr trcdvcvr7, x12 + msr trcdvcmr0, x8 + msr trcdvcmr1, x8 + msr trcdvcmr2, x22 + msr trcdvcmr3, x22 + msr trcdvcmr4, x5 + msr trcdvcmr5, x16 + msr trcdvcmr6, x27 + msr trcdvcmr7, x21 + msr trccidcvr0, x8 + msr trccidcvr1, x6 + msr trccidcvr2, x9 + msr trccidcvr3, x8 + msr trccidcvr4, x3 + msr trccidcvr5, x21 + msr trccidcvr6, x12 + msr trccidcvr7, x7 + msr trcvmidcvr0, x4 + msr trcvmidcvr1, x3 + msr trcvmidcvr2, x9 + msr trcvmidcvr3, x17 + msr trcvmidcvr4, x14 + msr trcvmidcvr5, x12 + msr trcvmidcvr6, x10 + msr trcvmidcvr7, x3 + msr trccidcctlr0, x14 + msr trccidcctlr1, x22 + msr trcvmidcctlr0, x8 + msr trcvmidcctlr1, x15 + msr trcitctrl, x1 + msr trcclaimset, x7 + msr trcclaimclr, x29 +// CHECK: msr trcoslar, x28 // encoding: [0x9c,0x10,0x11,0xd5] +// CHECK: msr trclar, x14 // encoding: [0xce,0x7c,0x11,0xd5] +// CHECK: msr trcprgctlr, x10 // encoding: [0x0a,0x01,0x11,0xd5] +// CHECK: msr trcprocselr, x27 // encoding: [0x1b,0x02,0x11,0xd5] +// CHECK: msr trcconfigr, x24 // encoding: [0x18,0x04,0x11,0xd5] +// CHECK: msr trcauxctlr, x8 // encoding: [0x08,0x06,0x11,0xd5] +// CHECK: msr trceventctl0r, x16 // encoding: [0x10,0x08,0x11,0xd5] +// CHECK: msr trceventctl1r, x27 // encoding: [0x1b,0x09,0x11,0xd5] +// CHECK: msr trcstallctlr, x26 // encoding: [0x1a,0x0b,0x11,0xd5] +// CHECK: msr trctsctlr, x0 // encoding: [0x00,0x0c,0x11,0xd5] +// CHECK: msr trcsyncpr, x14 // encoding: [0x0e,0x0d,0x11,0xd5] +// CHECK: msr trcccctlr, x8 // encoding: [0x08,0x0e,0x11,0xd5] +// CHECK: msr trcbbctlr, x6 // encoding: [0x06,0x0f,0x11,0xd5] +// CHECK: msr trctraceidr, x23 // encoding: [0x37,0x00,0x11,0xd5] +// CHECK: msr trcqctlr, x5 // encoding: [0x25,0x01,0x11,0xd5] +// CHECK: msr trcvictlr, x0 // encoding: [0x40,0x00,0x11,0xd5] +// CHECK: msr trcviiectlr, x0 // encoding: [0x40,0x01,0x11,0xd5] +// CHECK: msr trcvissctlr, x1 // encoding: [0x41,0x02,0x11,0xd5] +// CHECK: msr trcvipcssctlr, x0 // encoding: [0x40,0x03,0x11,0xd5] +// CHECK: msr trcvdctlr, x7 // encoding: [0x47,0x08,0x11,0xd5] +// CHECK: msr trcvdsacctlr, x18 // encoding: [0x52,0x09,0x11,0xd5] +// CHECK: msr trcvdarcctlr, x24 // encoding: [0x58,0x0a,0x11,0xd5] +// CHECK: msr trcseqevr0, x28 // encoding: [0x9c,0x00,0x11,0xd5] +// CHECK: msr trcseqevr1, x21 // encoding: [0x95,0x01,0x11,0xd5] +// CHECK: msr trcseqevr2, x16 // encoding: [0x90,0x02,0x11,0xd5] +// CHECK: msr trcseqrstevr, x16 // encoding: [0x90,0x06,0x11,0xd5] +// CHECK: msr trcseqstr, x25 // encoding: [0x99,0x07,0x11,0xd5] +// CHECK: msr trcextinselr, x29 // encoding: [0x9d,0x08,0x11,0xd5] +// CHECK: msr trccntrldvr0, x20 // encoding: [0xb4,0x00,0x11,0xd5] +// CHECK: msr trccntrldvr1, x20 // encoding: [0xb4,0x01,0x11,0xd5] +// CHECK: msr trccntrldvr2, x22 // encoding: [0xb6,0x02,0x11,0xd5] +// CHECK: msr trccntrldvr3, x12 // encoding: [0xac,0x03,0x11,0xd5] +// CHECK: msr trccntctlr0, x20 // encoding: [0xb4,0x04,0x11,0xd5] +// CHECK: msr trccntctlr1, x4 // encoding: [0xa4,0x05,0x11,0xd5] +// CHECK: msr trccntctlr2, x8 // encoding: [0xa8,0x06,0x11,0xd5] +// CHECK: msr trccntctlr3, x16 // encoding: [0xb0,0x07,0x11,0xd5] +// CHECK: msr trccntvr0, x5 // encoding: [0xa5,0x08,0x11,0xd5] +// CHECK: msr trccntvr1, x27 // encoding: [0xbb,0x09,0x11,0xd5] +// CHECK: msr trccntvr2, x21 // encoding: [0xb5,0x0a,0x11,0xd5] +// CHECK: msr trccntvr3, x8 // encoding: [0xa8,0x0b,0x11,0xd5] +// CHECK: msr trcimspec0, x6 // encoding: [0xe6,0x00,0x11,0xd5] +// CHECK: msr trcimspec1, x27 // encoding: [0xfb,0x01,0x11,0xd5] +// CHECK: msr trcimspec2, x23 // encoding: [0xf7,0x02,0x11,0xd5] +// CHECK: msr trcimspec3, x15 // encoding: [0xef,0x03,0x11,0xd5] +// CHECK: msr trcimspec4, x13 // encoding: [0xed,0x04,0x11,0xd5] +// CHECK: msr trcimspec5, x25 // encoding: [0xf9,0x05,0x11,0xd5] +// CHECK: msr trcimspec6, x19 // encoding: [0xf3,0x06,0x11,0xd5] +// CHECK: msr trcimspec7, x27 // encoding: [0xfb,0x07,0x11,0xd5] +// CHECK: msr trcrsctlr2, x4 // encoding: [0x04,0x12,0x11,0xd5] +// CHECK: msr trcrsctlr3, x0 // encoding: [0x00,0x13,0x11,0xd5] +// CHECK: msr trcrsctlr4, x21 // encoding: [0x15,0x14,0x11,0xd5] +// CHECK: msr trcrsctlr5, x8 // encoding: [0x08,0x15,0x11,0xd5] +// CHECK: msr trcrsctlr6, x20 // encoding: [0x14,0x16,0x11,0xd5] +// CHECK: msr trcrsctlr7, x11 // encoding: [0x0b,0x17,0x11,0xd5] +// CHECK: msr trcrsctlr8, x18 // encoding: [0x12,0x18,0x11,0xd5] +// CHECK: msr trcrsctlr9, x24 // encoding: [0x18,0x19,0x11,0xd5] +// CHECK: msr trcrsctlr10, x15 // encoding: [0x0f,0x1a,0x11,0xd5] +// CHECK: msr trcrsctlr11, x21 // encoding: [0x15,0x1b,0x11,0xd5] +// CHECK: msr trcrsctlr12, x4 // encoding: [0x04,0x1c,0x11,0xd5] +// CHECK: msr trcrsctlr13, x28 // encoding: [0x1c,0x1d,0x11,0xd5] +// CHECK: msr trcrsctlr14, x3 // encoding: [0x03,0x1e,0x11,0xd5] +// CHECK: msr trcrsctlr15, x20 // encoding: [0x14,0x1f,0x11,0xd5] +// CHECK: msr trcrsctlr16, x12 // encoding: [0x2c,0x10,0x11,0xd5] +// CHECK: msr trcrsctlr17, x17 // encoding: [0x31,0x11,0x11,0xd5] +// CHECK: msr trcrsctlr18, x10 // encoding: [0x2a,0x12,0x11,0xd5] +// CHECK: msr trcrsctlr19, x11 // encoding: [0x2b,0x13,0x11,0xd5] +// CHECK: msr trcrsctlr20, x3 // encoding: [0x23,0x14,0x11,0xd5] +// CHECK: msr trcrsctlr21, x18 // encoding: [0x32,0x15,0x11,0xd5] +// CHECK: msr trcrsctlr22, x26 // encoding: [0x3a,0x16,0x11,0xd5] +// CHECK: msr trcrsctlr23, x5 // encoding: [0x25,0x17,0x11,0xd5] +// CHECK: msr trcrsctlr24, x25 // encoding: [0x39,0x18,0x11,0xd5] +// CHECK: msr trcrsctlr25, x5 // encoding: [0x25,0x19,0x11,0xd5] +// CHECK: msr trcrsctlr26, x4 // encoding: [0x24,0x1a,0x11,0xd5] +// CHECK: msr trcrsctlr27, x20 // encoding: [0x34,0x1b,0x11,0xd5] +// CHECK: msr trcrsctlr28, x5 // encoding: [0x25,0x1c,0x11,0xd5] +// CHECK: msr trcrsctlr29, x10 // encoding: [0x2a,0x1d,0x11,0xd5] +// CHECK: msr trcrsctlr30, x24 // encoding: [0x38,0x1e,0x11,0xd5] +// CHECK: msr trcrsctlr31, x20 // encoding: [0x34,0x1f,0x11,0xd5] +// CHECK: msr trcssccr0, x23 // encoding: [0x57,0x10,0x11,0xd5] +// CHECK: msr trcssccr1, x27 // encoding: [0x5b,0x11,0x11,0xd5] +// CHECK: msr trcssccr2, x27 // encoding: [0x5b,0x12,0x11,0xd5] +// CHECK: msr trcssccr3, x6 // encoding: [0x46,0x13,0x11,0xd5] +// CHECK: msr trcssccr4, x3 // encoding: [0x43,0x14,0x11,0xd5] +// CHECK: msr trcssccr5, x12 // encoding: [0x4c,0x15,0x11,0xd5] +// CHECK: msr trcssccr6, x7 // encoding: [0x47,0x16,0x11,0xd5] +// CHECK: msr trcssccr7, x6 // encoding: [0x46,0x17,0x11,0xd5] +// CHECK: msr trcsscsr0, x20 // encoding: [0x54,0x18,0x11,0xd5] +// CHECK: msr trcsscsr1, x17 // encoding: [0x51,0x19,0x11,0xd5] +// CHECK: msr trcsscsr2, x11 // encoding: [0x4b,0x1a,0x11,0xd5] +// CHECK: msr trcsscsr3, x4 // encoding: [0x44,0x1b,0x11,0xd5] +// CHECK: msr trcsscsr4, x14 // encoding: [0x4e,0x1c,0x11,0xd5] +// CHECK: msr trcsscsr5, x22 // encoding: [0x56,0x1d,0x11,0xd5] +// CHECK: msr trcsscsr6, x3 // encoding: [0x43,0x1e,0x11,0xd5] +// CHECK: msr trcsscsr7, x11 // encoding: [0x4b,0x1f,0x11,0xd5] +// CHECK: msr trcsspcicr0, x2 // encoding: [0x62,0x10,0x11,0xd5] +// CHECK: msr trcsspcicr1, x3 // encoding: [0x63,0x11,0x11,0xd5] +// CHECK: msr trcsspcicr2, x5 // encoding: [0x65,0x12,0x11,0xd5] +// CHECK: msr trcsspcicr3, x7 // encoding: [0x67,0x13,0x11,0xd5] +// CHECK: msr trcsspcicr4, x11 // encoding: [0x6b,0x14,0x11,0xd5] +// CHECK: msr trcsspcicr5, x13 // encoding: [0x6d,0x15,0x11,0xd5] +// CHECK: msr trcsspcicr6, x17 // encoding: [0x71,0x16,0x11,0xd5] +// CHECK: msr trcsspcicr7, x23 // encoding: [0x77,0x17,0x11,0xd5] +// CHECK: msr trcpdcr, x3 // encoding: [0x83,0x14,0x11,0xd5] +// CHECK: msr trcacvr0, x6 // encoding: [0x06,0x20,0x11,0xd5] +// CHECK: msr trcacvr1, x20 // encoding: [0x14,0x22,0x11,0xd5] +// CHECK: msr trcacvr2, x25 // encoding: [0x19,0x24,0x11,0xd5] +// CHECK: msr trcacvr3, x1 // encoding: [0x01,0x26,0x11,0xd5] +// CHECK: msr trcacvr4, x28 // encoding: [0x1c,0x28,0x11,0xd5] +// CHECK: msr trcacvr5, x15 // encoding: [0x0f,0x2a,0x11,0xd5] +// CHECK: msr trcacvr6, x25 // encoding: [0x19,0x2c,0x11,0xd5] +// CHECK: msr trcacvr7, x12 // encoding: [0x0c,0x2e,0x11,0xd5] +// CHECK: msr trcacvr8, x5 // encoding: [0x25,0x20,0x11,0xd5] +// CHECK: msr trcacvr9, x25 // encoding: [0x39,0x22,0x11,0xd5] +// CHECK: msr trcacvr10, x13 // encoding: [0x2d,0x24,0x11,0xd5] +// CHECK: msr trcacvr11, x10 // encoding: [0x2a,0x26,0x11,0xd5] +// CHECK: msr trcacvr12, x19 // encoding: [0x33,0x28,0x11,0xd5] +// CHECK: msr trcacvr13, x10 // encoding: [0x2a,0x2a,0x11,0xd5] +// CHECK: msr trcacvr14, x19 // encoding: [0x33,0x2c,0x11,0xd5] +// CHECK: msr trcacvr15, x2 // encoding: [0x22,0x2e,0x11,0xd5] +// CHECK: msr trcacatr0, x15 // encoding: [0x4f,0x20,0x11,0xd5] +// CHECK: msr trcacatr1, x13 // encoding: [0x4d,0x22,0x11,0xd5] +// CHECK: msr trcacatr2, x8 // encoding: [0x48,0x24,0x11,0xd5] +// CHECK: msr trcacatr3, x1 // encoding: [0x41,0x26,0x11,0xd5] +// CHECK: msr trcacatr4, x11 // encoding: [0x4b,0x28,0x11,0xd5] +// CHECK: msr trcacatr5, x8 // encoding: [0x48,0x2a,0x11,0xd5] +// CHECK: msr trcacatr6, x24 // encoding: [0x58,0x2c,0x11,0xd5] +// CHECK: msr trcacatr7, x6 // encoding: [0x46,0x2e,0x11,0xd5] +// CHECK: msr trcacatr8, x23 // encoding: [0x77,0x20,0x11,0xd5] +// CHECK: msr trcacatr9, x5 // encoding: [0x65,0x22,0x11,0xd5] +// CHECK: msr trcacatr10, x11 // encoding: [0x6b,0x24,0x11,0xd5] +// CHECK: msr trcacatr11, x11 // encoding: [0x6b,0x26,0x11,0xd5] +// CHECK: msr trcacatr12, x3 // encoding: [0x63,0x28,0x11,0xd5] +// CHECK: msr trcacatr13, x28 // encoding: [0x7c,0x2a,0x11,0xd5] +// CHECK: msr trcacatr14, x25 // encoding: [0x79,0x2c,0x11,0xd5] +// CHECK: msr trcacatr15, x4 // encoding: [0x64,0x2e,0x11,0xd5] +// CHECK: msr trcdvcvr0, x6 // encoding: [0x86,0x20,0x11,0xd5] +// CHECK: msr trcdvcvr1, x3 // encoding: [0x83,0x24,0x11,0xd5] +// CHECK: msr trcdvcvr2, x5 // encoding: [0x85,0x28,0x11,0xd5] +// CHECK: msr trcdvcvr3, x11 // encoding: [0x8b,0x2c,0x11,0xd5] +// CHECK: msr trcdvcvr4, x9 // encoding: [0xa9,0x20,0x11,0xd5] +// CHECK: msr trcdvcvr5, x14 // encoding: [0xae,0x24,0x11,0xd5] +// CHECK: msr trcdvcvr6, x10 // encoding: [0xaa,0x28,0x11,0xd5] +// CHECK: msr trcdvcvr7, x12 // encoding: [0xac,0x2c,0x11,0xd5] +// CHECK: msr trcdvcmr0, x8 // encoding: [0xc8,0x20,0x11,0xd5] +// CHECK: msr trcdvcmr1, x8 // encoding: [0xc8,0x24,0x11,0xd5] +// CHECK: msr trcdvcmr2, x22 // encoding: [0xd6,0x28,0x11,0xd5] +// CHECK: msr trcdvcmr3, x22 // encoding: [0xd6,0x2c,0x11,0xd5] +// CHECK: msr trcdvcmr4, x5 // encoding: [0xe5,0x20,0x11,0xd5] +// CHECK: msr trcdvcmr5, x16 // encoding: [0xf0,0x24,0x11,0xd5] +// CHECK: msr trcdvcmr6, x27 // encoding: [0xfb,0x28,0x11,0xd5] +// CHECK: msr trcdvcmr7, x21 // encoding: [0xf5,0x2c,0x11,0xd5] +// CHECK: msr trccidcvr0, x8 // encoding: [0x08,0x30,0x11,0xd5] +// CHECK: msr trccidcvr1, x6 // encoding: [0x06,0x32,0x11,0xd5] +// CHECK: msr trccidcvr2, x9 // encoding: [0x09,0x34,0x11,0xd5] +// CHECK: msr trccidcvr3, x8 // encoding: [0x08,0x36,0x11,0xd5] +// CHECK: msr trccidcvr4, x3 // encoding: [0x03,0x38,0x11,0xd5] +// CHECK: msr trccidcvr5, x21 // encoding: [0x15,0x3a,0x11,0xd5] +// CHECK: msr trccidcvr6, x12 // encoding: [0x0c,0x3c,0x11,0xd5] +// CHECK: msr trccidcvr7, x7 // encoding: [0x07,0x3e,0x11,0xd5] +// CHECK: msr trcvmidcvr0, x4 // encoding: [0x24,0x30,0x11,0xd5] +// CHECK: msr trcvmidcvr1, x3 // encoding: [0x23,0x32,0x11,0xd5] +// CHECK: msr trcvmidcvr2, x9 // encoding: [0x29,0x34,0x11,0xd5] +// CHECK: msr trcvmidcvr3, x17 // encoding: [0x31,0x36,0x11,0xd5] +// CHECK: msr trcvmidcvr4, x14 // encoding: [0x2e,0x38,0x11,0xd5] +// CHECK: msr trcvmidcvr5, x12 // encoding: [0x2c,0x3a,0x11,0xd5] +// CHECK: msr trcvmidcvr6, x10 // encoding: [0x2a,0x3c,0x11,0xd5] +// CHECK: msr trcvmidcvr7, x3 // encoding: [0x23,0x3e,0x11,0xd5] +// CHECK: msr trccidcctlr0, x14 // encoding: [0x4e,0x30,0x11,0xd5] +// CHECK: msr trccidcctlr1, x22 // encoding: [0x56,0x31,0x11,0xd5] +// CHECK: msr trcvmidcctlr0, x8 // encoding: [0x48,0x32,0x11,0xd5] +// CHECK: msr trcvmidcctlr1, x15 // encoding: [0x4f,0x33,0x11,0xd5] +// CHECK: msr trcitctrl, x1 // encoding: [0x81,0x70,0x11,0xd5] +// CHECK: msr trcclaimset, x7 // encoding: [0xc7,0x78,0x11,0xd5] +// CHECK: msr trcclaimclr, x29 // encoding: [0xdd,0x79,0x11,0xd5] diff --git a/test/MC/ARM/2013-03-18-Br-to-label-named-like-reg.s b/test/MC/ARM/2013-03-18-Br-to-label-named-like-reg.s new file mode 100644 index 000000000000..172abcf6f813 --- /dev/null +++ b/test/MC/ARM/2013-03-18-Br-to-label-named-like-reg.s @@ -0,0 +1,5 @@ +@ RUN: llvm-mc -arch arm %s +@ CHECK: test: +@ CHECK: br r1 +test: + bl r1 diff --git a/test/MC/ARM/AlignedBundling/group-bundle-arm.s b/test/MC/ARM/AlignedBundling/group-bundle-arm.s new file mode 100644 index 000000000000..1d6735320007 --- /dev/null +++ b/test/MC/ARM/AlignedBundling/group-bundle-arm.s @@ -0,0 +1,48 @@ +# RUN: llvm-mc -filetype=obj -triple armv7-linux-gnueabi %s -o - \ +# RUN: | llvm-objdump -no-show-raw-insn -triple armv7 -disassemble - | FileCheck %s + +# On ARM each instruction is 4 bytes long so padding for individual +# instructions should not be inserted. However, for bundle-locked groups +# it can be. + + .syntax unified + .text + .bundle_align_mode 4 + + bx lr + and r1, r1, r2 + and r1, r1, r2 + .bundle_lock + bx r9 + bx r8 + .bundle_unlock +# CHECK: c: nop +# CHECK-NEXT: 10: bx +# CHECK-NEXT: 14: bx + + # pow2 here + .align 4 + bx lr + .bundle_lock + bx r9 + bx r9 + bx r9 + bx r8 + .bundle_unlock +# CHECK: 20: bx +# CHECK-NEXT: 24: nop +# CHECK-NEXT: 28: nop +# CHECK-NEXT: 2c: nop +# CHECK-NEXT: 30: bx + + .align 4 +foo: + b foo + .long 3892240112 + .long 3892240112 + .long 3892240112 + .long 3892240112 + .long 3892240112 + .long 3892240112 +# CHECK: 40: b + diff --git a/test/MC/ARM/AlignedBundling/lit.local.cfg b/test/MC/ARM/AlignedBundling/lit.local.cfg new file mode 100644 index 000000000000..6c49f08b7496 --- /dev/null +++ b/test/MC/ARM/AlignedBundling/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.s'] + +targets = set(config.root.targets_to_build.split()) +if not 'X86' in targets: + config.unsupported = True + diff --git a/test/MC/ARM/AlignedBundling/pad-align-to-bundle-end.s b/test/MC/ARM/AlignedBundling/pad-align-to-bundle-end.s new file mode 100644 index 000000000000..341358b9db17 --- /dev/null +++ b/test/MC/ARM/AlignedBundling/pad-align-to-bundle-end.s @@ -0,0 +1,41 @@ +# RUN: llvm-mc -filetype=obj -triple armv7-linux-gnueabi %s -o - \ +# RUN: | llvm-objdump -no-show-raw-insn -triple armv7 -disassemble - | FileCheck %s + + .syntax unified + .text + .bundle_align_mode 4 + + bx lr + and r1, r1, r2 + and r1, r1, r2 + .bundle_lock align_to_end + bx r9 + .bundle_unlock +# No padding required here because bx just happens to be in the +# right offset. +# CHECK: 8: and +# CHECK-NEXT: c: bx + + bx lr + and r1, r1, r2 + .bundle_lock align_to_end + bx r9 + .bundle_unlock +# A 4-byte padding is needed here +# CHECK: 18: nop +# CHECK-NEXT: 1c: bx + + bx lr + and r1, r1, r2 + .bundle_lock align_to_end + bx r9 + bx r9 + bx r9 + .bundle_unlock +# A 12-byte padding is needed here to push the group to the end of the next +# bundle +# CHECK: 28: nop +# CHECK-NEXT: 2c: nop +# CHECK-NEXT: 30: nop +# CHECK-NEXT: 34: bx + diff --git a/test/MC/ARM/arm_instructions.s b/test/MC/ARM/arm_instructions.s index ce7e036b3be4..a4b6bda880c5 100644 --- a/test/MC/ARM/arm_instructions.s +++ b/test/MC/ARM/arm_instructions.s @@ -1,7 +1,14 @@ -@ RUN: llvm-mc -mcpu=cortex-a8 -triple arm-unknown-unknown -show-encoding %s | FileCheck %s - -@ CHECK: trap -@ CHECK: encoding: [0xfe,0xde,0xff,0xe7] +@ RUN: llvm-mc -mcpu=cortex-a8 -triple arm-unknown-unknown -show-encoding %s \ +@ RUN: | FileCheck %s -check-prefix=ALL +@ RUN: llvm-mc -mcpu=cortex-a9-mp -triple armv7-unknown-nacl -show-encoding %s \ +@ RUN: | FileCheck %s -check-prefix=NACL +@ RUN: llvm-mc -mcpu=cortex-a8 -mattr=+nacl-trap -triple armv7 -show-encoding %s \ +@ RUN: | FileCheck %s -check-prefix=NACL + +@ ALL: trap +@ ALL: encoding: [0xfe,0xde,0xff,0xe7] +@ NACL: trap +@ NACL: encoding: [0xf0,0xde,0xfe,0xe7] trap @ CHECK: bx lr diff --git a/test/MC/ARM/basic-arm-instructions.s b/test/MC/ARM/basic-arm-instructions.s index 5c2a214598d1..560a0d633cbe 100644 --- a/test/MC/ARM/basic-arm-instructions.s +++ b/test/MC/ARM/basic-arm-instructions.s @@ -143,11 +143,15 @@ Lforward: adr r1, #-0x0 adr r1, #-0x12000000 + adr r1, #-0x80000001 adr r1, #0x12000000 + adr r1, #0x80000001 @ CHECK: adr r1, #-0 @ encoding: [0x00,0x10,0x4f,0xe2] @ CHECK: adr r1, #-301989888 @ encoding: [0x12,0x14,0x4f,0xe2] +@ CHECK: adr r1, #2147483647 @ encoding: [0x06,0x11,0x4f,0xe2] @ CHECK: adr r1, #301989888 @ encoding: [0x12,0x14,0x8f,0xe2] +@ CHECK: adr r1, #-2147483647 @ encoding: [0x06,0x11,0x8f,0xe2] @------------------------------------------------------------------------------ @@ -2087,6 +2091,49 @@ Lforward: @ CHECK: srsia sp, #5 @ encoding: [0x05,0x05,0xcd,0xf8] @ CHECK: srsia sp!, #5 @ encoding: [0x05,0x05,0xed,0xf8] +@ Compatibility aliases. + srsda #5 + srsdb #1 + srsia #0 + srsib #15 + + srsda #31! + srsdb #19! + srsia #2! + srsib #14! + + srsfa #11 + srsea #10 + srsfd #9 + srsed #5 + + srsfa #5! + srsea #5! + srsfd #5! + srsed #5! + + srs #5 + srs #5! + +@ CHECK: srsda sp, #5 @ encoding: [0x05,0x05,0x4d,0xf8] +@ CHECK: srsdb sp, #1 @ encoding: [0x01,0x05,0x4d,0xf9] +@ CHECK: srsia sp, #0 @ encoding: [0x00,0x05,0xcd,0xf8] +@ CHECK: srsib sp, #15 @ encoding: [0x0f,0x05,0xcd,0xf9] +@ CHECK: srsda sp!, #31 @ encoding: [0x1f,0x05,0x6d,0xf8] +@ CHECK: srsdb sp!, #19 @ encoding: [0x13,0x05,0x6d,0xf9] +@ CHECK: srsia sp!, #2 @ encoding: [0x02,0x05,0xed,0xf8] +@ CHECK: srsib sp!, #14 @ encoding: [0x0e,0x05,0xed,0xf9] +@ CHECK: srsda sp, #11 @ encoding: [0x0b,0x05,0x4d,0xf8] +@ CHECK: srsdb sp, #10 @ encoding: [0x0a,0x05,0x4d,0xf9] +@ CHECK: srsia sp, #9 @ encoding: [0x09,0x05,0xcd,0xf8] +@ CHECK: srsib sp, #5 @ encoding: [0x05,0x05,0xcd,0xf9] +@ CHECK: srsda sp!, #5 @ encoding: [0x05,0x05,0x6d,0xf8] +@ CHECK: srsdb sp!, #5 @ encoding: [0x05,0x05,0x6d,0xf9] +@ CHECK: srsia sp!, #5 @ encoding: [0x05,0x05,0xed,0xf8] +@ CHECK: srsib sp!, #5 @ encoding: [0x05,0x05,0xed,0xf9] +@ CHECK: srsia sp, #5 @ encoding: [0x05,0x05,0xcd,0xf8] +@ CHECK: srsia sp!, #5 @ encoding: [0x05,0x05,0xed,0xf8] + @------------------------------------------------------------------------------ @ SSAT diff --git a/test/MC/ARM/basic-thumb2-instructions.s b/test/MC/ARM/basic-thumb2-instructions.s index 23d9f5977a29..9278a2a94b56 100644 --- a/test/MC/ARM/basic-thumb2-instructions.s +++ b/test/MC/ARM/basic-thumb2-instructions.s @@ -2352,6 +2352,32 @@ _func: @ CHECK: srsia sp, #5 @ encoding: [0x8d,0xe9,0x05,0xc0] @ CHECK: srsia sp!, #5 @ encoding: [0xad,0xe9,0x05,0xc0] + srsdb #1 + srsia #0 + + srsdb #19! + srsia #2! + + srsea #10 + srsfd #9 + + srsea #5! + srsfd #5! + + srs #5 + srs #5! + +@ CHECK: srsdb sp, #1 @ encoding: [0x0d,0xe8,0x01,0xc0] +@ CHECK: srsia sp, #0 @ encoding: [0x8d,0xe9,0x00,0xc0] +@ CHECK: srsdb sp!, #19 @ encoding: [0x2d,0xe8,0x13,0xc0] +@ CHECK: srsia sp!, #2 @ encoding: [0xad,0xe9,0x02,0xc0] +@ CHECK: srsdb sp, #10 @ encoding: [0x0d,0xe8,0x0a,0xc0] +@ CHECK: srsia sp, #9 @ encoding: [0x8d,0xe9,0x09,0xc0] +@ CHECK: srsdb sp!, #5 @ encoding: [0x2d,0xe8,0x05,0xc0] +@ CHECK: srsia sp!, #5 @ encoding: [0xad,0xe9,0x05,0xc0] +@ CHECK: srsia sp, #5 @ encoding: [0x8d,0xe9,0x05,0xc0] +@ CHECK: srsia sp!, #5 @ encoding: [0xad,0xe9,0x05,0xc0] + @------------------------------------------------------------------------------ @ SSAT @@ -3509,3 +3535,7 @@ _func: @ CHECK: ldrh.w r11, [pc, #-22] @ encoding: [0x3f,0xf8,0x16,0xb0] @ CHECK: ldrsb.w r11, [pc, #-22] @ encoding: [0x1f,0xf9,0x16,0xb0] @ CHECK: ldrsh.w r11, [pc, #-22] @ encoding: [0x3f,0xf9,0x16,0xb0] + +@ rdar://12596361 + ldr r1, [pc, #12] +@ CHECK: ldr.n r1, [pc, #12] @ encoding: [0x03,0x49] diff --git a/test/MC/ARM/data-in-code.ll b/test/MC/ARM/data-in-code.ll new file mode 100644 index 000000000000..c2feec5303c3 --- /dev/null +++ b/test/MC/ARM/data-in-code.ll @@ -0,0 +1,176 @@ +;; RUN: llc -O0 -mtriple=armv7-linux-gnueabi -filetype=obj %s -o - | \ +;; RUN: elf-dump | FileCheck -check-prefix=ARM %s + +;; RUN: llc -O0 -mtriple=thumbv7-linux-gnueabi -filetype=obj %s -o - | \ +;; RUN: elf-dump --dump-section-data | FileCheck -check-prefix=TMB %s + +;; Ensure that if a jump table is generated that it has Mapping Symbols +;; marking the data-in-code region. + +define void @foo(i32* %ptr) nounwind ssp { + %tmp = load i32* %ptr, align 4 + switch i32 %tmp, label %default [ + i32 11, label %bb0 + i32 10, label %bb1 + i32 8, label %bb2 + i32 4, label %bb3 + i32 2, label %bb4 + i32 6, label %bb5 + i32 9, label %bb6 + i32 15, label %bb7 + i32 1, label %bb8 + i32 3, label %bb9 + i32 5, label %bb10 + i32 30, label %bb11 + i32 31, label %bb12 + i32 13, label %bb13 + i32 14, label %bb14 + i32 20, label %bb15 + i32 19, label %bb16 + i32 17, label %bb17 + i32 18, label %bb18 + i32 21, label %bb19 + i32 22, label %bb20 + i32 16, label %bb21 + i32 24, label %bb22 + i32 25, label %bb23 + i32 26, label %bb24 + i32 27, label %bb25 + i32 28, label %bb26 + i32 23, label %bb27 + i32 12, label %bb28 + ] + +default: + br label %exit +bb0: + br label %exit +bb1: + br label %exit +bb2: + br label %exit +bb3: + br label %exit +bb4: + br label %exit +bb5: + br label %exit +bb6: + br label %exit +bb7: + br label %exit +bb8: + br label %exit +bb9: + br label %exit +bb10: + br label %exit +bb11: + br label %exit +bb12: + br label %exit +bb13: + br label %exit +bb14: + br label %exit +bb15: + br label %exit +bb16: + br label %exit +bb17: + br label %exit +bb18: + br label %exit +bb19: + br label %exit +bb20: + br label %exit +bb21: + br label %exit +bb22: + br label %exit +bb23: + br label %exit +bb24: + br label %exit +bb25: + br label %exit +bb26: + br label %exit +bb27: + br label %exit +bb28: + br label %exit + + +exit: + + ret void +} + +;; ARM: # Symbol 2 +;; ARM-NEXT: $a +;; ARM-NEXT: 'st_value', 0x00000000 +;; ARM-NEXT: 'st_size', 0x00000000 +;; ARM-NEXT: 'st_bind', 0x0 +;; ARM-NEXT: 'st_type', 0x0 +;; ARM-NEXT: 'st_other' +;; ARM-NEXT: 'st_shndx', [[MIXED_SECT:0x[0-9a-f]+]] + +;; ARM: # Symbol 3 +;; ARM-NEXT: $a +;; ARM-NEXT: 'st_value', 0x000000ac +;; ARM-NEXT: 'st_size', 0x00000000 +;; ARM-NEXT: 'st_bind', 0x0 +;; ARM-NEXT: 'st_type', 0x0 +;; ARM-NEXT: 'st_other' +;; ARM-NEXT: 'st_shndx', [[MIXED_SECT]] + +;; ARM: # Symbol 4 +;; ARM-NEXT: $d +;; ARM-NEXT: 'st_value', 0x00000000 +;; ARM-NEXT: 'st_size', 0x00000000 +;; ARM-NEXT: 'st_bind', 0x0 +;; ARM-NEXT: 'st_type', 0x0 + +;; ARM: # Symbol 5 +;; ARM-NEXT: $d +;; ARM-NEXT: 'st_value', 0x00000030 +;; ARM-NEXT: 'st_size', 0x00000000 +;; ARM-NEXT: 'st_bind', 0x0 +;; ARM-NEXT: 'st_type', 0x0 +;; ARM-NEXT: 'st_other' +;; ARM-NEXT: 'st_shndx', [[MIXED_SECT]] + +;; ARM-NOT: ${{[atd]}} + +;; TMB: # Symbol 3 +;; TMB-NEXT: $d +;; TMB-NEXT: 'st_value', 0x00000016 +;; TMB-NEXT: 'st_size', 0x00000000 +;; TMB-NEXT: 'st_bind', 0x0 +;; TMB-NEXT: 'st_type', 0x0 +;; TMB-NEXT: 'st_other' +;; TMB-NEXT: 'st_shndx', [[MIXED_SECT:0x[0-9a-f]+]] + +;; TMB: # Symbol 4 +;; TMB-NEXT: $t +;; TMB-NEXT: 'st_value', 0x00000000 +;; TMB-NEXT: 'st_size', 0x00000000 +;; TMB-NEXT: 'st_bind', 0x0 +;; TMB-NEXT: 'st_type', 0x0 +;; TMB-NEXT: 'st_other' +;; TMB-NEXT: 'st_shndx', [[MIXED_SECT]] + +;; TMB: # Symbol 5 +;; TMB-NEXT: $t +;; TMB-NEXT: 'st_value', 0x00000036 +;; TMB-NEXT: 'st_size', 0x00000000 +;; TMB-NEXT: 'st_bind', 0x0 +;; TMB-NEXT: 'st_type', 0x0 +;; TMB-NEXT: 'st_other' +;; TMB-NEXT: 'st_shndx', [[MIXED_SECT]] + + +;; TMB-NOT: ${{[atd]}} + diff --git a/test/MC/ARM/elf-eflags-eabi-cg.ll b/test/MC/ARM/elf-eflags-eabi-cg.ll new file mode 100644 index 000000000000..2e86a0f36077 --- /dev/null +++ b/test/MC/ARM/elf-eflags-eabi-cg.ll @@ -0,0 +1,13 @@ +; Codegen version to check for ELF header flags. +; +; RUN: llc %s -mtriple=thumbv7-linux-gnueabi -relocation-model=pic \ +; RUN: -filetype=obj -o - | elf-dump --dump-section-data | \ +; RUN: FileCheck %s + +define void @bar() nounwind { +entry: + ret void +} + +; For now the only e_flag set is EF_ARM_EABI_VER5 +;CHECK: 'e_flags', 0x05000000 diff --git a/test/MC/ARM/elf-reloc-01.ll b/test/MC/ARM/elf-reloc-01.ll index c98026b6a043..3ebd7c641b6d 100644 --- a/test/MC/ARM/elf-reloc-01.ll +++ b/test/MC/ARM/elf-reloc-01.ll @@ -62,9 +62,9 @@ declare void @exit(i32) noreturn nounwind ;; OBJ: Relocation 1 ;; OBJ-NEXT: 'r_offset', -;; OBJ-NEXT: 'r_sym', 0x000002 +;; OBJ-NEXT: 'r_sym', 0x000007 ;; OBJ-NEXT: 'r_type', 0x2b -;; OBJ: Symbol 2 +;; OBJ: Symbol 7 ;; OBJ-NEXT: '_MergedGlobals' ;; OBJ-NEXT: 'st_value', 0x00000010 diff --git a/test/MC/ARM/elf-reloc-02.ll b/test/MC/ARM/elf-reloc-02.ll index e51bac30ca8a..6b6b03c388a4 100644 --- a/test/MC/ARM/elf-reloc-02.ll +++ b/test/MC/ARM/elf-reloc-02.ll @@ -42,9 +42,9 @@ declare i32 @write(...) declare void @exit(i32) noreturn nounwind ;; OBJ: Relocation 0 -;; OBJ-NEXT: 'r_offset', -;; OBJ-NEXT: 'r_sym', 0x000002 +;; OBJ-NEXT: 'r_offset', +;; OBJ-NEXT: 'r_sym', 0x000005 ;; OBJ-NEXT: 'r_type', 0x2b -;; OBJ: Symbol 2 +;; OBJ: Symbol 5 ;; OBJ-NEXT: '.L.str' diff --git a/test/MC/ARM/elf-reloc-03.ll b/test/MC/ARM/elf-reloc-03.ll index 922242f9d3d6..87f91c11210b 100644 --- a/test/MC/ARM/elf-reloc-03.ll +++ b/test/MC/ARM/elf-reloc-03.ll @@ -89,9 +89,9 @@ entry: declare void @exit(i32) noreturn nounwind ;; OBJ: Relocation 1 -;; OBJ-NEXT: 'r_offset', -;; OBJ-NEXT: 'r_sym', 0x00000c +;; OBJ-NEXT: 'r_offset', +;; OBJ-NEXT: 'r_sym', 0x000010 ;; OBJ-NEXT: 'r_type', 0x2b -;; OBJ: Symbol 12 +;; OBJ: Symbol 16 ;; OBJ-NEXT: 'vtable' diff --git a/test/MC/ARM/elf-reloc-condcall.s b/test/MC/ARM/elf-reloc-condcall.s index 08b4ecc9c745..3fafb43eb060 100644 --- a/test/MC/ARM/elf-reloc-condcall.s +++ b/test/MC/ARM/elf-reloc-condcall.s @@ -9,25 +9,25 @@ // OBJ: .rel.text // OBJ: 'r_offset', 0x00000000 -// OBJ-NEXT: 'r_sym', 0x000004 +// OBJ-NEXT: 'r_sym', 0x000005 // OBJ-NEXT: 'r_type', 0x1d // OBJ: 'r_offset', 0x00000004 -// OBJ-NEXT: 'r_sym', 0x000004 +// OBJ-NEXT: 'r_sym', 0x000005 // OBJ-NEXT: 'r_type', 0x1c // OBJ: 'r_offset', 0x00000008 -// OBJ-NEXT: 'r_sym', 0x000004 +// OBJ-NEXT: 'r_sym', 0x000005 // OBJ-NEXT: 'r_type', 0x1c // OBJ: 'r_offset', 0x0000000c -// OBJ-NEXT: 'r_sym', 0x000004 +// OBJ-NEXT: 'r_sym', 0x000005 // OBJ-NEXT: 'r_type', 0x1d // OBJ: 'r_offset', 0x00000010 -// OBJ-NEXT: 'r_sym', 0x000004 +// OBJ-NEXT: 'r_sym', 0x000005 // OBJ-NEXT: 'r_type', 0x1d // OBJ: .symtab -// OBJ: Symbol 4 +// OBJ: Symbol 5 // OBJ-NEXT: some_label diff --git a/test/MC/ARM/elf-thumbfunc-reloc.ll b/test/MC/ARM/elf-thumbfunc-reloc.ll index ecac11daa3cf..b2f253d2fa95 100644 --- a/test/MC/ARM/elf-thumbfunc-reloc.ll +++ b/test/MC/ARM/elf-thumbfunc-reloc.ll @@ -28,10 +28,10 @@ entry: ; 00000008 0000070a R_ARM_THM_CALL 00000001 foo ; CHECK: Relocation 0 ; CHECK-NEXT: 'r_offset', 0x00000008 -; CHECK-NEXT: 'r_sym', 0x000007 +; CHECK-NEXT: 'r_sym', 0x000009 ; CHECK-NEXT: 'r_type', 0x0a ; make sure foo is thumb function: bit 0 = 1 -; CHECK: Symbol 7 +; CHECK: Symbol 9 ; CHECK-NEXT: 'foo' ; CHECK-NEXT: 'st_value', 0x00000001 diff --git a/test/MC/ARM/elf-thumbfunc.s b/test/MC/ARM/elf-thumbfunc.s index 0aa7f41cc4be..91b2eee7592b 100644 --- a/test/MC/ARM/elf-thumbfunc.s +++ b/test/MC/ARM/elf-thumbfunc.s @@ -12,7 +12,7 @@ foo: bx lr @@ make sure foo is thumb function: bit 0 = 1 (st_value) -@CHECK: Symbol 4 +@CHECK: Symbol 5 @CHECK-NEXT: 'st_name', 0x00000001 @CHECK-NEXT: 'st_value', 0x00000001 @CHECK-NEXT: 'st_size', 0x00000000 diff --git a/test/MC/ARM/mapping-within-section.s b/test/MC/ARM/mapping-within-section.s new file mode 100644 index 000000000000..56dd6ef07e73 --- /dev/null +++ b/test/MC/ARM/mapping-within-section.s @@ -0,0 +1,33 @@ +@ RUN: llvm-mc -triple=arm-linux-gnueabi -filetype=obj < %s | llvm-objdump -t - | FileCheck %s + + .text +@ $a at 0x0000 + add r0, r0, r0 +@ $d at 0x0004 + .word 42 + .thumb +@ $t at 0x0008 + adds r0, r0, r0 + adds r0, r0, r0 +@ $a at 0x000c + .arm + add r0, r0, r0 +@ $t at 0x0010 + .thumb + adds r0, r0, r0 +@ $d at 0x0012 + .ascii "012" + .byte 1 + .byte 2 + .byte 3 +@ $a at 0x0018 + .arm + add r0, r0, r0 + +@ CHECK: 00000000 .text 00000000 $a +@ CHECK-NEXT: 0000000c .text 00000000 $a +@ CHECK-NEXT: 00000018 .text 00000000 $a +@ CHECK-NEXT: 00000004 .text 00000000 $d +@ CHECK-NEXT: 00000012 .text 00000000 $d +@ CHECK-NEXT: 00000008 .text 00000000 $t +@ CHECK-NEXT: 00000010 .text 00000000 $t diff --git a/test/MC/ARM/multi-section-mapping.s b/test/MC/ARM/multi-section-mapping.s new file mode 100644 index 000000000000..f7c4e89a85ea --- /dev/null +++ b/test/MC/ARM/multi-section-mapping.s @@ -0,0 +1,35 @@ +@ RUN: llvm-mc -triple=arm-linux-gnueabi -filetype=obj < %s | llvm-objdump -t - | FileCheck %s + + .text + add r0, r0, r0 + +@ .wibble should *not* inherit .text's mapping symbol. It's a completely different section. + .section .wibble + add r0, r0, r0 + +@ A section should be able to start with a $t + .section .starts_thumb + .thumb + adds r0, r0, r0 + +@ A setion should be able to start with a $d + .section .starts_data + .word 42 + +@ Changing back to .text should not emit a redundant $a + .text + .arm + add r0, r0, r0 + +@ With all those constraints, we want: +@ + .text to have $a at 0 and no others +@ + .wibble to have $a at 0 +@ + .starts_thumb to have $t at 0 +@ + .starts_data to have $d at 0 + +@ CHECK: 00000000 .text 00000000 $a +@ CHECK-NEXT: 00000000 .wibble 00000000 $a +@ CHECK-NEXT: 00000000 .starts_data 00000000 $d +@ CHECK-NEXT: 00000000 .starts_thumb 00000000 $t +@ CHECK-NOT: ${{[adt]}} + diff --git a/test/MC/ARM/neon-bitwise-encoding.s b/test/MC/ARM/neon-bitwise-encoding.s index e8c1dd634867..8c7228835c9b 100644 --- a/test/MC/ARM/neon-bitwise-encoding.s +++ b/test/MC/ARM/neon-bitwise-encoding.s @@ -1,4 +1,5 @@ -@ RUN: llvm-mc -mcpu=cortex-a8 -triple arm-unknown-unknown -show-encoding < %s | FileCheck %s +@ RUN: llvm-mc -mcpu=cortex-a8 -triple arm-unknown-unknown -show-encoding < %s \ +@ RUN: | FileCheck %s vand d16, d17, d16 vand q8, q8, q9 @@ -255,6 +256,42 @@ veor.f q8, q2 veor.i64 q8, q2 + vclt.s16 q5, #0 + vclt.s16 d5, #0 + + vceq.s16 q5, q3 + vceq.s16 d5, d3 + + vcgt.s16 q5, q3 + vcgt.s16 d5, d3 + + vcge.s16 q5, q3 + vcge.s16 d5, d3 + + vcgt.s16 q5, #0 + vcgt.s16 d5, #0 + + vcge.s16 q5, #0 + vcge.s16 d5, #0 + + vceq.s16 q5, #0 + vceq.s16 d5, #0 + + vcle.s16 q5, #0 + vcle.s16 d5, #0 + + vacge.f32 d5, d30 + vacge.f32 q5, q3 + + vacgt.f32 d5, d30 + vacgt.f32 q5, q3 + +@ FIXME: We don't have an alias that reverses the operands +@ vacle.f32 d5, d30 +@ vacle.f32 q5, q3 +@ vaclt.f32 d5, d30 +@ vaclt.f32 q5, q3 + @ CHECK: vand q6, q6, q5 @ encoding: [0x5a,0xc1,0x0c,0xf2] @ CHECK: vand q6, q6, q5 @ encoding: [0x5a,0xc1,0x0c,0xf2] @ CHECK: vand q7, q7, q1 @ encoding: [0x52,0xe1,0x0e,0xf2] @@ -272,3 +309,32 @@ @ CHECK: veor q7, q7, q1 @ encoding: [0x52,0xe1,0x0e,0xf3] @ CHECK: veor q8, q8, q2 @ encoding: [0xd4,0x01,0x40,0xf3] @ CHECK: veor q8, q8, q2 @ encoding: [0xd4,0x01,0x40,0xf3] +@ CHECK: vclt.s16 q5, q5, #0 @ encoding: [0x4a,0xa2,0xb5,0xf3] +@ CHECK: vclt.s16 d5, d5, #0 @ encoding: [0x05,0x52,0xb5,0xf3] + +@ CHECK: vceq.i16 q5, q5, q3 @ encoding: [0x56,0xa8,0x1a,0xf3] +@ CHECK: vceq.i16 d5, d5, d3 @ encoding: [0x13,0x58,0x15,0xf3] + +@ CHECK: vcgt.s16 q5, q5, q3 @ encoding: [0x46,0xa3,0x1a,0xf2] +@ CHECK: vcgt.s16 d5, d5, d3 @ encoding: [0x03,0x53,0x15,0xf2] + +@ CHECK: vcge.s16 q5, q5, q3 @ encoding: [0x56,0xa3,0x1a,0xf2] +@ CHECK: vcge.s16 d5, d5, d3 @ encoding: [0x13,0x53,0x15,0xf2] + +@ CHECK: vcgt.s16 q5, q5, #0 @ encoding: [0x4a,0xa0,0xb5,0xf3] +@ CHECK: vcgt.s16 d5, d5, #0 @ encoding: [0x05,0x50,0xb5,0xf3] + +@ CHECK: vcge.s16 q5, q5, #0 @ encoding: [0xca,0xa0,0xb5,0xf3] +@ CHECK: vcge.s16 d5, d5, #0 @ encoding: [0x85,0x50,0xb5,0xf3] + +@ CHECK: vceq.i16 q5, q5, #0 @ encoding: [0x4a,0xa1,0xb5,0xf3] +@ CHECK: vceq.i16 d5, d5, #0 @ encoding: [0x05,0x51,0xb5,0xf3] + +@ CHECK: vcle.s16 q5, q5, #0 @ encoding: [0xca,0xa1,0xb5,0xf3] +@ CHECK: vcle.s16 d5, d5, #0 @ encoding: [0x85,0x51,0xb5,0xf3] + +@ CHECK: vacge.f32 d5, d5, d30 @ encoding: [0x3e,0x5e,0x05,0xf3] +@ CHECK: vacge.f32 q5, q5, q3 @ encoding: [0x56,0xae,0x0a,0xf3] + +@ CHECK: vacgt.f32 d5, d5, d30 @ encoding: [0x3e,0x5e,0x25,0xf3] +@ CHECK: vacgt.f32 q5, q5, q3 @ encoding: [0x56,0xae,0x2a,0xf3] diff --git a/test/MC/ARM/neon-vld-encoding.s b/test/MC/ARM/neon-vld-encoding.s index 3cc6bf11cf5e..648e91705782 100644 --- a/test/MC/ARM/neon-vld-encoding.s +++ b/test/MC/ARM/neon-vld-encoding.s @@ -1,163 +1,163 @@ @ RUN: llvm-mc -mcpu=cortex-a8 -triple armv7-apple-darwin -show-encoding < %s | FileCheck %s - vld1.8 {d16}, [r0, :64] + vld1.8 {d16}, [r0:64] vld1.16 {d16}, [r0] vld1.32 {d16}, [r0] vld1.64 {d16}, [r0] - vld1.8 {d16, d17}, [r0, :64] - vld1.16 {d16, d17}, [r0, :128] + vld1.8 {d16, d17}, [r0:64] + vld1.16 {d16, d17}, [r0:128] vld1.32 {d16, d17}, [r0] vld1.64 {d16, d17}, [r0] vld1.8 {d1, d2, d3}, [r3] - vld1.16 {d4, d5, d6}, [r3, :64] + vld1.16 {d4, d5, d6}, [r3:64] vld1.32 {d5, d6, d7}, [r3] - vld1.64 {d6, d7, d8}, [r3, :64] + vld1.64 {d6, d7, d8}, [r3:64] vld1.8 {d1, d2, d3, d4}, [r3] - vld1.16 {d4, d5, d6, d7}, [r3, :64] + vld1.16 {d4, d5, d6, d7}, [r3:64] vld1.32 {d5, d6, d7, d8}, [r3] - vld1.64 {d6, d7, d8, d9}, [r3, :64] + vld1.64 {d6, d7, d8, d9}, [r3:64] - vld1.8 {d16}, [r0, :64]! + vld1.8 {d16}, [r0:64]! vld1.16 {d16}, [r0]! vld1.32 {d16}, [r0]! vld1.64 {d16}, [r0]! - vld1.8 {d16, d17}, [r0, :64]! - vld1.16 {d16, d17}, [r0, :128]! + vld1.8 {d16, d17}, [r0:64]! + vld1.16 {d16, d17}, [r0:128]! vld1.32 {d16, d17}, [r0]! vld1.64 {d16, d17}, [r0]! - vld1.8 {d16}, [r0, :64], r5 + vld1.8 {d16}, [r0:64], r5 vld1.16 {d16}, [r0], r5 vld1.32 {d16}, [r0], r5 vld1.64 {d16}, [r0], r5 - vld1.8 {d16, d17}, [r0, :64], r5 - vld1.16 {d16, d17}, [r0, :128], r5 + vld1.8 {d16, d17}, [r0:64], r5 + vld1.16 {d16, d17}, [r0:128], r5 vld1.32 {d16, d17}, [r0], r5 vld1.64 {d16, d17}, [r0], r5 vld1.8 {d1, d2, d3}, [r3]! - vld1.16 {d4, d5, d6}, [r3, :64]! + vld1.16 {d4, d5, d6}, [r3:64]! vld1.32 {d5, d6, d7}, [r3]! - vld1.64 {d6, d7, d8}, [r3, :64]! + vld1.64 {d6, d7, d8}, [r3:64]! vld1.8 {d1, d2, d3}, [r3], r6 - vld1.16 {d4, d5, d6}, [r3, :64], r6 + vld1.16 {d4, d5, d6}, [r3:64], r6 vld1.32 {d5, d6, d7}, [r3], r6 - vld1.64 {d6, d7, d8}, [r3, :64], r6 + vld1.64 {d6, d7, d8}, [r3:64], r6 vld1.8 {d1, d2, d3, d4}, [r3]! - vld1.16 {d4, d5, d6, d7}, [r3, :64]! + vld1.16 {d4, d5, d6, d7}, [r3:64]! vld1.32 {d5, d6, d7, d8}, [r3]! - vld1.64 {d6, d7, d8, d9}, [r3, :64]! + vld1.64 {d6, d7, d8, d9}, [r3:64]! vld1.8 {d1, d2, d3, d4}, [r3], r8 - vld1.16 {d4, d5, d6, d7}, [r3, :64], r8 + vld1.16 {d4, d5, d6, d7}, [r3:64], r8 vld1.32 {d5, d6, d7, d8}, [r3], r8 - vld1.64 {d6, d7, d8, d9}, [r3, :64], r8 + vld1.64 {d6, d7, d8, d9}, [r3:64], r8 -@ CHECK: vld1.8 {d16}, [r0, :64] @ encoding: [0x1f,0x07,0x60,0xf4] +@ CHECK: vld1.8 {d16}, [r0:64] @ encoding: [0x1f,0x07,0x60,0xf4] @ CHECK: vld1.16 {d16}, [r0] @ encoding: [0x4f,0x07,0x60,0xf4] @ CHECK: vld1.32 {d16}, [r0] @ encoding: [0x8f,0x07,0x60,0xf4] @ CHECK: vld1.64 {d16}, [r0] @ encoding: [0xcf,0x07,0x60,0xf4] -@ CHECK: vld1.8 {d16, d17}, [r0, :64] @ encoding: [0x1f,0x0a,0x60,0xf4] -@ CHECK: vld1.16 {d16, d17}, [r0, :128] @ encoding: [0x6f,0x0a,0x60,0xf4] +@ CHECK: vld1.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x0a,0x60,0xf4] +@ CHECK: vld1.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x0a,0x60,0xf4] @ CHECK: vld1.32 {d16, d17}, [r0] @ encoding: [0x8f,0x0a,0x60,0xf4] @ CHECK: vld1.64 {d16, d17}, [r0] @ encoding: [0xcf,0x0a,0x60,0xf4] @ CHECK: vld1.8 {d1, d2, d3}, [r3] @ encoding: [0x0f,0x16,0x23,0xf4] -@ CHECK: vld1.16 {d4, d5, d6}, [r3, :64] @ encoding: [0x5f,0x46,0x23,0xf4] +@ CHECK: vld1.16 {d4, d5, d6}, [r3:64] @ encoding: [0x5f,0x46,0x23,0xf4] @ CHECK: vld1.32 {d5, d6, d7}, [r3] @ encoding: [0x8f,0x56,0x23,0xf4] -@ CHECK: vld1.64 {d6, d7, d8}, [r3, :64] @ encoding: [0xdf,0x66,0x23,0xf4] +@ CHECK: vld1.64 {d6, d7, d8}, [r3:64] @ encoding: [0xdf,0x66,0x23,0xf4] @ CHECK: vld1.8 {d1, d2, d3, d4}, [r3] @ encoding: [0x0f,0x12,0x23,0xf4] -@ CHECK: vld1.16 {d4, d5, d6, d7}, [r3, :64] @ encoding: [0x5f,0x42,0x23,0xf4] +@ CHECK: vld1.16 {d4, d5, d6, d7}, [r3:64] @ encoding: [0x5f,0x42,0x23,0xf4] @ CHECK: vld1.32 {d5, d6, d7, d8}, [r3] @ encoding: [0x8f,0x52,0x23,0xf4] -@ CHECK: vld1.64 {d6, d7, d8, d9}, [r3, :64] @ encoding: [0xdf,0x62,0x23,0xf4] -@ CHECK: vld1.8 {d16}, [r0, :64]! @ encoding: [0x1d,0x07,0x60,0xf4] +@ CHECK: vld1.64 {d6, d7, d8, d9}, [r3:64] @ encoding: [0xdf,0x62,0x23,0xf4] +@ CHECK: vld1.8 {d16}, [r0:64]! @ encoding: [0x1d,0x07,0x60,0xf4] @ CHECK: vld1.16 {d16}, [r0]! @ encoding: [0x4d,0x07,0x60,0xf4] @ CHECK: vld1.32 {d16}, [r0]! @ encoding: [0x8d,0x07,0x60,0xf4] @ CHECK: vld1.64 {d16}, [r0]! @ encoding: [0xcd,0x07,0x60,0xf4] -@ CHECK: vld1.8 {d16, d17}, [r0, :64]! @ encoding: [0x1d,0x0a,0x60,0xf4] -@ CHECK: vld1.16 {d16, d17}, [r0, :128]! @ encoding: [0x6d,0x0a,0x60,0xf4] +@ CHECK: vld1.8 {d16, d17}, [r0:64]! @ encoding: [0x1d,0x0a,0x60,0xf4] +@ CHECK: vld1.16 {d16, d17}, [r0:128]! @ encoding: [0x6d,0x0a,0x60,0xf4] @ CHECK: vld1.32 {d16, d17}, [r0]! @ encoding: [0x8d,0x0a,0x60,0xf4] @ CHECK: vld1.64 {d16, d17}, [r0]! @ encoding: [0xcd,0x0a,0x60,0xf4] -@ CHECK: vld1.8 {d16}, [r0, :64], r5 @ encoding: [0x15,0x07,0x60,0xf4] +@ CHECK: vld1.8 {d16}, [r0:64], r5 @ encoding: [0x15,0x07,0x60,0xf4] @ CHECK: vld1.16 {d16}, [r0], r5 @ encoding: [0x45,0x07,0x60,0xf4] @ CHECK: vld1.32 {d16}, [r0], r5 @ encoding: [0x85,0x07,0x60,0xf4] @ CHECK: vld1.64 {d16}, [r0], r5 @ encoding: [0xc5,0x07,0x60,0xf4] -@ CHECK: vld1.8 {d16, d17}, [r0, :64], r5 @ encoding: [0x15,0x0a,0x60,0xf4] -@ CHECK: vld1.16 {d16, d17}, [r0, :128], r5 @ encoding: [0x65,0x0a,0x60,0xf4] +@ CHECK: vld1.8 {d16, d17}, [r0:64], r5 @ encoding: [0x15,0x0a,0x60,0xf4] +@ CHECK: vld1.16 {d16, d17}, [r0:128], r5 @ encoding: [0x65,0x0a,0x60,0xf4] @ CHECK: vld1.32 {d16, d17}, [r0], r5 @ encoding: [0x85,0x0a,0x60,0xf4] @ CHECK: vld1.64 {d16, d17}, [r0], r5 @ encoding: [0xc5,0x0a,0x60,0xf4] @ CHECK: vld1.8 {d1, d2, d3}, [r3]! @ encoding: [0x0d,0x16,0x23,0xf4] -@ CHECK: vld1.16 {d4, d5, d6}, [r3, :64]! @ encoding: [0x5d,0x46,0x23,0xf4] +@ CHECK: vld1.16 {d4, d5, d6}, [r3:64]! @ encoding: [0x5d,0x46,0x23,0xf4] @ CHECK: vld1.32 {d5, d6, d7}, [r3]! @ encoding: [0x8d,0x56,0x23,0xf4] -@ CHECK: vld1.64 {d6, d7, d8}, [r3, :64]! @ encoding: [0xdd,0x66,0x23,0xf4] +@ CHECK: vld1.64 {d6, d7, d8}, [r3:64]! @ encoding: [0xdd,0x66,0x23,0xf4] @ CHECK: vld1.8 {d1, d2, d3}, [r3], r6 @ encoding: [0x06,0x16,0x23,0xf4] -@ CHECK: vld1.16 {d4, d5, d6}, [r3, :64], r6 @ encoding: [0x56,0x46,0x23,0xf4] +@ CHECK: vld1.16 {d4, d5, d6}, [r3:64], r6 @ encoding: [0x56,0x46,0x23,0xf4] @ CHECK: vld1.32 {d5, d6, d7}, [r3], r6 @ encoding: [0x86,0x56,0x23,0xf4] -@ CHECK: vld1.64 {d6, d7, d8}, [r3, :64], r6 @ encoding: [0xd6,0x66,0x23,0xf4] +@ CHECK: vld1.64 {d6, d7, d8}, [r3:64], r6 @ encoding: [0xd6,0x66,0x23,0xf4] @ CHECK: vld1.8 {d1, d2, d3, d4}, [r3]! @ encoding: [0x0d,0x12,0x23,0xf4] -@ CHECK: vld1.16 {d4, d5, d6, d7}, [r3, :64]! @ encoding: [0x5d,0x42,0x23,0xf4] +@ CHECK: vld1.16 {d4, d5, d6, d7}, [r3:64]! @ encoding: [0x5d,0x42,0x23,0xf4] @ CHECK: vld1.32 {d5, d6, d7, d8}, [r3]! @ encoding: [0x8d,0x52,0x23,0xf4] -@ CHECK: vld1.64 {d6, d7, d8, d9}, [r3, :64]! @ encoding: [0xdd,0x62,0x23,0xf4] +@ CHECK: vld1.64 {d6, d7, d8, d9}, [r3:64]! @ encoding: [0xdd,0x62,0x23,0xf4] @ CHECK: vld1.8 {d1, d2, d3, d4}, [r3], r8 @ encoding: [0x08,0x12,0x23,0xf4] -@ CHECK: vld1.16 {d4, d5, d6, d7}, [r3, :64], r8 @ encoding: [0x58,0x42,0x23,0xf4] +@ CHECK: vld1.16 {d4, d5, d6, d7}, [r3:64], r8 @ encoding: [0x58,0x42,0x23,0xf4] @ CHECK: vld1.32 {d5, d6, d7, d8}, [r3], r8 @ encoding: [0x88,0x52,0x23,0xf4] -@ CHECK: vld1.64 {d6, d7, d8, d9}, [r3, :64], r8 @ encoding: [0xd8,0x62,0x23,0xf4] +@ CHECK: vld1.64 {d6, d7, d8, d9}, [r3:64], r8 @ encoding: [0xd8,0x62,0x23,0xf4] - vld2.8 {d16, d17}, [r0, :64] - vld2.16 {d16, d17}, [r0, :128] + vld2.8 {d16, d17}, [r0:64] + vld2.16 {d16, d17}, [r0:128] vld2.32 {d16, d17}, [r0] - vld2.8 {d16, d17, d18, d19}, [r0, :64] - vld2.16 {d16, d17, d18, d19}, [r0, :128] - vld2.32 {d16, d17, d18, d19}, [r0, :256] + vld2.8 {d16, d17, d18, d19}, [r0:64] + vld2.16 {d16, d17, d18, d19}, [r0:128] + vld2.32 {d16, d17, d18, d19}, [r0:256] - vld2.8 {d19, d20}, [r0, :64]! - vld2.16 {d16, d17}, [r0, :128]! + vld2.8 {d19, d20}, [r0:64]! + vld2.16 {d16, d17}, [r0:128]! vld2.32 {q10}, [r0]! - vld2.8 {d4-d7}, [r0, :64]! - vld2.16 {d1, d2, d3, d4}, [r0, :128]! - vld2.32 {q7, q8}, [r0, :256]! + vld2.8 {d4-d7}, [r0:64]! + vld2.16 {d1, d2, d3, d4}, [r0:128]! + vld2.32 {q7, q8}, [r0:256]! - vld2.8 {d19, d20}, [r0, :64], r6 - vld2.16 {d16, d17}, [r0, :128], r6 + vld2.8 {d19, d20}, [r0:64], r6 + vld2.16 {d16, d17}, [r0:128], r6 vld2.32 {q10}, [r0], r6 - vld2.8 {d4-d7}, [r0, :64], r6 - vld2.16 {d1, d2, d3, d4}, [r0, :128], r6 - vld2.32 {q7, q8}, [r0, :256], r6 + vld2.8 {d4-d7}, [r0:64], r6 + vld2.16 {d1, d2, d3, d4}, [r0:128], r6 + vld2.32 {q7, q8}, [r0:256], r6 -@ CHECK: vld2.8 {d16, d17}, [r0, :64] @ encoding: [0x1f,0x08,0x60,0xf4] -@ CHECK: vld2.16 {d16, d17}, [r0, :128] @ encoding: [0x6f,0x08,0x60,0xf4] +@ CHECK: vld2.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x08,0x60,0xf4] +@ CHECK: vld2.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x08,0x60,0xf4] @ CHECK: vld2.32 {d16, d17}, [r0] @ encoding: [0x8f,0x08,0x60,0xf4] -@ CHECK: vld2.8 {d16, d17, d18, d19}, [r0, :64] @ encoding: [0x1f,0x03,0x60,0xf4] -@ CHECK: vld2.16 {d16, d17, d18, d19}, [r0, :128] @ encoding: [0x6f,0x03,0x60,0xf4] -@ CHECK: vld2.32 {d16, d17, d18, d19}, [r0, :256] @ encoding: [0xbf,0x03,0x60,0xf4] +@ CHECK: vld2.8 {d16, d17, d18, d19}, [r0:64] @ encoding: [0x1f,0x03,0x60,0xf4] +@ CHECK: vld2.16 {d16, d17, d18, d19}, [r0:128] @ encoding: [0x6f,0x03,0x60,0xf4] +@ CHECK: vld2.32 {d16, d17, d18, d19}, [r0:256] @ encoding: [0xbf,0x03,0x60,0xf4] -@ CHECK: vld2.8 {d19, d20}, [r0, :64]! @ encoding: [0x1d,0x38,0x60,0xf4] -@ CHECK: vld2.16 {d16, d17}, [r0, :128]! @ encoding: [0x6d,0x08,0x60,0xf4] +@ CHECK: vld2.8 {d19, d20}, [r0:64]! @ encoding: [0x1d,0x38,0x60,0xf4] +@ CHECK: vld2.16 {d16, d17}, [r0:128]! @ encoding: [0x6d,0x08,0x60,0xf4] @ CHECK: vld2.32 {d20, d21}, [r0]! @ encoding: [0x8d,0x48,0x60,0xf4] -@ CHECK: vld2.8 {d4, d5, d6, d7}, [r0, :64]! @ encoding: [0x1d,0x43,0x20,0xf4] -@ CHECK: vld2.16 {d1, d2, d3, d4}, [r0, :128]! @ encoding: [0x6d,0x13,0x20,0xf4] -@ CHECK: vld2.32 {d14, d15, d16, d17}, [r0, :256]! @ encoding: [0xbd,0xe3,0x20,0xf4] +@ CHECK: vld2.8 {d4, d5, d6, d7}, [r0:64]! @ encoding: [0x1d,0x43,0x20,0xf4] +@ CHECK: vld2.16 {d1, d2, d3, d4}, [r0:128]! @ encoding: [0x6d,0x13,0x20,0xf4] +@ CHECK: vld2.32 {d14, d15, d16, d17}, [r0:256]! @ encoding: [0xbd,0xe3,0x20,0xf4] -@ CHECK: vld2.8 {d19, d20}, [r0, :64], r6 @ encoding: [0x16,0x38,0x60,0xf4] -@ CHECK: vld2.16 {d16, d17}, [r0, :128], r6 @ encoding: [0x66,0x08,0x60,0xf4] +@ CHECK: vld2.8 {d19, d20}, [r0:64], r6 @ encoding: [0x16,0x38,0x60,0xf4] +@ CHECK: vld2.16 {d16, d17}, [r0:128], r6 @ encoding: [0x66,0x08,0x60,0xf4] @ CHECK: vld2.32 {d20, d21}, [r0], r6 @ encoding: [0x86,0x48,0x60,0xf4] -@ CHECK: vld2.8 {d4, d5, d6, d7}, [r0, :64], r6 @ encoding: [0x16,0x43,0x20,0xf4] -@ CHECK: vld2.16 {d1, d2, d3, d4}, [r0, :128], r6 @ encoding: [0x66,0x13,0x20,0xf4] -@ CHECK: vld2.32 {d14, d15, d16, d17}, [r0, :256], r6 @ encoding: [0xb6,0xe3,0x20,0xf4] +@ CHECK: vld2.8 {d4, d5, d6, d7}, [r0:64], r6 @ encoding: [0x16,0x43,0x20,0xf4] +@ CHECK: vld2.16 {d1, d2, d3, d4}, [r0:128], r6 @ encoding: [0x66,0x13,0x20,0xf4] +@ CHECK: vld2.32 {d14, d15, d16, d17}, [r0:256], r6 @ encoding: [0xb6,0xe3,0x20,0xf4] vld3.8 {d16, d17, d18}, [r1] vld3.16 {d6, d7, d8}, [r2] vld3.32 {d1, d2, d3}, [r3] - vld3.8 {d16, d18, d20}, [r0, :64] + vld3.8 {d16, d18, d20}, [r0:64] vld3.u16 {d27, d29, d31}, [r4] vld3.i32 {d6, d8, d10}, [r5] @@ -171,7 +171,7 @@ vld3.p8 {d6, d7, d8}, [r8]! vld3.16 {d9, d10, d11}, [r7]! vld3.f32 {d1, d2, d3}, [r6]! - vld3.8 {d16, d18, d20}, [r0, :64]! + vld3.8 {d16, d18, d20}, [r0:64]! vld3.p16 {d20, d22, d24}, [r5]! vld3.32 {d5, d7, d9}, [r4]! @@ -179,7 +179,7 @@ @ CHECK: vld3.8 {d16, d17, d18}, [r1] @ encoding: [0x0f,0x04,0x61,0xf4] @ CHECK: vld3.16 {d6, d7, d8}, [r2] @ encoding: [0x4f,0x64,0x22,0xf4] @ CHECK: vld3.32 {d1, d2, d3}, [r3] @ encoding: [0x8f,0x14,0x23,0xf4] -@ CHECK: vld3.8 {d16, d18, d20}, [r0, :64] @ encoding: [0x1f,0x05,0x60,0xf4] +@ CHECK: vld3.8 {d16, d18, d20}, [r0:64] @ encoding: [0x1f,0x05,0x60,0xf4] @ CHECK: vld3.16 {d27, d29, d31}, [r4] @ encoding: [0x4f,0xb5,0x64,0xf4] @ CHECK: vld3.32 {d6, d8, d10}, [r5] @ encoding: [0x8f,0x65,0x25,0xf4] @ CHECK: vld3.8 {d12, d13, d14}, [r6], r1 @ encoding: [0x01,0xc4,0x26,0xf4] @@ -191,48 +191,48 @@ @ CHECK: vld3.8 {d6, d7, d8}, [r8]! @ encoding: [0x0d,0x64,0x28,0xf4] @ CHECK: vld3.16 {d9, d10, d11}, [r7]! @ encoding: [0x4d,0x94,0x27,0xf4] @ CHECK: vld3.32 {d1, d2, d3}, [r6]! @ encoding: [0x8d,0x14,0x26,0xf4] -@ CHECK: vld3.8 {d16, d18, d20}, [r0, :64]! @ encoding: [0x1d,0x05,0x60,0xf4] +@ CHECK: vld3.8 {d16, d18, d20}, [r0:64]! @ encoding: [0x1d,0x05,0x60,0xf4] @ CHECK: vld3.16 {d20, d22, d24}, [r5]! @ encoding: [0x4d,0x45,0x65,0xf4] @ CHECK: vld3.32 {d5, d7, d9}, [r4]! @ encoding: [0x8d,0x55,0x24,0xf4] - vld4.8 {d16, d17, d18, d19}, [r1, :64] - vld4.16 {d16, d17, d18, d19}, [r2, :128] - vld4.32 {d16, d17, d18, d19}, [r3, :256] - vld4.8 {d17, d19, d21, d23}, [r5, :256] + vld4.8 {d16, d17, d18, d19}, [r1:64] + vld4.16 {d16, d17, d18, d19}, [r2:128] + vld4.32 {d16, d17, d18, d19}, [r3:256] + vld4.8 {d17, d19, d21, d23}, [r5:256] vld4.16 {d17, d19, d21, d23}, [r7] vld4.32 {d16, d18, d20, d22}, [r8] - vld4.s8 {d16, d17, d18, d19}, [r1, :64]! - vld4.s16 {d16, d17, d18, d19}, [r2, :128]! - vld4.s32 {d16, d17, d18, d19}, [r3, :256]! - vld4.u8 {d17, d19, d21, d23}, [r5, :256]! + vld4.s8 {d16, d17, d18, d19}, [r1:64]! + vld4.s16 {d16, d17, d18, d19}, [r2:128]! + vld4.s32 {d16, d17, d18, d19}, [r3:256]! + vld4.u8 {d17, d19, d21, d23}, [r5:256]! vld4.u16 {d17, d19, d21, d23}, [r7]! vld4.u32 {d16, d18, d20, d22}, [r8]! - vld4.p8 {d16, d17, d18, d19}, [r1, :64], r8 + vld4.p8 {d16, d17, d18, d19}, [r1:64], r8 vld4.p16 {d16, d17, d18, d19}, [r2], r7 - vld4.f32 {d16, d17, d18, d19}, [r3, :64], r5 - vld4.i8 {d16, d18, d20, d22}, [r4, :256], r2 + vld4.f32 {d16, d17, d18, d19}, [r3:64], r5 + vld4.i8 {d16, d18, d20, d22}, [r4:256], r2 vld4.i16 {d16, d18, d20, d22}, [r6], r3 vld4.i32 {d17, d19, d21, d23}, [r9], r4 -@ CHECK: vld4.8 {d16, d17, d18, d19}, [r1, :64] @ encoding: [0x1f,0x00,0x61,0xf4] -@ CHECK: vld4.16 {d16, d17, d18, d19}, [r2, :128] @ encoding: [0x6f,0x00,0x62,0xf4] -@ CHECK: vld4.32 {d16, d17, d18, d19}, [r3, :256] @ encoding: [0xbf,0x00,0x63,0xf4] -@ CHECK: vld4.8 {d17, d19, d21, d23}, [r5, :256] @ encoding: [0x3f,0x11,0x65,0xf4] +@ CHECK: vld4.8 {d16, d17, d18, d19}, [r1:64] @ encoding: [0x1f,0x00,0x61,0xf4] +@ CHECK: vld4.16 {d16, d17, d18, d19}, [r2:128] @ encoding: [0x6f,0x00,0x62,0xf4] +@ CHECK: vld4.32 {d16, d17, d18, d19}, [r3:256] @ encoding: [0xbf,0x00,0x63,0xf4] +@ CHECK: vld4.8 {d17, d19, d21, d23}, [r5:256] @ encoding: [0x3f,0x11,0x65,0xf4] @ CHECK: vld4.16 {d17, d19, d21, d23}, [r7] @ encoding: [0x4f,0x11,0x67,0xf4] @ CHECK: vld4.32 {d16, d18, d20, d22}, [r8] @ encoding: [0x8f,0x01,0x68,0xf4] -@ CHECK: vld4.8 {d16, d17, d18, d19}, [r1, :64]! @ encoding: [0x1d,0x00,0x61,0xf4] -@ CHECK: vld4.16 {d16, d17, d18, d19}, [r2, :128]! @ encoding: [0x6d,0x00,0x62,0xf4] -@ CHECK: vld4.32 {d16, d17, d18, d19}, [r3, :256]! @ encoding: [0xbd,0x00,0x63,0xf4] -@ CHECK: vld4.8 {d17, d19, d21, d23}, [r5, :256]! @ encoding: [0x3d,0x11,0x65,0xf4] +@ CHECK: vld4.8 {d16, d17, d18, d19}, [r1:64]! @ encoding: [0x1d,0x00,0x61,0xf4] +@ CHECK: vld4.16 {d16, d17, d18, d19}, [r2:128]! @ encoding: [0x6d,0x00,0x62,0xf4] +@ CHECK: vld4.32 {d16, d17, d18, d19}, [r3:256]! @ encoding: [0xbd,0x00,0x63,0xf4] +@ CHECK: vld4.8 {d17, d19, d21, d23}, [r5:256]! @ encoding: [0x3d,0x11,0x65,0xf4] @ CHECK: vld4.16 {d17, d19, d21, d23}, [r7]! @ encoding: [0x4d,0x11,0x67,0xf4] @ CHECK: vld4.32 {d16, d18, d20, d22}, [r8]! @ encoding: [0x8d,0x01,0x68,0xf4] -@ CHECK: vld4.8 {d16, d17, d18, d19}, [r1, :64], r8 @ encoding: [0x18,0x00,0x61,0xf4] +@ CHECK: vld4.8 {d16, d17, d18, d19}, [r1:64], r8 @ encoding: [0x18,0x00,0x61,0xf4] @ CHECK: vld4.16 {d16, d17, d18, d19}, [r2], r7 @ encoding: [0x47,0x00,0x62,0xf4] -@ CHECK: vld4.32 {d16, d17, d18, d19}, [r3, :64], r5 @ encoding: [0x95,0x00,0x63,0xf4] -@ CHECK: vld4.8 {d16, d18, d20, d22}, [r4, :256], r2 @ encoding: [0x32,0x01,0x64,0xf4] +@ CHECK: vld4.32 {d16, d17, d18, d19}, [r3:64], r5 @ encoding: [0x95,0x00,0x63,0xf4] +@ CHECK: vld4.8 {d16, d18, d20, d22}, [r4:256], r2 @ encoding: [0x32,0x01,0x64,0xf4] @ CHECK: vld4.16 {d16, d18, d20, d22}, [r6], r3 @ encoding: [0x43,0x01,0x66,0xf4] @ CHECK: vld4.32 {d17, d19, d21, d23}, [r9], r4 @ encoding: [0x84,0x11,0x69,0xf4] @@ -252,28 +252,28 @@ @ CHECK: vld1.8 {d4[], d5[]}, [r1], r3 @ encoding: [0x23,0x4c,0xa1,0xf4] vld1.8 {d16[3]}, [r0] - vld1.16 {d16[2]}, [r0, :16] - vld1.32 {d16[1]}, [r0, :32] + vld1.16 {d16[2]}, [r0:16] + vld1.32 {d16[1]}, [r0:32] vld1.p8 d12[6], [r2]! vld1.i8 d12[6], [r2], r2 vld1.u16 d12[3], [r2]! vld1.16 d12[2], [r2], r2 @ CHECK: vld1.8 {d16[3]}, [r0] @ encoding: [0x6f,0x00,0xe0,0xf4] -@ CHECK: vld1.16 {d16[2]}, [r0, :16] @ encoding: [0x9f,0x04,0xe0,0xf4] -@ CHECK: vld1.32 {d16[1]}, [r0, :32] @ encoding: [0xbf,0x08,0xe0,0xf4] +@ CHECK: vld1.16 {d16[2]}, [r0:16] @ encoding: [0x9f,0x04,0xe0,0xf4] +@ CHECK: vld1.32 {d16[1]}, [r0:32] @ encoding: [0xbf,0x08,0xe0,0xf4] @ CHECK: vld1.8 {d12[6]}, [r2]! @ encoding: [0xcd,0xc0,0xa2,0xf4] @ CHECK: vld1.8 {d12[6]}, [r2], r2 @ encoding: [0xc2,0xc0,0xa2,0xf4] @ CHECK: vld1.16 {d12[3]}, [r2]! @ encoding: [0xcd,0xc4,0xa2,0xf4] @ CHECK: vld1.16 {d12[2]}, [r2], r2 @ encoding: [0x82,0xc4,0xa2,0xf4] - vld2.8 {d16[1], d17[1]}, [r0, :16] - vld2.16 {d16[1], d17[1]}, [r0, :32] + vld2.8 {d16[1], d17[1]}, [r0:16] + vld2.16 {d16[1], d17[1]}, [r0:32] vld2.32 {d16[1], d17[1]}, [r0] vld2.16 {d17[1], d19[1]}, [r0] - vld2.32 {d17[0], d19[0]}, [r0, :64] - vld2.32 {d17[0], d19[0]}, [r0, :64]! + vld2.32 {d17[0], d19[0]}, [r0:64] + vld2.32 {d17[0], d19[0]}, [r0:64]! vld2.8 {d2[4], d3[4]}, [r2], r3 vld2.8 {d2[4], d3[4]}, [r2]! vld2.8 {d2[4], d3[4]}, [r2] @@ -284,12 +284,12 @@ vld2.32 {d22[ ],d23[ ]}, [r5], r4 vld2.32 {d22[ ],d24[ ]}, [r6], r4 -@ CHECK: vld2.8 {d16[1], d17[1]}, [r0, :16] @ encoding: [0x3f,0x01,0xe0,0xf4] -@ CHECK: vld2.16 {d16[1], d17[1]}, [r0, :32] @ encoding: [0x5f,0x05,0xe0,0xf4] +@ CHECK: vld2.8 {d16[1], d17[1]}, [r0:16] @ encoding: [0x3f,0x01,0xe0,0xf4] +@ CHECK: vld2.16 {d16[1], d17[1]}, [r0:32] @ encoding: [0x5f,0x05,0xe0,0xf4] @ CHECK: vld2.32 {d16[1], d17[1]}, [r0] @ encoding: [0x8f,0x09,0xe0,0xf4] @ CHECK: vld2.16 {d17[1], d19[1]}, [r0] @ encoding: [0x6f,0x15,0xe0,0xf4] -@ CHECK: vld2.32 {d17[0], d19[0]}, [r0, :64] @ encoding: [0x5f,0x19,0xe0,0xf4] -@ CHECK: vld2.32 {d17[0], d19[0]}, [r0, :64]! @ encoding: [0x5d,0x19,0xe0,0xf4] +@ CHECK: vld2.32 {d17[0], d19[0]}, [r0:64] @ encoding: [0x5f,0x19,0xe0,0xf4] +@ CHECK: vld2.32 {d17[0], d19[0]}, [r0:64]! @ encoding: [0x5d,0x19,0xe0,0xf4] @ CHECK: vld2.8 {d2[4], d3[4]}, [r2], r3 @ encoding: [0x83,0x21,0xa2,0xf4] @ CHECK: vld2.8 {d2[4], d3[4]}, [r2]! @ encoding: [0x8d,0x21,0xa2,0xf4] @ CHECK: vld2.8 {d2[4], d3[4]}, [r2] @ encoding: [0x8f,0x21,0xa2,0xf4] @@ -383,15 +383,15 @@ vld4.16 {d17[1], d19[1], d21[1], d23[1]}, [r7] vld4.32 {d16[1], d18[1], d20[1], d22[1]}, [r8] - vld4.s8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32]! - vld4.s16 {d16[1], d17[1], d18[1], d19[1]}, [r2, :64]! - vld4.s32 {d16[1], d17[1], d18[1], d19[1]}, [r3, :128]! + vld4.s8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32]! + vld4.s16 {d16[1], d17[1], d18[1], d19[1]}, [r2:64]! + vld4.s32 {d16[1], d17[1], d18[1], d19[1]}, [r3:128]! vld4.u16 {d17[1], d19[1], d21[1], d23[1]}, [r7]! vld4.u32 {d16[1], d18[1], d20[1], d22[1]}, [r8]! - vld4.p8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32], r8 + vld4.p8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32], r8 vld4.p16 {d16[1], d17[1], d18[1], d19[1]}, [r2], r7 - vld4.f32 {d16[1], d17[1], d18[1], d19[1]}, [r3, :64], r5 + vld4.f32 {d16[1], d17[1], d18[1], d19[1]}, [r3:64], r5 vld4.i16 {d16[1], d18[1], d20[1], d22[1]}, [r6], r3 vld4.i32 {d17[1], d19[1], d21[1], d23[1]}, [r9], r4 @@ -400,14 +400,14 @@ @ CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3] @ encoding: [0x8f,0x0b,0xe3,0xf4] @ CHECK: vld4.16 {d17[1], d19[1], d21[1], d23[1]}, [r7] @ encoding: [0x6f,0x17,0xe7,0xf4] @ CHECK: vld4.32 {d16[1], d18[1], d20[1], d22[1]}, [r8] @ encoding: [0xcf,0x0b,0xe8,0xf4] -@ CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32]! @ encoding: [0x3d,0x03,0xe1,0xf4] -@ CHECK: vld4.16 {d16[1], d17[1], d18[1], d19[1]}, [r2, :64]! @ encoding: [0x5d,0x07,0xe2,0xf4] -@ CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3, :128]! @ encoding: [0xad,0x0b,0xe3,0xf4] +@ CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32]! @ encoding: [0x3d,0x03,0xe1,0xf4] +@ CHECK: vld4.16 {d16[1], d17[1], d18[1], d19[1]}, [r2:64]! @ encoding: [0x5d,0x07,0xe2,0xf4] +@ CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3:128]! @ encoding: [0xad,0x0b,0xe3,0xf4] @ CHECK: vld4.16 {d17[1], d18[1], d19[1], d20[1]}, [r7]! @ encoding: [0x6d,0x17,0xe7,0xf4] @ CHECK: vld4.32 {d16[1], d18[1], d20[1], d22[1]}, [r8]! @ encoding: [0xcd,0x0b,0xe8,0xf4] -@ CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32], r8 @ encoding: [0x38,0x03,0xe1,0xf4] +@ CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32], r8 @ encoding: [0x38,0x03,0xe1,0xf4] @ CHECK: vld4.16 {d16[1], d17[1], d18[1], d19[1]}, [r2], r7 @ encoding: [0x47,0x07,0xe2,0xf4] -@ CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3, :64], r5 @ encoding: [0x95,0x0b,0xe3,0xf4] +@ CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3:64], r5 @ encoding: [0x95,0x0b,0xe3,0xf4] @ CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r6], r3 @ encoding: [0x63,0x07,0xe6,0xf4] @ CHECK: vld4.32 {d17[1], d19[1], d21[1], d23[1]}, [r9], r4 @ encoding: [0xc4,0x1b,0xe9,0xf4] @@ -490,8 +490,17 @@ @ Register lists can use the range syntax, just like VLDM - vld1.f64 {d2-d5}, [r2,:128]! - vld1.f64 {d2,d3,d4,d5}, [r2,:128]! + vld1.f64 {d2-d5}, [r2:128]! + vld1.f64 {d2,d3,d4,d5}, [r2:128]! -@ CHECK: vld1.64 {d2, d3, d4, d5}, [r2, :128]! @ encoding: [0xed,0x22,0x22,0xf4] -@ CHECK: vld1.64 {d2, d3, d4, d5}, [r2, :128]! @ encoding: [0xed,0x22,0x22,0xf4] +@ CHECK: vld1.64 {d2, d3, d4, d5}, [r2:128]! @ encoding: [0xed,0x22,0x22,0xf4] +@ CHECK: vld1.64 {d2, d3, d4, d5}, [r2:128]! @ encoding: [0xed,0x22,0x22,0xf4] + + +@ verify that the old incorrect alignment specifier syntax (", :") +@ still gets accepted. + vld2.8 {d16, d17}, [r0, :64] + vld2.16 {d16, d17}, [r0, :128] + +@ CHECK: vld2.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x08,0x60,0xf4] +@ CHECK: vld2.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x08,0x60,0xf4] diff --git a/test/MC/ARM/neon-vst-encoding.s b/test/MC/ARM/neon-vst-encoding.s index f5feca4c8c12..ef9f037c536f 100644 --- a/test/MC/ARM/neon-vst-encoding.s +++ b/test/MC/ARM/neon-vst-encoding.s @@ -1,67 +1,67 @@ @ RUN: llvm-mc -mcpu=cortex-a8 -triple armv7-apple-darwin -show-encoding < %s | FileCheck %s - vst1.8 {d16}, [r0, :64] + vst1.8 {d16}, [r0:64] vst1.16 {d16}, [r0] vst1.32 {d16}, [r0] vst1.64 {d16}, [r0] - vst1.8 {d16, d17}, [r0, :64] - vst1.16 {d16, d17}, [r0, :128] + vst1.8 {d16, d17}, [r0:64] + vst1.16 {d16, d17}, [r0:128] vst1.32 {d16, d17}, [r0] vst1.64 {d16, d17}, [r0] - vst1.8 {d16, d17, d18}, [r0, :64] - vst1.8 {d16, d17, d18}, [r0, :64]! + vst1.8 {d16, d17, d18}, [r0:64] + vst1.8 {d16, d17, d18}, [r0:64]! vst1.8 {d16, d17, d18}, [r0], r3 - vst1.8 {d16, d17, d18, d19}, [r0, :64] - vst1.16 {d16, d17, d18, d19}, [r1, :64]! + vst1.8 {d16, d17, d18, d19}, [r0:64] + vst1.16 {d16, d17, d18, d19}, [r1:64]! vst1.64 {d16, d17, d18, d19}, [r3], r2 -@ CHECK: vst1.8 {d16}, [r0, :64] @ encoding: [0x1f,0x07,0x40,0xf4] +@ CHECK: vst1.8 {d16}, [r0:64] @ encoding: [0x1f,0x07,0x40,0xf4] @ CHECK: vst1.16 {d16}, [r0] @ encoding: [0x4f,0x07,0x40,0xf4] @ CHECK: vst1.32 {d16}, [r0] @ encoding: [0x8f,0x07,0x40,0xf4] @ CHECK: vst1.64 {d16}, [r0] @ encoding: [0xcf,0x07,0x40,0xf4] -@ CHECK: vst1.8 {d16, d17}, [r0, :64] @ encoding: [0x1f,0x0a,0x40,0xf4] -@ CHECK: vst1.16 {d16, d17}, [r0, :128] @ encoding: [0x6f,0x0a,0x40,0xf4] +@ CHECK: vst1.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x0a,0x40,0xf4] +@ CHECK: vst1.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x0a,0x40,0xf4] @ CHECK: vst1.32 {d16, d17}, [r0] @ encoding: [0x8f,0x0a,0x40,0xf4] @ CHECK: vst1.64 {d16, d17}, [r0] @ encoding: [0xcf,0x0a,0x40,0xf4] -@ CHECK: vst1.8 {d16, d17, d18}, [r0, :64] @ encoding: [0x1f,0x06,0x40,0xf4] -@ CHECK: vst1.8 {d16, d17, d18}, [r0, :64]! @ encoding: [0x1d,0x06,0x40,0xf4] +@ CHECK: vst1.8 {d16, d17, d18}, [r0:64] @ encoding: [0x1f,0x06,0x40,0xf4] +@ CHECK: vst1.8 {d16, d17, d18}, [r0:64]! @ encoding: [0x1d,0x06,0x40,0xf4] @ CHECK: vst1.8 {d16, d17, d18}, [r0], r3 @ encoding: [0x03,0x06,0x40,0xf4] -@ CHECK: vst1.8 {d16, d17, d18, d19}, [r0, :64] @ encoding: [0x1f,0x02,0x40,0xf4] -@ CHECK: vst1.16 {d16, d17, d18, d19}, [r1, :64]! @ encoding: [0x5d,0x02,0x41,0xf4] +@ CHECK: vst1.8 {d16, d17, d18, d19}, [r0:64] @ encoding: [0x1f,0x02,0x40,0xf4] +@ CHECK: vst1.16 {d16, d17, d18, d19}, [r1:64]! @ encoding: [0x5d,0x02,0x41,0xf4] @ CHECK: vst1.64 {d16, d17, d18, d19}, [r3], r2 @ encoding: [0xc2,0x02,0x43,0xf4] - vst2.8 {d16, d17}, [r0, :64] - vst2.16 {d16, d17}, [r0, :128] + vst2.8 {d16, d17}, [r0:64] + vst2.16 {d16, d17}, [r0:128] vst2.32 {d16, d17}, [r0] - vst2.8 {d16, d17, d18, d19}, [r0, :64] - vst2.16 {d16, d17, d18, d19}, [r0, :128] - vst2.32 {d16, d17, d18, d19}, [r0, :256] - vst2.8 {d16, d17}, [r0, :64]! - vst2.16 {q15}, [r0, :128]! + vst2.8 {d16, d17, d18, d19}, [r0:64] + vst2.16 {d16, d17, d18, d19}, [r0:128] + vst2.32 {d16, d17, d18, d19}, [r0:256] + vst2.8 {d16, d17}, [r0:64]! + vst2.16 {q15}, [r0:128]! vst2.32 {d14, d15}, [r0]! - vst2.8 {d16, d17, d18, d19}, [r0, :64]! - vst2.16 {d18-d21}, [r0, :128]! - vst2.32 {q4, q5}, [r0, :256]! + vst2.8 {d16, d17, d18, d19}, [r0:64]! + vst2.16 {d18-d21}, [r0:128]! + vst2.32 {q4, q5}, [r0:256]! -@ CHECK: vst2.8 {d16, d17}, [r0, :64] @ encoding: [0x1f,0x08,0x40,0xf4] -@ CHECK: vst2.16 {d16, d17}, [r0, :128] @ encoding: [0x6f,0x08,0x40,0xf4] +@ CHECK: vst2.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x08,0x40,0xf4] +@ CHECK: vst2.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x08,0x40,0xf4] @ CHECK: vst2.32 {d16, d17}, [r0] @ encoding: [0x8f,0x08,0x40,0xf4] -@ CHECK: vst2.8 {d16, d17, d18, d19}, [r0, :64] @ encoding: [0x1f,0x03,0x40,0xf4] -@ CHECK: vst2.16 {d16, d17, d18, d19}, [r0, :128] @ encoding: [0x6f,0x03,0x40,0xf4] -@ CHECK: vst2.32 {d16, d17, d18, d19}, [r0, :256] @ encoding: [0xbf,0x03,0x40,0xf4] -@ CHECK: vst2.8 {d16, d17}, [r0, :64]! @ encoding: [0x1d,0x08,0x40,0xf4] -@ CHECK: vst2.16 {d30, d31}, [r0, :128]! @ encoding: [0x6d,0xe8,0x40,0xf4] +@ CHECK: vst2.8 {d16, d17, d18, d19}, [r0:64] @ encoding: [0x1f,0x03,0x40,0xf4] +@ CHECK: vst2.16 {d16, d17, d18, d19}, [r0:128] @ encoding: [0x6f,0x03,0x40,0xf4] +@ CHECK: vst2.32 {d16, d17, d18, d19}, [r0:256] @ encoding: [0xbf,0x03,0x40,0xf4] +@ CHECK: vst2.8 {d16, d17}, [r0:64]! @ encoding: [0x1d,0x08,0x40,0xf4] +@ CHECK: vst2.16 {d30, d31}, [r0:128]! @ encoding: [0x6d,0xe8,0x40,0xf4] @ CHECK: vst2.32 {d14, d15}, [r0]! @ encoding: [0x8d,0xe8,0x00,0xf4] -@ CHECK: vst2.8 {d16, d17, d18, d19}, [r0, :64]! @ encoding: [0x1d,0x03,0x40,0xf4] -@ CHECK: vst2.16 {d18, d19, d20, d21}, [r0, :128]! @ encoding: [0x6d,0x23,0x40,0xf4] -@ CHECK: vst2.32 {d8, d9, d10, d11}, [r0, :256]! @ encoding: [0xbd,0x83,0x00,0xf4] +@ CHECK: vst2.8 {d16, d17, d18, d19}, [r0:64]! @ encoding: [0x1d,0x03,0x40,0xf4] +@ CHECK: vst2.16 {d18, d19, d20, d21}, [r0:128]! @ encoding: [0x6d,0x23,0x40,0xf4] +@ CHECK: vst2.32 {d8, d9, d10, d11}, [r0:256]! @ encoding: [0xbd,0x83,0x00,0xf4] vst3.8 {d16, d17, d18}, [r1] vst3.16 {d6, d7, d8}, [r2] vst3.32 {d1, d2, d3}, [r3] - vst3.8 {d16, d18, d20}, [r0, :64] + vst3.8 {d16, d18, d20}, [r0:64] vst3.u16 {d27, d29, d31}, [r4] vst3.i32 {d6, d8, d10}, [r5] @@ -75,14 +75,14 @@ vst3.p8 {d6, d7, d8}, [r8]! vst3.16 {d9, d10, d11}, [r7]! vst3.f32 {d1, d2, d3}, [r6]! - vst3.8 {d16, d18, d20}, [r0, :64]! + vst3.8 {d16, d18, d20}, [r0:64]! vst3.p16 {d20, d22, d24}, [r5]! vst3.32 {d5, d7, d9}, [r4]! @ CHECK: vst3.8 {d16, d17, d18}, [r1] @ encoding: [0x0f,0x04,0x41,0xf4] @ CHECK: vst3.16 {d6, d7, d8}, [r2] @ encoding: [0x4f,0x64,0x02,0xf4] @ CHECK: vst3.32 {d1, d2, d3}, [r3] @ encoding: [0x8f,0x14,0x03,0xf4] -@ CHECK: vst3.8 {d16, d18, d20}, [r0, :64] @ encoding: [0x1f,0x05,0x40,0xf4] +@ CHECK: vst3.8 {d16, d18, d20}, [r0:64] @ encoding: [0x1f,0x05,0x40,0xf4] @ CHECK: vst3.16 {d27, d29, d31}, [r4] @ encoding: [0x4f,0xb5,0x44,0xf4] @ CHECK: vst3.32 {d6, d8, d10}, [r5] @ encoding: [0x8f,0x65,0x05,0xf4] @ CHECK: vst3.8 {d12, d13, d14}, [r6], r1 @ encoding: [0x01,0xc4,0x06,0xf4] @@ -94,85 +94,85 @@ @ CHECK: vst3.8 {d6, d7, d8}, [r8]! @ encoding: [0x0d,0x64,0x08,0xf4] @ CHECK: vst3.16 {d9, d10, d11}, [r7]! @ encoding: [0x4d,0x94,0x07,0xf4] @ CHECK: vst3.32 {d1, d2, d3}, [r6]! @ encoding: [0x8d,0x14,0x06,0xf4] -@ CHECK: vst3.8 {d16, d18, d20}, [r0, :64]! @ encoding: [0x1d,0x05,0x40,0xf4] +@ CHECK: vst3.8 {d16, d18, d20}, [r0:64]! @ encoding: [0x1d,0x05,0x40,0xf4] @ CHECK: vst3.16 {d20, d22, d24}, [r5]! @ encoding: [0x4d,0x45,0x45,0xf4] @ CHECK: vst3.32 {d5, d7, d9}, [r4]! @ encoding: [0x8d,0x55,0x04,0xf4] - vst4.8 {d16, d17, d18, d19}, [r1, :64] - vst4.16 {d16, d17, d18, d19}, [r2, :128] - vst4.32 {d16, d17, d18, d19}, [r3, :256] - vst4.8 {d17, d19, d21, d23}, [r5, :256] + vst4.8 {d16, d17, d18, d19}, [r1:64] + vst4.16 {d16, d17, d18, d19}, [r2:128] + vst4.32 {d16, d17, d18, d19}, [r3:256] + vst4.8 {d17, d19, d21, d23}, [r5:256] vst4.16 {d17, d19, d21, d23}, [r7] vst4.32 {d16, d18, d20, d22}, [r8] - vst4.s8 {d16, d17, d18, d19}, [r1, :64]! - vst4.s16 {d16, d17, d18, d19}, [r2, :128]! - vst4.s32 {d16, d17, d18, d19}, [r3, :256]! - vst4.u8 {d17, d19, d21, d23}, [r5, :256]! + vst4.s8 {d16, d17, d18, d19}, [r1:64]! + vst4.s16 {d16, d17, d18, d19}, [r2:128]! + vst4.s32 {d16, d17, d18, d19}, [r3:256]! + vst4.u8 {d17, d19, d21, d23}, [r5:256]! vst4.u16 {d17, d19, d21, d23}, [r7]! vst4.u32 {d16, d18, d20, d22}, [r8]! - vst4.p8 {d16, d17, d18, d19}, [r1, :64], r8 + vst4.p8 {d16, d17, d18, d19}, [r1:64], r8 vst4.p16 {d16, d17, d18, d19}, [r2], r7 - vst4.f32 {d16, d17, d18, d19}, [r3, :64], r5 - vst4.i8 {d16, d18, d20, d22}, [r4, :256], r2 + vst4.f32 {d16, d17, d18, d19}, [r3:64], r5 + vst4.i8 {d16, d18, d20, d22}, [r4:256], r2 vst4.i16 {d16, d18, d20, d22}, [r6], r3 vst4.i32 {d17, d19, d21, d23}, [r9], r4 -@ CHECK: vst4.8 {d16, d17, d18, d19}, [r1, :64] @ encoding: [0x1f,0x00,0x41,0xf4] -@ CHECK: vst4.16 {d16, d17, d18, d19}, [r2, :128] @ encoding: [0x6f,0x00,0x42,0xf4] -@ CHECK: vst4.32 {d16, d17, d18, d19}, [r3, :256] @ encoding: [0xbf,0x00,0x43,0xf4] -@ CHECK: vst4.8 {d17, d19, d21, d23}, [r5, :256] @ encoding: [0x3f,0x11,0x45,0xf4] +@ CHECK: vst4.8 {d16, d17, d18, d19}, [r1:64] @ encoding: [0x1f,0x00,0x41,0xf4] +@ CHECK: vst4.16 {d16, d17, d18, d19}, [r2:128] @ encoding: [0x6f,0x00,0x42,0xf4] +@ CHECK: vst4.32 {d16, d17, d18, d19}, [r3:256] @ encoding: [0xbf,0x00,0x43,0xf4] +@ CHECK: vst4.8 {d17, d19, d21, d23}, [r5:256] @ encoding: [0x3f,0x11,0x45,0xf4] @ CHECK: vst4.16 {d17, d19, d21, d23}, [r7] @ encoding: [0x4f,0x11,0x47,0xf4] @ CHECK: vst4.32 {d16, d18, d20, d22}, [r8] @ encoding: [0x8f,0x01,0x48,0xf4] -@ CHECK: vst4.8 {d16, d17, d18, d19}, [r1, :64]! @ encoding: [0x1d,0x00,0x41,0xf4] -@ CHECK: vst4.16 {d16, d17, d18, d19}, [r2, :128]! @ encoding: [0x6d,0x00,0x42,0xf4] -@ CHECK: vst4.32 {d16, d17, d18, d19}, [r3, :256]! @ encoding: [0xbd,0x00,0x43,0xf4] -@ CHECK: vst4.8 {d17, d19, d21, d23}, [r5, :256]! @ encoding: [0x3d,0x11,0x45,0xf4] +@ CHECK: vst4.8 {d16, d17, d18, d19}, [r1:64]! @ encoding: [0x1d,0x00,0x41,0xf4] +@ CHECK: vst4.16 {d16, d17, d18, d19}, [r2:128]! @ encoding: [0x6d,0x00,0x42,0xf4] +@ CHECK: vst4.32 {d16, d17, d18, d19}, [r3:256]! @ encoding: [0xbd,0x00,0x43,0xf4] +@ CHECK: vst4.8 {d17, d19, d21, d23}, [r5:256]! @ encoding: [0x3d,0x11,0x45,0xf4] @ CHECK: vst4.16 {d17, d19, d21, d23}, [r7]! @ encoding: [0x4d,0x11,0x47,0xf4] @ CHECK: vst4.32 {d16, d18, d20, d22}, [r8]! @ encoding: [0x8d,0x01,0x48,0xf4] -@ CHECK: vst4.8 {d16, d17, d18, d19}, [r1, :64], r8 @ encoding: [0x18,0x00,0x41,0xf4] +@ CHECK: vst4.8 {d16, d17, d18, d19}, [r1:64], r8 @ encoding: [0x18,0x00,0x41,0xf4] @ CHECK: vst4.16 {d16, d17, d18, d19}, [r2], r7 @ encoding: [0x47,0x00,0x42,0xf4] -@ CHECK: vst4.32 {d16, d17, d18, d19}, [r3, :64], r5 @ encoding: [0x95,0x00,0x43,0xf4] -@ CHECK: vst4.8 {d16, d18, d20, d22}, [r4, :256], r2 @ encoding: [0x32,0x01,0x44,0xf4] +@ CHECK: vst4.32 {d16, d17, d18, d19}, [r3:64], r5 @ encoding: [0x95,0x00,0x43,0xf4] +@ CHECK: vst4.8 {d16, d18, d20, d22}, [r4:256], r2 @ encoding: [0x32,0x01,0x44,0xf4] @ CHECK: vst4.16 {d16, d18, d20, d22}, [r6], r3 @ encoding: [0x43,0x01,0x46,0xf4] @ CHECK: vst4.32 {d17, d19, d21, d23}, [r9], r4 @ encoding: [0x84,0x11,0x49,0xf4] - vst2.8 {d16[1], d17[1]}, [r0, :16] - vst2.p16 {d16[1], d17[1]}, [r0, :32] + vst2.8 {d16[1], d17[1]}, [r0:16] + vst2.p16 {d16[1], d17[1]}, [r0:32] vst2.i32 {d16[1], d17[1]}, [r0] vst2.u16 {d17[1], d19[1]}, [r0] - vst2.f32 {d17[0], d19[0]}, [r0, :64] + vst2.f32 {d17[0], d19[0]}, [r0:64] vst2.8 {d2[4], d3[4]}, [r2], r3 vst2.u8 {d2[4], d3[4]}, [r2]! vst2.p8 {d2[4], d3[4]}, [r2] vst2.16 {d17[1], d19[1]}, [r0] - vst2.32 {d17[0], d19[0]}, [r0, :64] + vst2.32 {d17[0], d19[0]}, [r0:64] vst2.i16 {d7[1], d9[1]}, [r1]! - vst2.32 {d6[0], d8[0]}, [r2, :64]! + vst2.32 {d6[0], d8[0]}, [r2:64]! vst2.16 {d2[1], d4[1]}, [r3], r5 - vst2.u32 {d5[0], d7[0]}, [r4, :64], r7 + vst2.u32 {d5[0], d7[0]}, [r4:64], r7 -@ CHECK: vst2.8 {d16[1], d17[1]}, [r0, :16] @ encoding: [0x3f,0x01,0xc0,0xf4] -@ CHECK: vst2.16 {d16[1], d17[1]}, [r0, :32] @ encoding: [0x5f,0x05,0xc0,0xf4] +@ CHECK: vst2.8 {d16[1], d17[1]}, [r0:16] @ encoding: [0x3f,0x01,0xc0,0xf4] +@ CHECK: vst2.16 {d16[1], d17[1]}, [r0:32] @ encoding: [0x5f,0x05,0xc0,0xf4] @ CHECK: vst2.32 {d16[1], d17[1]}, [r0] @ encoding: [0x8f,0x09,0xc0,0xf4] @ CHECK: vst2.16 {d17[1], d19[1]}, [r0] @ encoding: [0x6f,0x15,0xc0,0xf4] -@ CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64] @ encoding: [0x5f,0x19,0xc0,0xf4] +@ CHECK: vst2.32 {d17[0], d19[0]}, [r0:64] @ encoding: [0x5f,0x19,0xc0,0xf4] @ CHECK: vst2.8 {d2[4], d3[4]}, [r2], r3 @ encoding: [0x83,0x21,0x82,0xf4] @ CHECK: vst2.8 {d2[4], d3[4]}, [r2]! @ encoding: [0x8d,0x21,0x82,0xf4] @ CHECK: vst2.8 {d2[4], d3[4]}, [r2] @ encoding: [0x8f,0x21,0x82,0xf4] @ CHECK: vst2.16 {d17[1], d19[1]}, [r0] @ encoding: [0x6f,0x15,0xc0,0xf4] -@ CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64] @ encoding: [0x5f,0x19,0xc0,0xf4] +@ CHECK: vst2.32 {d17[0], d19[0]}, [r0:64] @ encoding: [0x5f,0x19,0xc0,0xf4] @ CHECK: vst2.16 {d7[1], d9[1]}, [r1]! @ encoding: [0x6d,0x75,0x81,0xf4] -@ CHECK: vst2.32 {d6[0], d8[0]}, [r2, :64]! @ encoding: [0x5d,0x69,0x82,0xf4] +@ CHECK: vst2.32 {d6[0], d8[0]}, [r2:64]! @ encoding: [0x5d,0x69,0x82,0xf4] @ CHECK: vst2.16 {d2[1], d4[1]}, [r3], r5 @ encoding: [0x65,0x25,0x83,0xf4] -@ CHECK: vst2.32 {d5[0], d7[0]}, [r4, :64], r7 @ encoding: [0x57,0x59,0x84,0xf4] +@ CHECK: vst2.32 {d5[0], d7[0]}, [r4:64], r7 @ encoding: [0x57,0x59,0x84,0xf4] vst3.8 {d16[1], d17[1], d18[1]}, [r1] @@ -216,15 +216,15 @@ vst4.16 {d17[1], d19[1], d21[1], d23[1]}, [r7] vst4.32 {d16[1], d18[1], d20[1], d22[1]}, [r8] - vst4.s8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32]! - vst4.s16 {d16[1], d17[1], d18[1], d19[1]}, [r2, :64]! - vst4.s32 {d16[1], d17[1], d18[1], d19[1]}, [r3, :128]! + vst4.s8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32]! + vst4.s16 {d16[1], d17[1], d18[1], d19[1]}, [r2:64]! + vst4.s32 {d16[1], d17[1], d18[1], d19[1]}, [r3:128]! vst4.u16 {d17[1], d19[1], d21[1], d23[1]}, [r7]! vst4.u32 {d16[1], d18[1], d20[1], d22[1]}, [r8]! - vst4.p8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32], r8 + vst4.p8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32], r8 vst4.p16 {d16[1], d17[1], d18[1], d19[1]}, [r2], r7 - vst4.f32 {d16[1], d17[1], d18[1], d19[1]}, [r3, :64], r5 + vst4.f32 {d16[1], d17[1], d18[1], d19[1]}, [r3:64], r5 vst4.i16 {d16[1], d18[1], d20[1], d22[1]}, [r6], r3 vst4.i32 {d17[1], d19[1], d21[1], d23[1]}, [r9], r4 @@ -233,14 +233,14 @@ @ CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3] @ encoding: [0x8f,0x0b,0xc3,0xf4] @ CHECK: vst4.16 {d17[1], d19[1], d21[1], d23[1]}, [r7] @ encoding: [0x6f,0x17,0xc7,0xf4] @ CHECK: vst4.32 {d16[1], d18[1], d20[1], d22[1]}, [r8] @ encoding: [0xcf,0x0b,0xc8,0xf4] -@ CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32]! @ encoding: [0x3d,0x03,0xc1,0xf4] -@ CHECK: vst4.16 {d16[1], d17[1], d18[1], d19[1]}, [r2, :64]! @ encoding: [0x5d,0x07,0xc2,0xf4] -@ CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3, :128]! @ encoding: [0xad,0x0b,0xc3,0xf4] +@ CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32]! @ encoding: [0x3d,0x03,0xc1,0xf4] +@ CHECK: vst4.16 {d16[1], d17[1], d18[1], d19[1]}, [r2:64]! @ encoding: [0x5d,0x07,0xc2,0xf4] +@ CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3:128]! @ encoding: [0xad,0x0b,0xc3,0xf4] @ CHECK: vst4.16 {d17[1], d18[1], d19[1], d20[1]}, [r7]! @ encoding: [0x6d,0x17,0xc7,0xf4] @ CHECK: vst4.32 {d16[1], d18[1], d20[1], d22[1]}, [r8]! @ encoding: [0xcd,0x0b,0xc8,0xf4] -@ CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32], r8 @ encoding: [0x38,0x03,0xc1,0xf4] +@ CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32], r8 @ encoding: [0x38,0x03,0xc1,0xf4] @ CHECK: vst4.16 {d16[1], d17[1], d18[1], d19[1]}, [r2], r7 @ encoding: [0x47,0x07,0xc2,0xf4] -@ CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3, :64], r5 @ encoding: [0x95,0x0b,0xc3,0xf4] +@ CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r3:64], r5 @ encoding: [0x95,0x0b,0xc3,0xf4] @ CHECK: vst4.16 {d16[1], d18[1], d20[1], d22[1]}, [r6], r3 @ encoding: [0x63,0x07,0xc6,0xf4] @ CHECK: vst4.32 {d17[1], d19[1], d21[1], d23[1]}, [r9], r4 @ encoding: [0xc4,0x1b,0xc9,0xf4] @@ -269,10 +269,17 @@ vst2.8 {d8, d10}, [r4] @ CHECK: vst2.8 {d8, d10}, [r4] @ encoding: [0x0f,0x89,0x04,0xf4] - vst1.32 {d9[1]}, [r3, :32] - vst1.32 {d27[1]}, [r9, :32]! - vst1.32 {d27[1]}, [r3, :32], r5 -@ CHECK: vst1.32 {d9[1]}, [r3, :32] @ encoding: [0xbf,0x98,0x83,0xf4] -@ CHECK: vst1.32 {d27[1]}, [r9, :32]! @ encoding: [0xbd,0xb8,0xc9,0xf4] -@ CHECK: vst1.32 {d27[1]}, [r3, :32], r5 @ encoding: [0xb5,0xb8,0xc3,0xf4] + vst1.32 {d9[1]}, [r3:32] + vst1.32 {d27[1]}, [r9:32]! + vst1.32 {d27[1]}, [r3:32], r5 +@ CHECK: vst1.32 {d9[1]}, [r3:32] @ encoding: [0xbf,0x98,0x83,0xf4] +@ CHECK: vst1.32 {d27[1]}, [r9:32]! @ encoding: [0xbd,0xb8,0xc9,0xf4] +@ CHECK: vst1.32 {d27[1]}, [r3:32], r5 @ encoding: [0xb5,0xb8,0xc3,0xf4] +@ verify that the old incorrect alignment specifier syntax (", :") +@ still gets accepted. + vst2.8 {d16, d17}, [r0, :64] + vst2.16 {d16, d17}, [r0, :128] + +@ CHECK: vst2.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x08,0x40,0xf4] +@ CHECK: vst2.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x08,0x40,0xf4]
\ No newline at end of file diff --git a/test/MC/ARM/neont2-vld-encoding.s b/test/MC/ARM/neont2-vld-encoding.s index 031205a5cc8a..7db855278116 100644 --- a/test/MC/ARM/neont2-vld-encoding.s +++ b/test/MC/ARM/neont2-vld-encoding.s @@ -3,46 +3,46 @@ .code 16 -@ CHECK: vld1.8 {d16}, [r0, :64] @ encoding: [0x1f,0x07,0x60,0xf9] - vld1.8 {d16}, [r0, :64] +@ CHECK: vld1.8 {d16}, [r0:64] @ encoding: [0x1f,0x07,0x60,0xf9] + vld1.8 {d16}, [r0:64] @ CHECK: vld1.16 {d16}, [r0] @ encoding: [0x4f,0x07,0x60,0xf9] vld1.16 {d16}, [r0] @ CHECK: vld1.32 {d16}, [r0] @ encoding: [0x8f,0x07,0x60,0xf9] vld1.32 {d16}, [r0] @ CHECK: vld1.64 {d16}, [r0] @ encoding: [0xcf,0x07,0x60,0xf9] vld1.64 {d16}, [r0] -@ CHECK: vld1.8 {d16, d17}, [r0, :64] @ encoding: [0x1f,0x0a,0x60,0xf9] - vld1.8 {d16, d17}, [r0, :64] -@ CHECK: vld1.16 {d16, d17}, [r0, :128] @ encoding: [0x6f,0x0a,0x60,0xf9] - vld1.16 {d16, d17}, [r0, :128] +@ CHECK: vld1.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x0a,0x60,0xf9] + vld1.8 {d16, d17}, [r0:64] +@ CHECK: vld1.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x0a,0x60,0xf9] + vld1.16 {d16, d17}, [r0:128] @ CHECK: vld1.32 {d16, d17}, [r0] @ encoding: [0x8f,0x0a,0x60,0xf9] vld1.32 {d16, d17}, [r0] @ CHECK: vld1.64 {d16, d17}, [r0] @ encoding: [0xcf,0x0a,0x60,0xf9] vld1.64 {d16, d17}, [r0] -@ CHECK: vld2.8 {d16, d17}, [r0, :64] @ encoding: [0x1f,0x08,0x60,0xf9] - vld2.8 {d16, d17}, [r0, :64] -@ CHECK: vld2.16 {d16, d17}, [r0, :128] @ encoding: [0x6f,0x08,0x60,0xf9] - vld2.16 {d16, d17}, [r0, :128] +@ CHECK: vld2.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x08,0x60,0xf9] + vld2.8 {d16, d17}, [r0:64] +@ CHECK: vld2.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x08,0x60,0xf9] + vld2.16 {d16, d17}, [r0:128] @ CHECK: vld2.32 {d16, d17}, [r0] @ encoding: [0x8f,0x08,0x60,0xf9] vld2.32 {d16, d17}, [r0] -@ CHECK: vld2.8 {d16, d17, d18, d19}, [r0, :64] @ encoding: [0x1f,0x03,0x60,0xf9] - vld2.8 {d16, d17, d18, d19}, [r0, :64] -@ CHECK: vld2.16 {d16, d17, d18, d19}, [r0, :128] @ encoding: [0x6f,0x03,0x60,0xf9] - vld2.16 {d16, d17, d18, d19}, [r0, :128] -@ CHECK: vld2.32 {d16, d17, d18, d19}, [r0, :256] @ encoding: [0xbf,0x03,0x60,0xf9] - vld2.32 {d16, d17, d18, d19}, [r0, :256] +@ CHECK: vld2.8 {d16, d17, d18, d19}, [r0:64] @ encoding: [0x1f,0x03,0x60,0xf9] + vld2.8 {d16, d17, d18, d19}, [r0:64] +@ CHECK: vld2.16 {d16, d17, d18, d19}, [r0:128] @ encoding: [0x6f,0x03,0x60,0xf9] + vld2.16 {d16, d17, d18, d19}, [r0:128] +@ CHECK: vld2.32 {d16, d17, d18, d19}, [r0:256] @ encoding: [0xbf,0x03,0x60,0xf9] + vld2.32 {d16, d17, d18, d19}, [r0:256] -@ CHECK: vld3.8 {d16, d17, d18}, [r0, :64] @ encoding: [0x1f,0x04,0x60,0xf9] - vld3.8 {d16, d17, d18}, [r0, :64] +@ CHECK: vld3.8 {d16, d17, d18}, [r0:64] @ encoding: [0x1f,0x04,0x60,0xf9] + vld3.8 {d16, d17, d18}, [r0:64] @ CHECK: vld3.16 {d16, d17, d18}, [r0] @ encoding: [0x4f,0x04,0x60,0xf9] vld3.16 {d16, d17, d18}, [r0] @ CHECK: vld3.32 {d16, d17, d18}, [r0] @ encoding: [0x8f,0x04,0x60,0xf9] vld3.32 {d16, d17, d18}, [r0] -@ CHECK: vld3.8 {d16, d18, d20}, [r0, :64]! @ encoding: [0x1d,0x05,0x60,0xf9] - vld3.8 {d16, d18, d20}, [r0, :64]! -@ CHECK: vld3.8 {d17, d19, d21}, [r0, :64]! @ encoding: [0x1d,0x15,0x60,0xf9] - vld3.8 {d17, d19, d21}, [r0, :64]! +@ CHECK: vld3.8 {d16, d18, d20}, [r0:64]! @ encoding: [0x1d,0x05,0x60,0xf9] + vld3.8 {d16, d18, d20}, [r0:64]! +@ CHECK: vld3.8 {d17, d19, d21}, [r0:64]! @ encoding: [0x1d,0x15,0x60,0xf9] + vld3.8 {d17, d19, d21}, [r0:64]! @ CHECK: vld3.16 {d16, d18, d20}, [r0]! @ encoding: [0x4d,0x05,0x60,0xf9] vld3.16 {d16, d18, d20}, [r0]! @ CHECK: vld3.16 {d17, d19, d21}, [r0]! @ encoding: [0x4d,0x15,0x60,0xf9] @@ -52,16 +52,16 @@ @ CHECK: vld3.32 {d17, d19, d21}, [r0]! @ encoding: [0x8d,0x15,0x60,0xf9] vld3.32 {d17, d19, d21}, [r0]! -@ CHECK: vld4.8 {d16, d17, d18, d19}, [r0, :64] @ encoding: [0x1f,0x00,0x60,0xf9] - vld4.8 {d16, d17, d18, d19}, [r0, :64] -@ CHECK: vld4.16 {d16, d17, d18, d19}, [r0, :128] @ encoding: [0x6f,0x00,0x60,0xf9] - vld4.16 {d16, d17, d18, d19}, [r0, :128] -@ CHECK: vld4.32 {d16, d17, d18, d19}, [r0, :256] @ encoding: [0xbf,0x00,0x60,0xf9] - vld4.32 {d16, d17, d18, d19}, [r0, :256] -@ CHECK: vld4.8 {d16, d18, d20, d22}, [r0, :256]! @ encoding: [0x3d,0x01,0x60,0xf9] - vld4.8 {d16, d18, d20, d22}, [r0, :256]! -@ CHECK: vld4.8 {d17, d19, d21, d23}, [r0, :256]! @ encoding: [0x3d,0x11,0x60,0xf9] - vld4.8 {d17, d19, d21, d23}, [r0, :256]! +@ CHECK: vld4.8 {d16, d17, d18, d19}, [r0:64] @ encoding: [0x1f,0x00,0x60,0xf9] + vld4.8 {d16, d17, d18, d19}, [r0:64] +@ CHECK: vld4.16 {d16, d17, d18, d19}, [r0:128] @ encoding: [0x6f,0x00,0x60,0xf9] + vld4.16 {d16, d17, d18, d19}, [r0:128] +@ CHECK: vld4.32 {d16, d17, d18, d19}, [r0:256] @ encoding: [0xbf,0x00,0x60,0xf9] + vld4.32 {d16, d17, d18, d19}, [r0:256] +@ CHECK: vld4.8 {d16, d18, d20, d22}, [r0:256]! @ encoding: [0x3d,0x01,0x60,0xf9] + vld4.8 {d16, d18, d20, d22}, [r0:256]! +@ CHECK: vld4.8 {d17, d19, d21, d23}, [r0:256]! @ encoding: [0x3d,0x11,0x60,0xf9] + vld4.8 {d17, d19, d21, d23}, [r0:256]! @ CHECK: vld4.16 {d16, d18, d20, d22}, [r0]! @ encoding: [0x4d,0x01,0x60,0xf9] vld4.16 {d16, d18, d20, d22}, [r0]! @ CHECK: vld4.16 {d17, d19, d21, d23}, [r0]! @ encoding: [0x4d,0x11,0x60,0xf9] @@ -73,21 +73,21 @@ @ CHECK: vld1.8 {d16[3]}, [r0] @ encoding: [0x6f,0x00,0xe0,0xf9] vld1.8 {d16[3]}, [r0] -@ CHECK: vld1.16 {d16[2]}, [r0, :16] @ encoding: [0x9f,0x04,0xe0,0xf9] - vld1.16 {d16[2]}, [r0, :16] -@ CHECK: vld1.32 {d16[1]}, [r0, :32] @ encoding: [0xbf,0x08,0xe0,0xf9] - vld1.32 {d16[1]}, [r0, :32] +@ CHECK: vld1.16 {d16[2]}, [r0:16] @ encoding: [0x9f,0x04,0xe0,0xf9] + vld1.16 {d16[2]}, [r0:16] +@ CHECK: vld1.32 {d16[1]}, [r0:32] @ encoding: [0xbf,0x08,0xe0,0xf9] + vld1.32 {d16[1]}, [r0:32] -@ CHECK: vld2.8 {d16[1], d17[1]}, [r0, :16] @ encoding: [0x3f,0x01,0xe0,0xf9] - vld2.8 {d16[1], d17[1]}, [r0, :16] -@ CHECK: vld2.16 {d16[1], d17[1]}, [r0, :32] @ encoding: [0x5f,0x05,0xe0,0xf9] - vld2.16 {d16[1], d17[1]}, [r0, :32] +@ CHECK: vld2.8 {d16[1], d17[1]}, [r0:16] @ encoding: [0x3f,0x01,0xe0,0xf9] + vld2.8 {d16[1], d17[1]}, [r0:16] +@ CHECK: vld2.16 {d16[1], d17[1]}, [r0:32] @ encoding: [0x5f,0x05,0xe0,0xf9] + vld2.16 {d16[1], d17[1]}, [r0:32] @ CHECK: vld2.32 {d16[1], d17[1]}, [r0] @ encoding: [0x8f,0x09,0xe0,0xf9] vld2.32 {d16[1], d17[1]}, [r0] @ CHECK: vld2.16 {d17[1], d19[1]}, [r0] @ encoding: [0x6f,0x15,0xe0,0xf9] vld2.16 {d17[1], d19[1]}, [r0] -@ CHECK: vld2.32 {d17[0], d19[0]}, [r0, :64] @ encoding: [0x5f,0x19,0xe0,0xf9] - vld2.32 {d17[0], d19[0]}, [r0, :64] +@ CHECK: vld2.32 {d17[0], d19[0]}, [r0:64] @ encoding: [0x5f,0x19,0xe0,0xf9] + vld2.32 {d17[0], d19[0]}, [r0:64] @ CHECK: vld3.8 {d16[1], d17[1], d18[1]}, [r0] @ encoding: [0x2f,0x02,0xe0,0xf9] vld3.8 {d16[1], d17[1], d18[1]}, [r0] @@ -100,13 +100,13 @@ @ CHECK: vld3.32 {d17[1], d19[1], d21[1]}, [r0] @ encoding: [0xcf,0x1a,0xe0,0xf9] vld3.32 {d17[1], d19[1], d21[1]}, [r0] -@ CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] @ encoding: [0x3f,0x03,0xe0,0xf9] - vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] +@ CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] @ encoding: [0x3f,0x03,0xe0,0xf9] + vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] @ CHECK: vld4.16 {d16[1], d17[1], d18[1], d19[1]}, [r0] @ encoding: [0x4f,0x07,0xe0,0xf9] vld4.16 {d16[1], d17[1], d18[1], d19[1]}, [r0] -@ CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] @ encoding: [0xaf,0x0b,0xe0,0xf9] - vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] -@ CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r0, :64] @ encoding: [0x7f,0x07,0xe0,0xf9] - vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r0, :64] +@ CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] @ encoding: [0xaf,0x0b,0xe0,0xf9] + vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] +@ CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r0:64] @ encoding: [0x7f,0x07,0xe0,0xf9] + vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r0:64] @ CHECK: vld4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] @ encoding: [0x4f,0x1b,0xe0,0xf9] vld4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] diff --git a/test/MC/ARM/neont2-vst-encoding.s b/test/MC/ARM/neont2-vst-encoding.s index b50d8b63c1c2..9adf7514f4b7 100644 --- a/test/MC/ARM/neont2-vst-encoding.s +++ b/test/MC/ARM/neont2-vst-encoding.s @@ -3,46 +3,46 @@ .code 16 -@ CHECK: vst1.8 {d16}, [r0, :64] @ encoding: [0x1f,0x07,0x40,0xf9] - vst1.8 {d16}, [r0, :64] +@ CHECK: vst1.8 {d16}, [r0:64] @ encoding: [0x1f,0x07,0x40,0xf9] + vst1.8 {d16}, [r0:64] @ CHECK: vst1.16 {d16}, [r0] @ encoding: [0x4f,0x07,0x40,0xf9] vst1.16 {d16}, [r0] @ CHECK: vst1.32 {d16}, [r0] @ encoding: [0x8f,0x07,0x40,0xf9] vst1.32 {d16}, [r0] @ CHECK: vst1.64 {d16}, [r0] @ encoding: [0xcf,0x07,0x40,0xf9] vst1.64 {d16}, [r0] -@ CHECK: vst1.8 {d16, d17}, [r0, :64] @ encoding: [0x1f,0x0a,0x40,0xf9] - vst1.8 {d16, d17}, [r0, :64] -@ CHECK: vst1.16 {d16, d17}, [r0, :128] @ encoding: [0x6f,0x0a,0x40,0xf9] - vst1.16 {d16, d17}, [r0, :128] +@ CHECK: vst1.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x0a,0x40,0xf9] + vst1.8 {d16, d17}, [r0:64] +@ CHECK: vst1.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x0a,0x40,0xf9] + vst1.16 {d16, d17}, [r0:128] @ CHECK: vst1.32 {d16, d17}, [r0] @ encoding: [0x8f,0x0a,0x40,0xf9] vst1.32 {d16, d17}, [r0] @ CHECK: vst1.64 {d16, d17}, [r0] @ encoding: [0xcf,0x0a,0x40,0xf9] vst1.64 {d16, d17}, [r0] -@ CHECK: vst2.8 {d16, d17}, [r0, :64] @ encoding: [0x1f,0x08,0x40,0xf9] - vst2.8 {d16, d17}, [r0, :64] -@ CHECK: vst2.16 {d16, d17}, [r0, :128] @ encoding: [0x6f,0x08,0x40,0xf9] - vst2.16 {d16, d17}, [r0, :128] +@ CHECK: vst2.8 {d16, d17}, [r0:64] @ encoding: [0x1f,0x08,0x40,0xf9] + vst2.8 {d16, d17}, [r0:64] +@ CHECK: vst2.16 {d16, d17}, [r0:128] @ encoding: [0x6f,0x08,0x40,0xf9] + vst2.16 {d16, d17}, [r0:128] @ CHECK: vst2.32 {d16, d17}, [r0] @ encoding: [0x8f,0x08,0x40,0xf9] vst2.32 {d16, d17}, [r0] -@ CHECK: vst2.8 {d16, d17, d18, d19}, [r0, :64] @ encoding: [0x1f,0x03,0x40,0xf9] - vst2.8 {d16, d17, d18, d19}, [r0, :64] -@ CHECK: vst2.16 {d16, d17, d18, d19}, [r0, :128] @ encoding: [0x6f,0x03,0x40,0xf9] - vst2.16 {d16, d17, d18, d19}, [r0, :128] -@ CHECK: vst2.32 {d16, d17, d18, d19}, [r0, :256] @ encoding: [0xbf,0x03,0x40,0xf9] - vst2.32 {d16, d17, d18, d19}, [r0, :256] +@ CHECK: vst2.8 {d16, d17, d18, d19}, [r0:64] @ encoding: [0x1f,0x03,0x40,0xf9] + vst2.8 {d16, d17, d18, d19}, [r0:64] +@ CHECK: vst2.16 {d16, d17, d18, d19}, [r0:128] @ encoding: [0x6f,0x03,0x40,0xf9] + vst2.16 {d16, d17, d18, d19}, [r0:128] +@ CHECK: vst2.32 {d16, d17, d18, d19}, [r0:256] @ encoding: [0xbf,0x03,0x40,0xf9] + vst2.32 {d16, d17, d18, d19}, [r0:256] -@ CHECK: vst3.8 {d16, d17, d18}, [r0, :64] @ encoding: [0x1f,0x04,0x40,0xf9] - vst3.8 {d16, d17, d18}, [r0, :64] +@ CHECK: vst3.8 {d16, d17, d18}, [r0:64] @ encoding: [0x1f,0x04,0x40,0xf9] + vst3.8 {d16, d17, d18}, [r0:64] @ CHECK: vst3.16 {d16, d17, d18}, [r0] @ encoding: [0x4f,0x04,0x40,0xf9] vst3.16 {d16, d17, d18}, [r0] @ CHECK: vst3.32 {d16, d17, d18}, [r0] @ encoding: [0x8f,0x04,0x40,0xf9] vst3.32 {d16, d17, d18}, [r0] -@ CHECK: vst3.8 {d16, d18, d20}, [r0, :64]! @ encoding: [0x1d,0x05,0x40,0xf9] - vst3.8 {d16, d18, d20}, [r0, :64]! -@ CHECK: vst3.8 {d17, d19, d21}, [r0, :64]! @ encoding: [0x1d,0x15,0x40,0xf9] - vst3.8 {d17, d19, d21}, [r0, :64]! +@ CHECK: vst3.8 {d16, d18, d20}, [r0:64]! @ encoding: [0x1d,0x05,0x40,0xf9] + vst3.8 {d16, d18, d20}, [r0:64]! +@ CHECK: vst3.8 {d17, d19, d21}, [r0:64]! @ encoding: [0x1d,0x15,0x40,0xf9] + vst3.8 {d17, d19, d21}, [r0:64]! @ CHECK: vst3.16 {d16, d18, d20}, [r0]! @ encoding: [0x4d,0x05,0x40,0xf9] vst3.16 {d16, d18, d20}, [r0]! @ CHECK: vst3.16 {d17, d19, d21}, [r0]! @ encoding: [0x4d,0x15,0x40,0xf9] @@ -52,14 +52,14 @@ @ CHECK: vst3.32 {d17, d19, d21}, [r0]! @ encoding: [0x8d,0x15,0x40,0xf9] vst3.32 {d17, d19, d21}, [r0]! -@ CHECK: vst4.8 {d16, d17, d18, d19}, [r0, :64] @ encoding: [0x1f,0x00,0x40,0xf9] - vst4.8 {d16, d17, d18, d19}, [r0, :64] -@ CHECK: vst4.16 {d16, d17, d18, d19}, [r0, :128] @ encoding: [0x6f,0x00,0x40,0xf9] - vst4.16 {d16, d17, d18, d19}, [r0, :128] -@ CHECK: vst4.8 {d16, d18, d20, d22}, [r0, :256]! @ encoding: [0x3d,0x01,0x40,0xf9] - vst4.8 {d16, d18, d20, d22}, [r0, :256]! -@ CHECK: vst4.8 {d17, d19, d21, d23}, [r0, :256]! @ encoding: [0x3d,0x11,0x40,0xf9] - vst4.8 {d17, d19, d21, d23}, [r0, :256]! +@ CHECK: vst4.8 {d16, d17, d18, d19}, [r0:64] @ encoding: [0x1f,0x00,0x40,0xf9] + vst4.8 {d16, d17, d18, d19}, [r0:64] +@ CHECK: vst4.16 {d16, d17, d18, d19}, [r0:128] @ encoding: [0x6f,0x00,0x40,0xf9] + vst4.16 {d16, d17, d18, d19}, [r0:128] +@ CHECK: vst4.8 {d16, d18, d20, d22}, [r0:256]! @ encoding: [0x3d,0x01,0x40,0xf9] + vst4.8 {d16, d18, d20, d22}, [r0:256]! +@ CHECK: vst4.8 {d17, d19, d21, d23}, [r0:256]! @ encoding: [0x3d,0x11,0x40,0xf9] + vst4.8 {d17, d19, d21, d23}, [r0:256]! @ CHECK: vst4.16 {d16, d18, d20, d22}, [r0]! @ encoding: [0x4d,0x01,0x40,0xf9] vst4.16 {d16, d18, d20, d22}, [r0]! @ CHECK: vst4.16 {d17, d19, d21, d23}, [r0]! @ encoding: [0x4d,0x11,0x40,0xf9] @@ -69,16 +69,16 @@ @ CHECK: vst4.32 {d17, d19, d21, d23}, [r0]! @ encoding: [0x8d,0x11,0x40,0xf9] vst4.32 {d17, d19, d21, d23}, [r0]! -@ CHECK: vst2.8 {d16[1], d17[1]}, [r0, :16] @ encoding: [0x3f,0x01,0xc0,0xf9] - vst2.8 {d16[1], d17[1]}, [r0, :16] -@ CHECK: vst2.16 {d16[1], d17[1]}, [r0, :32] @ encoding: [0x5f,0x05,0xc0,0xf9] - vst2.16 {d16[1], d17[1]}, [r0, :32] +@ CHECK: vst2.8 {d16[1], d17[1]}, [r0:16] @ encoding: [0x3f,0x01,0xc0,0xf9] + vst2.8 {d16[1], d17[1]}, [r0:16] +@ CHECK: vst2.16 {d16[1], d17[1]}, [r0:32] @ encoding: [0x5f,0x05,0xc0,0xf9] + vst2.16 {d16[1], d17[1]}, [r0:32] @ CHECK: vst2.32 {d16[1], d17[1]}, [r0] @ encoding: [0x8f,0x09,0xc0,0xf9] vst2.32 {d16[1], d17[1]}, [r0] @ CHECK: vst2.16 {d17[1], d19[1]}, [r0] @ encoding: [0x6f,0x15,0xc0,0xf9] vst2.16 {d17[1], d19[1]}, [r0] -@ CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64] @ encoding: [0x5f,0x19,0xc0,0xf9] - vst2.32 {d17[0], d19[0]}, [r0, :64] +@ CHECK: vst2.32 {d17[0], d19[0]}, [r0:64] @ encoding: [0x5f,0x19,0xc0,0xf9] + vst2.32 {d17[0], d19[0]}, [r0:64] @ CHECK: vst3.8 {d16[1], d17[1], d18[1]}, [r0] @ encoding: [0x2f,0x02,0xc0,0xf9] vst3.8 {d16[1], d17[1], d18[1]}, [r0] @@ -91,14 +91,14 @@ @ CHECK: vst3.32 {d16[0], d18[0], d20[0]}, [r0] @ encoding: [0x4f,0x0a,0xc0,0xf9] vst3.32 {d16[0], d18[0], d20[0]}, [r0] -@ CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] @ encoding: [0x3f,0x03,0xc0,0xf9] - vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] +@ CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] @ encoding: [0x3f,0x03,0xc0,0xf9] + vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] @ CHECK: vst4.16 {d16[1], d17[1], d18[1], d19[1]}, [r0] @ encoding: [0x4f,0x07,0xc0,0xf9] vst4.16 {d16[1], d17[1], d18[1], d19[1]}, [r0] -@ CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] @ encoding: [0xaf,0x0b,0xc0,0xf9] - vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] -@ CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0, :64] @ encoding: [0xff,0x17,0xc0,0xf9] - vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0, :64] +@ CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] @ encoding: [0xaf,0x0b,0xc0,0xf9] + vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] +@ CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0:64] @ encoding: [0xff,0x17,0xc0,0xf9] + vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0:64] @ CHECK: vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] @ encoding: [0x4f,0x1b,0xc0,0xf9] vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] diff --git a/test/MC/ARM/relocated-mapping.s b/test/MC/ARM/relocated-mapping.s new file mode 100644 index 000000000000..3bed14c4520a --- /dev/null +++ b/test/MC/ARM/relocated-mapping.s @@ -0,0 +1,11 @@ +@ RUN: llvm-mc -triple=arm-linux-gnueabi -filetype=obj < %s | llvm-objdump -t - | FileCheck %s + +@ Implementation-detail test (unfortunately): values that are relocated do not +@ go via MCStreamer::EmitBytes; make sure they still emit a mapping symbol. + add r0, r0, r0 + .word somewhere + add r0, r0, r0 + +@ CHECK: 00000000 .text 00000000 $a +@ CHECK-NEXT: 00000008 .text 00000000 $a +@ CHECK-NEXT: 00000004 .text 00000000 $d diff --git a/test/MC/AsmParser/align_invalid.s b/test/MC/AsmParser/align_invalid.s new file mode 100644 index 000000000000..0d06d9423ced --- /dev/null +++ b/test/MC/AsmParser/align_invalid.s @@ -0,0 +1,10 @@ +# RUN: llvm-mc -triple i386-linux-gnu < %s 2>&1 | FileCheck %s -check-prefix=ELF +# RUN: llvm-mc -triple i386-apple-darwin < %s 2>&1 | FileCheck %s -check-prefix=DARWIN + +.align 3 +# ELF: error: alignment must be a power of 2 +# DARWIN-NOT: error + +.align 32 +# ELF-NOT: error +# DARWIN: error: invalid alignment value diff --git a/test/MC/AsmParser/directive_values.s b/test/MC/AsmParser/directive_values.s index 6c79c38bf569..ed932b297462 100644 --- a/test/MC/AsmParser/directive_values.s +++ b/test/MC/AsmParser/directive_values.s @@ -63,3 +63,9 @@ TEST7: # CHECK-NEXT: .byte 2 # CHECK-NEXT: .byte 3 # CHECK-NEXT: .byte 4 + +TEST8: + .long 0x200000UL+1 + .long 0x200000L+1 +# CHECK: .long 2097153 +# CHECK: .long 2097153 diff --git a/test/MC/AsmParser/section_names.s b/test/MC/AsmParser/section_names.s new file mode 100644 index 000000000000..332cdbe3fed5 --- /dev/null +++ b/test/MC/AsmParser/section_names.s @@ -0,0 +1,62 @@ +# RUN: llvm-mc -triple i386-pc-linux-gnu -filetype=obj -o %t %s +# RUN: elf-dump --dump-section-data < %t | FileCheck %s +.section .nobits +.byte 1 +.section .nobits2 +.byte 1 +.section .nobitsfoo +.byte 1 +.section .init_array +.byte 1 +.section .init_array2 +.byte 1 +.section .init_arrayfoo +.byte 1 +.section .fini_array +.byte 1 +.section .fini_array2 +.byte 1 +.section .fini_arrayfoo +.byte 1 +.section .preinit_array +.byte 1 +.section .preinit_array2 +.byte 1 +.section .preinit_arrayfoo +.byte 1 +.section .note +.byte 1 +.section .note2 +.byte 1 +.section .notefoo +.byte 1 +# CHECK: (('sh_name', 0x00000{{...}}) # '.nobits' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.nobits2' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.nobitsfoo' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.init_array' +# CHECK-NEXT: ('sh_type', 0x0000000e) +# CHECK: (('sh_name', 0x00000{{...}}) # '.init_array2' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.init_arrayfoo' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.fini_array' +# CHECK-NEXT: ('sh_type', 0x0000000f) +# CHECK: (('sh_name', 0x00000{{...}}) # '.fini_array2' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.fini_arrayfoo' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.preinit_array' +# CHECK-NEXT: ('sh_type', 0x00000010) +# CHECK: (('sh_name', 0x00000{{...}}) # '.preinit_array2' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.preinit_arrayfoo' +# CHECK-NEXT: ('sh_type', 0x00000001) +# CHECK: (('sh_name', 0x00000{{...}}) # '.note' +# CHECK-NEXT: ('sh_type', 0x00000007) +# CHECK: (('sh_name', 0x00000{{...}}) # '.note2' +# CHECK-NEXT: ('sh_type', 0x00000007) +#CHECK: (('sh_name', 0x00000{{...}}) # '.notefoo' +# CHECK-NEXT: ('sh_type', 0x00000007) diff --git a/test/MC/COFF/symbol-alias.s b/test/MC/COFF/symbol-alias.s index 03f07b2e5685..4b1772ce711b 100644 --- a/test/MC/COFF/symbol-alias.s +++ b/test/MC/COFF/symbol-alias.s @@ -23,8 +23,11 @@ _bar: .long 0 # 0x0 +# Order is important here. Assign _bar_alias_alias before _bar_alias. .globl _foo_alias _foo_alias = _foo + .globl _bar_alias_alias +_bar_alias_alias = _bar_alias .globl _bar_alias _bar_alias = _bar @@ -52,6 +55,14 @@ _bar_alias = _bar // CHECK-NEXT: StorageClass = [[FOO_STORAGE_CLASS]] // CHECK-NEXT: NumberOfAuxSymbols = [[FOO_NUMBER_OF_AUX_SYMBOLS]] +// CHECK: Name = {{_?}}bar_alias_alias +// CHECK-NEXT: Value = [[BAR_VALUE]] +// CHECK-NEXT: SectionNumber = [[BAR_SECTION_NUMBER]] +// CHECK-NEXT: SimpleType = [[BAR_SIMPLE_TYPE]] +// CHECK-NEXT: ComplexType = [[BAR_COMPLEX_TYPE]] +// CHECK-NEXT: StorageClass = [[BAR_STORAGE_CLASS]] +// CHECK-NEXT: NumberOfAuxSymbols = [[BAR_NUMBER_OF_AUX_SYMBOLS]] + // CHECK: Name = {{_?}}bar_alias // CHECK-NEXT: Value = [[BAR_VALUE]] // CHECK-NEXT: SectionNumber = [[BAR_SECTION_NUMBER]] diff --git a/test/MC/COFF/weak-symbol-section-specification.ll b/test/MC/COFF/weak-symbol-section-specification.ll new file mode 100644 index 000000000000..5049372959fb --- /dev/null +++ b/test/MC/COFF/weak-symbol-section-specification.ll @@ -0,0 +1,23 @@ +; The purpose of this test is to verify that weak linkage type is not ignored by backend, +; if section was specialized. + +; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s + +@a = weak unnamed_addr constant { i32, i32, i32 } { i32 0, i32 0, i32 0}, section ".data" + +; CHECK: Name = .data$a +; CHECK-NEXT: VirtualSize = 0 +; CHECK-NEXT: VirtualAddress = 0 +; CHECK-NEXT: SizeOfRawData = {{[0-9]+}} +; CHECK-NEXT: PointerToRawData = 0x{{[0-9A-F]+}} +; CHECK-NEXT: PointerToRelocations = 0x0 +; CHECK-NEXT: PointerToLineNumbers = 0x0 +; CHECK-NEXT: NumberOfRelocations = 0 +; CHECK-NEXT: NumberOfLineNumbers = 0 +; CHECK-NEXT: Charateristics = 0x40401040 +; CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA +; CHECK-NEXT: IMAGE_SCN_LNK_COMDAT +; CHECK-NEXT: IMAGE_SCN_ALIGN_8BYTES +; CHECK-NEXT: IMAGE_SCN_MEM_READ +; CHECK-NEXT: SectionData = +; CHECK-NEXT: 00 00 00 00 00 00 00 00 - 00 00 00 00 diff --git a/test/MC/Disassembler/AArch64/a64-ignored-fields.txt b/test/MC/Disassembler/AArch64/a64-ignored-fields.txt new file mode 100644 index 000000000000..966530d36a33 --- /dev/null +++ b/test/MC/Disassembler/AArch64/a64-ignored-fields.txt @@ -0,0 +1,8 @@ +# RUN: llvm-mc -triple=aarch64 -disassemble -show-encoding < %s | FileCheck %s + +# The "Rm" bits are ignored, but the canonical representation has them filled +# with 0s. This is what we should produce even if the input bit-pattern had +# something else there. + +# CHECK: fcmp s31, #0.0 // encoding: [0xe8,0x23,0x20,0x1e] +0xe8 0x23 0x33 0x1e diff --git a/test/MC/Disassembler/AArch64/basic-a64-instructions.txt b/test/MC/Disassembler/AArch64/basic-a64-instructions.txt new file mode 100644 index 000000000000..4fa2d5078b2f --- /dev/null +++ b/test/MC/Disassembler/AArch64/basic-a64-instructions.txt @@ -0,0 +1,4200 @@ +# RUN: llvm-mc -triple=aarch64 -disassemble < %s | FileCheck %s + +#------------------------------------------------------------------------------ +# Add/sub (immediate) +#------------------------------------------------------------------------------ +# CHECK: add w4, w5, #0 +# CHECK: add w2, w3, #4095 +# CHECK: add w30, w29, #1, lsl #12 +# CHECK: add w13, w5, #4095, lsl #12 +# CHECK: add x5, x7, #1638 +0xa4 0x0 0x0 0x11 +0x62 0xfc 0x3f 0x11 +0xbe 0x7 0x40 0x11 +0xad 0xfc 0x7f 0x11 +0xe5 0x98 0x19 0x91 + +# CHECK: add w20, wsp, #801 +# CHECK: add wsp, wsp, #1104 +# CHECK: add wsp, w30, #4084 +0xf4 0x87 0xc 0x11 +0xff 0x43 0x11 0x11 +0xdf 0xd3 0x3f 0x11 + +# CHECK: add x0, x24, #291 +# CHECK: add x3, x24, #4095, lsl #12 +# CHECK: add x8, sp, #1074 +# CHECK: add sp, x29, #3816 +0x0 0x8f 0x4 0x91 +0x3 0xff 0x7f 0x91 +0xe8 0xcb 0x10 0x91 +0xbf 0xa3 0x3b 0x91 + +# CHECK: sub w0, wsp, #4077 +# CHECK: sub w4, w20, #546, lsl #12 +# CHECK: sub sp, sp, #288 +# CHECK: sub wsp, w19, #16 +0xe0 0xb7 0x3f 0x51 +0x84 0x8a 0x48 0x51 +0xff 0x83 0x4 0xd1 +0x7f 0x42 0x0 0x51 + + +# CHECK: adds w13, w23, #291, lsl #12 +# CHECK: cmn w2, #4095 +# CHECK: adds w20, wsp, #0 +# CHECK: cmn x3, #1, lsl #12 +0xed 0x8e 0x44 0x31 +0x5f 0xfc 0x3f 0x31 +0xf4 0x3 0x0 0x31 +0x7f 0x4 0x40 0xb1 + +# CHECK: cmp sp, #20, lsl #12 +# CHECK: cmp x30, #4095 +# CHECK: subs x4, sp, #3822 +0xff 0x53 0x40 0xf1 +0xdf 0xff 0x3f 0xf1 +0xe4 0xbb 0x3b 0xf1 + +# These should really be CMN +# CHECK: cmn w3, #291, lsl #12 +# CHECK: cmn wsp, #1365 +# CHECK: cmn sp, #1092, lsl #12 +0x7f 0x8c 0x44 0x31 +0xff 0x57 0x15 0x31 +0xff 0x13 0x51 0xb1 + +# CHECK: mov sp, x30 +# CHECK: mov wsp, w20 +# CHECK: mov x11, sp +# CHECK: mov w24, wsp +0xdf 0x3 0x0 0x91 +0x9f 0x2 0x0 0x11 +0xeb 0x3 0x0 0x91 +0xf8 0x3 0x0 0x11 + +#------------------------------------------------------------------------------ +# Add-subtract (shifted register) +#------------------------------------------------------------------------------ + +# CHECK: add w3, w5, w7 +# CHECK: add wzr, w3, w5 +# CHECK: add w20, wzr, w4 +# CHECK: add w4, w6, wzr +# CHECK: add w11, w13, w15 +# CHECK: add w9, w3, wzr, lsl #10 +# CHECK: add w17, w29, w20, lsl #31 +# CHECK: add w21, w22, w23, lsr #0 +# CHECK: add w24, w25, w26, lsr #18 +# CHECK: add w27, w28, w29, lsr #31 +# CHECK: add w2, w3, w4, asr #0 +# CHECK: add w5, w6, w7, asr #21 +# CHECK: add w8, w9, w10, asr #31 +0xa3 0x0 0x7 0xb +0x7f 0x0 0x5 0xb +0xf4 0x3 0x4 0xb +0xc4 0x0 0x1f 0xb +0xab 0x1 0xf 0xb +0x69 0x28 0x1f 0xb +0xb1 0x7f 0x14 0xb +0xd5 0x2 0x57 0xb +0x38 0x4b 0x5a 0xb +0x9b 0x7f 0x5d 0xb +0x62 0x0 0x84 0xb +0xc5 0x54 0x87 0xb +0x28 0x7d 0x8a 0xb + +# CHECK: add x3, x5, x7 +# CHECK: add xzr, x3, x5 +# CHECK: add x20, xzr, x4 +# CHECK: add x4, x6, xzr +# CHECK: add x11, x13, x15 +# CHECK: add x9, x3, xzr, lsl #10 +# CHECK: add x17, x29, x20, lsl #63 +# CHECK: add x21, x22, x23, lsr #0 +# CHECK: add x24, x25, x26, lsr #18 +# CHECK: add x27, x28, x29, lsr #63 +# CHECK: add x2, x3, x4, asr #0 +# CHECK: add x5, x6, x7, asr #21 +# CHECK: add x8, x9, x10, asr #63 +0xa3 0x0 0x7 0x8b +0x7f 0x0 0x5 0x8b +0xf4 0x3 0x4 0x8b +0xc4 0x0 0x1f 0x8b +0xab 0x1 0xf 0x8b +0x69 0x28 0x1f 0x8b +0xb1 0xff 0x14 0x8b +0xd5 0x2 0x57 0x8b +0x38 0x4b 0x5a 0x8b +0x9b 0xff 0x5d 0x8b +0x62 0x0 0x84 0x8b +0xc5 0x54 0x87 0x8b +0x28 0xfd 0x8a 0x8b + +# CHECK: adds w3, w5, w7 +# CHECK: cmn w3, w5 +# CHECK: adds w20, wzr, w4 +# CHECK: adds w4, w6, wzr +# CHECK: adds w11, w13, w15 +# CHECK: adds w9, w3, wzr, lsl #10 +# CHECK: adds w17, w29, w20, lsl #31 +# CHECK: adds w21, w22, w23, lsr #0 +# CHECK: adds w24, w25, w26, lsr #18 +# CHECK: adds w27, w28, w29, lsr #31 +# CHECK: adds w2, w3, w4, asr #0 +# CHECK: adds w5, w6, w7, asr #21 +# CHECK: adds w8, w9, w10, asr #31 +0xa3 0x0 0x7 0x2b +0x7f 0x0 0x5 0x2b +0xf4 0x3 0x4 0x2b +0xc4 0x0 0x1f 0x2b +0xab 0x1 0xf 0x2b +0x69 0x28 0x1f 0x2b +0xb1 0x7f 0x14 0x2b +0xd5 0x2 0x57 0x2b +0x38 0x4b 0x5a 0x2b +0x9b 0x7f 0x5d 0x2b +0x62 0x0 0x84 0x2b +0xc5 0x54 0x87 0x2b +0x28 0x7d 0x8a 0x2b + +# CHECK: adds x3, x5, x7 +# CHECK: cmn x3, x5 +# CHECK: adds x20, xzr, x4 +# CHECK: adds x4, x6, xzr +# CHECK: adds x11, x13, x15 +# CHECK: adds x9, x3, xzr, lsl #10 +# CHECK: adds x17, x29, x20, lsl #63 +# CHECK: adds x21, x22, x23, lsr #0 +# CHECK: adds x24, x25, x26, lsr #18 +# CHECK: adds x27, x28, x29, lsr #63 +# CHECK: adds x2, x3, x4, asr #0 +# CHECK: adds x5, x6, x7, asr #21 +# CHECK: adds x8, x9, x10, asr #63 +0xa3 0x0 0x7 0xab +0x7f 0x0 0x5 0xab +0xf4 0x3 0x4 0xab +0xc4 0x0 0x1f 0xab +0xab 0x1 0xf 0xab +0x69 0x28 0x1f 0xab +0xb1 0xff 0x14 0xab +0xd5 0x2 0x57 0xab +0x38 0x4b 0x5a 0xab +0x9b 0xff 0x5d 0xab +0x62 0x0 0x84 0xab +0xc5 0x54 0x87 0xab +0x28 0xfd 0x8a 0xab + +# CHECK: sub w3, w5, w7 +# CHECK: sub wzr, w3, w5 +# CHECK: sub w20, wzr, w4 +# CHECK: sub w4, w6, wzr +# CHECK: sub w11, w13, w15 +# CHECK: sub w9, w3, wzr, lsl #10 +# CHECK: sub w17, w29, w20, lsl #31 +# CHECK: sub w21, w22, w23, lsr #0 +# CHECK: sub w24, w25, w26, lsr #18 +# CHECK: sub w27, w28, w29, lsr #31 +# CHECK: sub w2, w3, w4, asr #0 +# CHECK: sub w5, w6, w7, asr #21 +# CHECK: sub w8, w9, w10, asr #31 +0xa3 0x0 0x7 0x4b +0x7f 0x0 0x5 0x4b +0xf4 0x3 0x4 0x4b +0xc4 0x0 0x1f 0x4b +0xab 0x1 0xf 0x4b +0x69 0x28 0x1f 0x4b +0xb1 0x7f 0x14 0x4b +0xd5 0x2 0x57 0x4b +0x38 0x4b 0x5a 0x4b +0x9b 0x7f 0x5d 0x4b +0x62 0x0 0x84 0x4b +0xc5 0x54 0x87 0x4b +0x28 0x7d 0x8a 0x4b + +# CHECK: sub x3, x5, x7 +# CHECK: sub xzr, x3, x5 +# CHECK: sub x20, xzr, x4 +# CHECK: sub x4, x6, xzr +# CHECK: sub x11, x13, x15 +# CHECK: sub x9, x3, xzr, lsl #10 +# CHECK: sub x17, x29, x20, lsl #63 +# CHECK: sub x21, x22, x23, lsr #0 +# CHECK: sub x24, x25, x26, lsr #18 +# CHECK: sub x27, x28, x29, lsr #63 +# CHECK: sub x2, x3, x4, asr #0 +# CHECK: sub x5, x6, x7, asr #21 +# CHECK: sub x8, x9, x10, asr #63 +0xa3 0x0 0x7 0xcb +0x7f 0x0 0x5 0xcb +0xf4 0x3 0x4 0xcb +0xc4 0x0 0x1f 0xcb +0xab 0x1 0xf 0xcb +0x69 0x28 0x1f 0xcb +0xb1 0xff 0x14 0xcb +0xd5 0x2 0x57 0xcb +0x38 0x4b 0x5a 0xcb +0x9b 0xff 0x5d 0xcb +0x62 0x0 0x84 0xcb +0xc5 0x54 0x87 0xcb +0x28 0xfd 0x8a 0xcb + +# CHECK: subs w3, w5, w7 +# CHECK: cmp w3, w5 +# CHECK: subs w20, wzr, w4 +# CHECK: subs w4, w6, wzr +# CHECK: subs w11, w13, w15 +# CHECK: subs w9, w3, wzr, lsl #10 +# CHECK: subs w17, w29, w20, lsl #31 +# CHECK: subs w21, w22, w23, lsr #0 +# CHECK: subs w24, w25, w26, lsr #18 +# CHECK: subs w27, w28, w29, lsr #31 +# CHECK: subs w2, w3, w4, asr #0 +# CHECK: subs w5, w6, w7, asr #21 +# CHECK: subs w8, w9, w10, asr #31 +0xa3 0x0 0x7 0x6b +0x7f 0x0 0x5 0x6b +0xf4 0x3 0x4 0x6b +0xc4 0x0 0x1f 0x6b +0xab 0x1 0xf 0x6b +0x69 0x28 0x1f 0x6b +0xb1 0x7f 0x14 0x6b +0xd5 0x2 0x57 0x6b +0x38 0x4b 0x5a 0x6b +0x9b 0x7f 0x5d 0x6b +0x62 0x0 0x84 0x6b +0xc5 0x54 0x87 0x6b +0x28 0x7d 0x8a 0x6b + +# CHECK: subs x3, x5, x7 +# CHECK: cmp x3, x5 +# CHECK: subs x20, xzr, x4 +# CHECK: subs x4, x6, xzr +# CHECK: subs x11, x13, x15 +# CHECK: subs x9, x3, xzr, lsl #10 +# CHECK: subs x17, x29, x20, lsl #63 +# CHECK: subs x21, x22, x23, lsr #0 +# CHECK: subs x24, x25, x26, lsr #18 +# CHECK: subs x27, x28, x29, lsr #63 +# CHECK: subs x2, x3, x4, asr #0 +# CHECK: subs x5, x6, x7, asr #21 +# CHECK: subs x8, x9, x10, asr #63 +0xa3 0x0 0x7 0xeb +0x7f 0x0 0x5 0xeb +0xf4 0x3 0x4 0xeb +0xc4 0x0 0x1f 0xeb +0xab 0x1 0xf 0xeb +0x69 0x28 0x1f 0xeb +0xb1 0xff 0x14 0xeb +0xd5 0x2 0x57 0xeb +0x38 0x4b 0x5a 0xeb +0x9b 0xff 0x5d 0xeb +0x62 0x0 0x84 0xeb +0xc5 0x54 0x87 0xeb +0x28 0xfd 0x8a 0xeb + +# CHECK: cmn w0, w3 +# CHECK: cmn wzr, w4 +# CHECK: cmn w5, wzr +# CHECK: cmn w6, w7 +# CHECK: cmn w8, w9, lsl #15 +# CHECK: cmn w10, w11, lsl #31 +# CHECK: cmn w12, w13, lsr #0 +# CHECK: cmn w14, w15, lsr #21 +# CHECK: cmn w16, w17, lsr #31 +# CHECK: cmn w18, w19, asr #0 +# CHECK: cmn w20, w21, asr #22 +# CHECK: cmn w22, w23, asr #31 +0x1f 0x0 0x3 0x2b +0xff 0x3 0x4 0x2b +0xbf 0x0 0x1f 0x2b +0xdf 0x0 0x7 0x2b +0x1f 0x3d 0x9 0x2b +0x5f 0x7d 0xb 0x2b +0x9f 0x1 0x4d 0x2b +0xdf 0x55 0x4f 0x2b +0x1f 0x7e 0x51 0x2b +0x5f 0x2 0x93 0x2b +0x9f 0x5a 0x95 0x2b +0xdf 0x7e 0x97 0x2b + +# CHECK: cmn x0, x3 +# CHECK: cmn xzr, x4 +# CHECK: cmn x5, xzr +# CHECK: cmn x6, x7 +# CHECK: cmn x8, x9, lsl #15 +# CHECK: cmn x10, x11, lsl #63 +# CHECK: cmn x12, x13, lsr #0 +# CHECK: cmn x14, x15, lsr #41 +# CHECK: cmn x16, x17, lsr #63 +# CHECK: cmn x18, x19, asr #0 +# CHECK: cmn x20, x21, asr #55 +# CHECK: cmn x22, x23, asr #63 +0x1f 0x0 0x3 0xab +0xff 0x3 0x4 0xab +0xbf 0x0 0x1f 0xab +0xdf 0x0 0x7 0xab +0x1f 0x3d 0x9 0xab +0x5f 0xfd 0xb 0xab +0x9f 0x1 0x4d 0xab +0xdf 0xa5 0x4f 0xab +0x1f 0xfe 0x51 0xab +0x5f 0x2 0x93 0xab +0x9f 0xde 0x95 0xab +0xdf 0xfe 0x97 0xab + +# CHECK: cmp w0, w3 +# CHECK: cmp wzr, w4 +# CHECK: cmp w5, wzr +# CHECK: cmp w6, w7 +# CHECK: cmp w8, w9, lsl #15 +# CHECK: cmp w10, w11, lsl #31 +# CHECK: cmp w12, w13, lsr #0 +# CHECK: cmp w14, w15, lsr #21 +# CHECK: cmp w16, w17, lsr #31 +# CHECK: cmp w18, w19, asr #0 +# CHECK: cmp w20, w21, asr #22 +# CHECK: cmp w22, w23, asr #31 +0x1f 0x0 0x3 0x6b +0xff 0x3 0x4 0x6b +0xbf 0x0 0x1f 0x6b +0xdf 0x0 0x7 0x6b +0x1f 0x3d 0x9 0x6b +0x5f 0x7d 0xb 0x6b +0x9f 0x1 0x4d 0x6b +0xdf 0x55 0x4f 0x6b +0x1f 0x7e 0x51 0x6b +0x5f 0x2 0x93 0x6b +0x9f 0x5a 0x95 0x6b +0xdf 0x7e 0x97 0x6b + +# CHECK: cmp x0, x3 +# CHECK: cmp xzr, x4 +# CHECK: cmp x5, xzr +# CHECK: cmp x6, x7 +# CHECK: cmp x8, x9, lsl #15 +# CHECK: cmp x10, x11, lsl #63 +# CHECK: cmp x12, x13, lsr #0 +# CHECK: cmp x14, x15, lsr #41 +# CHECK: cmp x16, x17, lsr #63 +# CHECK: cmp x18, x19, asr #0 +# CHECK: cmp x20, x21, asr #55 +# CHECK: cmp x22, x23, asr #63 +0x1f 0x0 0x3 0xeb +0xff 0x3 0x4 0xeb +0xbf 0x0 0x1f 0xeb +0xdf 0x0 0x7 0xeb +0x1f 0x3d 0x9 0xeb +0x5f 0xfd 0xb 0xeb +0x9f 0x1 0x4d 0xeb +0xdf 0xa5 0x4f 0xeb +0x1f 0xfe 0x51 0xeb +0x5f 0x2 0x93 0xeb +0x9f 0xde 0x95 0xeb +0xdf 0xfe 0x97 0xeb + +# CHECK: sub w29, wzr, w30 +# CHECK: sub w30, wzr, wzr +# CHECK: sub wzr, wzr, w0 +# CHECK: sub w28, wzr, w27 +# CHECK: sub w26, wzr, w25, lsl #29 +# CHECK: sub w24, wzr, w23, lsl #31 +# CHECK: sub w22, wzr, w21, lsr #0 +# CHECK: sub w20, wzr, w19, lsr #1 +# CHECK: sub w18, wzr, w17, lsr #31 +# CHECK: sub w16, wzr, w15, asr #0 +# CHECK: sub w14, wzr, w13, asr #12 +# CHECK: sub w12, wzr, w11, asr #31 +0xfd 0x3 0x1e 0x4b +0xfe 0x3 0x1f 0x4b +0xff 0x3 0x0 0x4b +0xfc 0x3 0x1b 0x4b +0xfa 0x77 0x19 0x4b +0xf8 0x7f 0x17 0x4b +0xf6 0x3 0x55 0x4b +0xf4 0x7 0x53 0x4b +0xf2 0x7f 0x51 0x4b +0xf0 0x3 0x8f 0x4b +0xee 0x33 0x8d 0x4b +0xec 0x7f 0x8b 0x4b + +# CHECK: sub x29, xzr, x30 +# CHECK: sub x30, xzr, xzr +# CHECK: sub xzr, xzr, x0 +# CHECK: sub x28, xzr, x27 +# CHECK: sub x26, xzr, x25, lsl #29 +# CHECK: sub x24, xzr, x23, lsl #31 +# CHECK: sub x22, xzr, x21, lsr #0 +# CHECK: sub x20, xzr, x19, lsr #1 +# CHECK: sub x18, xzr, x17, lsr #31 +# CHECK: sub x16, xzr, x15, asr #0 +# CHECK: sub x14, xzr, x13, asr #12 +# CHECK: sub x12, xzr, x11, asr #31 +0xfd 0x3 0x1e 0xcb +0xfe 0x3 0x1f 0xcb +0xff 0x3 0x0 0xcb +0xfc 0x3 0x1b 0xcb +0xfa 0x77 0x19 0xcb +0xf8 0x7f 0x17 0xcb +0xf6 0x3 0x55 0xcb +0xf4 0x7 0x53 0xcb +0xf2 0x7f 0x51 0xcb +0xf0 0x3 0x8f 0xcb +0xee 0x33 0x8d 0xcb +0xec 0x7f 0x8b 0xcb + +# CHECK: subs w29, wzr, w30 +# CHECK: subs w30, wzr, wzr +# CHECK: cmp wzr, w0 +# CHECK: subs w28, wzr, w27 +# CHECK: subs w26, wzr, w25, lsl #29 +# CHECK: subs w24, wzr, w23, lsl #31 +# CHECK: subs w22, wzr, w21, lsr #0 +# CHECK: subs w20, wzr, w19, lsr #1 +# CHECK: subs w18, wzr, w17, lsr #31 +# CHECK: subs w16, wzr, w15, asr #0 +# CHECK: subs w14, wzr, w13, asr #12 +# CHECK: subs w12, wzr, w11, asr #31 +0xfd 0x3 0x1e 0x6b +0xfe 0x3 0x1f 0x6b +0xff 0x3 0x0 0x6b +0xfc 0x3 0x1b 0x6b +0xfa 0x77 0x19 0x6b +0xf8 0x7f 0x17 0x6b +0xf6 0x3 0x55 0x6b +0xf4 0x7 0x53 0x6b +0xf2 0x7f 0x51 0x6b +0xf0 0x3 0x8f 0x6b +0xee 0x33 0x8d 0x6b +0xec 0x7f 0x8b 0x6b + +# CHECK: subs x29, xzr, x30 +# CHECK: subs x30, xzr, xzr +# CHECK: cmp xzr, x0 +# CHECK: subs x28, xzr, x27 +# CHECK: subs x26, xzr, x25, lsl #29 +# CHECK: subs x24, xzr, x23, lsl #31 +# CHECK: subs x22, xzr, x21, lsr #0 +# CHECK: subs x20, xzr, x19, lsr #1 +# CHECK: subs x18, xzr, x17, lsr #31 +# CHECK: subs x16, xzr, x15, asr #0 +# CHECK: subs x14, xzr, x13, asr #12 +# CHECK: subs x12, xzr, x11, asr #31 +0xfd 0x3 0x1e 0xeb +0xfe 0x3 0x1f 0xeb +0xff 0x3 0x0 0xeb +0xfc 0x3 0x1b 0xeb +0xfa 0x77 0x19 0xeb +0xf8 0x7f 0x17 0xeb +0xf6 0x3 0x55 0xeb +0xf4 0x7 0x53 0xeb +0xf2 0x7f 0x51 0xeb +0xf0 0x3 0x8f 0xeb +0xee 0x33 0x8d 0xeb +0xec 0x7f 0x8b 0xeb + +#------------------------------------------------------------------------------ +# Add-subtract (shifted register) +#------------------------------------------------------------------------------ + +# CHECK: adc w29, w27, w25 +# CHECK: adc wzr, w3, w4 +# CHECK: adc w9, wzr, w10 +# CHECK: adc w20, w0, wzr +0x7d 0x3 0x19 0x1a +0x7f 0x0 0x4 0x1a +0xe9 0x3 0xa 0x1a +0x14 0x0 0x1f 0x1a + +# CHECK: adc x29, x27, x25 +# CHECK: adc xzr, x3, x4 +# CHECK: adc x9, xzr, x10 +# CHECK: adc x20, x0, xzr +0x7d 0x3 0x19 0x9a +0x7f 0x0 0x4 0x9a +0xe9 0x3 0xa 0x9a +0x14 0x0 0x1f 0x9a + +# CHECK: adcs w29, w27, w25 +# CHECK: adcs wzr, w3, w4 +# CHECK: adcs w9, wzr, w10 +# CHECK: adcs w20, w0, wzr +0x7d 0x3 0x19 0x3a +0x7f 0x0 0x4 0x3a +0xe9 0x3 0xa 0x3a +0x14 0x0 0x1f 0x3a + +# CHECK: adcs x29, x27, x25 +# CHECK: adcs xzr, x3, x4 +# CHECK: adcs x9, xzr, x10 +# CHECK: adcs x20, x0, xzr +0x7d 0x3 0x19 0xba +0x7f 0x0 0x4 0xba +0xe9 0x3 0xa 0xba +0x14 0x0 0x1f 0xba + +# CHECK: sbc w29, w27, w25 +# CHECK: sbc wzr, w3, w4 +# CHECK: ngc w9, w10 +# CHECK: sbc w20, w0, wzr +0x7d 0x3 0x19 0x5a +0x7f 0x0 0x4 0x5a +0xe9 0x3 0xa 0x5a +0x14 0x0 0x1f 0x5a + +# CHECK: sbc x29, x27, x25 +# CHECK: sbc xzr, x3, x4 +# CHECK: ngc x9, x10 +# CHECK: sbc x20, x0, xzr +0x7d 0x3 0x19 0xda +0x7f 0x0 0x4 0xda +0xe9 0x3 0xa 0xda +0x14 0x0 0x1f 0xda + +# CHECK: sbcs w29, w27, w25 +# CHECK: sbcs wzr, w3, w4 +# CHECK: ngcs w9, w10 +# CHECK: sbcs w20, w0, wzr +0x7d 0x3 0x19 0x7a +0x7f 0x0 0x4 0x7a +0xe9 0x3 0xa 0x7a +0x14 0x0 0x1f 0x7a + +# CHECK: sbcs x29, x27, x25 +# CHECK: sbcs xzr, x3, x4 +# CHECK: ngcs x9, x10 +# CHECK: sbcs x20, x0, xzr +0x7d 0x3 0x19 0xfa +0x7f 0x0 0x4 0xfa +0xe9 0x3 0xa 0xfa +0x14 0x0 0x1f 0xfa + +# CHECK: ngc w3, w12 +# CHECK: ngc wzr, w9 +# CHECK: ngc w23, wzr +0xe3 0x3 0xc 0x5a +0xff 0x3 0x9 0x5a +0xf7 0x3 0x1f 0x5a + +# CHECK: ngc x29, x30 +# CHECK: ngc xzr, x0 +# CHECK: ngc x0, xzr +0xfd 0x3 0x1e 0xda +0xff 0x3 0x0 0xda +0xe0 0x3 0x1f 0xda + +# CHECK: ngcs w3, w12 +# CHECK: ngcs wzr, w9 +# CHECK: ngcs w23, wzr +0xe3 0x3 0xc 0x7a +0xff 0x3 0x9 0x7a +0xf7 0x3 0x1f 0x7a + +# CHECK: ngcs x29, x30 +# CHECK: ngcs xzr, x0 +# CHECK: ngcs x0, xzr +0xfd 0x3 0x1e 0xfa +0xff 0x3 0x0 0xfa +0xe0 0x3 0x1f 0xfa + +#------------------------------------------------------------------------------ +# Compare and branch (immediate) +#------------------------------------------------------------------------------ + +# CHECK: sbfx x1, x2, #3, #2 +# CHECK: asr x3, x4, #63 +# CHECK: asr wzr, wzr, #31 +# CHECK: sbfx w12, w9, #0, #1 +0x41 0x10 0x43 0x93 +0x83 0xfc 0x7f 0x93 +0xff 0x7f 0x1f 0x13 +0x2c 0x1 0x0 0x13 + +# CHECK: ubfiz x4, x5, #52, #11 +# CHECK: ubfx xzr, x4, #0, #1 +# CHECK: ubfiz x4, xzr, #1, #6 +# CHECK: lsr x5, x6, #12 +0xa4 0x28 0x4c 0xd3 +0x9f 0x0 0x40 0xd3 +0xe4 0x17 0x7f 0xd3 +0xc5 0xfc 0x4c 0xd3 + +# CHECK: bfi x4, x5, #52, #11 +# CHECK: bfxil xzr, x4, #0, #1 +# CHECK: bfi x4, xzr, #1, #6 +# CHECK: bfxil x5, x6, #12, #52 +0xa4 0x28 0x4c 0xb3 +0x9f 0x0 0x40 0xb3 +0xe4 0x17 0x7f 0xb3 +0xc5 0xfc 0x4c 0xb3 + +# CHECK: sxtb w1, w2 +# CHECK: sxtb xzr, w3 +# CHECK: sxth w9, w10 +# CHECK: sxth x0, w1 +# CHECK: sxtw x3, w30 +0x41 0x1c 0x0 0x13 +0x7f 0x1c 0x40 0x93 +0x49 0x3d 0x0 0x13 +0x20 0x3c 0x40 0x93 +0xc3 0x7f 0x40 0x93 + +# CHECK: uxtb w1, w2 +# CHECK: uxth w9, w10 +# CHECK: ubfx x3, x30, #0, #32 +0x41 0x1c 0x0 0x53 +0x49 0x3d 0x0 0x53 +0xc3 0x7f 0x40 0xd3 + +# CHECK: asr w3, w2, #0 +# CHECK: asr w9, w10, #31 +# CHECK: asr x20, x21, #63 +# CHECK: asr w1, wzr, #3 +0x43 0x7c 0x0 0x13 +0x49 0x7d 0x1f 0x13 +0xb4 0xfe 0x7f 0x93 +0xe1 0x7f 0x3 0x13 + +# CHECK: lsr w3, w2, #0 +# CHECK: lsr w9, w10, #31 +# CHECK: lsr x20, x21, #63 +# CHECK: lsr wzr, wzr, #3 +0x43 0x7c 0x0 0x53 +0x49 0x7d 0x1f 0x53 +0xb4 0xfe 0x7f 0xd3 +0xff 0x7f 0x3 0x53 + +# CHECK: lsr w3, w2, #0 +# CHECK: lsl w9, w10, #31 +# CHECK: lsl x20, x21, #63 +# CHECK: lsl w1, wzr, #3 +0x43 0x7c 0x0 0x53 +0x49 0x1 0x1 0x53 +0xb4 0x2 0x41 0xd3 +0xe1 0x73 0x1d 0x53 + +# CHECK: sbfx w9, w10, #0, #1 +# CHECK: sbfiz x2, x3, #63, #1 +# CHECK: asr x19, x20, #0 +# CHECK: sbfiz x9, x10, #5, #59 +# CHECK: asr w9, w10, #0 +# CHECK: sbfiz w11, w12, #31, #1 +# CHECK: sbfiz w13, w14, #29, #3 +# CHECK: sbfiz xzr, xzr, #10, #11 +0x49 0x1 0x0 0x13 +0x62 0x0 0x41 0x93 +0x93 0xfe 0x40 0x93 +0x49 0xe9 0x7b 0x93 +0x49 0x7d 0x0 0x13 +0x8b 0x1 0x1 0x13 +0xcd 0x9 0x3 0x13 +0xff 0x2b 0x76 0x93 + +# CHECK: sbfx w9, w10, #0, #1 +# CHECK: asr x2, x3, #63 +# CHECK: asr x19, x20, #0 +# CHECK: asr x9, x10, #5 +# CHECK: asr w9, w10, #0 +# CHECK: asr w11, w12, #31 +# CHECK: asr w13, w14, #29 +# CHECK: sbfx xzr, xzr, #10, #11 +0x49 0x1 0x0 0x13 +0x62 0xfc 0x7f 0x93 +0x93 0xfe 0x40 0x93 +0x49 0xfd 0x45 0x93 +0x49 0x7d 0x0 0x13 +0x8b 0x7d 0x1f 0x13 +0xcd 0x7d 0x1d 0x13 +0xff 0x53 0x4a 0x93 + +# CHECK: bfxil w9, w10, #0, #1 +# CHECK: bfi x2, x3, #63, #1 +# CHECK: bfxil x19, x20, #0, #64 +# CHECK: bfi x9, x10, #5, #59 +# CHECK: bfxil w9, w10, #0, #32 +# CHECK: bfi w11, w12, #31, #1 +# CHECK: bfi w13, w14, #29, #3 +# CHECK: bfi xzr, xzr, #10, #11 +0x49 0x1 0x0 0x33 +0x62 0x0 0x41 0xb3 +0x93 0xfe 0x40 0xb3 +0x49 0xe9 0x7b 0xb3 +0x49 0x7d 0x0 0x33 +0x8b 0x1 0x1 0x33 +0xcd 0x9 0x3 0x33 +0xff 0x2b 0x76 0xb3 + +# CHECK: bfxil w9, w10, #0, #1 +# CHECK: bfxil x2, x3, #63, #1 +# CHECK: bfxil x19, x20, #0, #64 +# CHECK: bfxil x9, x10, #5, #59 +# CHECK: bfxil w9, w10, #0, #32 +# CHECK: bfxil w11, w12, #31, #1 +# CHECK: bfxil w13, w14, #29, #3 +# CHECK: bfxil xzr, xzr, #10, #11 +0x49 0x1 0x0 0x33 +0x62 0xfc 0x7f 0xb3 +0x93 0xfe 0x40 0xb3 +0x49 0xfd 0x45 0xb3 +0x49 0x7d 0x0 0x33 +0x8b 0x7d 0x1f 0x33 +0xcd 0x7d 0x1d 0x33 +0xff 0x53 0x4a 0xb3 + +# CHECK: ubfx w9, w10, #0, #1 +# CHECK: lsl x2, x3, #63 +# CHECK: lsr x19, x20, #0 +# CHECK: lsl x9, x10, #5 +# CHECK: lsr w9, w10, #0 +# CHECK: lsl w11, w12, #31 +# CHECK: lsl w13, w14, #29 +# CHECK: ubfiz xzr, xzr, #10, #11 +0x49 0x1 0x0 0x53 +0x62 0x0 0x41 0xd3 +0x93 0xfe 0x40 0xd3 +0x49 0xe9 0x7b 0xd3 +0x49 0x7d 0x0 0x53 +0x8b 0x1 0x1 0x53 +0xcd 0x9 0x3 0x53 +0xff 0x2b 0x76 0xd3 + +# CHECK: ubfx w9, w10, #0, #1 +# CHECK: lsr x2, x3, #63 +# CHECK: lsr x19, x20, #0 +# CHECK: lsr x9, x10, #5 +# CHECK: lsr w9, w10, #0 +# CHECK: lsr w11, w12, #31 +# CHECK: lsr w13, w14, #29 +# CHECK: ubfx xzr, xzr, #10, #11 +0x49 0x1 0x0 0x53 +0x62 0xfc 0x7f 0xd3 +0x93 0xfe 0x40 0xd3 +0x49 0xfd 0x45 0xd3 +0x49 0x7d 0x0 0x53 +0x8b 0x7d 0x1f 0x53 +0xcd 0x7d 0x1d 0x53 +0xff 0x53 0x4a 0xd3 + + +#------------------------------------------------------------------------------ +# Compare and branch (immediate) +#------------------------------------------------------------------------------ + +# CHECK: cbz w5, #4 +# CHECK: cbz x5, #0 +# CHECK: cbnz x2, #-4 +# CHECK: cbnz x26, #1048572 +0x25 0x0 0x0 0x34 +0x05 0x0 0x0 0xb4 +0xe2 0xff 0xff 0xb5 +0xfa 0xff 0x7f 0xb5 + +# CHECK: cbz wzr, #0 +# CHECK: cbnz xzr, #0 +0x1f 0x0 0x0 0x34 +0x1f 0x0 0x0 0xb5 + +#------------------------------------------------------------------------------ +# Conditional branch (immediate) +#------------------------------------------------------------------------------ + +# CHECK: b.ne #4 +# CHECK: b.ge #1048572 +# CHECK: b.ge #-4 +0x21 0x00 0x00 0x54 +0xea 0xff 0x7f 0x54 +0xea 0xff 0xff 0x54 + +#------------------------------------------------------------------------------ +# Conditional compare (immediate) +#------------------------------------------------------------------------------ + +# CHECK: ccmp w1, #31, #0, eq +# CHECK: ccmp w3, #0, #15, hs +# CHECK: ccmp wzr, #15, #13, hs +0x20 0x08 0x5f 0x7a +0x6f 0x28 0x40 0x7a +0xed 0x2b 0x4f 0x7a + +# CHECK: ccmp x9, #31, #0, le +# CHECK: ccmp x3, #0, #15, gt +# CHECK: ccmp xzr, #5, #7, ne +0x20 0xd9 0x5f 0xfa +0x6f 0xc8 0x40 0xfa +0xe7 0x1b 0x45 0xfa + +# CHECK: ccmn w1, #31, #0, eq +# CHECK: ccmn w3, #0, #15, hs +# CHECK: ccmn wzr, #15, #13, hs +0x20 0x08 0x5f 0x3a +0x6f 0x28 0x40 0x3a +0xed 0x2b 0x4f 0x3a + +# CHECK: ccmn x9, #31, #0, le +# CHECK: ccmn x3, #0, #15, gt +# CHECK: ccmn xzr, #5, #7, ne +0x20 0xd9 0x5f 0xba +0x6f 0xc8 0x40 0xba +0xe7 0x1b 0x45 0xba + +#------------------------------------------------------------------------------ +# Conditional compare (register) +#------------------------------------------------------------------------------ + +# CHECK: ccmp w1, wzr, #0, eq +# CHECK: ccmp w3, w0, #15, hs +# CHECK: ccmp wzr, w15, #13, hs +0x20 0x00 0x5f 0x7a +0x6f 0x20 0x40 0x7a +0xed 0x23 0x4f 0x7a + +# CHECK: ccmp x9, xzr, #0, le +# CHECK: ccmp x3, x0, #15, gt +# CHECK: ccmp xzr, x5, #7, ne +0x20 0xd1 0x5f 0xfa +0x6f 0xc0 0x40 0xfa +0xe7 0x13 0x45 0xfa + +# CHECK: ccmn w1, wzr, #0, eq +# CHECK: ccmn w3, w0, #15, hs +# CHECK: ccmn wzr, w15, #13, hs +0x20 0x00 0x5f 0x3a +0x6f 0x20 0x40 0x3a +0xed 0x23 0x4f 0x3a + +# CHECK: ccmn x9, xzr, #0, le +# CHECK: ccmn x3, x0, #15, gt +# CHECK: ccmn xzr, x5, #7, ne +0x20 0xd1 0x5f 0xba +0x6f 0xc0 0x40 0xba +0xe7 0x13 0x45 0xba + +#------------------------------------------------------------------------------ +# Conditional branch (immediate) +#------------------------------------------------------------------------------ +# CHECK: csel w1, w0, w19, ne +# CHECK: csel wzr, w5, w9, eq +# CHECK: csel w9, wzr, w30, gt +# CHECK: csel w1, w28, wzr, mi +# CHECK: csel x19, x23, x29, lt +# CHECK: csel xzr, x3, x4, ge +# CHECK: csel x5, xzr, x6, hs +# CHECK: csel x7, x8, xzr, lo +0x1 0x10 0x93 0x1a +0xbf 0x0 0x89 0x1a +0xe9 0xc3 0x9e 0x1a +0x81 0x43 0x9f 0x1a +0xf3 0xb2 0x9d 0x9a +0x7f 0xa0 0x84 0x9a +0xe5 0x23 0x86 0x9a +0x7 0x31 0x9f 0x9a + +# CHECK: csinc w1, w0, w19, ne +# CHECK: csinc wzr, w5, w9, eq +# CHECK: csinc w9, wzr, w30, gt +# CHECK: csinc w1, w28, wzr, mi +# CHECK: csinc x19, x23, x29, lt +# CHECK: csinc xzr, x3, x4, ge +# CHECK: csinc x5, xzr, x6, hs +# CHECK: csinc x7, x8, xzr, lo +0x1 0x14 0x93 0x1a +0xbf 0x4 0x89 0x1a +0xe9 0xc7 0x9e 0x1a +0x81 0x47 0x9f 0x1a +0xf3 0xb6 0x9d 0x9a +0x7f 0xa4 0x84 0x9a +0xe5 0x27 0x86 0x9a +0x7 0x35 0x9f 0x9a + +# CHECK: csinv w1, w0, w19, ne +# CHECK: csinv wzr, w5, w9, eq +# CHECK: csinv w9, wzr, w30, gt +# CHECK: csinv w1, w28, wzr, mi +# CHECK: csinv x19, x23, x29, lt +# CHECK: csinv xzr, x3, x4, ge +# CHECK: csinv x5, xzr, x6, hs +# CHECK: csinv x7, x8, xzr, lo +0x1 0x10 0x93 0x5a +0xbf 0x0 0x89 0x5a +0xe9 0xc3 0x9e 0x5a +0x81 0x43 0x9f 0x5a +0xf3 0xb2 0x9d 0xda +0x7f 0xa0 0x84 0xda +0xe5 0x23 0x86 0xda +0x7 0x31 0x9f 0xda + +# CHECK: csneg w1, w0, w19, ne +# CHECK: csneg wzr, w5, w9, eq +# CHECK: csneg w9, wzr, w30, gt +# CHECK: csneg w1, w28, wzr, mi +# CHECK: csneg x19, x23, x29, lt +# CHECK: csneg xzr, x3, x4, ge +# CHECK: csneg x5, xzr, x6, hs +# CHECK: csneg x7, x8, xzr, lo +0x1 0x14 0x93 0x5a +0xbf 0x4 0x89 0x5a +0xe9 0xc7 0x9e 0x5a +0x81 0x47 0x9f 0x5a +0xf3 0xb6 0x9d 0xda +0x7f 0xa4 0x84 0xda +0xe5 0x27 0x86 0xda +0x7 0x35 0x9f 0xda + +# CHECK: csinc w3, wzr, wzr, ne +# CHECK: csinc x9, xzr, xzr, mi +# CHECK: csinv w20, wzr, wzr, eq +# CHECK: csinv x30, xzr, xzr, lt +0xe3 0x17 0x9f 0x1a +0xe9 0x47 0x9f 0x9a +0xf4 0x3 0x9f 0x5a +0xfe 0xb3 0x9f 0xda + +# CHECK: csinc w3, w5, w5, le +# CHECK: csinc wzr, w4, w4, gt +# CHECK: csinc w9, wzr, wzr, ge +# CHECK: csinc x3, x5, x5, le +# CHECK: csinc xzr, x4, x4, gt +# CHECK: csinc x9, xzr, xzr, ge +0xa3 0xd4 0x85 0x1a +0x9f 0xc4 0x84 0x1a +0xe9 0xa7 0x9f 0x1a +0xa3 0xd4 0x85 0x9a +0x9f 0xc4 0x84 0x9a +0xe9 0xa7 0x9f 0x9a + +# CHECK: csinv w3, w5, w5, le +# CHECK: csinv wzr, w4, w4, gt +# CHECK: csinv w9, wzr, wzr, ge +# CHECK: csinv x3, x5, x5, le +# CHECK: csinv xzr, x4, x4, gt +# CHECK: csinv x9, xzr, xzr, ge +0xa3 0xd0 0x85 0x5a +0x9f 0xc0 0x84 0x5a +0xe9 0xa3 0x9f 0x5a +0xa3 0xd0 0x85 0xda +0x9f 0xc0 0x84 0xda +0xe9 0xa3 0x9f 0xda + +# CHECK: csneg w3, w5, w5, le +# CHECK: csneg wzr, w4, w4, gt +# CHECK: csneg w9, wzr, wzr, ge +# CHECK: csneg x3, x5, x5, le +# CHECK: csneg xzr, x4, x4, gt +# CHECK: csneg x9, xzr, xzr, ge +0xa3 0xd4 0x85 0x5a +0x9f 0xc4 0x84 0x5a +0xe9 0xa7 0x9f 0x5a +0xa3 0xd4 0x85 0xda +0x9f 0xc4 0x84 0xda +0xe9 0xa7 0x9f 0xda + +#------------------------------------------------------------------------------ +# Data-processing (1 source) +#------------------------------------------------------------------------------ + +# CHECK: rbit w0, w7 +# CHECK: rbit x18, x3 +# CHECK: rev16 w17, w1 +# CHECK: rev16 x5, x2 +# CHECK: rev w18, w0 +# CHECK: rev32 x20, x1 +0xe0 0x00 0xc0 0x5a +0x72 0x00 0xc0 0xda +0x31 0x04 0xc0 0x5a +0x45 0x04 0xc0 0xda +0x12 0x08 0xc0 0x5a +0x34 0x08 0xc0 0xda + +# CHECK: rev x22, x2 +# CHECK: clz w24, w3 +# CHECK: clz x26, x4 +# CHECK: cls w3, w5 +# CHECK: cls x20, x5 +0x56 0x0c 0xc0 0xda +0x78 0x10 0xc0 0x5a +0x9a 0x10 0xc0 0xda +0xa3 0x14 0xc0 0x5a +0xb4 0x14 0xc0 0xda + +#------------------------------------------------------------------------------ +# Data-processing (2 source) +#------------------------------------------------------------------------------ + +# CHECK: crc32b w5, w7, w20 +# CHECK: crc32h w28, wzr, w30 +# CHECK: crc32w w0, w1, w2 +# CHECK: crc32x w7, w9, x20 +# CHECK: crc32cb w9, w5, w4 +# CHECK: crc32ch w13, w17, w25 +# CHECK: crc32cw wzr, w3, w5 +# CHECK: crc32cx w18, w16, xzr +0xe5 0x40 0xd4 0x1a +0xfc 0x47 0xde 0x1a +0x20 0x48 0xc2 0x1a +0x27 0x4d 0xd4 0x9a +0xa9 0x50 0xc4 0x1a +0x2d 0x56 0xd9 0x1a +0x7f 0x58 0xc5 0x1a +0x12 0x5e 0xdf 0x9a + +# CHECK: udiv w0, w7, w10 +# CHECK: udiv x9, x22, x4 +# CHECK: sdiv w12, w21, w0 +# CHECK: sdiv x13, x2, x1 +# CHECK: lsl w11, w12, w13 +# CHECK: lsl x14, x15, x16 +# CHECK: lsr w17, w18, w19 +# CHECK: lsr x20, x21, x22 +# CHECK: asr w23, w24, w25 +# CHECK: asr x26, x27, x28 +# CHECK: ror w0, w1, w2 +# CHECK: ror x3, x4, x5 +0xe0 0x08 0xca 0x1a +0xc9 0x0a 0xc4 0x9a +0xac 0x0e 0xc0 0x1a +0x4d 0x0c 0xc1 0x9a +0x8b 0x21 0xcd 0x1a +0xee 0x21 0xd0 0x9a +0x51 0x26 0xd3 0x1a +0xb4 0x26 0xd6 0x9a +0x17 0x2b 0xd9 0x1a +0x7a 0x2b 0xdc 0x9a +0x20 0x2c 0xc2 0x1a +0x83 0x2c 0xc5 0x9a + +# CHECK: lsl w6, w7, w8 +# CHECK: lsl x9, x10, x11 +# CHECK: lsr w12, w13, w14 +# CHECK: lsr x15, x16, x17 +# CHECK: asr w18, w19, w20 +# CHECK: asr x21, x22, x23 +# CHECK: ror w24, w25, w26 +# CHECK: ror x27, x28, x29 +0xe6 0x20 0xc8 0x1a +0x49 0x21 0xcb 0x9a +0xac 0x25 0xce 0x1a +0x0f 0x26 0xd1 0x9a +0x72 0x2a 0xd4 0x1a +0xd5 0x2a 0xd7 0x9a +0x38 0x2f 0xda 0x1a +0x9b 0x2f 0xdd 0x9a + +#------------------------------------------------------------------------------ +# Data-processing (3 sources) +#------------------------------------------------------------------------------ + +# First check some non-canonical encodings where Ra is not 0b11111 (only umulh +# and smulh have them). + +# CHECK: smulh x30, x29, x28 +# CHECK: smulh xzr, x27, x26 +# CHECK: umulh x30, x29, x28 +# CHECK: umulh x23, x30, xzr +0xbe 0x73 0x5c 0x9b +0x7f 0x2f 0x5a 0x9b +0xbe 0x3f 0xdc 0x9b +0xd7 0x77 0xdf 0x9b + +# Now onto the boilerplate stuff + +# CHECK: madd w1, w3, w7, w4 +# CHECK: madd wzr, w0, w9, w11 +# CHECK: madd w13, wzr, w4, w4 +# CHECK: madd w19, w30, wzr, w29 +# CHECK: mul w4, w5, w6 +0x61 0x10 0x7 0x1b +0x1f 0x2c 0x9 0x1b +0xed 0x13 0x4 0x1b +0xd3 0x77 0x1f 0x1b +0xa4 0x7c 0x6 0x1b + +# CHECK: madd x1, x3, x7, x4 +# CHECK: madd xzr, x0, x9, x11 +# CHECK: madd x13, xzr, x4, x4 +# CHECK: madd x19, x30, xzr, x29 +# CHECK: mul x4, x5, x6 +0x61 0x10 0x7 0x9b +0x1f 0x2c 0x9 0x9b +0xed 0x13 0x4 0x9b +0xd3 0x77 0x1f 0x9b +0xa4 0x7c 0x6 0x9b + +# CHECK: msub w1, w3, w7, w4 +# CHECK: msub wzr, w0, w9, w11 +# CHECK: msub w13, wzr, w4, w4 +# CHECK: msub w19, w30, wzr, w29 +# CHECK: mneg w4, w5, w6 +0x61 0x90 0x7 0x1b +0x1f 0xac 0x9 0x1b +0xed 0x93 0x4 0x1b +0xd3 0xf7 0x1f 0x1b +0xa4 0xfc 0x6 0x1b + +# CHECK: msub x1, x3, x7, x4 +# CHECK: msub xzr, x0, x9, x11 +# CHECK: msub x13, xzr, x4, x4 +# CHECK: msub x19, x30, xzr, x29 +# CHECK: mneg x4, x5, x6 +0x61 0x90 0x7 0x9b +0x1f 0xac 0x9 0x9b +0xed 0x93 0x4 0x9b +0xd3 0xf7 0x1f 0x9b +0xa4 0xfc 0x6 0x9b + +# CHECK: smaddl x3, w5, w2, x9 +# CHECK: smaddl xzr, w10, w11, x12 +# CHECK: smaddl x13, wzr, w14, x15 +# CHECK: smaddl x16, w17, wzr, x18 +# CHECK: smull x19, w20, w21 +0xa3 0x24 0x22 0x9b +0x5f 0x31 0x2b 0x9b +0xed 0x3f 0x2e 0x9b +0x30 0x4a 0x3f 0x9b +0x93 0x7e 0x35 0x9b + +# CHECK: smsubl x3, w5, w2, x9 +# CHECK: smsubl xzr, w10, w11, x12 +# CHECK: smsubl x13, wzr, w14, x15 +# CHECK: smsubl x16, w17, wzr, x18 +# CHECK: smnegl x19, w20, w21 +0xa3 0xa4 0x22 0x9b +0x5f 0xb1 0x2b 0x9b +0xed 0xbf 0x2e 0x9b +0x30 0xca 0x3f 0x9b +0x93 0xfe 0x35 0x9b + +# CHECK: umaddl x3, w5, w2, x9 +# CHECK: umaddl xzr, w10, w11, x12 +# CHECK: umaddl x13, wzr, w14, x15 +# CHECK: umaddl x16, w17, wzr, x18 +# CHECK: umull x19, w20, w21 +0xa3 0x24 0xa2 0x9b +0x5f 0x31 0xab 0x9b +0xed 0x3f 0xae 0x9b +0x30 0x4a 0xbf 0x9b +0x93 0x7e 0xb5 0x9b + +# CHECK: umsubl x3, w5, w2, x9 +# CHECK: umsubl xzr, w10, w11, x12 +# CHECK: umsubl x13, wzr, w14, x15 +# CHECK: umsubl x16, w17, wzr, x18 +# CHECK: umnegl x19, w20, w21 +0xa3 0xa4 0xa2 0x9b +0x5f 0xb1 0xab 0x9b +0xed 0xbf 0xae 0x9b +0x30 0xca 0xbf 0x9b +0x93 0xfe 0xb5 0x9b + +# CHECK: smulh x30, x29, x28 +# CHECK: smulh xzr, x27, x26 +# CHECK: smulh x25, xzr, x24 +# CHECK: smulh x23, x22, xzr +0xbe 0x7f 0x5c 0x9b +0x7f 0x7f 0x5a 0x9b +0xf9 0x7f 0x58 0x9b +0xd7 0x7e 0x5f 0x9b + +# CHECK: umulh x30, x29, x28 +# CHECK: umulh xzr, x27, x26 +# CHECK: umulh x25, xzr, x24 +# CHECK: umulh x23, x22, xzr +0xbe 0x7f 0xdc 0x9b +0x7f 0x7f 0xda 0x9b +0xf9 0x7f 0xd8 0x9b +0xd7 0x7e 0xdf 0x9b + +# CHECK: mul w3, w4, w5 +# CHECK: mul wzr, w6, w7 +# CHECK: mul w8, wzr, w9 +# CHECK: mul w10, w11, wzr +# CHECK: mul x12, x13, x14 +# CHECK: mul xzr, x15, x16 +# CHECK: mul x17, xzr, x18 +# CHECK: mul x19, x20, xzr +0x83 0x7c 0x5 0x1b +0xdf 0x7c 0x7 0x1b +0xe8 0x7f 0x9 0x1b +0x6a 0x7d 0x1f 0x1b +0xac 0x7d 0xe 0x9b +0xff 0x7d 0x10 0x9b +0xf1 0x7f 0x12 0x9b +0x93 0x7e 0x1f 0x9b + +# CHECK: mneg w21, w22, w23 +# CHECK: mneg wzr, w24, w25 +# CHECK: mneg w26, wzr, w27 +# CHECK: mneg w28, w29, wzr +0xd5 0xfe 0x17 0x1b +0x1f 0xff 0x19 0x1b +0xfa 0xff 0x1b 0x1b +0xbc 0xff 0x1f 0x1b + +# CHECK: smull x11, w13, w17 +# CHECK: umull x11, w13, w17 +# CHECK: smnegl x11, w13, w17 +# CHECK: umnegl x11, w13, w17 +0xab 0x7d 0x31 0x9b +0xab 0x7d 0xb1 0x9b +0xab 0xfd 0x31 0x9b +0xab 0xfd 0xb1 0x9b + +#------------------------------------------------------------------------------ +# Exception generation +#------------------------------------------------------------------------------ + +# CHECK: svc #0 +# CHECK: svc #65535 +0x1 0x0 0x0 0xd4 +0xe1 0xff 0x1f 0xd4 + +# CHECK: hvc #1 +# CHECK: smc #12000 +# CHECK: brk #12 +# CHECK: hlt #123 +0x22 0x0 0x0 0xd4 +0x3 0xdc 0x5 0xd4 +0x80 0x1 0x20 0xd4 +0x60 0xf 0x40 0xd4 + +# CHECK: dcps1 #42 +# CHECK: dcps2 #9 +# CHECK: dcps3 #1000 +0x41 0x5 0xa0 0xd4 +0x22 0x1 0xa0 0xd4 +0x3 0x7d 0xa0 0xd4 + +# CHECK: dcps1 +# CHECK: dcps2 +# CHECK: dcps3 +0x1 0x0 0xa0 0xd4 +0x2 0x0 0xa0 0xd4 +0x3 0x0 0xa0 0xd4 + +#------------------------------------------------------------------------------ +# Extract (immediate) +#------------------------------------------------------------------------------ + +# CHECK: extr w3, w5, w7, #0 +# CHECK: extr w11, w13, w17, #31 +0xa3 0x0 0x87 0x13 +0xab 0x7d 0x91 0x13 + +# CHECK: extr x3, x5, x7, #15 +# CHECK: extr x11, x13, x17, #63 +0xa3 0x3c 0xc7 0x93 +0xab 0xfd 0xd1 0x93 + +# CHECK: extr x19, x23, x23, #24 +# CHECK: extr x29, xzr, xzr, #63 +# CHECK: extr w9, w13, w13, #31 +0xf3 0x62 0xd7 0x93 +0xfd 0xff 0xdf 0x93 +0xa9 0x7d 0x8d 0x13 + +#------------------------------------------------------------------------------ +# Floating-point compare +#------------------------------------------------------------------------------ + +# CHECK: fcmp s3, s5 +# CHECK: fcmp s31, #0.0 +# CHECK: fcmp s31, #0.0 +0x60 0x20 0x25 0x1e +0xe8 0x23 0x20 0x1e +0xe8 0x23 0x3f 0x1e + +# CHECK: fcmpe s29, s30 +# CHECK: fcmpe s15, #0.0 +# CHECK: fcmpe s15, #0.0 +0xb0 0x23 0x3e 0x1e +0xf8 0x21 0x20 0x1e +0xf8 0x21 0x2f 0x1e + +# CHECK: fcmp d4, d12 +# CHECK: fcmp d23, #0.0 +# CHECK: fcmp d23, #0.0 +0x80 0x20 0x6c 0x1e +0xe8 0x22 0x60 0x1e +0xe8 0x22 0x77 0x1e + +# CHECK: fcmpe d26, d22 +# CHECK: fcmpe d29, #0.0 +# CHECK: fcmpe d29, #0.0 +0x50 0x23 0x76 0x1e +0xb8 0x23 0x60 0x1e +0xb8 0x23 0x6d 0x1e + +#------------------------------------------------------------------------------ +# Floating-point conditional compare +#------------------------------------------------------------------------------ + +# CHECK: fccmp s1, s31, #0, eq +# CHECK: fccmp s3, s0, #15, hs +# CHECK: fccmp s31, s15, #13, hs +0x20 0x04 0x3f 0x1e +0x6f 0x24 0x20 0x1e +0xed 0x27 0x2f 0x1e + +# CHECK: fccmp d9, d31, #0, le +# CHECK: fccmp d3, d0, #15, gt +# CHECK: fccmp d31, d5, #7, ne +0x20 0xd5 0x7f 0x1e +0x6f 0xc4 0x60 0x1e +0xe7 0x17 0x65 0x1e + +# CHECK: fccmpe s1, s31, #0, eq +# CHECK: fccmpe s3, s0, #15, hs +# CHECK: fccmpe s31, s15, #13, hs +0x30 0x04 0x3f 0x1e +0x7f 0x24 0x20 0x1e +0xfd 0x27 0x2f 0x1e + +# CHECK: fccmpe d9, d31, #0, le +# CHECK: fccmpe d3, d0, #15, gt +# CHECK: fccmpe d31, d5, #7, ne +0x30 0xd5 0x7f 0x1e +0x7f 0xc4 0x60 0x1e +0xf7 0x17 0x65 0x1e + +#------------------------------------------------------------------------------- +# Floating-point conditional compare +#------------------------------------------------------------------------------- + +# CHECK: fcsel s3, s20, s9, pl +# CHECK: fcsel d9, d10, d11, mi +0x83 0x5e 0x29 0x1e +0x49 0x4d 0x6b 0x1e + +#------------------------------------------------------------------------------ +# Floating-point data-processing (1 source) +#------------------------------------------------------------------------------ + +# CHECK: fmov s0, s1 +# CHECK: fabs s2, s3 +# CHECK: fneg s4, s5 +# CHECK: fsqrt s6, s7 +# CHECK: fcvt d8, s9 +# CHECK: fcvt h10, s11 +# CHECK: frintn s12, s13 +# CHECK: frintp s14, s15 +# CHECK: frintm s16, s17 +# CHECK: frintz s18, s19 +# CHECK: frinta s20, s21 +# CHECK: frintx s22, s23 +# CHECK: frinti s24, s25 +0x20 0x40 0x20 0x1e +0x62 0xc0 0x20 0x1e +0xa4 0x40 0x21 0x1e +0xe6 0xc0 0x21 0x1e +0x28 0xc1 0x22 0x1e +0x6a 0xc1 0x23 0x1e +0xac 0x41 0x24 0x1e +0xee 0xc1 0x24 0x1e +0x30 0x42 0x25 0x1e +0x72 0xc2 0x25 0x1e +0xb4 0x42 0x26 0x1e +0xf6 0x42 0x27 0x1e +0x38 0xc3 0x27 0x1e + +# CHECK: fmov d0, d1 +# CHECK: fabs d2, d3 +# CHECK: fneg d4, d5 +# CHECK: fsqrt d6, d7 +# CHECK: fcvt s8, d9 +# CHECK: fcvt h10, d11 +# CHECK: frintn d12, d13 +# CHECK: frintp d14, d15 +# CHECK: frintm d16, d17 +# CHECK: frintz d18, d19 +# CHECK: frinta d20, d21 +# CHECK: frintx d22, d23 +# CHECK: frinti d24, d25 +0x20 0x40 0x60 0x1e +0x62 0xc0 0x60 0x1e +0xa4 0x40 0x61 0x1e +0xe6 0xc0 0x61 0x1e +0x28 0x41 0x62 0x1e +0x6a 0xc1 0x63 0x1e +0xac 0x41 0x64 0x1e +0xee 0xc1 0x64 0x1e +0x30 0x42 0x65 0x1e +0x72 0xc2 0x65 0x1e +0xb4 0x42 0x66 0x1e +0xf6 0x42 0x67 0x1e +0x38 0xc3 0x67 0x1e + +# CHECK: fcvt s26, h27 +# CHECK: fcvt d28, h29 +0x7a 0x43 0xe2 0x1e +0xbc 0xc3 0xe2 0x1e + +#------------------------------------------------------------------------------ +# Floating-point data-processing (2 sources) +#------------------------------------------------------------------------------ + +# CHECK: fmul s20, s19, s17 +# CHECK: fdiv s1, s2, s3 +# CHECK: fadd s4, s5, s6 +# CHECK: fsub s7, s8, s9 +# CHECK: fmax s10, s11, s12 +# CHECK: fmin s13, s14, s15 +# CHECK: fmaxnm s16, s17, s18 +# CHECK: fminnm s19, s20, s21 +# CHECK: fnmul s22, s23, s2 +0x74 0xa 0x31 0x1e +0x41 0x18 0x23 0x1e +0xa4 0x28 0x26 0x1e +0x7 0x39 0x29 0x1e +0x6a 0x49 0x2c 0x1e +0xcd 0x59 0x2f 0x1e +0x30 0x6a 0x32 0x1e +0x93 0x7a 0x35 0x1e +0xf6 0x8a 0x38 0x1e + + +# CHECK: fmul d20, d19, d17 +# CHECK: fdiv d1, d2, d3 +# CHECK: fadd d4, d5, d6 +# CHECK: fsub d7, d8, d9 +# CHECK: fmax d10, d11, d12 +# CHECK: fmin d13, d14, d15 +# CHECK: fmaxnm d16, d17, d18 +# CHECK: fminnm d19, d20, d21 +# CHECK: fnmul d22, d23, d24 +0x74 0xa 0x71 0x1e +0x41 0x18 0x63 0x1e +0xa4 0x28 0x66 0x1e +0x7 0x39 0x69 0x1e +0x6a 0x49 0x6c 0x1e +0xcd 0x59 0x6f 0x1e +0x30 0x6a 0x72 0x1e +0x93 0x7a 0x75 0x1e +0xf6 0x8a 0x78 0x1e + +#------------------------------------------------------------------------------ +# Floating-point data-processing (1 source) +#------------------------------------------------------------------------------ + +# CHECK: fmadd s3, s5, s6, s31 +# CHECK: fmadd d3, d13, d0, d23 +# CHECK: fmsub s3, s5, s6, s31 +# CHECK: fmsub d3, d13, d0, d23 +# CHECK: fnmadd s3, s5, s6, s31 +# CHECK: fnmadd d3, d13, d0, d23 +# CHECK: fnmsub s3, s5, s6, s31 +# CHECK: fnmsub d3, d13, d0, d23 +0xa3 0x7c 0x06 0x1f +0xa3 0x5d 0x40 0x1f +0xa3 0xfc 0x06 0x1f +0xa3 0xdd 0x40 0x1f +0xa3 0x7c 0x26 0x1f +0xa3 0x5d 0x60 0x1f +0xa3 0xfc 0x26 0x1f +0xa3 0xdd 0x60 0x1f + +#------------------------------------------------------------------------------ +# Floating-point <-> fixed-point conversion +#------------------------------------------------------------------------------ + +# CHECK: fcvtzs w3, s5, #1 +# CHECK: fcvtzs wzr, s20, #13 +# CHECK: fcvtzs w19, s0, #32 +0xa3 0xfc 0x18 0x1e +0x9f 0xce 0x18 0x1e +0x13 0x80 0x18 0x1e + +# CHECK: fcvtzs x3, s5, #1 +# CHECK: fcvtzs x12, s30, #45 +# CHECK: fcvtzs x19, s0, #64 +0xa3 0xfc 0x18 0x9e +0xcc 0x4f 0x18 0x9e +0x13 0x00 0x18 0x9e + +# CHECK: fcvtzs w3, d5, #1 +# CHECK: fcvtzs wzr, d20, #13 +# CHECK: fcvtzs w19, d0, #32 +0xa3 0xfc 0x58 0x1e +0x9f 0xce 0x58 0x1e +0x13 0x80 0x58 0x1e + +# CHECK: fcvtzs x3, d5, #1 +# CHECK: fcvtzs x12, d30, #45 +# CHECK: fcvtzs x19, d0, #64 +0xa3 0xfc 0x58 0x9e +0xcc 0x4f 0x58 0x9e +0x13 0x00 0x58 0x9e + +# CHECK: fcvtzu w3, s5, #1 +# CHECK: fcvtzu wzr, s20, #13 +# CHECK: fcvtzu w19, s0, #32 +0xa3 0xfc 0x19 0x1e +0x9f 0xce 0x19 0x1e +0x13 0x80 0x19 0x1e + +# CHECK: fcvtzu x3, s5, #1 +# CHECK: fcvtzu x12, s30, #45 +# CHECK: fcvtzu x19, s0, #64 +0xa3 0xfc 0x19 0x9e +0xcc 0x4f 0x19 0x9e +0x13 0x00 0x19 0x9e + +# CHECK: fcvtzu w3, d5, #1 +# CHECK: fcvtzu wzr, d20, #13 +# CHECK: fcvtzu w19, d0, #32 +0xa3 0xfc 0x59 0x1e +0x9f 0xce 0x59 0x1e +0x13 0x80 0x59 0x1e + +# CHECK: fcvtzu x3, d5, #1 +# CHECK: fcvtzu x12, d30, #45 +# CHECK: fcvtzu x19, d0, #64 +0xa3 0xfc 0x59 0x9e +0xcc 0x4f 0x59 0x9e +0x13 0x00 0x59 0x9e + +# CHECK: scvtf s23, w19, #1 +# CHECK: scvtf s31, wzr, #20 +# CHECK: scvtf s14, w0, #32 +0x77 0xfe 0x02 0x1e +0xff 0xb3 0x02 0x1e +0x0e 0x80 0x02 0x1e + +# CHECK: scvtf s23, x19, #1 +# CHECK: scvtf s31, xzr, #20 +# CHECK: scvtf s14, x0, #64 +0x77 0xfe 0x02 0x9e +0xff 0xb3 0x02 0x9e +0x0e 0x00 0x02 0x9e + +# CHECK: scvtf d23, w19, #1 +# CHECK: scvtf d31, wzr, #20 +# CHECK: scvtf d14, w0, #32 +0x77 0xfe 0x42 0x1e +0xff 0xb3 0x42 0x1e +0x0e 0x80 0x42 0x1e + +# CHECK: scvtf d23, x19, #1 +# CHECK: scvtf d31, xzr, #20 +# CHECK: scvtf d14, x0, #64 +0x77 0xfe 0x42 0x9e +0xff 0xb3 0x42 0x9e +0x0e 0x00 0x42 0x9e + +# CHECK: ucvtf s23, w19, #1 +# CHECK: ucvtf s31, wzr, #20 +# CHECK: ucvtf s14, w0, #32 +0x77 0xfe 0x03 0x1e +0xff 0xb3 0x03 0x1e +0x0e 0x80 0x03 0x1e + +# CHECK: ucvtf s23, x19, #1 +# CHECK: ucvtf s31, xzr, #20 +# CHECK: ucvtf s14, x0, #64 +0x77 0xfe 0x03 0x9e +0xff 0xb3 0x03 0x9e +0x0e 0x00 0x03 0x9e + +# CHECK: ucvtf d23, w19, #1 +# CHECK: ucvtf d31, wzr, #20 +# CHECK: ucvtf d14, w0, #32 +0x77 0xfe 0x43 0x1e +0xff 0xb3 0x43 0x1e +0x0e 0x80 0x43 0x1e + +# CHECK: ucvtf d23, x19, #1 +# CHECK: ucvtf d31, xzr, #20 +# CHECK: ucvtf d14, x0, #64 +0x77 0xfe 0x43 0x9e +0xff 0xb3 0x43 0x9e +0x0e 0x00 0x43 0x9e + +#------------------------------------------------------------------------------ +# Floating-point <-> integer conversion +#------------------------------------------------------------------------------ +# CHECK: fcvtns w3, s31 +# CHECK: fcvtns xzr, s12 +# CHECK: fcvtnu wzr, s12 +# CHECK: fcvtnu x0, s0 +0xe3 0x3 0x20 0x1e +0x9f 0x1 0x20 0x9e +0x9f 0x1 0x21 0x1e +0x0 0x0 0x21 0x9e + +# CHECK: fcvtps wzr, s9 +# CHECK: fcvtps x12, s20 +# CHECK: fcvtpu w30, s23 +# CHECK: fcvtpu x29, s3 +0x3f 0x1 0x28 0x1e +0x8c 0x2 0x28 0x9e +0xfe 0x2 0x29 0x1e +0x7d 0x0 0x29 0x9e + +# CHECK: fcvtms w2, s3 +# CHECK: fcvtms x4, s5 +# CHECK: fcvtmu w6, s7 +# CHECK: fcvtmu x8, s9 +0x62 0x0 0x30 0x1e +0xa4 0x0 0x30 0x9e +0xe6 0x0 0x31 0x1e +0x28 0x1 0x31 0x9e + +# CHECK: fcvtzs w10, s11 +# CHECK: fcvtzs x12, s13 +# CHECK: fcvtzu w14, s15 +# CHECK: fcvtzu x15, s16 +0x6a 0x1 0x38 0x1e +0xac 0x1 0x38 0x9e +0xee 0x1 0x39 0x1e +0xf 0x2 0x39 0x9e + +# CHECK: scvtf s17, w18 +# CHECK: scvtf s19, x20 +# CHECK: ucvtf s21, w22 +# CHECK: scvtf s23, x24 +0x51 0x2 0x22 0x1e +0x93 0x2 0x22 0x9e +0xd5 0x2 0x23 0x1e +0x17 0x3 0x22 0x9e + +# CHECK: fcvtas w25, s26 +# CHECK: fcvtas x27, s28 +# CHECK: fcvtau w29, s30 +# CHECK: fcvtau xzr, s0 +0x59 0x3 0x24 0x1e +0x9b 0x3 0x24 0x9e +0xdd 0x3 0x25 0x1e +0x1f 0x0 0x25 0x9e + +# CHECK: fcvtns w3, d31 +# CHECK: fcvtns xzr, d12 +# CHECK: fcvtnu wzr, d12 +# CHECK: fcvtnu x0, d0 +0xe3 0x3 0x60 0x1e +0x9f 0x1 0x60 0x9e +0x9f 0x1 0x61 0x1e +0x0 0x0 0x61 0x9e + +# CHECK: fcvtps wzr, d9 +# CHECK: fcvtps x12, d20 +# CHECK: fcvtpu w30, d23 +# CHECK: fcvtpu x29, d3 +0x3f 0x1 0x68 0x1e +0x8c 0x2 0x68 0x9e +0xfe 0x2 0x69 0x1e +0x7d 0x0 0x69 0x9e + +# CHECK: fcvtms w2, d3 +# CHECK: fcvtms x4, d5 +# CHECK: fcvtmu w6, d7 +# CHECK: fcvtmu x8, d9 +0x62 0x0 0x70 0x1e +0xa4 0x0 0x70 0x9e +0xe6 0x0 0x71 0x1e +0x28 0x1 0x71 0x9e + +# CHECK: fcvtzs w10, d11 +# CHECK: fcvtzs x12, d13 +# CHECK: fcvtzu w14, d15 +# CHECK: fcvtzu x15, d16 +0x6a 0x1 0x78 0x1e +0xac 0x1 0x78 0x9e +0xee 0x1 0x79 0x1e +0xf 0x2 0x79 0x9e + +# CHECK: scvtf d17, w18 +# CHECK: scvtf d19, x20 +# CHECK: ucvtf d21, w22 +# CHECK: ucvtf d23, x24 +0x51 0x2 0x62 0x1e +0x93 0x2 0x62 0x9e +0xd5 0x2 0x63 0x1e +0x17 0x3 0x63 0x9e + +# CHECK: fcvtas w25, d26 +# CHECK: fcvtas x27, d28 +# CHECK: fcvtau w29, d30 +# CHECK: fcvtau xzr, d0 +0x59 0x3 0x64 0x1e +0x9b 0x3 0x64 0x9e +0xdd 0x3 0x65 0x1e +0x1f 0x0 0x65 0x9e + +# CHECK: fmov w3, s9 +# CHECK: fmov s9, w3 +0x23 0x1 0x26 0x1e +0x69 0x0 0x27 0x1e + +# CHECK: fmov x20, d31 +# CHECK: fmov d1, x15 +0xf4 0x3 0x66 0x9e +0xe1 0x1 0x67 0x9e + +# CHECK: fmov x3, v12.d[1] +# CHECK: fmov v1.d[1], x19 +0x83 0x1 0xae 0x9e +0x61 0x2 0xaf 0x9e + +#------------------------------------------------------------------------------ +# Floating-point immediate +#------------------------------------------------------------------------------ + +# CHECK: fmov s2, #0.12500000 +# CHECK: fmov s3, #1.00000000 +# CHECK: fmov d30, #16.00000000 +0x2 0x10 0x28 0x1e +0x3 0x10 0x2e 0x1e +0x1e 0x10 0x66 0x1e + +# CHECK: fmov s4, #1.06250000 +# CHECK: fmov d10, #1.93750000 +0x4 0x30 0x2e 0x1e +0xa 0xf0 0x6f 0x1e + +# CHECK: fmov s12, #-1.00000000 +0xc 0x10 0x3e 0x1e + +# CHECK: fmov d16, #8.50000000 +0x10 0x30 0x64 0x1e + +#------------------------------------------------------------------------------ +# Load-register (literal) +#------------------------------------------------------------------------------ + +# CHECK: ldr w3, #0 +# CHECK: ldr x29, #4 +# CHECK: ldrsw xzr, #-4 +0x03 0x00 0x00 0x18 +0x3d 0x00 0x00 0x58 +0xff 0xff 0xff 0x98 + +# CHECK: ldr s0, #8 +# CHECK: ldr d0, #1048572 +# CHECK: ldr q0, #-1048576 +0x40 0x00 0x00 0x1c +0xe0 0xff 0x7f 0x5c +0x00 0x00 0x80 0x9c + +# CHECK: prfm pldl1strm, #0 +# CHECK: prfm #22, #0 +0x01 0x00 0x00 0xd8 +0x16 0x00 0x00 0xd8 + +#------------------------------------------------------------------------------ +# Load/store exclusive +#------------------------------------------------------------------------------ + +#CHECK: stxrb w18, w8, [sp] +#CHECK: stxrh w24, w15, [x16] +#CHECK: stxr w5, w6, [x17] +#CHECK: stxr w1, x10, [x21] +#CHECK: stxr w1, x10, [x21] +0xe8 0x7f 0x12 0x08 +0x0f 0x7e 0x18 0x48 +0x26 0x7e 0x05 0x88 +0xaa 0x7e 0x01 0xc8 +0xaa 0x7a 0x01 0xc8 + +#CHECK: ldxrb w30, [x0] +#CHECK: ldxrh w17, [x4] +#CHECK: ldxr w22, [sp] +#CHECK: ldxr x11, [x29] +#CHECK: ldxr x11, [x29] +#CHECK: ldxr x11, [x29] +0x1e 0x7c 0x5f 0x08 +0x91 0x7c 0x5f 0x48 +0xf6 0x7f 0x5f 0x88 +0xab 0x7f 0x5f 0xc8 +0xab 0x6f 0x5f 0xc8 +0xab 0x7f 0x5e 0xc8 + +#CHECK: stxp w12, w11, w10, [sp] +#CHECK: stxp wzr, x27, x9, [x12] +0xeb 0x2b 0x2c 0x88 +0x9b 0x25 0x3f 0xc8 + +#CHECK: ldxp w0, wzr, [sp] +#CHECK: ldxp x17, x0, [x18] +#CHECK: ldxp x17, x0, [x18] +0xe0 0x7f 0x7f 0x88 +0x51 0x02 0x7f 0xc8 +0x51 0x02 0x7e 0xc8 + +#CHECK: stlxrb w12, w22, [x0] +#CHECK: stlxrh w10, w1, [x1] +#CHECK: stlxr w9, w2, [x2] +#CHECK: stlxr w9, x3, [sp] + +0x16 0xfc 0x0c 0x08 +0x21 0xfc 0x0a 0x48 +0x42 0xfc 0x09 0x88 +0xe3 0xff 0x09 0xc8 + +#CHECK: ldaxrb w8, [x4] +#CHECK: ldaxrh w7, [x5] +#CHECK: ldaxr w6, [sp] +#CHECK: ldaxr x5, [x6] +#CHECK: ldaxr x5, [x6] +#CHECK: ldaxr x5, [x6] +0x88 0xfc 0x5f 0x08 +0xa7 0xfc 0x5f 0x48 +0xe6 0xff 0x5f 0x88 +0xc5 0xfc 0x5f 0xc8 +0xc5 0xec 0x5f 0xc8 +0xc5 0xfc 0x5e 0xc8 + +#CHECK: stlxp w4, w5, w6, [sp] +#CHECK: stlxp wzr, x6, x7, [x1] +0xe5 0x9b 0x24 0x88 +0x26 0x9c 0x3f 0xc8 + +#CHECK: ldaxp w5, w18, [sp] +#CHECK: ldaxp x6, x19, [x22] +#CHECK: ldaxp x6, x19, [x22] +0xe5 0xcb 0x7f 0x88 +0xc6 0xce 0x7f 0xc8 +0xc6 0xce 0x7e 0xc8 + +#CHECK: stlrb w24, [sp] +#CHECK: stlrh w25, [x30] +#CHECK: stlr w26, [x29] +#CHECK: stlr x27, [x28] +#CHECK: stlr x27, [x28] +#CHECK: stlr x27, [x28] +0xf8 0xff 0x9f 0x08 +0xd9 0xff 0x9f 0x48 +0xba 0xff 0x9f 0x88 +0x9b 0xff 0x9f 0xc8 +0x9b 0xef 0x9f 0xc8 +0x9b 0xff 0x9e 0xc8 + +#CHECK: ldarb w23, [sp] +#CHECK: ldarh w22, [x30] +#CHECK: ldar wzr, [x29] +#CHECK: ldar x21, [x28] +#CHECK: ldar x21, [x28] +#CHECK: ldar x21, [x28] +0xf7 0xff 0xdf 0x08 +0xd6 0xff 0xdf 0x48 +0xbf 0xff 0xdf 0x88 +0x95 0xff 0xdf 0xc8 +0x95 0xef 0xdf 0xc8 +0x95 0xff 0xde 0xc8 + +#------------------------------------------------------------------------------ +# Load/store (unscaled immediate) +#------------------------------------------------------------------------------ + +# CHECK: sturb w9, [sp] +# CHECK: sturh wzr, [x12, #255] +# CHECK: stur w16, [x0, #-256] +# CHECK: stur x28, [x14, #1] +0xe9 0x3 0x0 0x38 +0x9f 0xf1 0xf 0x78 +0x10 0x0 0x10 0xb8 +0xdc 0x11 0x0 0xf8 + +# CHECK: ldurb w1, [x20, #255] +# CHECK: ldurh w20, [x1, #255] +# CHECK: ldur w12, [sp, #255] +# CHECK: ldur xzr, [x12, #255] +0x81 0xf2 0x4f 0x38 +0x34 0xf0 0x4f 0x78 +0xec 0xf3 0x4f 0xb8 +0x9f 0xf1 0x4f 0xf8 + +# CHECK: ldursb x9, [x7, #-256] +# CHECK: ldursh x17, [x19, #-256] +# CHECK: ldursw x20, [x15, #-256] +# CHECK: prfum pldl2keep, [sp, #-256] +# CHECK: ldursb w19, [x1, #-256] +# CHECK: ldursh w15, [x21, #-256] +0xe9 0x0 0x90 0x38 +0x71 0x2 0x90 0x78 +0xf4 0x1 0x90 0xb8 +0xe2 0x3 0x90 0xf8 +0x33 0x0 0xd0 0x38 +0xaf 0x2 0xd0 0x78 + +# CHECK: stur b0, [sp, #1] +# CHECK: stur h12, [x12, #-1] +# CHECK: stur s15, [x0, #255] +# CHECK: stur d31, [x5, #25] +# CHECK: stur q9, [x5] +0xe0 0x13 0x0 0x3c +0x8c 0xf1 0x1f 0x7c +0xf 0xf0 0xf 0xbc +0xbf 0x90 0x1 0xfc +0xa9 0x0 0x80 0x3c + +# CHECK: ldur b3, [sp] +# CHECK: ldur h5, [x4, #-256] +# CHECK: ldur s7, [x12, #-1] +# CHECK: ldur d11, [x19, #4] +# CHECK: ldur q13, [x1, #2] +0xe3 0x3 0x40 0x3c +0x85 0x0 0x50 0x7c +0x87 0xf1 0x5f 0xbc +0x6b 0x42 0x40 0xfc +0x2d 0x20 0xc0 0x3c + +#------------------------------------------------------------------------------ +# Load/store (immediate post-indexed) +#------------------------------------------------------------------------------ + +# E.g. "str xzr, [sp], #4" is *not* unpredictable +# CHECK-NOT: warning: potentially undefined instruction encoding +0xff 0x47 0x40 0xb8 + +# CHECK: strb w9, [x2], #255 +# CHECK: strb w10, [x3], #1 +# CHECK: strb w10, [x3], #-256 +# CHECK: strh w9, [x2], #255 +# CHECK: strh w9, [x2], #1 +# CHECK: strh w10, [x3], #-256 +0x49 0xf4 0xf 0x38 +0x6a 0x14 0x0 0x38 +0x6a 0x4 0x10 0x38 +0x49 0xf4 0xf 0x78 +0x49 0x14 0x0 0x78 +0x6a 0x4 0x10 0x78 + +# CHECK: str w19, [sp], #255 +# CHECK: str w20, [x30], #1 +# CHECK: str w21, [x12], #-256 +# CHECK: str xzr, [x9], #255 +# CHECK: str x2, [x3], #1 +# CHECK: str x19, [x12], #-256 +0xf3 0xf7 0xf 0xb8 +0xd4 0x17 0x0 0xb8 +0x95 0x5 0x10 0xb8 +0x3f 0xf5 0xf 0xf8 +0x62 0x14 0x0 0xf8 +0x93 0x5 0x10 0xf8 + +# CHECK: ldrb w9, [x2], #255 +# CHECK: ldrb w10, [x3], #1 +# CHECK: ldrb w10, [x3], #-256 +# CHECK: ldrh w9, [x2], #255 +# CHECK: ldrh w9, [x2], #1 +# CHECK: ldrh w10, [x3], #-256 +0x49 0xf4 0x4f 0x38 +0x6a 0x14 0x40 0x38 +0x6a 0x4 0x50 0x38 +0x49 0xf4 0x4f 0x78 +0x49 0x14 0x40 0x78 +0x6a 0x4 0x50 0x78 + +# CHECK: ldr w19, [sp], #255 +# CHECK: ldr w20, [x30], #1 +# CHECK: ldr w21, [x12], #-256 +# CHECK: ldr xzr, [x9], #255 +# CHECK: ldr x2, [x3], #1 +# CHECK: ldr x19, [x12], #-256 +0xf3 0xf7 0x4f 0xb8 +0xd4 0x17 0x40 0xb8 +0x95 0x5 0x50 0xb8 +0x3f 0xf5 0x4f 0xf8 +0x62 0x14 0x40 0xf8 +0x93 0x5 0x50 0xf8 + +# CHECK: ldrsb xzr, [x9], #255 +# CHECK: ldrsb x2, [x3], #1 +# CHECK: ldrsb x19, [x12], #-256 +# CHECK: ldrsh xzr, [x9], #255 +# CHECK: ldrsh x2, [x3], #1 +# CHECK: ldrsh x19, [x12], #-256 +# CHECK: ldrsw xzr, [x9], #255 +# CHECK: ldrsw x2, [x3], #1 +# CHECK: ldrsw x19, [x12], #-256 +0x3f 0xf5 0x8f 0x38 +0x62 0x14 0x80 0x38 +0x93 0x5 0x90 0x38 +0x3f 0xf5 0x8f 0x78 +0x62 0x14 0x80 0x78 +0x93 0x5 0x90 0x78 +0x3f 0xf5 0x8f 0xb8 +0x62 0x14 0x80 0xb8 +0x93 0x5 0x90 0xb8 + +# CHECK: ldrsb wzr, [x9], #255 +# CHECK: ldrsb w2, [x3], #1 +# CHECK: ldrsb w19, [x12], #-256 +# CHECK: ldrsh wzr, [x9], #255 +# CHECK: ldrsh w2, [x3], #1 +# CHECK: ldrsh w19, [x12], #-256 +0x3f 0xf5 0xcf 0x38 +0x62 0x14 0xc0 0x38 +0x93 0x5 0xd0 0x38 +0x3f 0xf5 0xcf 0x78 +0x62 0x14 0xc0 0x78 +0x93 0x5 0xd0 0x78 + +# CHECK: str b0, [x0], #255 +# CHECK: str b3, [x3], #1 +# CHECK: str b5, [sp], #-256 +# CHECK: str h10, [x10], #255 +# CHECK: str h13, [x23], #1 +# CHECK: str h15, [sp], #-256 +# CHECK: str s20, [x20], #255 +# CHECK: str s23, [x23], #1 +# CHECK: str s25, [x0], #-256 +# CHECK: str d20, [x20], #255 +# CHECK: str d23, [x23], #1 +# CHECK: str d25, [x0], #-256 +0x0 0xf4 0xf 0x3c +0x63 0x14 0x0 0x3c +0xe5 0x7 0x10 0x3c +0x4a 0xf5 0xf 0x7c +0xed 0x16 0x0 0x7c +0xef 0x7 0x10 0x7c +0x94 0xf6 0xf 0xbc +0xf7 0x16 0x0 0xbc +0x19 0x4 0x10 0xbc +0x94 0xf6 0xf 0xfc +0xf7 0x16 0x0 0xfc +0x19 0x4 0x10 0xfc + +# CHECK: ldr b0, [x0], #255 +# CHECK: ldr b3, [x3], #1 +# CHECK: ldr b5, [sp], #-256 +# CHECK: ldr h10, [x10], #255 +# CHECK: ldr h13, [x23], #1 +# CHECK: ldr h15, [sp], #-256 +# CHECK: ldr s20, [x20], #255 +# CHECK: ldr s23, [x23], #1 +# CHECK: ldr s25, [x0], #-256 +# CHECK: ldr d20, [x20], #255 +# CHECK: ldr d23, [x23], #1 +# CHECK: ldr d25, [x0], #-256 +0x0 0xf4 0x4f 0x3c +0x63 0x14 0x40 0x3c +0xe5 0x7 0x50 0x3c +0x4a 0xf5 0x4f 0x7c +0xed 0x16 0x40 0x7c +0xef 0x7 0x50 0x7c +0x94 0xf6 0x4f 0xbc +0xf7 0x16 0x40 0xbc +0x19 0x4 0x50 0xbc +0x94 0xf6 0x4f 0xfc +0xf7 0x16 0x40 0xfc +0x19 0x4 0x50 0xfc +0x34 0xf4 0xcf 0x3c + +# CHECK: ldr q20, [x1], #255 +# CHECK: ldr q23, [x9], #1 +# CHECK: ldr q25, [x20], #-256 +# CHECK: str q10, [x1], #255 +# CHECK: str q22, [sp], #1 +# CHECK: str q21, [x20], #-256 +0x37 0x15 0xc0 0x3c +0x99 0x6 0xd0 0x3c +0x2a 0xf4 0x8f 0x3c +0xf6 0x17 0x80 0x3c +0x95 0x6 0x90 0x3c + +#------------------------------------------------------------------------------- +# Load-store register (immediate pre-indexed) +#------------------------------------------------------------------------------- + +# E.g. "str xzr, [sp, #4]!" is *not* unpredictable +# CHECK-NOT: warning: potentially undefined instruction encoding +0xff 0xf 0x40 0xf8 + +# CHECK: ldr x3, [x4, #0]! +0x83 0xc 0x40 0xf8 + +# CHECK: strb w9, [x2, #255]! +# CHECK: strb w10, [x3, #1]! +# CHECK: strb w10, [x3, #-256]! +# CHECK: strh w9, [x2, #255]! +# CHECK: strh w9, [x2, #1]! +# CHECK: strh w10, [x3, #-256]! +0x49 0xfc 0xf 0x38 +0x6a 0x1c 0x0 0x38 +0x6a 0xc 0x10 0x38 +0x49 0xfc 0xf 0x78 +0x49 0x1c 0x0 0x78 +0x6a 0xc 0x10 0x78 + +# CHECK: str w19, [sp, #255]! +# CHECK: str w20, [x30, #1]! +# CHECK: str w21, [x12, #-256]! +# CHECK: str xzr, [x9, #255]! +# CHECK: str x2, [x3, #1]! +# CHECK: str x19, [x12, #-256]! +0xf3 0xff 0xf 0xb8 +0xd4 0x1f 0x0 0xb8 +0x95 0xd 0x10 0xb8 +0x3f 0xfd 0xf 0xf8 +0x62 0x1c 0x0 0xf8 +0x93 0xd 0x10 0xf8 + +# CHECK: ldrb w9, [x2, #255]! +# CHECK: ldrb w10, [x3, #1]! +# CHECK: ldrb w10, [x3, #-256]! +# CHECK: ldrh w9, [x2, #255]! +# CHECK: ldrh w9, [x2, #1]! +# CHECK: ldrh w10, [x3, #-256]! +0x49 0xfc 0x4f 0x38 +0x6a 0x1c 0x40 0x38 +0x6a 0xc 0x50 0x38 +0x49 0xfc 0x4f 0x78 +0x49 0x1c 0x40 0x78 +0x6a 0xc 0x50 0x78 + +# CHECK: ldr w19, [sp, #255]! +# CHECK: ldr w20, [x30, #1]! +# CHECK: ldr w21, [x12, #-256]! +# CHECK: ldr xzr, [x9, #255]! +# CHECK: ldr x2, [x3, #1]! +# CHECK: ldr x19, [x12, #-256]! +0xf3 0xff 0x4f 0xb8 +0xd4 0x1f 0x40 0xb8 +0x95 0xd 0x50 0xb8 +0x3f 0xfd 0x4f 0xf8 +0x62 0x1c 0x40 0xf8 +0x93 0xd 0x50 0xf8 + +# CHECK: ldrsb xzr, [x9, #255]! +# CHECK: ldrsb x2, [x3, #1]! +# CHECK: ldrsb x19, [x12, #-256]! +# CHECK: ldrsh xzr, [x9, #255]! +# CHECK: ldrsh x2, [x3, #1]! +# CHECK: ldrsh x19, [x12, #-256]! +# CHECK: ldrsw xzr, [x9, #255]! +# CHECK: ldrsw x2, [x3, #1]! +# CHECK: ldrsw x19, [x12, #-256]! +0x3f 0xfd 0x8f 0x38 +0x62 0x1c 0x80 0x38 +0x93 0xd 0x90 0x38 +0x3f 0xfd 0x8f 0x78 +0x62 0x1c 0x80 0x78 +0x93 0xd 0x90 0x78 +0x3f 0xfd 0x8f 0xb8 +0x62 0x1c 0x80 0xb8 +0x93 0xd 0x90 0xb8 + +# CHECK: ldrsb wzr, [x9, #255]! +# CHECK: ldrsb w2, [x3, #1]! +# CHECK: ldrsb w19, [x12, #-256]! +# CHECK: ldrsh wzr, [x9, #255]! +# CHECK: ldrsh w2, [x3, #1]! +# CHECK: ldrsh w19, [x12, #-256]! +0x3f 0xfd 0xcf 0x38 +0x62 0x1c 0xc0 0x38 +0x93 0xd 0xd0 0x38 +0x3f 0xfd 0xcf 0x78 +0x62 0x1c 0xc0 0x78 +0x93 0xd 0xd0 0x78 + +# CHECK: str b0, [x0, #255]! +# CHECK: str b3, [x3, #1]! +# CHECK: str b5, [sp, #-256]! +# CHECK: str h10, [x10, #255]! +# CHECK: str h13, [x23, #1]! +# CHECK: str h15, [sp, #-256]! +# CHECK: str s20, [x20, #255]! +# CHECK: str s23, [x23, #1]! +# CHECK: str s25, [x0, #-256]! +# CHECK: str d20, [x20, #255]! +# CHECK: str d23, [x23, #1]! +# CHECK: str d25, [x0, #-256]! +0x0 0xfc 0xf 0x3c +0x63 0x1c 0x0 0x3c +0xe5 0xf 0x10 0x3c +0x4a 0xfd 0xf 0x7c +0xed 0x1e 0x0 0x7c +0xef 0xf 0x10 0x7c +0x94 0xfe 0xf 0xbc +0xf7 0x1e 0x0 0xbc +0x19 0xc 0x10 0xbc +0x94 0xfe 0xf 0xfc +0xf7 0x1e 0x0 0xfc +0x19 0xc 0x10 0xfc + +# CHECK: ldr b0, [x0, #255]! +# CHECK: ldr b3, [x3, #1]! +# CHECK: ldr b5, [sp, #-256]! +# CHECK: ldr h10, [x10, #255]! +# CHECK: ldr h13, [x23, #1]! +# CHECK: ldr h15, [sp, #-256]! +# CHECK: ldr s20, [x20, #255]! +# CHECK: ldr s23, [x23, #1]! +# CHECK: ldr s25, [x0, #-256]! +# CHECK: ldr d20, [x20, #255]! +# CHECK: ldr d23, [x23, #1]! +# CHECK: ldr d25, [x0, #-256]! +0x0 0xfc 0x4f 0x3c +0x63 0x1c 0x40 0x3c +0xe5 0xf 0x50 0x3c +0x4a 0xfd 0x4f 0x7c +0xed 0x1e 0x40 0x7c +0xef 0xf 0x50 0x7c +0x94 0xfe 0x4f 0xbc +0xf7 0x1e 0x40 0xbc +0x19 0xc 0x50 0xbc +0x94 0xfe 0x4f 0xfc +0xf7 0x1e 0x40 0xfc +0x19 0xc 0x50 0xfc + +# CHECK: ldr q20, [x1, #255]! +# CHECK: ldr q23, [x9, #1]! +# CHECK: ldr q25, [x20, #-256]! +# CHECK: str q10, [x1, #255]! +# CHECK: str q22, [sp, #1]! +# CHECK: str q21, [x20, #-256]! +0x34 0xfc 0xcf 0x3c +0x37 0x1d 0xc0 0x3c +0x99 0xe 0xd0 0x3c +0x2a 0xfc 0x8f 0x3c +0xf6 0x1f 0x80 0x3c +0x95 0xe 0x90 0x3c + +#------------------------------------------------------------------------------ +# Load/store (unprivileged) +#------------------------------------------------------------------------------ + +# CHECK: sttrb w9, [sp] +# CHECK: sttrh wzr, [x12, #255] +# CHECK: sttr w16, [x0, #-256] +# CHECK: sttr x28, [x14, #1] +0xe9 0x0b 0x0 0x38 +0x9f 0xf9 0xf 0x78 +0x10 0x08 0x10 0xb8 +0xdc 0x19 0x0 0xf8 + +# CHECK: ldtrb w1, [x20, #255] +# CHECK: ldtrh w20, [x1, #255] +# CHECK: ldtr w12, [sp, #255] +# CHECK: ldtr xzr, [x12, #255] +0x81 0xfa 0x4f 0x38 +0x34 0xf8 0x4f 0x78 +0xec 0xfb 0x4f 0xb8 +0x9f 0xf9 0x4f 0xf8 + +# CHECK: ldtrsb x9, [x7, #-256] +# CHECK: ldtrsh x17, [x19, #-256] +# CHECK: ldtrsw x20, [x15, #-256] +# CHECK: ldtrsb w19, [x1, #-256] +# CHECK: ldtrsh w15, [x21, #-256] +0xe9 0x08 0x90 0x38 +0x71 0x0a 0x90 0x78 +0xf4 0x09 0x90 0xb8 +0x33 0x08 0xd0 0x38 +0xaf 0x0a 0xd0 0x78 + +#------------------------------------------------------------------------------ +# Load/store (unsigned immediate) +#------------------------------------------------------------------------------ + +# CHECK: ldr x0, [x0] +# CHECK: ldr x4, [x29] +# CHECK: ldr x30, [x12, #32760] +# CHECK: ldr x20, [sp, #8] +0x0 0x0 0x40 0xf9 +0xa4 0x3 0x40 0xf9 +0x9e 0xfd 0x7f 0xf9 +0xf4 0x7 0x40 0xf9 + +# CHECK: ldr xzr, [sp] +0xff 0x3 0x40 0xf9 + +# CHECK: ldr w2, [sp] +# CHECK: ldr w17, [sp, #16380] +# CHECK: ldr w13, [x2, #4] +0xe2 0x3 0x40 0xb9 +0xf1 0xff 0x7f 0xb9 +0x4d 0x4 0x40 0xb9 + +# CHECK: ldrsw x2, [x5, #4] +# CHECK: ldrsw x23, [sp, #16380] +0xa2 0x4 0x80 0xb9 +0xf7 0xff 0xbf 0xb9 + +# CHECK: ldrh w2, [x4] +# CHECK: ldrsh w23, [x6, #8190] +# CHECK: ldrsh wzr, [sp, #2] +# CHECK: ldrsh x29, [x2, #2] +0x82 0x0 0x40 0x79 +0xd7 0xfc 0xff 0x79 +0xff 0x7 0xc0 0x79 +0x5d 0x4 0x80 0x79 + +# CHECK: ldrb w26, [x3, #121] +# CHECK: ldrb w12, [x2] +# CHECK: ldrsb w27, [sp, #4095] +# CHECK: ldrsb xzr, [x15] +0x7a 0xe4 0x41 0x39 +0x4c 0x0 0x40 0x39 +0xfb 0xff 0xff 0x39 +0xff 0x1 0x80 0x39 + +# CHECK: str x30, [sp] +# CHECK: str w20, [x4, #16380] +# CHECK: strh w20, [x10, #14] +# CHECK: strh w17, [sp, #8190] +# CHECK: strb w23, [x3, #4095] +# CHECK: strb wzr, [x2] +0xfe 0x3 0x0 0xf9 +0x94 0xfc 0x3f 0xb9 +0x54 0x1d 0x0 0x79 +0xf1 0xff 0x3f 0x79 +0x77 0xfc 0x3f 0x39 +0x5f 0x0 0x0 0x39 + +# CHECK: ldr b31, [sp, #4095] +# CHECK: ldr h20, [x2, #8190] +# CHECK: ldr s10, [x19, #16380] +# CHECK: ldr d3, [x10, #32760] +# CHECK: str q12, [sp, #65520] +0xff 0xff 0x7f 0x3d +0x54 0xfc 0x7f 0x7d +0x6a 0xfe 0x7f 0xbd +0x43 0xfd 0x7f 0xfd +0xec 0xff 0xbf 0x3d + +# CHECK: prfm pldl1keep, [sp, #8] +# CHECK: prfm pldl1strm, [x3, #0] +# CHECK: prfm pldl2keep, [x5, #16] +# CHECK: prfm pldl2strm, [x2, #0] +# CHECK: prfm pldl3keep, [x5, #0] +# CHECK: prfm pldl3strm, [x6, #0] +# CHECK: prfm plil1keep, [sp, #8] +# CHECK: prfm plil1strm, [x3, #0] +# CHECK: prfm plil2keep, [x5, #16] +# CHECK: prfm plil2strm, [x2, #0] +# CHECK: prfm plil3keep, [x5, #0] +# CHECK: prfm plil3strm, [x6, #0] +# CHECK: prfm pstl1keep, [sp, #8] +# CHECK: prfm pstl1strm, [x3, #0] +# CHECK: prfm pstl2keep, [x5, #16] +# CHECK: prfm pstl2strm, [x2, #0] +# CHECK: prfm pstl3keep, [x5, #0] +# CHECK: prfm pstl3strm, [x6, #0] +0xe0 0x07 0x80 0xf9 +0x61 0x00 0x80 0xf9 +0xa2 0x08 0x80 0xf9 +0x43 0x00 0x80 0xf9 +0xa4 0x00 0x80 0xf9 +0xc5 0x00 0x80 0xf9 +0xe8 0x07 0x80 0xf9 +0x69 0x00 0x80 0xf9 +0xaa 0x08 0x80 0xf9 +0x4b 0x00 0x80 0xf9 +0xac 0x00 0x80 0xf9 +0xcd 0x00 0x80 0xf9 +0xf0 0x07 0x80 0xf9 +0x71 0x00 0x80 0xf9 +0xb2 0x08 0x80 0xf9 +0x53 0x00 0x80 0xf9 +0xb4 0x00 0x80 0xf9 +0xd5 0x00 0x80 0xf9 + + +#------------------------------------------------------------------------------ +# Load/store (register offset) +#------------------------------------------------------------------------------ + +# CHECK: ldrb w3, [sp, x5] +# CHECK: ldrb w9, [x27, x6] +# CHECK: ldrsb w10, [x30, x7] +# CHECK: ldrb w11, [x29, x3, sxtx] +# CHECK: strb w12, [x28, xzr, sxtx] +# CHECK: ldrb w14, [x26, w6, uxtw] +# CHECK: ldrsb w15, [x25, w7, uxtw] +# CHECK: ldrb w17, [x23, w9, sxtw] +# CHECK: ldrsb x18, [x22, w10, sxtw] +0xe3 0x6b 0x65 0x38 +0x69 0x6b 0x66 0x38 +0xca 0x6b 0xe7 0x38 +0xab 0xeb 0x63 0x38 +0x8c 0xeb 0x3f 0x38 +0x4e 0x4b 0x66 0x38 +0x2f 0x4b 0xe7 0x38 +0xf1 0xca 0x69 0x38 +0xd2 0xca 0xaa 0x38 + +# CHECK: ldrsh w3, [sp, x5] +# CHECK: ldrsh w9, [x27, x6] +# CHECK: ldrh w10, [x30, x7, lsl #1] +# CHECK: strh w11, [x29, x3, sxtx] +# CHECK: ldrh w12, [x28, xzr, sxtx] +# CHECK: ldrsh x13, [x27, x5, sxtx #1] +# CHECK: ldrh w14, [x26, w6, uxtw] +# CHECK: ldrh w15, [x25, w7, uxtw] +# CHECK: ldrsh w16, [x24, w8, uxtw #1] +# CHECK: ldrh w17, [x23, w9, sxtw] +# CHECK: ldrh w18, [x22, w10, sxtw] +# CHECK: strh w19, [x21, wzr, sxtw #1] +0xe3 0x6b 0xe5 0x78 +0x69 0x6b 0xe6 0x78 +0xca 0x7b 0x67 0x78 +0xab 0xeb 0x23 0x78 +0x8c 0xeb 0x7f 0x78 +0x6d 0xfb 0xa5 0x78 +0x4e 0x4b 0x66 0x78 +0x2f 0x4b 0x67 0x78 +0x10 0x5b 0xe8 0x78 +0xf1 0xca 0x69 0x78 +0xd2 0xca 0x6a 0x78 +0xb3 0xda 0x3f 0x78 + +# CHECK: ldr w3, [sp, x5] +# CHECK: ldr s9, [x27, x6] +# CHECK: ldr w10, [x30, x7, lsl #2] +# CHECK: ldr w11, [x29, x3, sxtx] +# CHECK: str s12, [x28, xzr, sxtx] +# CHECK: str w13, [x27, x5, sxtx #2] +# CHECK: str w14, [x26, w6, uxtw] +# CHECK: ldr w15, [x25, w7, uxtw] +# CHECK: ldr w16, [x24, w8, uxtw #2] +# CHECK: ldrsw x17, [x23, w9, sxtw] +# CHECK: ldr w18, [x22, w10, sxtw] +# CHECK: ldrsw x19, [x21, wzr, sxtw #2] +0xe3 0x6b 0x65 0xb8 +0x69 0x6b 0x66 0xbc +0xca 0x7b 0x67 0xb8 +0xab 0xeb 0x63 0xb8 +0x8c 0xeb 0x3f 0xbc +0x6d 0xfb 0x25 0xb8 +0x4e 0x4b 0x26 0xb8 +0x2f 0x4b 0x67 0xb8 +0x10 0x5b 0x68 0xb8 +0xf1 0xca 0xa9 0xb8 +0xd2 0xca 0x6a 0xb8 +0xb3 0xda 0xbf 0xb8 + +# CHECK: ldr x3, [sp, x5] +# CHECK: str x9, [x27, x6] +# CHECK: ldr d10, [x30, x7, lsl #3] +# CHECK: str x11, [x29, x3, sxtx] +# CHECK: ldr x12, [x28, xzr, sxtx] +# CHECK: ldr x13, [x27, x5, sxtx #3] +# CHECK: prfm pldl1keep, [x26, w6, uxtw] +# CHECK: ldr x15, [x25, w7, uxtw] +# CHECK: ldr x16, [x24, w8, uxtw #3] +# CHECK: ldr x17, [x23, w9, sxtw] +# CHECK: ldr x18, [x22, w10, sxtw] +# CHECK: str d19, [x21, wzr, sxtw #3] +0xe3 0x6b 0x65 0xf8 +0x69 0x6b 0x26 0xf8 +0xca 0x7b 0x67 0xfc +0xab 0xeb 0x23 0xf8 +0x8c 0xeb 0x7f 0xf8 +0x6d 0xfb 0x65 0xf8 +0x40 0x4b 0xa6 0xf8 +0x2f 0x4b 0x67 0xf8 +0x10 0x5b 0x68 0xf8 +0xf1 0xca 0x69 0xf8 +0xd2 0xca 0x6a 0xf8 +0xb3 0xda 0x3f 0xfc + +# CHECK: ldr q3, [sp, x5] +# CHECK: ldr q9, [x27, x6] +# CHECK: ldr q10, [x30, x7, lsl #4] +# CHECK: str q11, [x29, x3, sxtx] +# CHECK: str q12, [x28, xzr, sxtx] +# CHECK: str q13, [x27, x5, sxtx #4] +# CHECK: ldr q14, [x26, w6, uxtw] +# CHECK: ldr q15, [x25, w7, uxtw] +# CHECK: ldr q16, [x24, w8, uxtw #4] +# CHECK: ldr q17, [x23, w9, sxtw] +# CHECK: str q18, [x22, w10, sxtw] +# CHECK: ldr q19, [x21, wzr, sxtw #4] +0xe3 0x6b 0xe5 0x3c +0x69 0x6b 0xe6 0x3c +0xca 0x7b 0xe7 0x3c +0xab 0xeb 0xa3 0x3c +0x8c 0xeb 0xbf 0x3c +0x6d 0xfb 0xa5 0x3c +0x4e 0x4b 0xe6 0x3c +0x2f 0x4b 0xe7 0x3c +0x10 0x5b 0xe8 0x3c +0xf1 0xca 0xe9 0x3c +0xd2 0xca 0xaa 0x3c +0xb3 0xda 0xff 0x3c + +#------------------------------------------------------------------------------ +# Load/store register pair (offset) +#------------------------------------------------------------------------------ + +# CHECK: ldp w3, w5, [sp] +# CHECK: stp wzr, w9, [sp, #252] +# CHECK: ldp w2, wzr, [sp, #-256] +# CHECK: ldp w9, w10, [sp, #4] +0xe3 0x17 0x40 0x29 +0xff 0xa7 0x1f 0x29 +0xe2 0x7f 0x60 0x29 +0xe9 0xab 0x40 0x29 + +# CHECK: ldpsw x9, x10, [sp, #4] +# CHECK: ldpsw x9, x10, [x2, #-256] +# CHECK: ldpsw x20, x30, [sp, #252] +0xe9 0xab 0x40 0x69 +0x49 0x28 0x60 0x69 +0xf4 0xfb 0x5f 0x69 + +# CHECK: ldp x21, x29, [x2, #504] +# CHECK: ldp x22, x23, [x3, #-512] +# CHECK: ldp x24, x25, [x4, #8] +0x55 0xf4 0x5f 0xa9 +0x76 0x5c 0x60 0xa9 +0x98 0xe4 0x40 0xa9 + +# CHECK: ldp s29, s28, [sp, #252] +# CHECK: stp s27, s26, [sp, #-256] +# CHECK: ldp s1, s2, [x3, #44] +0xfd 0xf3 0x5f 0x2d +0xfb 0x6b 0x20 0x2d +0x61 0x88 0x45 0x2d + +# CHECK: stp d3, d5, [x9, #504] +# CHECK: stp d7, d11, [x10, #-512] +# CHECK: ldp d2, d3, [x30, #-8] +0x23 0x95 0x1f 0x6d +0x47 0x2d 0x20 0x6d +0xc2 0x8f 0x7f 0x6d + +# CHECK: stp q3, q5, [sp] +# CHECK: stp q17, q19, [sp, #1008] +# CHECK: ldp q23, q29, [x1, #-1024] +0xe3 0x17 0x0 0xad +0xf1 0xcf 0x1f 0xad +0x37 0x74 0x60 0xad + +#------------------------------------------------------------------------------ +# Load/store register pair (post-indexed) +#------------------------------------------------------------------------------ + +# CHECK: ldp w3, w5, [sp], #0 +# CHECK: stp wzr, w9, [sp], #252 +# CHECK: ldp w2, wzr, [sp], #-256 +# CHECK: ldp w9, w10, [sp], #4 +0xe3 0x17 0xc0 0x28 +0xff 0xa7 0x9f 0x28 +0xe2 0x7f 0xe0 0x28 +0xe9 0xab 0xc0 0x28 + +# CHECK: ldpsw x9, x10, [sp], #4 +# CHECK: ldpsw x9, x10, [x2], #-256 +# CHECK: ldpsw x20, x30, [sp], #252 +0xe9 0xab 0xc0 0x68 +0x49 0x28 0xe0 0x68 +0xf4 0xfb 0xdf 0x68 + +# CHECK: ldp x21, x29, [x2], #504 +# CHECK: ldp x22, x23, [x3], #-512 +# CHECK: ldp x24, x25, [x4], #8 +0x55 0xf4 0xdf 0xa8 +0x76 0x5c 0xe0 0xa8 +0x98 0xe4 0xc0 0xa8 + +# CHECK: ldp s29, s28, [sp], #252 +# CHECK: stp s27, s26, [sp], #-256 +# CHECK: ldp s1, s2, [x3], #44 +0xfd 0xf3 0xdf 0x2c +0xfb 0x6b 0xa0 0x2c +0x61 0x88 0xc5 0x2c + +# CHECK: stp d3, d5, [x9], #504 +# CHECK: stp d7, d11, [x10], #-512 +# CHECK: ldp d2, d3, [x30], #-8 +0x23 0x95 0x9f 0x6c +0x47 0x2d 0xa0 0x6c +0xc2 0x8f 0xff 0x6c + +# CHECK: stp q3, q5, [sp], #0 +# CHECK: stp q17, q19, [sp], #1008 +# CHECK: ldp q23, q29, [x1], #-1024 +0xe3 0x17 0x80 0xac +0xf1 0xcf 0x9f 0xac +0x37 0x74 0xe0 0xac + +#------------------------------------------------------------------------------ +# Load/store register pair (pre-indexed) +#------------------------------------------------------------------------------ + +# CHECK: ldp w3, w5, [sp, #0]! +# CHECK: stp wzr, w9, [sp, #252]! +# CHECK: ldp w2, wzr, [sp, #-256]! +# CHECK: ldp w9, w10, [sp, #4]! +0xe3 0x17 0xc0 0x29 +0xff 0xa7 0x9f 0x29 +0xe2 0x7f 0xe0 0x29 +0xe9 0xab 0xc0 0x29 + +# CHECK: ldpsw x9, x10, [sp, #4]! +# CHECK: ldpsw x9, x10, [x2, #-256]! +# CHECK: ldpsw x20, x30, [sp, #252]! +0xe9 0xab 0xc0 0x69 +0x49 0x28 0xe0 0x69 +0xf4 0xfb 0xdf 0x69 + +# CHECK: ldp x21, x29, [x2, #504]! +# CHECK: ldp x22, x23, [x3, #-512]! +# CHECK: ldp x24, x25, [x4, #8]! +0x55 0xf4 0xdf 0xa9 +0x76 0x5c 0xe0 0xa9 +0x98 0xe4 0xc0 0xa9 + +# CHECK: ldp s29, s28, [sp, #252]! +# CHECK: stp s27, s26, [sp, #-256]! +# CHECK: ldp s1, s2, [x3, #44]! +0xfd 0xf3 0xdf 0x2d +0xfb 0x6b 0xa0 0x2d +0x61 0x88 0xc5 0x2d + +# CHECK: stp d3, d5, [x9, #504]! +# CHECK: stp d7, d11, [x10, #-512]! +# CHECK: ldp d2, d3, [x30, #-8]! +0x23 0x95 0x9f 0x6d +0x47 0x2d 0xa0 0x6d +0xc2 0x8f 0xff 0x6d + +# CHECK: stp q3, q5, [sp, #0]! +# CHECK: stp q17, q19, [sp, #1008]! +# CHECK: ldp q23, q29, [x1, #-1024]! +0xe3 0x17 0x80 0xad +0xf1 0xcf 0x9f 0xad +0x37 0x74 0xe0 0xad + +#------------------------------------------------------------------------------ +# Load/store register pair (offset) +#------------------------------------------------------------------------------ + +# CHECK: ldnp w3, w5, [sp] +# CHECK: stnp wzr, w9, [sp, #252] +# CHECK: ldnp w2, wzr, [sp, #-256] +# CHECK: ldnp w9, w10, [sp, #4] +0xe3 0x17 0x40 0x28 +0xff 0xa7 0x1f 0x28 +0xe2 0x7f 0x60 0x28 +0xe9 0xab 0x40 0x28 + +# CHECK: ldnp x21, x29, [x2, #504] +# CHECK: ldnp x22, x23, [x3, #-512] +# CHECK: ldnp x24, x25, [x4, #8] +0x55 0xf4 0x5f 0xa8 +0x76 0x5c 0x60 0xa8 +0x98 0xe4 0x40 0xa8 + +# CHECK: ldnp s29, s28, [sp, #252] +# CHECK: stnp s27, s26, [sp, #-256] +# CHECK: ldnp s1, s2, [x3, #44] +0xfd 0xf3 0x5f 0x2c +0xfb 0x6b 0x20 0x2c +0x61 0x88 0x45 0x2c + +# CHECK: stnp d3, d5, [x9, #504] +# CHECK: stnp d7, d11, [x10, #-512] +# CHECK: ldnp d2, d3, [x30, #-8] +0x23 0x95 0x1f 0x6c +0x47 0x2d 0x20 0x6c +0xc2 0x8f 0x7f 0x6c + +# CHECK: stnp q3, q5, [sp] +# CHECK: stnp q17, q19, [sp, #1008] +# CHECK: ldnp q23, q29, [x1, #-1024] +0xe3 0x17 0x0 0xac +0xf1 0xcf 0x1f 0xac +0x37 0x74 0x60 0xac + +#------------------------------------------------------------------------------ +# Logical (immediate) +#------------------------------------------------------------------------------ +# CHECK: orr w3, w9, #0xffff0000 +# CHECK: orr wsp, w10, #0xe00000ff +# CHECK: orr w9, w10, #0x3ff +0x23 0x3d 0x10 0x32 +0x5f 0x29 0x3 0x32 +0x49 0x25 0x0 0x32 + +# CHECK: and w14, w15, #0x80008000 +# CHECK: and w12, w13, #0xffc3ffc3 +# CHECK: and w11, wzr, #0x30003 +0xee 0x81 0x1 0x12 +0xac 0xad 0xa 0x12 +0xeb 0x87 0x0 0x12 + +# CHECK: eor w3, w6, #0xe0e0e0e0 +# CHECK: eor wsp, wzr, #0x3030303 +# CHECK: eor w16, w17, #0x81818181 +0xc3 0xc8 0x3 0x52 +0xff 0xc7 0x0 0x52 +0x30 0xc6 0x1 0x52 + +# CHECK: ands wzr, w18, #0xcccccccc +# CHECK: ands w19, w20, #0x33333333 +# CHECK: ands w21, w22, #0x99999999 +0x5f 0xe6 0x2 0x72 +0x93 0xe6 0x0 0x72 +0xd5 0xe6 0x1 0x72 + +# CHECK: ands wzr, w3, #0xaaaaaaaa +# CHECK: ands wzr, wzr, #0x55555555 +0x7f 0xf0 0x1 0x72 +0xff 0xf3 0x0 0x72 + +# CHECK: eor x3, x5, #0xffffffffc000000 +# CHECK: and x9, x10, #0x7fffffffffff +# CHECK: orr x11, x12, #0x8000000000000fff +0xa3 0x84 0x66 0xd2 +0x49 0xb9 0x40 0x92 +0x8b 0x31 0x41 0xb2 + +# CHECK: orr x3, x9, #0xffff0000ffff0000 +# CHECK: orr sp, x10, #0xe00000ffe00000ff +# CHECK: orr x9, x10, #0x3ff000003ff +0x23 0x3d 0x10 0xb2 +0x5f 0x29 0x3 0xb2 +0x49 0x25 0x0 0xb2 + +# CHECK: and x14, x15, #0x8000800080008000 +# CHECK: and x12, x13, #0xffc3ffc3ffc3ffc3 +# CHECK: and x11, xzr, #0x3000300030003 +0xee 0x81 0x1 0x92 +0xac 0xad 0xa 0x92 +0xeb 0x87 0x0 0x92 + +# CHECK: eor x3, x6, #0xe0e0e0e0e0e0e0e0 +# CHECK: eor sp, xzr, #0x303030303030303 +# CHECK: eor x16, x17, #0x8181818181818181 +0xc3 0xc8 0x3 0xd2 +0xff 0xc7 0x0 0xd2 +0x30 0xc6 0x1 0xd2 + +# CHECK: ands xzr, x18, #0xcccccccccccccccc +# CHECK: ands x19, x20, #0x3333333333333333 +# CHECK: ands x21, x22, #0x9999999999999999 +0x5f 0xe6 0x2 0xf2 +0x93 0xe6 0x0 0xf2 +0xd5 0xe6 0x1 0xf2 + +# CHECK: ands xzr, x3, #0xaaaaaaaaaaaaaaaa +# CHECK: ands xzr, xzr, #0x5555555555555555 +0x7f 0xf0 0x1 0xf2 +0xff 0xf3 0x0 0xf2 + +# CHECK: orr w3, wzr, #0xf000f +# CHECK: orr x10, xzr, #0xaaaaaaaaaaaaaaaa +0xe3 0x8f 0x0 0x32 +0xea 0xf3 0x1 0xb2 + +# CHECK: orr w3, wzr, #0xffff +# CHECK: orr x9, xzr, #0xffff00000000 +0xe3 0x3f 0x0 0x32 +0xe9 0x3f 0x60 0xb2 + +#------------------------------------------------------------------------------ +# Logical (shifted register) +#------------------------------------------------------------------------------ + +# CHECK: and w12, w23, w21 +# CHECK: and w16, w15, w1, lsl #1 +# CHECK: and w9, w4, w10, lsl #31 +# CHECK: and w3, w30, w11 +# CHECK: and x3, x5, x7, lsl #63 +0xec 0x2 0x15 0xa +0xf0 0x5 0x1 0xa +0x89 0x7c 0xa 0xa +0xc3 0x3 0xb 0xa +0xa3 0xfc 0x7 0x8a + +# CHECK: and x5, x14, x19, asr #4 +# CHECK: and w3, w17, w19, ror #31 +# CHECK: and w0, w2, wzr, lsr #17 +# CHECK: and w3, w30, w11, asr +0xc5 0x11 0x93 0x8a +0x23 0x7e 0xd3 0xa +0x40 0x44 0x5f 0xa +0xc3 0x3 0x8b 0xa + +# CHECK: and xzr, x4, x26 +# CHECK: and w3, wzr, w20, ror +# CHECK: and x7, x20, xzr, asr #63 +0x9f 0x0 0x1a 0x8a +0xe3 0x3 0xd4 0xa +0x87 0xfe 0x9f 0x8a + +# CHECK: bic x13, x20, x14, lsl #47 +# CHECK: bic w2, w7, w9 +# CHECK: orr w2, w7, w0, asr #31 +# CHECK: orr x8, x9, x10, lsl #12 +# CHECK: orn x3, x5, x7, asr +# CHECK: orn w2, w5, w29 +0x8d 0xbe 0x2e 0x8a +0xe2 0x0 0x29 0xa +0xe2 0x7c 0x80 0x2a +0x28 0x31 0xa 0xaa +0xa3 0x0 0xa7 0xaa +0xa2 0x0 0x3d 0x2a + +# CHECK: ands w7, wzr, w9, lsl #1 +# CHECK: ands x3, x5, x20, ror #63 +# CHECK: bics w3, w5, w7 +# CHECK: bics x3, xzr, x3, lsl #1 +# CHECK: tst w3, w7, lsl #31 +# CHECK: tst x2, x20, asr +0xe7 0x7 0x9 0x6a +0xa3 0xfc 0xd4 0xea +0xa3 0x0 0x27 0x6a +0xe3 0x7 0x23 0xea +0x7f 0x7c 0x7 0x6a +0x5f 0x0 0x94 0xea + +# CHECK: mov x3, x6 +# CHECK: mov x3, xzr +# CHECK: mov wzr, w2 +# CHECK: mov w3, w5 +0xe3 0x3 0x6 0xaa +0xe3 0x3 0x1f 0xaa +0xff 0x3 0x2 0x2a +0xe3 0x3 0x5 0x2a + +#------------------------------------------------------------------------------ +# Move wide (immediate) +#------------------------------------------------------------------------------ + +# N.b. (FIXME) canonical aliases aren't produced here because of +# limitation in InstAlias. Lots of the "mov[nz]" instructions should +# be "mov". + +# CHECK: movz w1, #65535 +# CHECK: movz w2, #0, lsl #16 +# CHECK: movn w2, #1234 +0xe1 0xff 0x9f 0x52 +0x2 0x0 0xa0 0x52 +0x42 0x9a 0x80 0x12 + +# CHECK: movz x2, #1234, lsl #32 +# CHECK: movk xzr, #4321, lsl #48 +0x42 0x9a 0xc0 0xd2 +0x3f 0x1c 0xe2 0xf2 + +# CHECK: movz x2, #0 +# CHECK: movk w3, #0 +# CHECK: movz x4, #0, lsl #16 +# CHECK: movk w5, #0, lsl #16 +# CHECK: movz x6, #0, lsl #32 +# CHECK: movk x7, #0, lsl #32 +# CHECK: movz x8, #0, lsl #48 +# CHECK: movk x9, #0, lsl #48 +0x2 0x0 0x80 0xd2 +0x3 0x0 0x80 0x72 +0x4 0x0 0xa0 0xd2 +0x5 0x0 0xa0 0x72 +0x6 0x0 0xc0 0xd2 +0x7 0x0 0xc0 0xf2 +0x8 0x0 0xe0 0xd2 +0x9 0x0 0xe0 0xf2 + +#------------------------------------------------------------------------------ +# PC-relative addressing +#------------------------------------------------------------------------------ + +# It's slightly dodgy using immediates here, but harmless enough when +# it's all that's available. + +# CHECK: adr x2, #1600 +# CHECK: adrp x21, #6553600 +# CHECK: adr x0, #262144 +0x02 0x32 0x00 0x10 +0x15 0x32 0x00 0x90 +0x00 0x00 0x20 0x10 + +#------------------------------------------------------------------------------ +# System +#------------------------------------------------------------------------------ + +# CHECK: nop +# CHECK: hint #127 +# CHECK: nop +# CHECK: yield +# CHECK: wfe +# CHECK: wfi +# CHECK: sev +# CHECK: sevl +0x1f 0x20 0x3 0xd5 +0xff 0x2f 0x3 0xd5 +0x1f 0x20 0x3 0xd5 +0x3f 0x20 0x3 0xd5 +0x5f 0x20 0x3 0xd5 +0x7f 0x20 0x3 0xd5 +0x9f 0x20 0x3 0xd5 +0xbf 0x20 0x3 0xd5 + +# CHECK: clrex +# CHECK: clrex #0 +# CHECK: clrex #7 +# CHECK: clrex +0x5f 0x3f 0x3 0xd5 +0x5f 0x30 0x3 0xd5 +0x5f 0x37 0x3 0xd5 +0x5f 0x3f 0x3 0xd5 + +# CHECK: dsb #0 +# CHECK: dsb #12 +# CHECK: dsb sy +# CHECK: dsb oshld +# CHECK: dsb oshst +# CHECK: dsb osh +# CHECK: dsb nshld +# CHECK: dsb nshst +# CHECK: dsb nsh +# CHECK: dsb ishld +# CHECK: dsb ishst +# CHECK: dsb ish +# CHECK: dsb ld +# CHECK: dsb st +# CHECK: dsb sy +0x9f 0x30 0x3 0xd5 +0x9f 0x3c 0x3 0xd5 +0x9f 0x3f 0x3 0xd5 +0x9f 0x31 0x3 0xd5 +0x9f 0x32 0x3 0xd5 +0x9f 0x33 0x3 0xd5 +0x9f 0x35 0x3 0xd5 +0x9f 0x36 0x3 0xd5 +0x9f 0x37 0x3 0xd5 +0x9f 0x39 0x3 0xd5 +0x9f 0x3a 0x3 0xd5 +0x9f 0x3b 0x3 0xd5 +0x9f 0x3d 0x3 0xd5 +0x9f 0x3e 0x3 0xd5 +0x9f 0x3f 0x3 0xd5 + +# CHECK: dmb #0 +# CHECK: dmb #12 +# CHECK: dmb sy +# CHECK: dmb oshld +# CHECK: dmb oshst +# CHECK: dmb osh +# CHECK: dmb nshld +# CHECK: dmb nshst +# CHECK: dmb nsh +# CHECK: dmb ishld +# CHECK: dmb ishst +# CHECK: dmb ish +# CHECK: dmb ld +# CHECK: dmb st +# CHECK: dmb sy +0xbf 0x30 0x3 0xd5 +0xbf 0x3c 0x3 0xd5 +0xbf 0x3f 0x3 0xd5 +0xbf 0x31 0x3 0xd5 +0xbf 0x32 0x3 0xd5 +0xbf 0x33 0x3 0xd5 +0xbf 0x35 0x3 0xd5 +0xbf 0x36 0x3 0xd5 +0xbf 0x37 0x3 0xd5 +0xbf 0x39 0x3 0xd5 +0xbf 0x3a 0x3 0xd5 +0xbf 0x3b 0x3 0xd5 +0xbf 0x3d 0x3 0xd5 +0xbf 0x3e 0x3 0xd5 +0xbf 0x3f 0x3 0xd5 + +# CHECK: isb +# CHECK: isb #12 +0xdf 0x3f 0x3 0xd5 +0xdf 0x3c 0x3 0xd5 + +# CHECK: msr spsel, #0 +# CHECK: msr daifset, #15 +# CHECK: msr daifclr, #12 +0xbf 0x40 0x0 0xd5 +0xdf 0x4f 0x3 0xd5 +0xff 0x4c 0x3 0xd5 + +# CHECK: sys #7, c5, c9, #7, x5 +# CHECK: sys #0, c15, c15, #2 +# CHECK: sysl x9, #7, c5, c9, #7 +# CHECK: sysl x1, #0, c15, c15, #2 +0xe5 0x59 0xf 0xd5 +0x5f 0xff 0x8 0xd5 +0xe9 0x59 0x2f 0xd5 +0x41 0xff 0x28 0xd5 + +# CHECK: sys #0, c7, c1, #0, xzr +# CHECK: sys #0, c7, c5, #0, xzr +# CHECK: sys #3, c7, c5, #1, x9 +0x1f 0x71 0x8 0xd5 +0x1f 0x75 0x8 0xd5 +0x29 0x75 0xb 0xd5 + +# CHECK: sys #3, c7, c4, #1, x12 +# CHECK: sys #0, c7, c6, #1, xzr +# CHECK: sys #0, c7, c6, #2, x2 +# CHECK: sys #3, c7, c10, #1, x9 +# CHECK: sys #0, c7, c10, #2, x10 +# CHECK: sys #3, c7, c11, #1, x0 +# CHECK: sys #3, c7, c14, #1, x3 +# CHECK: sys #0, c7, c14, #2, x30 +0x2c 0x74 0xb 0xd5 +0x3f 0x76 0x8 0xd5 +0x42 0x76 0x8 0xd5 +0x29 0x7a 0xb 0xd5 +0x4a 0x7a 0x8 0xd5 +0x20 0x7b 0xb 0xd5 +0x23 0x7e 0xb 0xd5 +0x5e 0x7e 0x8 0xd5 + + +# CHECK: msr teecr32_el1, x12 +# CHECK: msr osdtrrx_el1, x12 +# CHECK: msr mdccint_el1, x12 +# CHECK: msr mdscr_el1, x12 +# CHECK: msr osdtrtx_el1, x12 +# CHECK: msr dbgdtr_el0, x12 +# CHECK: msr dbgdtrtx_el0, x12 +# CHECK: msr oseccr_el1, x12 +# CHECK: msr dbgvcr32_el2, x12 +# CHECK: msr dbgbvr0_el1, x12 +# CHECK: msr dbgbvr1_el1, x12 +# CHECK: msr dbgbvr2_el1, x12 +# CHECK: msr dbgbvr3_el1, x12 +# CHECK: msr dbgbvr4_el1, x12 +# CHECK: msr dbgbvr5_el1, x12 +# CHECK: msr dbgbvr6_el1, x12 +# CHECK: msr dbgbvr7_el1, x12 +# CHECK: msr dbgbvr8_el1, x12 +# CHECK: msr dbgbvr9_el1, x12 +# CHECK: msr dbgbvr10_el1, x12 +# CHECK: msr dbgbvr11_el1, x12 +# CHECK: msr dbgbvr12_el1, x12 +# CHECK: msr dbgbvr13_el1, x12 +# CHECK: msr dbgbvr14_el1, x12 +# CHECK: msr dbgbvr15_el1, x12 +# CHECK: msr dbgbcr0_el1, x12 +# CHECK: msr dbgbcr1_el1, x12 +# CHECK: msr dbgbcr2_el1, x12 +# CHECK: msr dbgbcr3_el1, x12 +# CHECK: msr dbgbcr4_el1, x12 +# CHECK: msr dbgbcr5_el1, x12 +# CHECK: msr dbgbcr6_el1, x12 +# CHECK: msr dbgbcr7_el1, x12 +# CHECK: msr dbgbcr8_el1, x12 +# CHECK: msr dbgbcr9_el1, x12 +# CHECK: msr dbgbcr10_el1, x12 +# CHECK: msr dbgbcr11_el1, x12 +# CHECK: msr dbgbcr12_el1, x12 +# CHECK: msr dbgbcr13_el1, x12 +# CHECK: msr dbgbcr14_el1, x12 +# CHECK: msr dbgbcr15_el1, x12 +# CHECK: msr dbgwvr0_el1, x12 +# CHECK: msr dbgwvr1_el1, x12 +# CHECK: msr dbgwvr2_el1, x12 +# CHECK: msr dbgwvr3_el1, x12 +# CHECK: msr dbgwvr4_el1, x12 +# CHECK: msr dbgwvr5_el1, x12 +# CHECK: msr dbgwvr6_el1, x12 +# CHECK: msr dbgwvr7_el1, x12 +# CHECK: msr dbgwvr8_el1, x12 +# CHECK: msr dbgwvr9_el1, x12 +# CHECK: msr dbgwvr10_el1, x12 +# CHECK: msr dbgwvr11_el1, x12 +# CHECK: msr dbgwvr12_el1, x12 +# CHECK: msr dbgwvr13_el1, x12 +# CHECK: msr dbgwvr14_el1, x12 +# CHECK: msr dbgwvr15_el1, x12 +# CHECK: msr dbgwcr0_el1, x12 +# CHECK: msr dbgwcr1_el1, x12 +# CHECK: msr dbgwcr2_el1, x12 +# CHECK: msr dbgwcr3_el1, x12 +# CHECK: msr dbgwcr4_el1, x12 +# CHECK: msr dbgwcr5_el1, x12 +# CHECK: msr dbgwcr6_el1, x12 +# CHECK: msr dbgwcr7_el1, x12 +# CHECK: msr dbgwcr8_el1, x12 +# CHECK: msr dbgwcr9_el1, x12 +# CHECK: msr dbgwcr10_el1, x12 +# CHECK: msr dbgwcr11_el1, x12 +# CHECK: msr dbgwcr12_el1, x12 +# CHECK: msr dbgwcr13_el1, x12 +# CHECK: msr dbgwcr14_el1, x12 +# CHECK: msr dbgwcr15_el1, x12 +# CHECK: msr teehbr32_el1, x12 +# CHECK: msr oslar_el1, x12 +# CHECK: msr osdlr_el1, x12 +# CHECK: msr dbgprcr_el1, x12 +# CHECK: msr dbgclaimset_el1, x12 +# CHECK: msr dbgclaimclr_el1, x12 +# CHECK: msr csselr_el1, x12 +# CHECK: msr vpidr_el2, x12 +# CHECK: msr vmpidr_el2, x12 +# CHECK: msr sctlr_el1, x12 +# CHECK: msr sctlr_el2, x12 +# CHECK: msr sctlr_el3, x12 +# CHECK: msr actlr_el1, x12 +# CHECK: msr actlr_el2, x12 +# CHECK: msr actlr_el3, x12 +# CHECK: msr cpacr_el1, x12 +# CHECK: msr hcr_el2, x12 +# CHECK: msr scr_el3, x12 +# CHECK: msr mdcr_el2, x12 +# CHECK: msr sder32_el3, x12 +# CHECK: msr cptr_el2, x12 +# CHECK: msr cptr_el3, x12 +# CHECK: msr hstr_el2, x12 +# CHECK: msr hacr_el2, x12 +# CHECK: msr mdcr_el3, x12 +# CHECK: msr ttbr0_el1, x12 +# CHECK: msr ttbr0_el2, x12 +# CHECK: msr ttbr0_el3, x12 +# CHECK: msr ttbr1_el1, x12 +# CHECK: msr tcr_el1, x12 +# CHECK: msr tcr_el2, x12 +# CHECK: msr tcr_el3, x12 +# CHECK: msr vttbr_el2, x12 +# CHECK: msr vtcr_el2, x12 +# CHECK: msr dacr32_el2, x12 +# CHECK: msr spsr_el1, x12 +# CHECK: msr spsr_el2, x12 +# CHECK: msr spsr_el3, x12 +# CHECK: msr elr_el1, x12 +# CHECK: msr elr_el2, x12 +# CHECK: msr elr_el3, x12 +# CHECK: msr sp_el0, x12 +# CHECK: msr sp_el1, x12 +# CHECK: msr sp_el2, x12 +# CHECK: msr spsel, x12 +# CHECK: msr nzcv, x12 +# CHECK: msr daif, x12 +# CHECK: msr currentel, x12 +# CHECK: msr spsr_irq, x12 +# CHECK: msr spsr_abt, x12 +# CHECK: msr spsr_und, x12 +# CHECK: msr spsr_fiq, x12 +# CHECK: msr fpcr, x12 +# CHECK: msr fpsr, x12 +# CHECK: msr dspsr_el0, x12 +# CHECK: msr dlr_el0, x12 +# CHECK: msr ifsr32_el2, x12 +# CHECK: msr afsr0_el1, x12 +# CHECK: msr afsr0_el2, x12 +# CHECK: msr afsr0_el3, x12 +# CHECK: msr afsr1_el1, x12 +# CHECK: msr afsr1_el2, x12 +# CHECK: msr afsr1_el3, x12 +# CHECK: msr esr_el1, x12 +# CHECK: msr esr_el2, x12 +# CHECK: msr esr_el3, x12 +# CHECK: msr fpexc32_el2, x12 +# CHECK: msr far_el1, x12 +# CHECK: msr far_el2, x12 +# CHECK: msr far_el3, x12 +# CHECK: msr hpfar_el2, x12 +# CHECK: msr par_el1, x12 +# CHECK: msr pmcr_el0, x12 +# CHECK: msr pmcntenset_el0, x12 +# CHECK: msr pmcntenclr_el0, x12 +# CHECK: msr pmovsclr_el0, x12 +# CHECK: msr pmselr_el0, x12 +# CHECK: msr pmccntr_el0, x12 +# CHECK: msr pmxevtyper_el0, x12 +# CHECK: msr pmxevcntr_el0, x12 +# CHECK: msr pmuserenr_el0, x12 +# CHECK: msr pmintenset_el1, x12 +# CHECK: msr pmintenclr_el1, x12 +# CHECK: msr pmovsset_el0, x12 +# CHECK: msr mair_el1, x12 +# CHECK: msr mair_el2, x12 +# CHECK: msr mair_el3, x12 +# CHECK: msr amair_el1, x12 +# CHECK: msr amair_el2, x12 +# CHECK: msr amair_el3, x12 +# CHECK: msr vbar_el1, x12 +# CHECK: msr vbar_el2, x12 +# CHECK: msr vbar_el3, x12 +# CHECK: msr rmr_el1, x12 +# CHECK: msr rmr_el2, x12 +# CHECK: msr rmr_el3, x12 +# CHECK: msr tpidr_el0, x12 +# CHECK: msr tpidr_el2, x12 +# CHECK: msr tpidr_el3, x12 +# CHECK: msr tpidrro_el0, x12 +# CHECK: msr tpidr_el1, x12 +# CHECK: msr cntfrq_el0, x12 +# CHECK: msr cntvoff_el2, x12 +# CHECK: msr cntkctl_el1, x12 +# CHECK: msr cnthctl_el2, x12 +# CHECK: msr cntp_tval_el0, x12 +# CHECK: msr cnthp_tval_el2, x12 +# CHECK: msr cntps_tval_el1, x12 +# CHECK: msr cntp_ctl_el0, x12 +# CHECK: msr cnthp_ctl_el2, x12 +# CHECK: msr cntps_ctl_el1, x12 +# CHECK: msr cntp_cval_el0, x12 +# CHECK: msr cnthp_cval_el2, x12 +# CHECK: msr cntps_cval_el1, x12 +# CHECK: msr cntv_tval_el0, x12 +# CHECK: msr cntv_ctl_el0, x12 +# CHECK: msr cntv_cval_el0, x12 +# CHECK: msr pmevcntr0_el0, x12 +# CHECK: msr pmevcntr1_el0, x12 +# CHECK: msr pmevcntr2_el0, x12 +# CHECK: msr pmevcntr3_el0, x12 +# CHECK: msr pmevcntr4_el0, x12 +# CHECK: msr pmevcntr5_el0, x12 +# CHECK: msr pmevcntr6_el0, x12 +# CHECK: msr pmevcntr7_el0, x12 +# CHECK: msr pmevcntr8_el0, x12 +# CHECK: msr pmevcntr9_el0, x12 +# CHECK: msr pmevcntr10_el0, x12 +# CHECK: msr pmevcntr11_el0, x12 +# CHECK: msr pmevcntr12_el0, x12 +# CHECK: msr pmevcntr13_el0, x12 +# CHECK: msr pmevcntr14_el0, x12 +# CHECK: msr pmevcntr15_el0, x12 +# CHECK: msr pmevcntr16_el0, x12 +# CHECK: msr pmevcntr17_el0, x12 +# CHECK: msr pmevcntr18_el0, x12 +# CHECK: msr pmevcntr19_el0, x12 +# CHECK: msr pmevcntr20_el0, x12 +# CHECK: msr pmevcntr21_el0, x12 +# CHECK: msr pmevcntr22_el0, x12 +# CHECK: msr pmevcntr23_el0, x12 +# CHECK: msr pmevcntr24_el0, x12 +# CHECK: msr pmevcntr25_el0, x12 +# CHECK: msr pmevcntr26_el0, x12 +# CHECK: msr pmevcntr27_el0, x12 +# CHECK: msr pmevcntr28_el0, x12 +# CHECK: msr pmevcntr29_el0, x12 +# CHECK: msr pmevcntr30_el0, x12 +# CHECK: msr pmccfiltr_el0, x12 +# CHECK: msr pmevtyper0_el0, x12 +# CHECK: msr pmevtyper1_el0, x12 +# CHECK: msr pmevtyper2_el0, x12 +# CHECK: msr pmevtyper3_el0, x12 +# CHECK: msr pmevtyper4_el0, x12 +# CHECK: msr pmevtyper5_el0, x12 +# CHECK: msr pmevtyper6_el0, x12 +# CHECK: msr pmevtyper7_el0, x12 +# CHECK: msr pmevtyper8_el0, x12 +# CHECK: msr pmevtyper9_el0, x12 +# CHECK: msr pmevtyper10_el0, x12 +# CHECK: msr pmevtyper11_el0, x12 +# CHECK: msr pmevtyper12_el0, x12 +# CHECK: msr pmevtyper13_el0, x12 +# CHECK: msr pmevtyper14_el0, x12 +# CHECK: msr pmevtyper15_el0, x12 +# CHECK: msr pmevtyper16_el0, x12 +# CHECK: msr pmevtyper17_el0, x12 +# CHECK: msr pmevtyper18_el0, x12 +# CHECK: msr pmevtyper19_el0, x12 +# CHECK: msr pmevtyper20_el0, x12 +# CHECK: msr pmevtyper21_el0, x12 +# CHECK: msr pmevtyper22_el0, x12 +# CHECK: msr pmevtyper23_el0, x12 +# CHECK: msr pmevtyper24_el0, x12 +# CHECK: msr pmevtyper25_el0, x12 +# CHECK: msr pmevtyper26_el0, x12 +# CHECK: msr pmevtyper27_el0, x12 +# CHECK: msr pmevtyper28_el0, x12 +# CHECK: msr pmevtyper29_el0, x12 +# CHECK: msr pmevtyper30_el0, x12 +# CHECK: mrs x9, teecr32_el1 +# CHECK: mrs x9, osdtrrx_el1 +# CHECK: mrs x9, mdccsr_el0 +# CHECK: mrs x9, mdccint_el1 +# CHECK: mrs x9, mdscr_el1 +# CHECK: mrs x9, osdtrtx_el1 +# CHECK: mrs x9, dbgdtr_el0 +# CHECK: mrs x9, dbgdtrrx_el0 +# CHECK: mrs x9, oseccr_el1 +# CHECK: mrs x9, dbgvcr32_el2 +# CHECK: mrs x9, dbgbvr0_el1 +# CHECK: mrs x9, dbgbvr1_el1 +# CHECK: mrs x9, dbgbvr2_el1 +# CHECK: mrs x9, dbgbvr3_el1 +# CHECK: mrs x9, dbgbvr4_el1 +# CHECK: mrs x9, dbgbvr5_el1 +# CHECK: mrs x9, dbgbvr6_el1 +# CHECK: mrs x9, dbgbvr7_el1 +# CHECK: mrs x9, dbgbvr8_el1 +# CHECK: mrs x9, dbgbvr9_el1 +# CHECK: mrs x9, dbgbvr10_el1 +# CHECK: mrs x9, dbgbvr11_el1 +# CHECK: mrs x9, dbgbvr12_el1 +# CHECK: mrs x9, dbgbvr13_el1 +# CHECK: mrs x9, dbgbvr14_el1 +# CHECK: mrs x9, dbgbvr15_el1 +# CHECK: mrs x9, dbgbcr0_el1 +# CHECK: mrs x9, dbgbcr1_el1 +# CHECK: mrs x9, dbgbcr2_el1 +# CHECK: mrs x9, dbgbcr3_el1 +# CHECK: mrs x9, dbgbcr4_el1 +# CHECK: mrs x9, dbgbcr5_el1 +# CHECK: mrs x9, dbgbcr6_el1 +# CHECK: mrs x9, dbgbcr7_el1 +# CHECK: mrs x9, dbgbcr8_el1 +# CHECK: mrs x9, dbgbcr9_el1 +# CHECK: mrs x9, dbgbcr10_el1 +# CHECK: mrs x9, dbgbcr11_el1 +# CHECK: mrs x9, dbgbcr12_el1 +# CHECK: mrs x9, dbgbcr13_el1 +# CHECK: mrs x9, dbgbcr14_el1 +# CHECK: mrs x9, dbgbcr15_el1 +# CHECK: mrs x9, dbgwvr0_el1 +# CHECK: mrs x9, dbgwvr1_el1 +# CHECK: mrs x9, dbgwvr2_el1 +# CHECK: mrs x9, dbgwvr3_el1 +# CHECK: mrs x9, dbgwvr4_el1 +# CHECK: mrs x9, dbgwvr5_el1 +# CHECK: mrs x9, dbgwvr6_el1 +# CHECK: mrs x9, dbgwvr7_el1 +# CHECK: mrs x9, dbgwvr8_el1 +# CHECK: mrs x9, dbgwvr9_el1 +# CHECK: mrs x9, dbgwvr10_el1 +# CHECK: mrs x9, dbgwvr11_el1 +# CHECK: mrs x9, dbgwvr12_el1 +# CHECK: mrs x9, dbgwvr13_el1 +# CHECK: mrs x9, dbgwvr14_el1 +# CHECK: mrs x9, dbgwvr15_el1 +# CHECK: mrs x9, dbgwcr0_el1 +# CHECK: mrs x9, dbgwcr1_el1 +# CHECK: mrs x9, dbgwcr2_el1 +# CHECK: mrs x9, dbgwcr3_el1 +# CHECK: mrs x9, dbgwcr4_el1 +# CHECK: mrs x9, dbgwcr5_el1 +# CHECK: mrs x9, dbgwcr6_el1 +# CHECK: mrs x9, dbgwcr7_el1 +# CHECK: mrs x9, dbgwcr8_el1 +# CHECK: mrs x9, dbgwcr9_el1 +# CHECK: mrs x9, dbgwcr10_el1 +# CHECK: mrs x9, dbgwcr11_el1 +# CHECK: mrs x9, dbgwcr12_el1 +# CHECK: mrs x9, dbgwcr13_el1 +# CHECK: mrs x9, dbgwcr14_el1 +# CHECK: mrs x9, dbgwcr15_el1 +# CHECK: mrs x9, mdrar_el1 +# CHECK: mrs x9, teehbr32_el1 +# CHECK: mrs x9, oslsr_el1 +# CHECK: mrs x9, osdlr_el1 +# CHECK: mrs x9, dbgprcr_el1 +# CHECK: mrs x9, dbgclaimset_el1 +# CHECK: mrs x9, dbgclaimclr_el1 +# CHECK: mrs x9, dbgauthstatus_el1 +# CHECK: mrs x9, midr_el1 +# CHECK: mrs x9, ccsidr_el1 +# CHECK: mrs x9, csselr_el1 +# CHECK: mrs x9, vpidr_el2 +# CHECK: mrs x9, clidr_el1 +# CHECK: mrs x9, ctr_el0 +# CHECK: mrs x9, mpidr_el1 +# CHECK: mrs x9, vmpidr_el2 +# CHECK: mrs x9, revidr_el1 +# CHECK: mrs x9, aidr_el1 +# CHECK: mrs x9, dczid_el0 +# CHECK: mrs x9, id_pfr0_el1 +# CHECK: mrs x9, id_pfr1_el1 +# CHECK: mrs x9, id_dfr0_el1 +# CHECK: mrs x9, id_afr0_el1 +# CHECK: mrs x9, id_mmfr0_el1 +# CHECK: mrs x9, id_mmfr1_el1 +# CHECK: mrs x9, id_mmfr2_el1 +# CHECK: mrs x9, id_mmfr3_el1 +# CHECK: mrs x9, id_isar0_el1 +# CHECK: mrs x9, id_isar1_el1 +# CHECK: mrs x9, id_isar2_el1 +# CHECK: mrs x9, id_isar3_el1 +# CHECK: mrs x9, id_isar4_el1 +# CHECK: mrs x9, id_isar5_el1 +# CHECK: mrs x9, mvfr0_el1 +# CHECK: mrs x9, mvfr1_el1 +# CHECK: mrs x9, mvfr2_el1 +# CHECK: mrs x9, id_aa64pfr0_el1 +# CHECK: mrs x9, id_aa64pfr1_el1 +# CHECK: mrs x9, id_aa64dfr0_el1 +# CHECK: mrs x9, id_aa64dfr1_el1 +# CHECK: mrs x9, id_aa64afr0_el1 +# CHECK: mrs x9, id_aa64afr1_el1 +# CHECK: mrs x9, id_aa64isar0_el1 +# CHECK: mrs x9, id_aa64isar1_el1 +# CHECK: mrs x9, id_aa64mmfr0_el1 +# CHECK: mrs x9, id_aa64mmfr1_el1 +# CHECK: mrs x9, sctlr_el1 +# CHECK: mrs x9, sctlr_el2 +# CHECK: mrs x9, sctlr_el3 +# CHECK: mrs x9, actlr_el1 +# CHECK: mrs x9, actlr_el2 +# CHECK: mrs x9, actlr_el3 +# CHECK: mrs x9, cpacr_el1 +# CHECK: mrs x9, hcr_el2 +# CHECK: mrs x9, scr_el3 +# CHECK: mrs x9, mdcr_el2 +# CHECK: mrs x9, sder32_el3 +# CHECK: mrs x9, cptr_el2 +# CHECK: mrs x9, cptr_el3 +# CHECK: mrs x9, hstr_el2 +# CHECK: mrs x9, hacr_el2 +# CHECK: mrs x9, mdcr_el3 +# CHECK: mrs x9, ttbr0_el1 +# CHECK: mrs x9, ttbr0_el2 +# CHECK: mrs x9, ttbr0_el3 +# CHECK: mrs x9, ttbr1_el1 +# CHECK: mrs x9, tcr_el1 +# CHECK: mrs x9, tcr_el2 +# CHECK: mrs x9, tcr_el3 +# CHECK: mrs x9, vttbr_el2 +# CHECK: mrs x9, vtcr_el2 +# CHECK: mrs x9, dacr32_el2 +# CHECK: mrs x9, spsr_el1 +# CHECK: mrs x9, spsr_el2 +# CHECK: mrs x9, spsr_el3 +# CHECK: mrs x9, elr_el1 +# CHECK: mrs x9, elr_el2 +# CHECK: mrs x9, elr_el3 +# CHECK: mrs x9, sp_el0 +# CHECK: mrs x9, sp_el1 +# CHECK: mrs x9, sp_el2 +# CHECK: mrs x9, spsel +# CHECK: mrs x9, nzcv +# CHECK: mrs x9, daif +# CHECK: mrs x9, currentel +# CHECK: mrs x9, spsr_irq +# CHECK: mrs x9, spsr_abt +# CHECK: mrs x9, spsr_und +# CHECK: mrs x9, spsr_fiq +# CHECK: mrs x9, fpcr +# CHECK: mrs x9, fpsr +# CHECK: mrs x9, dspsr_el0 +# CHECK: mrs x9, dlr_el0 +# CHECK: mrs x9, ifsr32_el2 +# CHECK: mrs x9, afsr0_el1 +# CHECK: mrs x9, afsr0_el2 +# CHECK: mrs x9, afsr0_el3 +# CHECK: mrs x9, afsr1_el1 +# CHECK: mrs x9, afsr1_el2 +# CHECK: mrs x9, afsr1_el3 +# CHECK: mrs x9, esr_el1 +# CHECK: mrs x9, esr_el2 +# CHECK: mrs x9, esr_el3 +# CHECK: mrs x9, fpexc32_el2 +# CHECK: mrs x9, far_el1 +# CHECK: mrs x9, far_el2 +# CHECK: mrs x9, far_el3 +# CHECK: mrs x9, hpfar_el2 +# CHECK: mrs x9, par_el1 +# CHECK: mrs x9, pmcr_el0 +# CHECK: mrs x9, pmcntenset_el0 +# CHECK: mrs x9, pmcntenclr_el0 +# CHECK: mrs x9, pmovsclr_el0 +# CHECK: mrs x9, pmselr_el0 +# CHECK: mrs x9, pmceid0_el0 +# CHECK: mrs x9, pmceid1_el0 +# CHECK: mrs x9, pmccntr_el0 +# CHECK: mrs x9, pmxevtyper_el0 +# CHECK: mrs x9, pmxevcntr_el0 +# CHECK: mrs x9, pmuserenr_el0 +# CHECK: mrs x9, pmintenset_el1 +# CHECK: mrs x9, pmintenclr_el1 +# CHECK: mrs x9, pmovsset_el0 +# CHECK: mrs x9, mair_el1 +# CHECK: mrs x9, mair_el2 +# CHECK: mrs x9, mair_el3 +# CHECK: mrs x9, amair_el1 +# CHECK: mrs x9, amair_el2 +# CHECK: mrs x9, amair_el3 +# CHECK: mrs x9, vbar_el1 +# CHECK: mrs x9, vbar_el2 +# CHECK: mrs x9, vbar_el3 +# CHECK: mrs x9, rvbar_el1 +# CHECK: mrs x9, rvbar_el2 +# CHECK: mrs x9, rvbar_el3 +# CHECK: mrs x9, rmr_el1 +# CHECK: mrs x9, rmr_el2 +# CHECK: mrs x9, rmr_el3 +# CHECK: mrs x9, isr_el1 +# CHECK: mrs x9, contextidr_el1 +# CHECK: mrs x9, tpidr_el0 +# CHECK: mrs x9, tpidr_el2 +# CHECK: mrs x9, tpidr_el3 +# CHECK: mrs x9, tpidrro_el0 +# CHECK: mrs x9, tpidr_el1 +# CHECK: mrs x9, cntfrq_el0 +# CHECK: mrs x9, cntpct_el0 +# CHECK: mrs x9, cntvct_el0 +# CHECK: mrs x9, cntvoff_el2 +# CHECK: mrs x9, cntkctl_el1 +# CHECK: mrs x9, cnthctl_el2 +# CHECK: mrs x9, cntp_tval_el0 +# CHECK: mrs x9, cnthp_tval_el2 +# CHECK: mrs x9, cntps_tval_el1 +# CHECK: mrs x9, cntp_ctl_el0 +# CHECK: mrs x9, cnthp_ctl_el2 +# CHECK: mrs x9, cntps_ctl_el1 +# CHECK: mrs x9, cntp_cval_el0 +# CHECK: mrs x9, cnthp_cval_el2 +# CHECK: mrs x9, cntps_cval_el1 +# CHECK: mrs x9, cntv_tval_el0 +# CHECK: mrs x9, cntv_ctl_el0 +# CHECK: mrs x9, cntv_cval_el0 +# CHECK: mrs x9, pmevcntr0_el0 +# CHECK: mrs x9, pmevcntr1_el0 +# CHECK: mrs x9, pmevcntr2_el0 +# CHECK: mrs x9, pmevcntr3_el0 +# CHECK: mrs x9, pmevcntr4_el0 +# CHECK: mrs x9, pmevcntr5_el0 +# CHECK: mrs x9, pmevcntr6_el0 +# CHECK: mrs x9, pmevcntr7_el0 +# CHECK: mrs x9, pmevcntr8_el0 +# CHECK: mrs x9, pmevcntr9_el0 +# CHECK: mrs x9, pmevcntr10_el0 +# CHECK: mrs x9, pmevcntr11_el0 +# CHECK: mrs x9, pmevcntr12_el0 +# CHECK: mrs x9, pmevcntr13_el0 +# CHECK: mrs x9, pmevcntr14_el0 +# CHECK: mrs x9, pmevcntr15_el0 +# CHECK: mrs x9, pmevcntr16_el0 +# CHECK: mrs x9, pmevcntr17_el0 +# CHECK: mrs x9, pmevcntr18_el0 +# CHECK: mrs x9, pmevcntr19_el0 +# CHECK: mrs x9, pmevcntr20_el0 +# CHECK: mrs x9, pmevcntr21_el0 +# CHECK: mrs x9, pmevcntr22_el0 +# CHECK: mrs x9, pmevcntr23_el0 +# CHECK: mrs x9, pmevcntr24_el0 +# CHECK: mrs x9, pmevcntr25_el0 +# CHECK: mrs x9, pmevcntr26_el0 +# CHECK: mrs x9, pmevcntr27_el0 +# CHECK: mrs x9, pmevcntr28_el0 +# CHECK: mrs x9, pmevcntr29_el0 +# CHECK: mrs x9, pmevcntr30_el0 +# CHECK: mrs x9, pmccfiltr_el0 +# CHECK: mrs x9, pmevtyper0_el0 +# CHECK: mrs x9, pmevtyper1_el0 +# CHECK: mrs x9, pmevtyper2_el0 +# CHECK: mrs x9, pmevtyper3_el0 +# CHECK: mrs x9, pmevtyper4_el0 +# CHECK: mrs x9, pmevtyper5_el0 +# CHECK: mrs x9, pmevtyper6_el0 +# CHECK: mrs x9, pmevtyper7_el0 +# CHECK: mrs x9, pmevtyper8_el0 +# CHECK: mrs x9, pmevtyper9_el0 +# CHECK: mrs x9, pmevtyper10_el0 +# CHECK: mrs x9, pmevtyper11_el0 +# CHECK: mrs x9, pmevtyper12_el0 +# CHECK: mrs x9, pmevtyper13_el0 +# CHECK: mrs x9, pmevtyper14_el0 +# CHECK: mrs x9, pmevtyper15_el0 +# CHECK: mrs x9, pmevtyper16_el0 +# CHECK: mrs x9, pmevtyper17_el0 +# CHECK: mrs x9, pmevtyper18_el0 +# CHECK: mrs x9, pmevtyper19_el0 +# CHECK: mrs x9, pmevtyper20_el0 +# CHECK: mrs x9, pmevtyper21_el0 +# CHECK: mrs x9, pmevtyper22_el0 +# CHECK: mrs x9, pmevtyper23_el0 +# CHECK: mrs x9, pmevtyper24_el0 +# CHECK: mrs x9, pmevtyper25_el0 +# CHECK: mrs x9, pmevtyper26_el0 +# CHECK: mrs x9, pmevtyper27_el0 +# CHECK: mrs x9, pmevtyper28_el0 +# CHECK: mrs x9, pmevtyper29_el0 +# CHECK: mrs x9, pmevtyper30_el0 + +0xc 0x0 0x12 0xd5 +0x4c 0x0 0x10 0xd5 +0xc 0x2 0x10 0xd5 +0x4c 0x2 0x10 0xd5 +0x4c 0x3 0x10 0xd5 +0xc 0x4 0x13 0xd5 +0xc 0x5 0x13 0xd5 +0x4c 0x6 0x10 0xd5 +0xc 0x7 0x14 0xd5 +0x8c 0x0 0x10 0xd5 +0x8c 0x1 0x10 0xd5 +0x8c 0x2 0x10 0xd5 +0x8c 0x3 0x10 0xd5 +0x8c 0x4 0x10 0xd5 +0x8c 0x5 0x10 0xd5 +0x8c 0x6 0x10 0xd5 +0x8c 0x7 0x10 0xd5 +0x8c 0x8 0x10 0xd5 +0x8c 0x9 0x10 0xd5 +0x8c 0xa 0x10 0xd5 +0x8c 0xb 0x10 0xd5 +0x8c 0xc 0x10 0xd5 +0x8c 0xd 0x10 0xd5 +0x8c 0xe 0x10 0xd5 +0x8c 0xf 0x10 0xd5 +0xac 0x0 0x10 0xd5 +0xac 0x1 0x10 0xd5 +0xac 0x2 0x10 0xd5 +0xac 0x3 0x10 0xd5 +0xac 0x4 0x10 0xd5 +0xac 0x5 0x10 0xd5 +0xac 0x6 0x10 0xd5 +0xac 0x7 0x10 0xd5 +0xac 0x8 0x10 0xd5 +0xac 0x9 0x10 0xd5 +0xac 0xa 0x10 0xd5 +0xac 0xb 0x10 0xd5 +0xac 0xc 0x10 0xd5 +0xac 0xd 0x10 0xd5 +0xac 0xe 0x10 0xd5 +0xac 0xf 0x10 0xd5 +0xcc 0x0 0x10 0xd5 +0xcc 0x1 0x10 0xd5 +0xcc 0x2 0x10 0xd5 +0xcc 0x3 0x10 0xd5 +0xcc 0x4 0x10 0xd5 +0xcc 0x5 0x10 0xd5 +0xcc 0x6 0x10 0xd5 +0xcc 0x7 0x10 0xd5 +0xcc 0x8 0x10 0xd5 +0xcc 0x9 0x10 0xd5 +0xcc 0xa 0x10 0xd5 +0xcc 0xb 0x10 0xd5 +0xcc 0xc 0x10 0xd5 +0xcc 0xd 0x10 0xd5 +0xcc 0xe 0x10 0xd5 +0xcc 0xf 0x10 0xd5 +0xec 0x0 0x10 0xd5 +0xec 0x1 0x10 0xd5 +0xec 0x2 0x10 0xd5 +0xec 0x3 0x10 0xd5 +0xec 0x4 0x10 0xd5 +0xec 0x5 0x10 0xd5 +0xec 0x6 0x10 0xd5 +0xec 0x7 0x10 0xd5 +0xec 0x8 0x10 0xd5 +0xec 0x9 0x10 0xd5 +0xec 0xa 0x10 0xd5 +0xec 0xb 0x10 0xd5 +0xec 0xc 0x10 0xd5 +0xec 0xd 0x10 0xd5 +0xec 0xe 0x10 0xd5 +0xec 0xf 0x10 0xd5 +0xc 0x10 0x12 0xd5 +0x8c 0x10 0x10 0xd5 +0x8c 0x13 0x10 0xd5 +0x8c 0x14 0x10 0xd5 +0xcc 0x78 0x10 0xd5 +0xcc 0x79 0x10 0xd5 +0xc 0x0 0x1a 0xd5 +0xc 0x0 0x1c 0xd5 +0xac 0x0 0x1c 0xd5 +0xc 0x10 0x18 0xd5 +0xc 0x10 0x1c 0xd5 +0xc 0x10 0x1e 0xd5 +0x2c 0x10 0x18 0xd5 +0x2c 0x10 0x1c 0xd5 +0x2c 0x10 0x1e 0xd5 +0x4c 0x10 0x18 0xd5 +0xc 0x11 0x1c 0xd5 +0xc 0x11 0x1e 0xd5 +0x2c 0x11 0x1c 0xd5 +0x2c 0x11 0x1e 0xd5 +0x4c 0x11 0x1c 0xd5 +0x4c 0x11 0x1e 0xd5 +0x6c 0x11 0x1c 0xd5 +0xec 0x11 0x1c 0xd5 +0x2c 0x13 0x1e 0xd5 +0xc 0x20 0x18 0xd5 +0xc 0x20 0x1c 0xd5 +0xc 0x20 0x1e 0xd5 +0x2c 0x20 0x18 0xd5 +0x4c 0x20 0x18 0xd5 +0x4c 0x20 0x1c 0xd5 +0x4c 0x20 0x1e 0xd5 +0xc 0x21 0x1c 0xd5 +0x4c 0x21 0x1c 0xd5 +0xc 0x30 0x1c 0xd5 +0xc 0x40 0x18 0xd5 +0xc 0x40 0x1c 0xd5 +0xc 0x40 0x1e 0xd5 +0x2c 0x40 0x18 0xd5 +0x2c 0x40 0x1c 0xd5 +0x2c 0x40 0x1e 0xd5 +0xc 0x41 0x18 0xd5 +0xc 0x41 0x1c 0xd5 +0xc 0x41 0x1e 0xd5 +0xc 0x42 0x18 0xd5 +0xc 0x42 0x1b 0xd5 +0x2c 0x42 0x1b 0xd5 +0x4c 0x42 0x18 0xd5 +0xc 0x43 0x1c 0xd5 +0x2c 0x43 0x1c 0xd5 +0x4c 0x43 0x1c 0xd5 +0x6c 0x43 0x1c 0xd5 +0xc 0x44 0x1b 0xd5 +0x2c 0x44 0x1b 0xd5 +0xc 0x45 0x1b 0xd5 +0x2c 0x45 0x1b 0xd5 +0x2c 0x50 0x1c 0xd5 +0xc 0x51 0x18 0xd5 +0xc 0x51 0x1c 0xd5 +0xc 0x51 0x1e 0xd5 +0x2c 0x51 0x18 0xd5 +0x2c 0x51 0x1c 0xd5 +0x2c 0x51 0x1e 0xd5 +0xc 0x52 0x18 0xd5 +0xc 0x52 0x1c 0xd5 +0xc 0x52 0x1e 0xd5 +0xc 0x53 0x1c 0xd5 +0xc 0x60 0x18 0xd5 +0xc 0x60 0x1c 0xd5 +0xc 0x60 0x1e 0xd5 +0x8c 0x60 0x1c 0xd5 +0xc 0x74 0x18 0xd5 +0xc 0x9c 0x1b 0xd5 +0x2c 0x9c 0x1b 0xd5 +0x4c 0x9c 0x1b 0xd5 +0x6c 0x9c 0x1b 0xd5 +0xac 0x9c 0x1b 0xd5 +0xc 0x9d 0x1b 0xd5 +0x2c 0x9d 0x1b 0xd5 +0x4c 0x9d 0x1b 0xd5 +0xc 0x9e 0x1b 0xd5 +0x2c 0x9e 0x18 0xd5 +0x4c 0x9e 0x18 0xd5 +0x6c 0x9e 0x1b 0xd5 +0xc 0xa2 0x18 0xd5 +0xc 0xa2 0x1c 0xd5 +0xc 0xa2 0x1e 0xd5 +0xc 0xa3 0x18 0xd5 +0xc 0xa3 0x1c 0xd5 +0xc 0xa3 0x1e 0xd5 +0xc 0xc0 0x18 0xd5 +0xc 0xc0 0x1c 0xd5 +0xc 0xc0 0x1e 0xd5 +0x4c 0xc0 0x18 0xd5 +0x4c 0xc0 0x1c 0xd5 +0x4c 0xc0 0x1e 0xd5 +0x4c 0xd0 0x1b 0xd5 +0x4c 0xd0 0x1c 0xd5 +0x4c 0xd0 0x1e 0xd5 +0x6c 0xd0 0x1b 0xd5 +0x8c 0xd0 0x18 0xd5 +0xc 0xe0 0x1b 0xd5 +0x6c 0xe0 0x1c 0xd5 +0xc 0xe1 0x18 0xd5 +0xc 0xe1 0x1c 0xd5 +0xc 0xe2 0x1b 0xd5 +0xc 0xe2 0x1c 0xd5 +0xc 0xe2 0x1f 0xd5 +0x2c 0xe2 0x1b 0xd5 +0x2c 0xe2 0x1c 0xd5 +0x2c 0xe2 0x1f 0xd5 +0x4c 0xe2 0x1b 0xd5 +0x4c 0xe2 0x1c 0xd5 +0x4c 0xe2 0x1f 0xd5 +0xc 0xe3 0x1b 0xd5 +0x2c 0xe3 0x1b 0xd5 +0x4c 0xe3 0x1b 0xd5 +0xc 0xe8 0x1b 0xd5 +0x2c 0xe8 0x1b 0xd5 +0x4c 0xe8 0x1b 0xd5 +0x6c 0xe8 0x1b 0xd5 +0x8c 0xe8 0x1b 0xd5 +0xac 0xe8 0x1b 0xd5 +0xcc 0xe8 0x1b 0xd5 +0xec 0xe8 0x1b 0xd5 +0xc 0xe9 0x1b 0xd5 +0x2c 0xe9 0x1b 0xd5 +0x4c 0xe9 0x1b 0xd5 +0x6c 0xe9 0x1b 0xd5 +0x8c 0xe9 0x1b 0xd5 +0xac 0xe9 0x1b 0xd5 +0xcc 0xe9 0x1b 0xd5 +0xec 0xe9 0x1b 0xd5 +0xc 0xea 0x1b 0xd5 +0x2c 0xea 0x1b 0xd5 +0x4c 0xea 0x1b 0xd5 +0x6c 0xea 0x1b 0xd5 +0x8c 0xea 0x1b 0xd5 +0xac 0xea 0x1b 0xd5 +0xcc 0xea 0x1b 0xd5 +0xec 0xea 0x1b 0xd5 +0xc 0xeb 0x1b 0xd5 +0x2c 0xeb 0x1b 0xd5 +0x4c 0xeb 0x1b 0xd5 +0x6c 0xeb 0x1b 0xd5 +0x8c 0xeb 0x1b 0xd5 +0xac 0xeb 0x1b 0xd5 +0xcc 0xeb 0x1b 0xd5 +0xec 0xef 0x1b 0xd5 +0xc 0xec 0x1b 0xd5 +0x2c 0xec 0x1b 0xd5 +0x4c 0xec 0x1b 0xd5 +0x6c 0xec 0x1b 0xd5 +0x8c 0xec 0x1b 0xd5 +0xac 0xec 0x1b 0xd5 +0xcc 0xec 0x1b 0xd5 +0xec 0xec 0x1b 0xd5 +0xc 0xed 0x1b 0xd5 +0x2c 0xed 0x1b 0xd5 +0x4c 0xed 0x1b 0xd5 +0x6c 0xed 0x1b 0xd5 +0x8c 0xed 0x1b 0xd5 +0xac 0xed 0x1b 0xd5 +0xcc 0xed 0x1b 0xd5 +0xec 0xed 0x1b 0xd5 +0xc 0xee 0x1b 0xd5 +0x2c 0xee 0x1b 0xd5 +0x4c 0xee 0x1b 0xd5 +0x6c 0xee 0x1b 0xd5 +0x8c 0xee 0x1b 0xd5 +0xac 0xee 0x1b 0xd5 +0xcc 0xee 0x1b 0xd5 +0xec 0xee 0x1b 0xd5 +0xc 0xef 0x1b 0xd5 +0x2c 0xef 0x1b 0xd5 +0x4c 0xef 0x1b 0xd5 +0x6c 0xef 0x1b 0xd5 +0x8c 0xef 0x1b 0xd5 +0xac 0xef 0x1b 0xd5 +0xcc 0xef 0x1b 0xd5 +0x9 0x0 0x32 0xd5 +0x49 0x0 0x30 0xd5 +0x9 0x1 0x33 0xd5 +0x9 0x2 0x30 0xd5 +0x49 0x2 0x30 0xd5 +0x49 0x3 0x30 0xd5 +0x9 0x4 0x33 0xd5 +0x9 0x5 0x33 0xd5 +0x49 0x6 0x30 0xd5 +0x9 0x7 0x34 0xd5 +0x89 0x0 0x30 0xd5 +0x89 0x1 0x30 0xd5 +0x89 0x2 0x30 0xd5 +0x89 0x3 0x30 0xd5 +0x89 0x4 0x30 0xd5 +0x89 0x5 0x30 0xd5 +0x89 0x6 0x30 0xd5 +0x89 0x7 0x30 0xd5 +0x89 0x8 0x30 0xd5 +0x89 0x9 0x30 0xd5 +0x89 0xa 0x30 0xd5 +0x89 0xb 0x30 0xd5 +0x89 0xc 0x30 0xd5 +0x89 0xd 0x30 0xd5 +0x89 0xe 0x30 0xd5 +0x89 0xf 0x30 0xd5 +0xa9 0x0 0x30 0xd5 +0xa9 0x1 0x30 0xd5 +0xa9 0x2 0x30 0xd5 +0xa9 0x3 0x30 0xd5 +0xa9 0x4 0x30 0xd5 +0xa9 0x5 0x30 0xd5 +0xa9 0x6 0x30 0xd5 +0xa9 0x7 0x30 0xd5 +0xa9 0x8 0x30 0xd5 +0xa9 0x9 0x30 0xd5 +0xa9 0xa 0x30 0xd5 +0xa9 0xb 0x30 0xd5 +0xa9 0xc 0x30 0xd5 +0xa9 0xd 0x30 0xd5 +0xa9 0xe 0x30 0xd5 +0xa9 0xf 0x30 0xd5 +0xc9 0x0 0x30 0xd5 +0xc9 0x1 0x30 0xd5 +0xc9 0x2 0x30 0xd5 +0xc9 0x3 0x30 0xd5 +0xc9 0x4 0x30 0xd5 +0xc9 0x5 0x30 0xd5 +0xc9 0x6 0x30 0xd5 +0xc9 0x7 0x30 0xd5 +0xc9 0x8 0x30 0xd5 +0xc9 0x9 0x30 0xd5 +0xc9 0xa 0x30 0xd5 +0xc9 0xb 0x30 0xd5 +0xc9 0xc 0x30 0xd5 +0xc9 0xd 0x30 0xd5 +0xc9 0xe 0x30 0xd5 +0xc9 0xf 0x30 0xd5 +0xe9 0x0 0x30 0xd5 +0xe9 0x1 0x30 0xd5 +0xe9 0x2 0x30 0xd5 +0xe9 0x3 0x30 0xd5 +0xe9 0x4 0x30 0xd5 +0xe9 0x5 0x30 0xd5 +0xe9 0x6 0x30 0xd5 +0xe9 0x7 0x30 0xd5 +0xe9 0x8 0x30 0xd5 +0xe9 0x9 0x30 0xd5 +0xe9 0xa 0x30 0xd5 +0xe9 0xb 0x30 0xd5 +0xe9 0xc 0x30 0xd5 +0xe9 0xd 0x30 0xd5 +0xe9 0xe 0x30 0xd5 +0xe9 0xf 0x30 0xd5 +0x9 0x10 0x30 0xd5 +0x9 0x10 0x32 0xd5 +0x89 0x11 0x30 0xd5 +0x89 0x13 0x30 0xd5 +0x89 0x14 0x30 0xd5 +0xc9 0x78 0x30 0xd5 +0xc9 0x79 0x30 0xd5 +0xc9 0x7e 0x30 0xd5 +0x9 0x0 0x38 0xd5 +0x9 0x0 0x39 0xd5 +0x9 0x0 0x3a 0xd5 +0x9 0x0 0x3c 0xd5 +0x29 0x0 0x39 0xd5 +0x29 0x0 0x3b 0xd5 +0xa9 0x0 0x38 0xd5 +0xa9 0x0 0x3c 0xd5 +0xc9 0x0 0x38 0xd5 +0xe9 0x0 0x39 0xd5 +0xe9 0x0 0x3b 0xd5 +0x9 0x1 0x38 0xd5 +0x29 0x1 0x38 0xd5 +0x49 0x1 0x38 0xd5 +0x69 0x1 0x38 0xd5 +0x89 0x1 0x38 0xd5 +0xa9 0x1 0x38 0xd5 +0xc9 0x1 0x38 0xd5 +0xe9 0x1 0x38 0xd5 +0x9 0x2 0x38 0xd5 +0x29 0x2 0x38 0xd5 +0x49 0x2 0x38 0xd5 +0x69 0x2 0x38 0xd5 +0x89 0x2 0x38 0xd5 +0xa9 0x2 0x38 0xd5 +0x9 0x3 0x38 0xd5 +0x29 0x3 0x38 0xd5 +0x49 0x3 0x38 0xd5 +0x9 0x4 0x38 0xd5 +0x29 0x4 0x38 0xd5 +0x9 0x5 0x38 0xd5 +0x29 0x5 0x38 0xd5 +0x89 0x5 0x38 0xd5 +0xa9 0x5 0x38 0xd5 +0x9 0x6 0x38 0xd5 +0x29 0x6 0x38 0xd5 +0x9 0x7 0x38 0xd5 +0x29 0x7 0x38 0xd5 +0x9 0x10 0x38 0xd5 +0x9 0x10 0x3c 0xd5 +0x9 0x10 0x3e 0xd5 +0x29 0x10 0x38 0xd5 +0x29 0x10 0x3c 0xd5 +0x29 0x10 0x3e 0xd5 +0x49 0x10 0x38 0xd5 +0x9 0x11 0x3c 0xd5 +0x9 0x11 0x3e 0xd5 +0x29 0x11 0x3c 0xd5 +0x29 0x11 0x3e 0xd5 +0x49 0x11 0x3c 0xd5 +0x49 0x11 0x3e 0xd5 +0x69 0x11 0x3c 0xd5 +0xe9 0x11 0x3c 0xd5 +0x29 0x13 0x3e 0xd5 +0x9 0x20 0x38 0xd5 +0x9 0x20 0x3c 0xd5 +0x9 0x20 0x3e 0xd5 +0x29 0x20 0x38 0xd5 +0x49 0x20 0x38 0xd5 +0x49 0x20 0x3c 0xd5 +0x49 0x20 0x3e 0xd5 +0x9 0x21 0x3c 0xd5 +0x49 0x21 0x3c 0xd5 +0x9 0x30 0x3c 0xd5 +0x9 0x40 0x38 0xd5 +0x9 0x40 0x3c 0xd5 +0x9 0x40 0x3e 0xd5 +0x29 0x40 0x38 0xd5 +0x29 0x40 0x3c 0xd5 +0x29 0x40 0x3e 0xd5 +0x9 0x41 0x38 0xd5 +0x9 0x41 0x3c 0xd5 +0x9 0x41 0x3e 0xd5 +0x9 0x42 0x38 0xd5 +0x9 0x42 0x3b 0xd5 +0x29 0x42 0x3b 0xd5 +0x49 0x42 0x38 0xd5 +0x9 0x43 0x3c 0xd5 +0x29 0x43 0x3c 0xd5 +0x49 0x43 0x3c 0xd5 +0x69 0x43 0x3c 0xd5 +0x9 0x44 0x3b 0xd5 +0x29 0x44 0x3b 0xd5 +0x9 0x45 0x3b 0xd5 +0x29 0x45 0x3b 0xd5 +0x29 0x50 0x3c 0xd5 +0x9 0x51 0x38 0xd5 +0x9 0x51 0x3c 0xd5 +0x9 0x51 0x3e 0xd5 +0x29 0x51 0x38 0xd5 +0x29 0x51 0x3c 0xd5 +0x29 0x51 0x3e 0xd5 +0x9 0x52 0x38 0xd5 +0x9 0x52 0x3c 0xd5 +0x9 0x52 0x3e 0xd5 +0x9 0x53 0x3c 0xd5 +0x9 0x60 0x38 0xd5 +0x9 0x60 0x3c 0xd5 +0x9 0x60 0x3e 0xd5 +0x89 0x60 0x3c 0xd5 +0x9 0x74 0x38 0xd5 +0x9 0x9c 0x3b 0xd5 +0x29 0x9c 0x3b 0xd5 +0x49 0x9c 0x3b 0xd5 +0x69 0x9c 0x3b 0xd5 +0xa9 0x9c 0x3b 0xd5 +0xc9 0x9c 0x3b 0xd5 +0xe9 0x9c 0x3b 0xd5 +0x9 0x9d 0x3b 0xd5 +0x29 0x9d 0x3b 0xd5 +0x49 0x9d 0x3b 0xd5 +0x9 0x9e 0x3b 0xd5 +0x29 0x9e 0x38 0xd5 +0x49 0x9e 0x38 0xd5 +0x69 0x9e 0x3b 0xd5 +0x9 0xa2 0x38 0xd5 +0x9 0xa2 0x3c 0xd5 +0x9 0xa2 0x3e 0xd5 +0x9 0xa3 0x38 0xd5 +0x9 0xa3 0x3c 0xd5 +0x9 0xa3 0x3e 0xd5 +0x9 0xc0 0x38 0xd5 +0x9 0xc0 0x3c 0xd5 +0x9 0xc0 0x3e 0xd5 +0x29 0xc0 0x38 0xd5 +0x29 0xc0 0x3c 0xd5 +0x29 0xc0 0x3e 0xd5 +0x49 0xc0 0x38 0xd5 +0x49 0xc0 0x3c 0xd5 +0x49 0xc0 0x3e 0xd5 +0x9 0xc1 0x38 0xd5 +0x29 0xd0 0x38 0xd5 +0x49 0xd0 0x3b 0xd5 +0x49 0xd0 0x3c 0xd5 +0x49 0xd0 0x3e 0xd5 +0x69 0xd0 0x3b 0xd5 +0x89 0xd0 0x38 0xd5 +0x9 0xe0 0x3b 0xd5 +0x29 0xe0 0x3b 0xd5 +0x49 0xe0 0x3b 0xd5 +0x69 0xe0 0x3c 0xd5 +0x9 0xe1 0x38 0xd5 +0x9 0xe1 0x3c 0xd5 +0x9 0xe2 0x3b 0xd5 +0x9 0xe2 0x3c 0xd5 +0x9 0xe2 0x3f 0xd5 +0x29 0xe2 0x3b 0xd5 +0x29 0xe2 0x3c 0xd5 +0x29 0xe2 0x3f 0xd5 +0x49 0xe2 0x3b 0xd5 +0x49 0xe2 0x3c 0xd5 +0x49 0xe2 0x3f 0xd5 +0x9 0xe3 0x3b 0xd5 +0x29 0xe3 0x3b 0xd5 +0x49 0xe3 0x3b 0xd5 +0x9 0xe8 0x3b 0xd5 +0x29 0xe8 0x3b 0xd5 +0x49 0xe8 0x3b 0xd5 +0x69 0xe8 0x3b 0xd5 +0x89 0xe8 0x3b 0xd5 +0xa9 0xe8 0x3b 0xd5 +0xc9 0xe8 0x3b 0xd5 +0xe9 0xe8 0x3b 0xd5 +0x9 0xe9 0x3b 0xd5 +0x29 0xe9 0x3b 0xd5 +0x49 0xe9 0x3b 0xd5 +0x69 0xe9 0x3b 0xd5 +0x89 0xe9 0x3b 0xd5 +0xa9 0xe9 0x3b 0xd5 +0xc9 0xe9 0x3b 0xd5 +0xe9 0xe9 0x3b 0xd5 +0x9 0xea 0x3b 0xd5 +0x29 0xea 0x3b 0xd5 +0x49 0xea 0x3b 0xd5 +0x69 0xea 0x3b 0xd5 +0x89 0xea 0x3b 0xd5 +0xa9 0xea 0x3b 0xd5 +0xc9 0xea 0x3b 0xd5 +0xe9 0xea 0x3b 0xd5 +0x9 0xeb 0x3b 0xd5 +0x29 0xeb 0x3b 0xd5 +0x49 0xeb 0x3b 0xd5 +0x69 0xeb 0x3b 0xd5 +0x89 0xeb 0x3b 0xd5 +0xa9 0xeb 0x3b 0xd5 +0xc9 0xeb 0x3b 0xd5 +0xe9 0xef 0x3b 0xd5 +0x9 0xec 0x3b 0xd5 +0x29 0xec 0x3b 0xd5 +0x49 0xec 0x3b 0xd5 +0x69 0xec 0x3b 0xd5 +0x89 0xec 0x3b 0xd5 +0xa9 0xec 0x3b 0xd5 +0xc9 0xec 0x3b 0xd5 +0xe9 0xec 0x3b 0xd5 +0x9 0xed 0x3b 0xd5 +0x29 0xed 0x3b 0xd5 +0x49 0xed 0x3b 0xd5 +0x69 0xed 0x3b 0xd5 +0x89 0xed 0x3b 0xd5 +0xa9 0xed 0x3b 0xd5 +0xc9 0xed 0x3b 0xd5 +0xe9 0xed 0x3b 0xd5 +0x9 0xee 0x3b 0xd5 +0x29 0xee 0x3b 0xd5 +0x49 0xee 0x3b 0xd5 +0x69 0xee 0x3b 0xd5 +0x89 0xee 0x3b 0xd5 +0xa9 0xee 0x3b 0xd5 +0xc9 0xee 0x3b 0xd5 +0xe9 0xee 0x3b 0xd5 +0x9 0xef 0x3b 0xd5 +0x29 0xef 0x3b 0xd5 +0x49 0xef 0x3b 0xd5 +0x69 0xef 0x3b 0xd5 +0x89 0xef 0x3b 0xd5 +0xa9 0xef 0x3b 0xd5 +0xc9 0xef 0x3b 0xd5 + +# CHECK: mrs x12, s3_7_c15_c1_5 +# CHECK: mrs x13, s3_2_c11_c15_7 +# CHECK: msr s3_0_c15_c0_0, x12 +# CHECK: msr s3_7_c11_c13_7, x5 +0xac 0xf1 0x3f 0xd5 +0xed 0xbf 0x3a 0xd5 +0x0c 0xf0 0x18 0xd5 +0xe5 0xbd 0x1f 0xd5 + +#------------------------------------------------------------------------------ +# Test and branch (immediate) +#------------------------------------------------------------------------------ + +# CHECK: tbz x12, #62, #0 +# CHECK: tbz x12, #62, #4 +# CHECK: tbz x12, #62, #-32768 +# CHECK: tbnz x12, #60, #32764 +0x0c 0x00 0xf0 0xb6 +0x2c 0x00 0xf0 0xb6 +0x0c 0x00 0xf4 0xb6 +0xec 0xff 0xe3 0xb7 + +#------------------------------------------------------------------------------ +# Unconditional branch (immediate) +#------------------------------------------------------------------------------ + +# CHECK: b #4 +# CHECK: b #-4 +# CHECK: b #134217724 +0x01 0x00 0x00 0x14 +0xff 0xff 0xff 0x17 +0xff 0xff 0xff 0x15 + +#------------------------------------------------------------------------------ +# Unconditional branch (register) +#------------------------------------------------------------------------------ + +# CHECK: br x20 +# CHECK: blr xzr +# CHECK: ret x10 +0x80 0x2 0x1f 0xd6 +0xe0 0x3 0x3f 0xd6 +0x40 0x1 0x5f 0xd6 + +# CHECK: ret +# CHECK: eret +# CHECK: drps +0xc0 0x3 0x5f 0xd6 +0xe0 0x3 0x9f 0xd6 +0xe0 0x3 0xbf 0xd6 + diff --git a/test/MC/Disassembler/AArch64/basic-a64-undefined.txt b/test/MC/Disassembler/AArch64/basic-a64-undefined.txt new file mode 100644 index 000000000000..a17579cb1680 --- /dev/null +++ b/test/MC/Disassembler/AArch64/basic-a64-undefined.txt @@ -0,0 +1,43 @@ +# These spawn another process so they're rather expensive. Not many. + +# Instructions notionally in the add/sub (extended register) sheet, but with +# invalid shift amount or "opt" field. +# RUN: echo "0x00 0x10 0xa0 0x0b" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0x00 0x10 0x60 0x0b" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0x00 0x14 0x20 0x0b" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s + +# Instructions notionally in the add/sub (immediate) sheet, but with +# invalid "shift" field. +# RUN: echo "0xdf 0x3 0x80 0x91" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0xed 0x8e 0xc4 0x31" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0x62 0xfc 0xbf 0x11" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0x3 0xff 0xff 0x91" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s + +# Instructions notionally in the load/store (unsigned immediate) sheet. +# Only unallocated (int-register) variants are: opc=0b11, size=0b10, 0b11 +# RUN: echo "0xd7 0xfc 0xff 0xb9" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0xd7 0xfc 0xcf 0xf9" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s + +# Instructions notionally in the floating-point <-> fixed-point conversion +# Scale field is 64-<imm> and <imm> should be 1-32 for a 32-bit int register. +# RUN: echo "0x23 0x01 0x18 0x1e" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0x23 0x25 0x42 0x1e" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s + +# Instructions notionally in the logical (shifted register) sheet, but with out +# of range shift: w-registers can only have 0-31. +# RUN: echo "0x00 0x80 0x00 0x0a" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s + +# Instructions notionally in the move wide (immediate) sheet, but with out +# of range shift: w-registers can only have 0 or 16. +# RUN: echo "0x00 0x00 0xc0 0x12" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0x12 0x34 0xe0 0x52" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s + +# Data-processing instructions are undefined when S=1 and for the 0b0000111 value in opcode:sf +# RUN: echo "0x00 0x00 0xc0 0x5f" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0x56 0x0c 0xc0 0x5a" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s + +# Data-processing instructions (2 source) are undefined for a value of 0001xx:0:x or 0011xx:0:x for opcode:S:sf +# RUN: echo "0x00 0x30 0xc1 0x1a" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s +# RUN: echo "0x00 0x10 0xc1 0x1a" | llvm-mc -triple=aarch64 -disassemble 2>&1 | FileCheck %s + +# CHECK: invalid instruction encoding diff --git a/test/MC/Disassembler/AArch64/basic-a64-unpredictable.txt b/test/MC/Disassembler/AArch64/basic-a64-unpredictable.txt new file mode 100644 index 000000000000..adb8f75ed990 --- /dev/null +++ b/test/MC/Disassembler/AArch64/basic-a64-unpredictable.txt @@ -0,0 +1,96 @@ +# RUN: llvm-mc -triple=aarch64 -disassemble < %s 2>&1 | FileCheck %s + +#------------------------------------------------------------------------------ +# Load-store exclusive +#------------------------------------------------------------------------------ + +#ldxp x14, x14, [sp] +0xee 0x3b 0x7f 0xc8 +#CHECK: warning: potentially undefined instruction encoding +#CHECK-NEXT: 0xee 0x3b 0x7f 0xc8 + +#ldaxp w19, w19, [x1] +0x33 0xcc 0x7f 0x88 +#CHECK: warning: potentially undefined instruction encoding +#CHECK-NEXT: 0x33 0xcc 0x7f 0x88 + +#------------------------------------------------------------------------------ +# Load-store register (immediate post-indexed) +#------------------------------------------------------------------------------ + +0x63 0x44 0x40 0xf8 +#CHECK: warning: potentially undefined instruction encoding +#CHECK-NEXT: 0x63 0x44 0x40 0xf8 + +0x42 0x14 0xc0 0x38 +#CHECK: warning: potentially undefined instruction encoding +#CHECK-NEXT: 0x42 0x14 0xc0 0x38 + +#------------------------------------------------------------------------------ +# Load-store register (immediate pre-indexed) +#------------------------------------------------------------------------------ + +0x63 0x4c 0x40 0xf8 +#CHECK: warning: potentially undefined instruction encoding +#CHECK-NEXT: 0x63 0x4c 0x40 0xf8 + +0x42 0x1c 0xc0 0x38 +#CHECK: warning: potentially undefined instruction encoding +#CHECK-NEXT: 0x42 0x1c 0xc0 0x38 + +#------------------------------------------------------------------------------ +# Load-store register pair (offset) +#------------------------------------------------------------------------------ + +# Unpredictable if Rt == Rt2 on a load. + +0xe3 0x0f 0x40 0xa9 +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0xe3 0x0f 0x40 0xa9 +# CHECK-NEXT: ^ + +0xe2 0x8b 0x41 0x69 +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0xe2 0x8b 0x41 0x69 +# CHECK-NEXT: ^ + +0x82 0x88 0x40 0x2d +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0x82 0x88 0x40 0x2d +# CHECK-NEXT: ^ + +#------------------------------------------------------------------------------ +# Load-store register pair (post-indexed) +#------------------------------------------------------------------------------ + +# Unpredictable if Rt == Rt2 on a load. + +0xe3 0x0f 0xc0 0xa8 +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0xe3 0x0f 0xc0 0xa8 +# CHECK-NEXT: ^ + +0xe2 0x8b 0xc1 0x68 +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0xe2 0x8b 0xc1 0x68 +# CHECK-NEXT: ^ + +0x82 0x88 0xc0 0x2c +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0x82 0x88 0xc0 0x2c +# CHECK-NEXT: ^ + +# Also unpredictable if writeback clashes with either transfer register + +0x63 0x94 0xc0 0xa8 +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0x63 0x94 0xc0 0xa8 + +0x69 0x2d 0x81 0xa8 +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0x69 0x2d 0x81 0xa8 + +0x29 0xad 0xc0 0x28 +# CHECK: warning: potentially undefined instruction encoding +# CHECK-NEXT: 0x29 0xad 0xc0 0x28 + diff --git a/test/MC/Disassembler/AArch64/gicv3-regs.txt b/test/MC/Disassembler/AArch64/gicv3-regs.txt new file mode 100644 index 000000000000..4351f6460c75 --- /dev/null +++ b/test/MC/Disassembler/AArch64/gicv3-regs.txt @@ -0,0 +1,222 @@ +# RUN: llvm-mc -triple aarch64-none-linux-gnu -disassemble < %s | FileCheck %s + +0x8 0xcc 0x38 0xd5 +# CHECK: mrs x8, icc_iar1_el1 +0x1a 0xc8 0x38 0xd5 +# CHECK: mrs x26, icc_iar0_el1 +0x42 0xcc 0x38 0xd5 +# CHECK: mrs x2, icc_hppir1_el1 +0x51 0xc8 0x38 0xd5 +# CHECK: mrs x17, icc_hppir0_el1 +0x7d 0xcb 0x38 0xd5 +# CHECK: mrs x29, icc_rpr_el1 +0x24 0xcb 0x3c 0xd5 +# CHECK: mrs x4, ich_vtr_el2 +0x78 0xcb 0x3c 0xd5 +# CHECK: mrs x24, ich_eisr_el2 +0xa9 0xcb 0x3c 0xd5 +# CHECK: mrs x9, ich_elsr_el2 +0x78 0xcc 0x38 0xd5 +# CHECK: mrs x24, icc_bpr1_el1 +0x6e 0xc8 0x38 0xd5 +# CHECK: mrs x14, icc_bpr0_el1 +0x13 0x46 0x38 0xd5 +# CHECK: mrs x19, icc_pmr_el1 +0x97 0xcc 0x38 0xd5 +# CHECK: mrs x23, icc_ctlr_el1 +0x94 0xcc 0x3e 0xd5 +# CHECK: mrs x20, icc_ctlr_el3 +0xbc 0xcc 0x38 0xd5 +# CHECK: mrs x28, icc_sre_el1 +0xb9 0xc9 0x3c 0xd5 +# CHECK: mrs x25, icc_sre_el2 +0xa8 0xcc 0x3e 0xd5 +# CHECK: mrs x8, icc_sre_el3 +0xd6 0xcc 0x38 0xd5 +# CHECK: mrs x22, icc_igrpen0_el1 +0xe5 0xcc 0x38 0xd5 +# CHECK: mrs x5, icc_igrpen1_el1 +0xe7 0xcc 0x3e 0xd5 +# CHECK: mrs x7, icc_igrpen1_el3 +0x16 0xcd 0x38 0xd5 +# CHECK: mrs x22, icc_seien_el1 +0x84 0xc8 0x38 0xd5 +# CHECK: mrs x4, icc_ap0r0_el1 +0xab 0xc8 0x38 0xd5 +# CHECK: mrs x11, icc_ap0r1_el1 +0xdb 0xc8 0x38 0xd5 +# CHECK: mrs x27, icc_ap0r2_el1 +0xf5 0xc8 0x38 0xd5 +# CHECK: mrs x21, icc_ap0r3_el1 +0x2 0xc9 0x38 0xd5 +# CHECK: mrs x2, icc_ap1r0_el1 +0x35 0xc9 0x38 0xd5 +# CHECK: mrs x21, icc_ap1r1_el1 +0x4a 0xc9 0x38 0xd5 +# CHECK: mrs x10, icc_ap1r2_el1 +0x7b 0xc9 0x38 0xd5 +# CHECK: mrs x27, icc_ap1r3_el1 +0x14 0xc8 0x3c 0xd5 +# CHECK: mrs x20, ich_ap0r0_el2 +0x35 0xc8 0x3c 0xd5 +# CHECK: mrs x21, ich_ap0r1_el2 +0x45 0xc8 0x3c 0xd5 +# CHECK: mrs x5, ich_ap0r2_el2 +0x64 0xc8 0x3c 0xd5 +# CHECK: mrs x4, ich_ap0r3_el2 +0xf 0xc9 0x3c 0xd5 +# CHECK: mrs x15, ich_ap1r0_el2 +0x2c 0xc9 0x3c 0xd5 +# CHECK: mrs x12, ich_ap1r1_el2 +0x5b 0xc9 0x3c 0xd5 +# CHECK: mrs x27, ich_ap1r2_el2 +0x74 0xc9 0x3c 0xd5 +# CHECK: mrs x20, ich_ap1r3_el2 +0xa 0xcb 0x3c 0xd5 +# CHECK: mrs x10, ich_hcr_el2 +0x5b 0xcb 0x3c 0xd5 +# CHECK: mrs x27, ich_misr_el2 +0xe6 0xcb 0x3c 0xd5 +# CHECK: mrs x6, ich_vmcr_el2 +0x93 0xc9 0x3c 0xd5 +# CHECK: mrs x19, ich_vseir_el2 +0x3 0xcc 0x3c 0xd5 +# CHECK: mrs x3, ich_lr0_el2 +0x21 0xcc 0x3c 0xd5 +# CHECK: mrs x1, ich_lr1_el2 +0x56 0xcc 0x3c 0xd5 +# CHECK: mrs x22, ich_lr2_el2 +0x75 0xcc 0x3c 0xd5 +# CHECK: mrs x21, ich_lr3_el2 +0x86 0xcc 0x3c 0xd5 +# CHECK: mrs x6, ich_lr4_el2 +0xaa 0xcc 0x3c 0xd5 +# CHECK: mrs x10, ich_lr5_el2 +0xcb 0xcc 0x3c 0xd5 +# CHECK: mrs x11, ich_lr6_el2 +0xec 0xcc 0x3c 0xd5 +# CHECK: mrs x12, ich_lr7_el2 +0x0 0xcd 0x3c 0xd5 +# CHECK: mrs x0, ich_lr8_el2 +0x35 0xcd 0x3c 0xd5 +# CHECK: mrs x21, ich_lr9_el2 +0x4d 0xcd 0x3c 0xd5 +# CHECK: mrs x13, ich_lr10_el2 +0x7a 0xcd 0x3c 0xd5 +# CHECK: mrs x26, ich_lr11_el2 +0x81 0xcd 0x3c 0xd5 +# CHECK: mrs x1, ich_lr12_el2 +0xa8 0xcd 0x3c 0xd5 +# CHECK: mrs x8, ich_lr13_el2 +0xc2 0xcd 0x3c 0xd5 +# CHECK: mrs x2, ich_lr14_el2 +0xe8 0xcd 0x3c 0xd5 +# CHECK: mrs x8, ich_lr15_el2 +0x3b 0xcc 0x18 0xd5 +# CHECK: msr icc_eoir1_el1, x27 +0x25 0xc8 0x18 0xd5 +# CHECK: msr icc_eoir0_el1, x5 +0x2d 0xcb 0x18 0xd5 +# CHECK: msr icc_dir_el1, x13 +0xb5 0xcb 0x18 0xd5 +# CHECK: msr icc_sgi1r_el1, x21 +0xd9 0xcb 0x18 0xd5 +# CHECK: msr icc_asgi1r_el1, x25 +0xfc 0xcb 0x18 0xd5 +# CHECK: msr icc_sgi0r_el1, x28 +0x67 0xcc 0x18 0xd5 +# CHECK: msr icc_bpr1_el1, x7 +0x69 0xc8 0x18 0xd5 +# CHECK: msr icc_bpr0_el1, x9 +0x1d 0x46 0x18 0xd5 +# CHECK: msr icc_pmr_el1, x29 +0x98 0xcc 0x18 0xd5 +# CHECK: msr icc_ctlr_el1, x24 +0x80 0xcc 0x1e 0xd5 +# CHECK: msr icc_ctlr_el3, x0 +0xa2 0xcc 0x18 0xd5 +# CHECK: msr icc_sre_el1, x2 +0xa5 0xc9 0x1c 0xd5 +# CHECK: msr icc_sre_el2, x5 +0xaa 0xcc 0x1e 0xd5 +# CHECK: msr icc_sre_el3, x10 +0xd6 0xcc 0x18 0xd5 +# CHECK: msr icc_igrpen0_el1, x22 +0xeb 0xcc 0x18 0xd5 +# CHECK: msr icc_igrpen1_el1, x11 +0xe8 0xcc 0x1e 0xd5 +# CHECK: msr icc_igrpen1_el3, x8 +0x4 0xcd 0x18 0xd5 +# CHECK: msr icc_seien_el1, x4 +0x9b 0xc8 0x18 0xd5 +# CHECK: msr icc_ap0r0_el1, x27 +0xa5 0xc8 0x18 0xd5 +# CHECK: msr icc_ap0r1_el1, x5 +0xd4 0xc8 0x18 0xd5 +# CHECK: msr icc_ap0r2_el1, x20 +0xe0 0xc8 0x18 0xd5 +# CHECK: msr icc_ap0r3_el1, x0 +0x2 0xc9 0x18 0xd5 +# CHECK: msr icc_ap1r0_el1, x2 +0x3d 0xc9 0x18 0xd5 +# CHECK: msr icc_ap1r1_el1, x29 +0x57 0xc9 0x18 0xd5 +# CHECK: msr icc_ap1r2_el1, x23 +0x6b 0xc9 0x18 0xd5 +# CHECK: msr icc_ap1r3_el1, x11 +0x2 0xc8 0x1c 0xd5 +# CHECK: msr ich_ap0r0_el2, x2 +0x3b 0xc8 0x1c 0xd5 +# CHECK: msr ich_ap0r1_el2, x27 +0x47 0xc8 0x1c 0xd5 +# CHECK: msr ich_ap0r2_el2, x7 +0x61 0xc8 0x1c 0xd5 +# CHECK: msr ich_ap0r3_el2, x1 +0x7 0xc9 0x1c 0xd5 +# CHECK: msr ich_ap1r0_el2, x7 +0x2c 0xc9 0x1c 0xd5 +# CHECK: msr ich_ap1r1_el2, x12 +0x4e 0xc9 0x1c 0xd5 +# CHECK: msr ich_ap1r2_el2, x14 +0x6d 0xc9 0x1c 0xd5 +# CHECK: msr ich_ap1r3_el2, x13 +0x1 0xcb 0x1c 0xd5 +# CHECK: msr ich_hcr_el2, x1 +0x4a 0xcb 0x1c 0xd5 +# CHECK: msr ich_misr_el2, x10 +0xf8 0xcb 0x1c 0xd5 +# CHECK: msr ich_vmcr_el2, x24 +0x9d 0xc9 0x1c 0xd5 +# CHECK: msr ich_vseir_el2, x29 +0x1a 0xcc 0x1c 0xd5 +# CHECK: msr ich_lr0_el2, x26 +0x29 0xcc 0x1c 0xd5 +# CHECK: msr ich_lr1_el2, x9 +0x52 0xcc 0x1c 0xd5 +# CHECK: msr ich_lr2_el2, x18 +0x7a 0xcc 0x1c 0xd5 +# CHECK: msr ich_lr3_el2, x26 +0x96 0xcc 0x1c 0xd5 +# CHECK: msr ich_lr4_el2, x22 +0xba 0xcc 0x1c 0xd5 +# CHECK: msr ich_lr5_el2, x26 +0xdb 0xcc 0x1c 0xd5 +# CHECK: msr ich_lr6_el2, x27 +0xe8 0xcc 0x1c 0xd5 +# CHECK: msr ich_lr7_el2, x8 +0x11 0xcd 0x1c 0xd5 +# CHECK: msr ich_lr8_el2, x17 +0x33 0xcd 0x1c 0xd5 +# CHECK: msr ich_lr9_el2, x19 +0x51 0xcd 0x1c 0xd5 +# CHECK: msr ich_lr10_el2, x17 +0x65 0xcd 0x1c 0xd5 +# CHECK: msr ich_lr11_el2, x5 +0x9d 0xcd 0x1c 0xd5 +# CHECK: msr ich_lr12_el2, x29 +0xa2 0xcd 0x1c 0xd5 +# CHECK: msr ich_lr13_el2, x2 +0xcd 0xcd 0x1c 0xd5 +# CHECK: msr ich_lr14_el2, x13 +0xfb 0xcd 0x1c 0xd5 +# CHECK: msr ich_lr15_el2, x27 diff --git a/test/MC/Disassembler/AArch64/ldp-offset-predictable.txt b/test/MC/Disassembler/AArch64/ldp-offset-predictable.txt new file mode 100644 index 000000000000..7ff495f4996d --- /dev/null +++ b/test/MC/Disassembler/AArch64/ldp-offset-predictable.txt @@ -0,0 +1,7 @@ +# RUN: llvm-mc -triple=aarch64 -disassemble < %s 2>&1 | FileCheck %s + +# Stores are OK. +0xe0 0x83 0x00 0xa9 +# CHECK-NOT: potentially undefined instruction encoding +# CHECK: stp x0, x0, [sp, #8] + diff --git a/test/MC/Disassembler/AArch64/ldp-postind.predictable.txt b/test/MC/Disassembler/AArch64/ldp-postind.predictable.txt new file mode 100644 index 000000000000..775660bba8a3 --- /dev/null +++ b/test/MC/Disassembler/AArch64/ldp-postind.predictable.txt @@ -0,0 +1,17 @@ +# RUN: llvm-mc -triple=aarch64 -disassemble < %s 2>&1 | FileCheck %s + +# None of these instructions should be classified as unpredictable: + +# CHECK-NOT: potentially undefined instruction encoding + +# Stores from duplicated registers should be fine. +0xe3 0x0f 0x80 0xa8 +# CHECK: stp x3, x3, [sp], #0 + +# d5 != x5 so "ldp d5, d6, [x5], #24" is fine. +0xa5 0x98 0xc1 0x6c +# CHECK: ldp d5, d6, [x5], #24 + +# xzr != sp so "stp xzr, xzr, [sp], #8" is fine. +0xff 0xff 0x80 0xa8 +# CHECK: stp xzr, xzr, [sp], #8 diff --git a/test/MC/Disassembler/AArch64/ldp-preind.predictable.txt b/test/MC/Disassembler/AArch64/ldp-preind.predictable.txt new file mode 100644 index 000000000000..48ea8170ba9e --- /dev/null +++ b/test/MC/Disassembler/AArch64/ldp-preind.predictable.txt @@ -0,0 +1,17 @@ +# RUN: llvm-mc -triple=aarch64 -disassemble < %s 2>&1 | FileCheck %s + +# None of these instructions should be classified as unpredictable: + +# CHECK-NOT: potentially undefined instruction encoding + +# Stores from duplicated registers should be fine. +0xe3 0x0f 0x80 0xa9 +# CHECK: stp x3, x3, [sp, #0]! + +# d5 != x5 so "ldp d5, d6, [x5, #24]!" is fine. +0xa5 0x98 0xc1 0x6d +# CHECK: ldp d5, d6, [x5, #24]! + +# xzr != sp so "stp xzr, xzr, [sp, #8]!" is fine. +0xff 0xff 0x80 0xa9 +# CHECK: stp xzr, xzr, [sp, #8]! diff --git a/test/MC/Disassembler/AArch64/lit.local.cfg b/test/MC/Disassembler/AArch64/lit.local.cfg new file mode 100644 index 000000000000..f9df30e4d3df --- /dev/null +++ b/test/MC/Disassembler/AArch64/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.txt'] + +targets = set(config.root.targets_to_build.split()) +if not 'AArch64' in targets: + config.unsupported = True + diff --git a/test/MC/Disassembler/AArch64/trace-regs.txt b/test/MC/Disassembler/AArch64/trace-regs.txt new file mode 100644 index 000000000000..10c5937f5dea --- /dev/null +++ b/test/MC/Disassembler/AArch64/trace-regs.txt @@ -0,0 +1,736 @@ +# RUN: llvm-mc -triple aarch64-none-linux-gnu -disassemble < %s | FileCheck %s + +0x8 0x3 0x31 0xd5 +# CHECK: mrs x8, trcstatr +0xc9 0x0 0x31 0xd5 +# CHECK: mrs x9, trcidr8 +0xcb 0x1 0x31 0xd5 +# CHECK: mrs x11, trcidr9 +0xd9 0x2 0x31 0xd5 +# CHECK: mrs x25, trcidr10 +0xc7 0x3 0x31 0xd5 +# CHECK: mrs x7, trcidr11 +0xc7 0x4 0x31 0xd5 +# CHECK: mrs x7, trcidr12 +0xc6 0x5 0x31 0xd5 +# CHECK: mrs x6, trcidr13 +0xfb 0x8 0x31 0xd5 +# CHECK: mrs x27, trcidr0 +0xfd 0x9 0x31 0xd5 +# CHECK: mrs x29, trcidr1 +0xe4 0xa 0x31 0xd5 +# CHECK: mrs x4, trcidr2 +0xe8 0xb 0x31 0xd5 +# CHECK: mrs x8, trcidr3 +0xef 0xc 0x31 0xd5 +# CHECK: mrs x15, trcidr4 +0xf4 0xd 0x31 0xd5 +# CHECK: mrs x20, trcidr5 +0xe6 0xe 0x31 0xd5 +# CHECK: mrs x6, trcidr6 +0xe6 0xf 0x31 0xd5 +# CHECK: mrs x6, trcidr7 +0x98 0x11 0x31 0xd5 +# CHECK: mrs x24, trcoslsr +0x92 0x15 0x31 0xd5 +# CHECK: mrs x18, trcpdsr +0xdc 0x7a 0x31 0xd5 +# CHECK: mrs x28, trcdevaff0 +0xc5 0x7b 0x31 0xd5 +# CHECK: mrs x5, trcdevaff1 +0xc5 0x7d 0x31 0xd5 +# CHECK: mrs x5, trclsr +0xcb 0x7e 0x31 0xd5 +# CHECK: mrs x11, trcauthstatus +0xcd 0x7f 0x31 0xd5 +# CHECK: mrs x13, trcdevarch +0xf2 0x72 0x31 0xd5 +# CHECK: mrs x18, trcdevid +0xf6 0x73 0x31 0xd5 +# CHECK: mrs x22, trcdevtype +0xee 0x74 0x31 0xd5 +# CHECK: mrs x14, trcpidr4 +0xe5 0x75 0x31 0xd5 +# CHECK: mrs x5, trcpidr5 +0xe5 0x76 0x31 0xd5 +# CHECK: mrs x5, trcpidr6 +0xe9 0x77 0x31 0xd5 +# CHECK: mrs x9, trcpidr7 +0xef 0x78 0x31 0xd5 +# CHECK: mrs x15, trcpidr0 +0xe6 0x79 0x31 0xd5 +# CHECK: mrs x6, trcpidr1 +0xeb 0x7a 0x31 0xd5 +# CHECK: mrs x11, trcpidr2 +0xf4 0x7b 0x31 0xd5 +# CHECK: mrs x20, trcpidr3 +0xf1 0x7c 0x31 0xd5 +# CHECK: mrs x17, trccidr0 +0xe2 0x7d 0x31 0xd5 +# CHECK: mrs x2, trccidr1 +0xf4 0x7e 0x31 0xd5 +# CHECK: mrs x20, trccidr2 +0xe4 0x7f 0x31 0xd5 +# CHECK: mrs x4, trccidr3 +0xb 0x1 0x31 0xd5 +# CHECK: mrs x11, trcprgctlr +0x17 0x2 0x31 0xd5 +# CHECK: mrs x23, trcprocselr +0xd 0x4 0x31 0xd5 +# CHECK: mrs x13, trcconfigr +0x17 0x6 0x31 0xd5 +# CHECK: mrs x23, trcauxctlr +0x9 0x8 0x31 0xd5 +# CHECK: mrs x9, trceventctl0r +0x10 0x9 0x31 0xd5 +# CHECK: mrs x16, trceventctl1r +0x4 0xb 0x31 0xd5 +# CHECK: mrs x4, trcstallctlr +0xe 0xc 0x31 0xd5 +# CHECK: mrs x14, trctsctlr +0x18 0xd 0x31 0xd5 +# CHECK: mrs x24, trcsyncpr +0x1c 0xe 0x31 0xd5 +# CHECK: mrs x28, trcccctlr +0xf 0xf 0x31 0xd5 +# CHECK: mrs x15, trcbbctlr +0x21 0x0 0x31 0xd5 +# CHECK: mrs x1, trctraceidr +0x34 0x1 0x31 0xd5 +# CHECK: mrs x20, trcqctlr +0x42 0x0 0x31 0xd5 +# CHECK: mrs x2, trcvictlr +0x4c 0x1 0x31 0xd5 +# CHECK: mrs x12, trcviiectlr +0x50 0x2 0x31 0xd5 +# CHECK: mrs x16, trcvissctlr +0x48 0x3 0x31 0xd5 +# CHECK: mrs x8, trcvipcssctlr +0x5b 0x8 0x31 0xd5 +# CHECK: mrs x27, trcvdctlr +0x49 0x9 0x31 0xd5 +# CHECK: mrs x9, trcvdsacctlr +0x40 0xa 0x31 0xd5 +# CHECK: mrs x0, trcvdarcctlr +0x8d 0x0 0x31 0xd5 +# CHECK: mrs x13, trcseqevr0 +0x8b 0x1 0x31 0xd5 +# CHECK: mrs x11, trcseqevr1 +0x9a 0x2 0x31 0xd5 +# CHECK: mrs x26, trcseqevr2 +0x8e 0x6 0x31 0xd5 +# CHECK: mrs x14, trcseqrstevr +0x84 0x7 0x31 0xd5 +# CHECK: mrs x4, trcseqstr +0x91 0x8 0x31 0xd5 +# CHECK: mrs x17, trcextinselr +0xb5 0x0 0x31 0xd5 +# CHECK: mrs x21, trccntrldvr0 +0xaa 0x1 0x31 0xd5 +# CHECK: mrs x10, trccntrldvr1 +0xb4 0x2 0x31 0xd5 +# CHECK: mrs x20, trccntrldvr2 +0xa5 0x3 0x31 0xd5 +# CHECK: mrs x5, trccntrldvr3 +0xb1 0x4 0x31 0xd5 +# CHECK: mrs x17, trccntctlr0 +0xa1 0x5 0x31 0xd5 +# CHECK: mrs x1, trccntctlr1 +0xb1 0x6 0x31 0xd5 +# CHECK: mrs x17, trccntctlr2 +0xa6 0x7 0x31 0xd5 +# CHECK: mrs x6, trccntctlr3 +0xbc 0x8 0x31 0xd5 +# CHECK: mrs x28, trccntvr0 +0xb7 0x9 0x31 0xd5 +# CHECK: mrs x23, trccntvr1 +0xa9 0xa 0x31 0xd5 +# CHECK: mrs x9, trccntvr2 +0xa6 0xb 0x31 0xd5 +# CHECK: mrs x6, trccntvr3 +0xf8 0x0 0x31 0xd5 +# CHECK: mrs x24, trcimspec0 +0xf8 0x1 0x31 0xd5 +# CHECK: mrs x24, trcimspec1 +0xef 0x2 0x31 0xd5 +# CHECK: mrs x15, trcimspec2 +0xea 0x3 0x31 0xd5 +# CHECK: mrs x10, trcimspec3 +0xfd 0x4 0x31 0xd5 +# CHECK: mrs x29, trcimspec4 +0xf2 0x5 0x31 0xd5 +# CHECK: mrs x18, trcimspec5 +0xfd 0x6 0x31 0xd5 +# CHECK: mrs x29, trcimspec6 +0xe2 0x7 0x31 0xd5 +# CHECK: mrs x2, trcimspec7 +0x8 0x12 0x31 0xd5 +# CHECK: mrs x8, trcrsctlr2 +0x0 0x13 0x31 0xd5 +# CHECK: mrs x0, trcrsctlr3 +0xc 0x14 0x31 0xd5 +# CHECK: mrs x12, trcrsctlr4 +0x1a 0x15 0x31 0xd5 +# CHECK: mrs x26, trcrsctlr5 +0x1d 0x16 0x31 0xd5 +# CHECK: mrs x29, trcrsctlr6 +0x11 0x17 0x31 0xd5 +# CHECK: mrs x17, trcrsctlr7 +0x0 0x18 0x31 0xd5 +# CHECK: mrs x0, trcrsctlr8 +0x1 0x19 0x31 0xd5 +# CHECK: mrs x1, trcrsctlr9 +0x11 0x1a 0x31 0xd5 +# CHECK: mrs x17, trcrsctlr10 +0x15 0x1b 0x31 0xd5 +# CHECK: mrs x21, trcrsctlr11 +0x1 0x1c 0x31 0xd5 +# CHECK: mrs x1, trcrsctlr12 +0x8 0x1d 0x31 0xd5 +# CHECK: mrs x8, trcrsctlr13 +0x18 0x1e 0x31 0xd5 +# CHECK: mrs x24, trcrsctlr14 +0x0 0x1f 0x31 0xd5 +# CHECK: mrs x0, trcrsctlr15 +0x22 0x10 0x31 0xd5 +# CHECK: mrs x2, trcrsctlr16 +0x3d 0x11 0x31 0xd5 +# CHECK: mrs x29, trcrsctlr17 +0x36 0x12 0x31 0xd5 +# CHECK: mrs x22, trcrsctlr18 +0x26 0x13 0x31 0xd5 +# CHECK: mrs x6, trcrsctlr19 +0x3a 0x14 0x31 0xd5 +# CHECK: mrs x26, trcrsctlr20 +0x3a 0x15 0x31 0xd5 +# CHECK: mrs x26, trcrsctlr21 +0x24 0x16 0x31 0xd5 +# CHECK: mrs x4, trcrsctlr22 +0x2c 0x17 0x31 0xd5 +# CHECK: mrs x12, trcrsctlr23 +0x21 0x18 0x31 0xd5 +# CHECK: mrs x1, trcrsctlr24 +0x20 0x19 0x31 0xd5 +# CHECK: mrs x0, trcrsctlr25 +0x31 0x1a 0x31 0xd5 +# CHECK: mrs x17, trcrsctlr26 +0x28 0x1b 0x31 0xd5 +# CHECK: mrs x8, trcrsctlr27 +0x2a 0x1c 0x31 0xd5 +# CHECK: mrs x10, trcrsctlr28 +0x39 0x1d 0x31 0xd5 +# CHECK: mrs x25, trcrsctlr29 +0x2c 0x1e 0x31 0xd5 +# CHECK: mrs x12, trcrsctlr30 +0x2b 0x1f 0x31 0xd5 +# CHECK: mrs x11, trcrsctlr31 +0x52 0x10 0x31 0xd5 +# CHECK: mrs x18, trcssccr0 +0x4c 0x11 0x31 0xd5 +# CHECK: mrs x12, trcssccr1 +0x43 0x12 0x31 0xd5 +# CHECK: mrs x3, trcssccr2 +0x42 0x13 0x31 0xd5 +# CHECK: mrs x2, trcssccr3 +0x55 0x14 0x31 0xd5 +# CHECK: mrs x21, trcssccr4 +0x4a 0x15 0x31 0xd5 +# CHECK: mrs x10, trcssccr5 +0x56 0x16 0x31 0xd5 +# CHECK: mrs x22, trcssccr6 +0x57 0x17 0x31 0xd5 +# CHECK: mrs x23, trcssccr7 +0x57 0x18 0x31 0xd5 +# CHECK: mrs x23, trcsscsr0 +0x53 0x19 0x31 0xd5 +# CHECK: mrs x19, trcsscsr1 +0x59 0x1a 0x31 0xd5 +# CHECK: mrs x25, trcsscsr2 +0x51 0x1b 0x31 0xd5 +# CHECK: mrs x17, trcsscsr3 +0x53 0x1c 0x31 0xd5 +# CHECK: mrs x19, trcsscsr4 +0x4b 0x1d 0x31 0xd5 +# CHECK: mrs x11, trcsscsr5 +0x45 0x1e 0x31 0xd5 +# CHECK: mrs x5, trcsscsr6 +0x49 0x1f 0x31 0xd5 +# CHECK: mrs x9, trcsscsr7 +0x9a 0x14 0x31 0xd5 +# CHECK: mrs x26, trcpdcr +0x8 0x20 0x31 0xd5 +# CHECK: mrs x8, trcacvr0 +0xf 0x22 0x31 0xd5 +# CHECK: mrs x15, trcacvr1 +0x13 0x24 0x31 0xd5 +# CHECK: mrs x19, trcacvr2 +0x8 0x26 0x31 0xd5 +# CHECK: mrs x8, trcacvr3 +0x1c 0x28 0x31 0xd5 +# CHECK: mrs x28, trcacvr4 +0x3 0x2a 0x31 0xd5 +# CHECK: mrs x3, trcacvr5 +0x19 0x2c 0x31 0xd5 +# CHECK: mrs x25, trcacvr6 +0x18 0x2e 0x31 0xd5 +# CHECK: mrs x24, trcacvr7 +0x26 0x20 0x31 0xd5 +# CHECK: mrs x6, trcacvr8 +0x23 0x22 0x31 0xd5 +# CHECK: mrs x3, trcacvr9 +0x38 0x24 0x31 0xd5 +# CHECK: mrs x24, trcacvr10 +0x23 0x26 0x31 0xd5 +# CHECK: mrs x3, trcacvr11 +0x2c 0x28 0x31 0xd5 +# CHECK: mrs x12, trcacvr12 +0x29 0x2a 0x31 0xd5 +# CHECK: mrs x9, trcacvr13 +0x2e 0x2c 0x31 0xd5 +# CHECK: mrs x14, trcacvr14 +0x23 0x2e 0x31 0xd5 +# CHECK: mrs x3, trcacvr15 +0x55 0x20 0x31 0xd5 +# CHECK: mrs x21, trcacatr0 +0x5a 0x22 0x31 0xd5 +# CHECK: mrs x26, trcacatr1 +0x48 0x24 0x31 0xd5 +# CHECK: mrs x8, trcacatr2 +0x56 0x26 0x31 0xd5 +# CHECK: mrs x22, trcacatr3 +0x46 0x28 0x31 0xd5 +# CHECK: mrs x6, trcacatr4 +0x5d 0x2a 0x31 0xd5 +# CHECK: mrs x29, trcacatr5 +0x45 0x2c 0x31 0xd5 +# CHECK: mrs x5, trcacatr6 +0x52 0x2e 0x31 0xd5 +# CHECK: mrs x18, trcacatr7 +0x62 0x20 0x31 0xd5 +# CHECK: mrs x2, trcacatr8 +0x73 0x22 0x31 0xd5 +# CHECK: mrs x19, trcacatr9 +0x6d 0x24 0x31 0xd5 +# CHECK: mrs x13, trcacatr10 +0x79 0x26 0x31 0xd5 +# CHECK: mrs x25, trcacatr11 +0x72 0x28 0x31 0xd5 +# CHECK: mrs x18, trcacatr12 +0x7d 0x2a 0x31 0xd5 +# CHECK: mrs x29, trcacatr13 +0x69 0x2c 0x31 0xd5 +# CHECK: mrs x9, trcacatr14 +0x72 0x2e 0x31 0xd5 +# CHECK: mrs x18, trcacatr15 +0x9d 0x20 0x31 0xd5 +# CHECK: mrs x29, trcdvcvr0 +0x8f 0x24 0x31 0xd5 +# CHECK: mrs x15, trcdvcvr1 +0x8f 0x28 0x31 0xd5 +# CHECK: mrs x15, trcdvcvr2 +0x8f 0x2c 0x31 0xd5 +# CHECK: mrs x15, trcdvcvr3 +0xb3 0x20 0x31 0xd5 +# CHECK: mrs x19, trcdvcvr4 +0xb6 0x24 0x31 0xd5 +# CHECK: mrs x22, trcdvcvr5 +0xbb 0x28 0x31 0xd5 +# CHECK: mrs x27, trcdvcvr6 +0xa1 0x2c 0x31 0xd5 +# CHECK: mrs x1, trcdvcvr7 +0xdd 0x20 0x31 0xd5 +# CHECK: mrs x29, trcdvcmr0 +0xc9 0x24 0x31 0xd5 +# CHECK: mrs x9, trcdvcmr1 +0xc1 0x28 0x31 0xd5 +# CHECK: mrs x1, trcdvcmr2 +0xc2 0x2c 0x31 0xd5 +# CHECK: mrs x2, trcdvcmr3 +0xe5 0x20 0x31 0xd5 +# CHECK: mrs x5, trcdvcmr4 +0xf5 0x24 0x31 0xd5 +# CHECK: mrs x21, trcdvcmr5 +0xe5 0x28 0x31 0xd5 +# CHECK: mrs x5, trcdvcmr6 +0xe1 0x2c 0x31 0xd5 +# CHECK: mrs x1, trcdvcmr7 +0x15 0x30 0x31 0xd5 +# CHECK: mrs x21, trccidcvr0 +0x18 0x32 0x31 0xd5 +# CHECK: mrs x24, trccidcvr1 +0x18 0x34 0x31 0xd5 +# CHECK: mrs x24, trccidcvr2 +0xc 0x36 0x31 0xd5 +# CHECK: mrs x12, trccidcvr3 +0xa 0x38 0x31 0xd5 +# CHECK: mrs x10, trccidcvr4 +0x9 0x3a 0x31 0xd5 +# CHECK: mrs x9, trccidcvr5 +0x6 0x3c 0x31 0xd5 +# CHECK: mrs x6, trccidcvr6 +0x14 0x3e 0x31 0xd5 +# CHECK: mrs x20, trccidcvr7 +0x34 0x30 0x31 0xd5 +# CHECK: mrs x20, trcvmidcvr0 +0x34 0x32 0x31 0xd5 +# CHECK: mrs x20, trcvmidcvr1 +0x3a 0x34 0x31 0xd5 +# CHECK: mrs x26, trcvmidcvr2 +0x21 0x36 0x31 0xd5 +# CHECK: mrs x1, trcvmidcvr3 +0x2e 0x38 0x31 0xd5 +# CHECK: mrs x14, trcvmidcvr4 +0x3b 0x3a 0x31 0xd5 +# CHECK: mrs x27, trcvmidcvr5 +0x3d 0x3c 0x31 0xd5 +# CHECK: mrs x29, trcvmidcvr6 +0x31 0x3e 0x31 0xd5 +# CHECK: mrs x17, trcvmidcvr7 +0x4a 0x30 0x31 0xd5 +# CHECK: mrs x10, trccidcctlr0 +0x44 0x31 0x31 0xd5 +# CHECK: mrs x4, trccidcctlr1 +0x49 0x32 0x31 0xd5 +# CHECK: mrs x9, trcvmidcctlr0 +0x4b 0x33 0x31 0xd5 +# CHECK: mrs x11, trcvmidcctlr1 +0x96 0x70 0x31 0xd5 +# CHECK: mrs x22, trcitctrl +0xd7 0x78 0x31 0xd5 +# CHECK: mrs x23, trcclaimset +0xce 0x79 0x31 0xd5 +# CHECK: mrs x14, trcclaimclr +0x9c 0x10 0x11 0xd5 +# CHECK: msr trcoslar, x28 +0xce 0x7c 0x11 0xd5 +# CHECK: msr trclar, x14 +0xa 0x1 0x11 0xd5 +# CHECK: msr trcprgctlr, x10 +0x1b 0x2 0x11 0xd5 +# CHECK: msr trcprocselr, x27 +0x18 0x4 0x11 0xd5 +# CHECK: msr trcconfigr, x24 +0x8 0x6 0x11 0xd5 +# CHECK: msr trcauxctlr, x8 +0x10 0x8 0x11 0xd5 +# CHECK: msr trceventctl0r, x16 +0x1b 0x9 0x11 0xd5 +# CHECK: msr trceventctl1r, x27 +0x1a 0xb 0x11 0xd5 +# CHECK: msr trcstallctlr, x26 +0x0 0xc 0x11 0xd5 +# CHECK: msr trctsctlr, x0 +0xe 0xd 0x11 0xd5 +# CHECK: msr trcsyncpr, x14 +0x8 0xe 0x11 0xd5 +# CHECK: msr trcccctlr, x8 +0x6 0xf 0x11 0xd5 +# CHECK: msr trcbbctlr, x6 +0x37 0x0 0x11 0xd5 +# CHECK: msr trctraceidr, x23 +0x25 0x1 0x11 0xd5 +# CHECK: msr trcqctlr, x5 +0x40 0x0 0x11 0xd5 +# CHECK: msr trcvictlr, x0 +0x40 0x1 0x11 0xd5 +# CHECK: msr trcviiectlr, x0 +0x41 0x2 0x11 0xd5 +# CHECK: msr trcvissctlr, x1 +0x40 0x3 0x11 0xd5 +# CHECK: msr trcvipcssctlr, x0 +0x47 0x8 0x11 0xd5 +# CHECK: msr trcvdctlr, x7 +0x52 0x9 0x11 0xd5 +# CHECK: msr trcvdsacctlr, x18 +0x58 0xa 0x11 0xd5 +# CHECK: msr trcvdarcctlr, x24 +0x9c 0x0 0x11 0xd5 +# CHECK: msr trcseqevr0, x28 +0x95 0x1 0x11 0xd5 +# CHECK: msr trcseqevr1, x21 +0x90 0x2 0x11 0xd5 +# CHECK: msr trcseqevr2, x16 +0x90 0x6 0x11 0xd5 +# CHECK: msr trcseqrstevr, x16 +0x99 0x7 0x11 0xd5 +# CHECK: msr trcseqstr, x25 +0x9d 0x8 0x11 0xd5 +# CHECK: msr trcextinselr, x29 +0xb4 0x0 0x11 0xd5 +# CHECK: msr trccntrldvr0, x20 +0xb4 0x1 0x11 0xd5 +# CHECK: msr trccntrldvr1, x20 +0xb6 0x2 0x11 0xd5 +# CHECK: msr trccntrldvr2, x22 +0xac 0x3 0x11 0xd5 +# CHECK: msr trccntrldvr3, x12 +0xb4 0x4 0x11 0xd5 +# CHECK: msr trccntctlr0, x20 +0xa4 0x5 0x11 0xd5 +# CHECK: msr trccntctlr1, x4 +0xa8 0x6 0x11 0xd5 +# CHECK: msr trccntctlr2, x8 +0xb0 0x7 0x11 0xd5 +# CHECK: msr trccntctlr3, x16 +0xa5 0x8 0x11 0xd5 +# CHECK: msr trccntvr0, x5 +0xbb 0x9 0x11 0xd5 +# CHECK: msr trccntvr1, x27 +0xb5 0xa 0x11 0xd5 +# CHECK: msr trccntvr2, x21 +0xa8 0xb 0x11 0xd5 +# CHECK: msr trccntvr3, x8 +0xe6 0x0 0x11 0xd5 +# CHECK: msr trcimspec0, x6 +0xfb 0x1 0x11 0xd5 +# CHECK: msr trcimspec1, x27 +0xf7 0x2 0x11 0xd5 +# CHECK: msr trcimspec2, x23 +0xef 0x3 0x11 0xd5 +# CHECK: msr trcimspec3, x15 +0xed 0x4 0x11 0xd5 +# CHECK: msr trcimspec4, x13 +0xf9 0x5 0x11 0xd5 +# CHECK: msr trcimspec5, x25 +0xf3 0x6 0x11 0xd5 +# CHECK: msr trcimspec6, x19 +0xfb 0x7 0x11 0xd5 +# CHECK: msr trcimspec7, x27 +0x4 0x12 0x11 0xd5 +# CHECK: msr trcrsctlr2, x4 +0x0 0x13 0x11 0xd5 +# CHECK: msr trcrsctlr3, x0 +0x15 0x14 0x11 0xd5 +# CHECK: msr trcrsctlr4, x21 +0x8 0x15 0x11 0xd5 +# CHECK: msr trcrsctlr5, x8 +0x14 0x16 0x11 0xd5 +# CHECK: msr trcrsctlr6, x20 +0xb 0x17 0x11 0xd5 +# CHECK: msr trcrsctlr7, x11 +0x12 0x18 0x11 0xd5 +# CHECK: msr trcrsctlr8, x18 +0x18 0x19 0x11 0xd5 +# CHECK: msr trcrsctlr9, x24 +0xf 0x1a 0x11 0xd5 +# CHECK: msr trcrsctlr10, x15 +0x15 0x1b 0x11 0xd5 +# CHECK: msr trcrsctlr11, x21 +0x4 0x1c 0x11 0xd5 +# CHECK: msr trcrsctlr12, x4 +0x1c 0x1d 0x11 0xd5 +# CHECK: msr trcrsctlr13, x28 +0x3 0x1e 0x11 0xd5 +# CHECK: msr trcrsctlr14, x3 +0x14 0x1f 0x11 0xd5 +# CHECK: msr trcrsctlr15, x20 +0x2c 0x10 0x11 0xd5 +# CHECK: msr trcrsctlr16, x12 +0x31 0x11 0x11 0xd5 +# CHECK: msr trcrsctlr17, x17 +0x2a 0x12 0x11 0xd5 +# CHECK: msr trcrsctlr18, x10 +0x2b 0x13 0x11 0xd5 +# CHECK: msr trcrsctlr19, x11 +0x23 0x14 0x11 0xd5 +# CHECK: msr trcrsctlr20, x3 +0x32 0x15 0x11 0xd5 +# CHECK: msr trcrsctlr21, x18 +0x3a 0x16 0x11 0xd5 +# CHECK: msr trcrsctlr22, x26 +0x25 0x17 0x11 0xd5 +# CHECK: msr trcrsctlr23, x5 +0x39 0x18 0x11 0xd5 +# CHECK: msr trcrsctlr24, x25 +0x25 0x19 0x11 0xd5 +# CHECK: msr trcrsctlr25, x5 +0x24 0x1a 0x11 0xd5 +# CHECK: msr trcrsctlr26, x4 +0x34 0x1b 0x11 0xd5 +# CHECK: msr trcrsctlr27, x20 +0x25 0x1c 0x11 0xd5 +# CHECK: msr trcrsctlr28, x5 +0x2a 0x1d 0x11 0xd5 +# CHECK: msr trcrsctlr29, x10 +0x38 0x1e 0x11 0xd5 +# CHECK: msr trcrsctlr30, x24 +0x34 0x1f 0x11 0xd5 +# CHECK: msr trcrsctlr31, x20 +0x57 0x10 0x11 0xd5 +# CHECK: msr trcssccr0, x23 +0x5b 0x11 0x11 0xd5 +# CHECK: msr trcssccr1, x27 +0x5b 0x12 0x11 0xd5 +# CHECK: msr trcssccr2, x27 +0x46 0x13 0x11 0xd5 +# CHECK: msr trcssccr3, x6 +0x43 0x14 0x11 0xd5 +# CHECK: msr trcssccr4, x3 +0x4c 0x15 0x11 0xd5 +# CHECK: msr trcssccr5, x12 +0x47 0x16 0x11 0xd5 +# CHECK: msr trcssccr6, x7 +0x46 0x17 0x11 0xd5 +# CHECK: msr trcssccr7, x6 +0x54 0x18 0x11 0xd5 +# CHECK: msr trcsscsr0, x20 +0x51 0x19 0x11 0xd5 +# CHECK: msr trcsscsr1, x17 +0x4b 0x1a 0x11 0xd5 +# CHECK: msr trcsscsr2, x11 +0x44 0x1b 0x11 0xd5 +# CHECK: msr trcsscsr3, x4 +0x4e 0x1c 0x11 0xd5 +# CHECK: msr trcsscsr4, x14 +0x56 0x1d 0x11 0xd5 +# CHECK: msr trcsscsr5, x22 +0x43 0x1e 0x11 0xd5 +# CHECK: msr trcsscsr6, x3 +0x4b 0x1f 0x11 0xd5 +# CHECK: msr trcsscsr7, x11 +0x83 0x14 0x11 0xd5 +# CHECK: msr trcpdcr, x3 +0x6 0x20 0x11 0xd5 +# CHECK: msr trcacvr0, x6 +0x14 0x22 0x11 0xd5 +# CHECK: msr trcacvr1, x20 +0x19 0x24 0x11 0xd5 +# CHECK: msr trcacvr2, x25 +0x1 0x26 0x11 0xd5 +# CHECK: msr trcacvr3, x1 +0x1c 0x28 0x11 0xd5 +# CHECK: msr trcacvr4, x28 +0xf 0x2a 0x11 0xd5 +# CHECK: msr trcacvr5, x15 +0x19 0x2c 0x11 0xd5 +# CHECK: msr trcacvr6, x25 +0xc 0x2e 0x11 0xd5 +# CHECK: msr trcacvr7, x12 +0x25 0x20 0x11 0xd5 +# CHECK: msr trcacvr8, x5 +0x39 0x22 0x11 0xd5 +# CHECK: msr trcacvr9, x25 +0x2d 0x24 0x11 0xd5 +# CHECK: msr trcacvr10, x13 +0x2a 0x26 0x11 0xd5 +# CHECK: msr trcacvr11, x10 +0x33 0x28 0x11 0xd5 +# CHECK: msr trcacvr12, x19 +0x2a 0x2a 0x11 0xd5 +# CHECK: msr trcacvr13, x10 +0x33 0x2c 0x11 0xd5 +# CHECK: msr trcacvr14, x19 +0x22 0x2e 0x11 0xd5 +# CHECK: msr trcacvr15, x2 +0x4f 0x20 0x11 0xd5 +# CHECK: msr trcacatr0, x15 +0x4d 0x22 0x11 0xd5 +# CHECK: msr trcacatr1, x13 +0x48 0x24 0x11 0xd5 +# CHECK: msr trcacatr2, x8 +0x41 0x26 0x11 0xd5 +# CHECK: msr trcacatr3, x1 +0x4b 0x28 0x11 0xd5 +# CHECK: msr trcacatr4, x11 +0x48 0x2a 0x11 0xd5 +# CHECK: msr trcacatr5, x8 +0x58 0x2c 0x11 0xd5 +# CHECK: msr trcacatr6, x24 +0x46 0x2e 0x11 0xd5 +# CHECK: msr trcacatr7, x6 +0x77 0x20 0x11 0xd5 +# CHECK: msr trcacatr8, x23 +0x65 0x22 0x11 0xd5 +# CHECK: msr trcacatr9, x5 +0x6b 0x24 0x11 0xd5 +# CHECK: msr trcacatr10, x11 +0x6b 0x26 0x11 0xd5 +# CHECK: msr trcacatr11, x11 +0x63 0x28 0x11 0xd5 +# CHECK: msr trcacatr12, x3 +0x7c 0x2a 0x11 0xd5 +# CHECK: msr trcacatr13, x28 +0x79 0x2c 0x11 0xd5 +# CHECK: msr trcacatr14, x25 +0x64 0x2e 0x11 0xd5 +# CHECK: msr trcacatr15, x4 +0x86 0x20 0x11 0xd5 +# CHECK: msr trcdvcvr0, x6 +0x83 0x24 0x11 0xd5 +# CHECK: msr trcdvcvr1, x3 +0x85 0x28 0x11 0xd5 +# CHECK: msr trcdvcvr2, x5 +0x8b 0x2c 0x11 0xd5 +# CHECK: msr trcdvcvr3, x11 +0xa9 0x20 0x11 0xd5 +# CHECK: msr trcdvcvr4, x9 +0xae 0x24 0x11 0xd5 +# CHECK: msr trcdvcvr5, x14 +0xaa 0x28 0x11 0xd5 +# CHECK: msr trcdvcvr6, x10 +0xac 0x2c 0x11 0xd5 +# CHECK: msr trcdvcvr7, x12 +0xc8 0x20 0x11 0xd5 +# CHECK: msr trcdvcmr0, x8 +0xc8 0x24 0x11 0xd5 +# CHECK: msr trcdvcmr1, x8 +0xd6 0x28 0x11 0xd5 +# CHECK: msr trcdvcmr2, x22 +0xd6 0x2c 0x11 0xd5 +# CHECK: msr trcdvcmr3, x22 +0xe5 0x20 0x11 0xd5 +# CHECK: msr trcdvcmr4, x5 +0xf0 0x24 0x11 0xd5 +# CHECK: msr trcdvcmr5, x16 +0xfb 0x28 0x11 0xd5 +# CHECK: msr trcdvcmr6, x27 +0xf5 0x2c 0x11 0xd5 +# CHECK: msr trcdvcmr7, x21 +0x8 0x30 0x11 0xd5 +# CHECK: msr trccidcvr0, x8 +0x6 0x32 0x11 0xd5 +# CHECK: msr trccidcvr1, x6 +0x9 0x34 0x11 0xd5 +# CHECK: msr trccidcvr2, x9 +0x8 0x36 0x11 0xd5 +# CHECK: msr trccidcvr3, x8 +0x3 0x38 0x11 0xd5 +# CHECK: msr trccidcvr4, x3 +0x15 0x3a 0x11 0xd5 +# CHECK: msr trccidcvr5, x21 +0xc 0x3c 0x11 0xd5 +# CHECK: msr trccidcvr6, x12 +0x7 0x3e 0x11 0xd5 +# CHECK: msr trccidcvr7, x7 +0x24 0x30 0x11 0xd5 +# CHECK: msr trcvmidcvr0, x4 +0x23 0x32 0x11 0xd5 +# CHECK: msr trcvmidcvr1, x3 +0x29 0x34 0x11 0xd5 +# CHECK: msr trcvmidcvr2, x9 +0x31 0x36 0x11 0xd5 +# CHECK: msr trcvmidcvr3, x17 +0x2e 0x38 0x11 0xd5 +# CHECK: msr trcvmidcvr4, x14 +0x2c 0x3a 0x11 0xd5 +# CHECK: msr trcvmidcvr5, x12 +0x2a 0x3c 0x11 0xd5 +# CHECK: msr trcvmidcvr6, x10 +0x23 0x3e 0x11 0xd5 +# CHECK: msr trcvmidcvr7, x3 +0x4e 0x30 0x11 0xd5 +# CHECK: msr trccidcctlr0, x14 +0x56 0x31 0x11 0xd5 +# CHECK: msr trccidcctlr1, x22 +0x48 0x32 0x11 0xd5 +# CHECK: msr trcvmidcctlr0, x8 +0x4f 0x33 0x11 0xd5 +# CHECK: msr trcvmidcctlr1, x15 +0x81 0x70 0x11 0xd5 +# CHECK: msr trcitctrl, x1 +0xc7 0x78 0x11 0xd5 +# CHECK: msr trcclaimset, x7 +0xdd 0x79 0x11 0xd5 +# CHECK: msr trcclaimclr, x29 + + diff --git a/test/MC/Disassembler/ARM/hex-immediates.txt b/test/MC/Disassembler/ARM/hex-immediates.txt new file mode 100644 index 000000000000..2634d7ed3368 --- /dev/null +++ b/test/MC/Disassembler/ARM/hex-immediates.txt @@ -0,0 +1,5 @@ +# RUN: llvm-mc -triple=thumbv7-apple-darwin -mcpu=cortex-a8 -hdis < %s | FileCheck %s +# CHECK: ldr r4, [pc, #0x20] +0x08 0x4c +# CHECK: sub sp, #0x84 +0xa1 0xb0 diff --git a/test/MC/Disassembler/ARM/invalid-VST1d8Twb_register-thumb.txt b/test/MC/Disassembler/ARM/invalid-VST1d8Twb_register-thumb.txt index 2d2a62811ae9..99da8ce9d85a 100644 --- a/test/MC/Disassembler/ARM/invalid-VST1d8Twb_register-thumb.txt +++ b/test/MC/Disassembler/ARM/invalid-VST1d8Twb_register-thumb.txt @@ -7,7 +7,7 @@ # ------------------------------------------------------------------------------------------------- # # A8.6.391 VST1 (multiple single elements) -# This encoding looks like: vst1.8 {d0,d1,d2}, [r0, :128] +# This encoding looks like: vst1.8 {d0,d1,d2}, [r0:128] # But bits 5-4 for the alignment of 128 encoded as align = 0b10, is available only if <list> # contains two or four registers. rdar://11220250 0x00 0xf9 0x2f 0x06 diff --git a/test/MC/Disassembler/ARM/neon-tests.txt b/test/MC/Disassembler/ARM/neon-tests.txt index a7b6b1ccb408..65e9954ac68b 100644 --- a/test/MC/Disassembler/ARM/neon-tests.txt +++ b/test/MC/Disassembler/ARM/neon-tests.txt @@ -21,10 +21,10 @@ # CHECK: vld4.8 {d4, d6, d8, d10}, [r2] 0x0f 0x41 0x22 0xf4 -# CHECK: vld1.32 {d3[], d4[]}, [r0, :32]! +# CHECK: vld1.32 {d3[], d4[]}, [r0:32]! 0xbd 0x3c 0xa0 0xf4 -# CHECK: vld4.16 {d3[], d5[], d7[], d9[]}, [r0, :64]! +# CHECK: vld4.16 {d3[], d5[], d7[], d9[]}, [r0:64]! 0x7d 0x3f 0xa0 0xf4 # CHECK: vorr d0, d15, d15 @@ -75,7 +75,7 @@ # CHECK: vbic.i32 q2, #0xa900 0x79 0x43 0x82 0xf3 -# CHECK: vst2.32 {d16, d18}, [r2, :64], r2 +# CHECK: vst2.32 {d16, d18}, [r2:64], r2 0x92 0x9 0x42 0xf4 # CHECK: vmov.s8 r0, d8[1] diff --git a/test/MC/Disassembler/ARM/neon.txt b/test/MC/Disassembler/ARM/neon.txt index 649424af22fd..cd5f418b56c0 100644 --- a/test/MC/Disassembler/ARM/neon.txt +++ b/test/MC/Disassembler/ARM/neon.txt @@ -1638,7 +1638,7 @@ 0x1f 0x07 0x60 0xf4 -# CHECK: vld1.8 {d16}, [r0, :64] +# CHECK: vld1.8 {d16}, [r0:64] 0x4f 0x07 0x60 0xf4 # CHECK: vld1.16 {d16}, [r0] 0x8f 0x07 0x60 0xf4 @@ -1646,37 +1646,37 @@ 0xcf 0x07 0x60 0xf4 # CHECK: vld1.64 {d16}, [r0] 0x1f 0x0a 0x60 0xf4 -# CHECK: vld1.8 {d16, d17}, [r0, :64] +# CHECK: vld1.8 {d16, d17}, [r0:64] 0x6f 0x0a 0x60 0xf4 -# CHECK: vld1.16 {d16, d17}, [r0, :128] +# CHECK: vld1.16 {d16, d17}, [r0:128] 0x8f 0x0a 0x60 0xf4 # CHECK: vld1.32 {d16, d17}, [r0] 0xcf 0x0a 0x60 0xf4 # CHECK: vld1.64 {d16, d17}, [r0] 0x1f 0x08 0x60 0xf4 -# CHECK: vld2.8 {d16, d17}, [r0, :64] +# CHECK: vld2.8 {d16, d17}, [r0:64] 0x6f 0x08 0x60 0xf4 -# CHECK: vld2.16 {d16, d17}, [r0, :128] +# CHECK: vld2.16 {d16, d17}, [r0:128] 0x8f 0x08 0x60 0xf4 # CHECK: vld2.32 {d16, d17}, [r0] 0x1f 0x03 0x60 0xf4 -# CHECK: vld2.8 {d16, d17, d18, d19}, [r0, :64] +# CHECK: vld2.8 {d16, d17, d18, d19}, [r0:64] 0x6f 0x03 0x60 0xf4 -# CHECK: vld2.16 {d16, d17, d18, d19}, [r0, :128] +# CHECK: vld2.16 {d16, d17, d18, d19}, [r0:128] 0xbf 0x03 0x60 0xf4 -# CHECK: vld2.32 {d16, d17, d18, d19}, [r0, :256] +# CHECK: vld2.32 {d16, d17, d18, d19}, [r0:256] 0x1f 0x04 0x60 0xf4 -# CHECK: vld3.8 {d16, d17, d18}, [r0, :64] +# CHECK: vld3.8 {d16, d17, d18}, [r0:64] 0x4f 0x04 0x60 0xf4 # CHECK: vld3.16 {d16, d17, d18}, [r0] 0x8f 0x04 0x60 0xf4 # CHECK: vld3.32 {d16, d17, d18}, [r0] 0x1d 0x05 0x60 0xf4 -# CHECK: vld3.8 {d16, d18, d20}, [r0, :64]! +# CHECK: vld3.8 {d16, d18, d20}, [r0:64]! 0x1d 0x15 0x60 0xf4 -# CHECK: vld3.8 {d17, d19, d21}, [r0, :64]! +# CHECK: vld3.8 {d17, d19, d21}, [r0:64]! 0x4d 0x05 0x60 0xf4 # CHECK: vld3.16 {d16, d18, d20}, [r0]! 0x4d 0x15 0x60 0xf4 @@ -1687,15 +1687,15 @@ # CHECK: vld3.32 {d17, d19, d21}, [r0]! 0x1f 0x00 0x60 0xf4 -# CHECK: vld4.8 {d16, d17, d18, d19}, [r0, :64] +# CHECK: vld4.8 {d16, d17, d18, d19}, [r0:64] 0x6f 0x00 0x60 0xf4 -# CHECK: vld4.16 {d16, d17, d18, d19}, [r0, :128] +# CHECK: vld4.16 {d16, d17, d18, d19}, [r0:128] 0xbf 0x00 0x60 0xf4 -# CHECK: vld4.32 {d16, d17, d18, d19}, [r0, :256] +# CHECK: vld4.32 {d16, d17, d18, d19}, [r0:256] 0x3d 0x01 0x60 0xf4 -# CHECK: vld4.8 {d16, d18, d20, d22}, [r0, :256]! +# CHECK: vld4.8 {d16, d18, d20, d22}, [r0:256]! 0x3d 0x11 0x60 0xf4 -# CHECK: vld4.8 {d17, d19, d21, d23}, [r0, :256]! +# CHECK: vld4.8 {d17, d19, d21, d23}, [r0:256]! 0x4d 0x01 0x60 0xf4 # CHECK: vld4.16 {d16, d18, d20, d22}, [r0]! 0x4d 0x11 0x60 0xf4 @@ -1708,20 +1708,20 @@ 0x6f 0x00 0xe0 0xf4 # CHECK: vld1.8 {d16[3]}, [r0] 0x9f 0x04 0xe0 0xf4 -# CHECK: vld1.16 {d16[2]}, [r0, :16] +# CHECK: vld1.16 {d16[2]}, [r0:16] 0xbf 0x08 0xe0 0xf4 -# CHECK: vld1.32 {d16[1]}, [r0, :32] +# CHECK: vld1.32 {d16[1]}, [r0:32] 0x3f 0x01 0xe0 0xf4 -# CHECK: vld2.8 {d16[1], d17[1]}, [r0, :16] +# CHECK: vld2.8 {d16[1], d17[1]}, [r0:16] 0x5f 0x05 0xe0 0xf4 -# CHECK: vld2.16 {d16[1], d17[1]}, [r0, :32] +# CHECK: vld2.16 {d16[1], d17[1]}, [r0:32] 0x8f 0x09 0xe0 0xf4 # CHECK: vld2.32 {d16[1], d17[1]}, [r0] 0x6f 0x15 0xe0 0xf4 # CHECK: vld2.16 {d17[1], d19[1]}, [r0] 0x5f 0x19 0xe0 0xf4 -# CHECK: vld2.32 {d17[0], d19[0]}, [r0, :64] +# CHECK: vld2.32 {d17[0], d19[0]}, [r0:64] 0x2f 0x02 0xe0 0xf4 # CHECK: vld3.8 {d16[1], d17[1], d18[1]}, [r0] @@ -1754,44 +1754,44 @@ 0xa5 0x0e 0xa4 0xf4 0x3f 0x03 0xe0 0xf4 -# CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] +# CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] 0x4f 0x07 0xe0 0xf4 # CHECK: vld4.16 {d16[1], d17[1], d18[1], d19[1]}, [r0] 0xaf 0x0b 0xe0 0xf4 -# CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] +# CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] 0x7f 0x07 0xe0 0xf4 -# CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r0, :64] +# CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r0:64] 0x4f 0x1b 0xe0 0xf4 # CHECK: vld4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] 0x0f 0x0f 0xa4 0xf4 # CHECK: vld4.8 {d0[], d1[], d2[], d3[]}, [r4] 0x3f 0x0f 0xa4 0xf4 -# CHECK: vld4.8 {d0[], d2[], d4[], d6[]}, [r4, :32] +# CHECK: vld4.8 {d0[], d2[], d4[], d6[]}, [r4:32] 0x1d 0x0f 0xa4 0xf4 -# CHECK: vld4.8 {d0[], d1[], d2[], d3[]}, [r4, :32]! +# CHECK: vld4.8 {d0[], d1[], d2[], d3[]}, [r4:32]! 0x35 0x0f 0xa4 0xf4 -# CHECK: vld4.8 {d0[], d2[], d4[], d6[]}, [r4, :32], r5 +# CHECK: vld4.8 {d0[], d2[], d4[], d6[]}, [r4:32], r5 0x4f 0x0f 0xa4 0xf4 # CHECK: vld4.16 {d0[], d1[], d2[], d3[]}, [r4] 0x7f 0x0f 0xa4 0xf4 -# CHECK: vld4.16 {d0[], d2[], d4[], d6[]}, [r4, :64] +# CHECK: vld4.16 {d0[], d2[], d4[], d6[]}, [r4:64] 0x5d 0x0f 0xa4 0xf4 -# CHECK: vld4.16 {d0[], d1[], d2[], d3[]}, [r4, :64]! +# CHECK: vld4.16 {d0[], d1[], d2[], d3[]}, [r4:64]! 0x75 0x0f 0xa4 0xf4 -# CHECK: vld4.16 {d0[], d2[], d4[], d6[]}, [r4, :64], r5 +# CHECK: vld4.16 {d0[], d2[], d4[], d6[]}, [r4:64], r5 0x8f 0x0f 0xa4 0xf4 # CHECK: vld4.32 {d0[], d1[], d2[], d3[]}, [r4] 0xbf 0x0f 0xa4 0xf4 -# CHECK: vld4.32 {d0[], d2[], d4[], d6[]}, [r4, :64] +# CHECK: vld4.32 {d0[], d2[], d4[], d6[]}, [r4:64] 0xdd 0x0f 0xa4 0xf4 -# CHECK: vld4.32 {d0[], d1[], d2[], d3[]}, [r4, :128]! +# CHECK: vld4.32 {d0[], d1[], d2[], d3[]}, [r4:128]! 0xf5 0x0f 0xa4 0xf4 -# CHECK: vld4.32 {d0[], d2[], d4[], d6[]}, [r4, :128], r5 +# CHECK: vld4.32 {d0[], d2[], d4[], d6[]}, [r4:128], r5 0x1f 0x07 0x40 0xf4 -# CHECK: vst1.8 {d16}, [r0, :64] +# CHECK: vst1.8 {d16}, [r0:64] 0x4f 0x07 0x40 0xf4 # CHECK: vst1.16 {d16}, [r0] 0x8f 0x07 0x40 0xf4 @@ -1799,37 +1799,37 @@ 0xcf 0x07 0x40 0xf4 # CHECK: vst1.64 {d16}, [r0] 0x1f 0x0a 0x40 0xf4 -# CHECK: vst1.8 {d16, d17}, [r0, :64] +# CHECK: vst1.8 {d16, d17}, [r0:64] 0x6f 0x0a 0x40 0xf4 -# CHECK: vst1.16 {d16, d17}, [r0, :128] +# CHECK: vst1.16 {d16, d17}, [r0:128] 0x8f 0x0a 0x40 0xf4 # CHECK: vst1.32 {d16, d17}, [r0] 0xcf 0x0a 0x40 0xf4 # CHECK: vst1.64 {d16, d17}, [r0] 0x1f 0x08 0x40 0xf4 -# CHECK: vst2.8 {d16, d17}, [r0, :64] +# CHECK: vst2.8 {d16, d17}, [r0:64] 0x6f 0x08 0x40 0xf4 -# CHECK: vst2.16 {d16, d17}, [r0, :128] +# CHECK: vst2.16 {d16, d17}, [r0:128] 0x8f 0x08 0x40 0xf4 # CHECK: vst2.32 {d16, d17}, [r0] 0x1f 0x03 0x40 0xf4 -# CHECK: vst2.8 {d16, d17, d18, d19}, [r0, :64] +# CHECK: vst2.8 {d16, d17, d18, d19}, [r0:64] 0x6f 0x03 0x40 0xf4 -# CHECK: vst2.16 {d16, d17, d18, d19}, [r0, :128] +# CHECK: vst2.16 {d16, d17, d18, d19}, [r0:128] 0xbf 0x03 0x40 0xf4 -# CHECK: vst2.32 {d16, d17, d18, d19}, [r0, :256] +# CHECK: vst2.32 {d16, d17, d18, d19}, [r0:256] 0x1f 0x04 0x40 0xf4 -# CHECK: vst3.8 {d16, d17, d18}, [r0, :64] +# CHECK: vst3.8 {d16, d17, d18}, [r0:64] 0x4f 0x04 0x40 0xf4 # CHECK: vst3.16 {d16, d17, d18}, [r0] 0x8f 0x04 0x40 0xf4 # CHECK: vst3.32 {d16, d17, d18}, [r0] 0x1d 0x05 0x40 0xf4 -# CHECK: vst3.8 {d16, d18, d20}, [r0, :64]! +# CHECK: vst3.8 {d16, d18, d20}, [r0:64]! 0x1d 0x15 0x40 0xf4 -# CHECK: vst3.8 {d17, d19, d21}, [r0, :64]! +# CHECK: vst3.8 {d17, d19, d21}, [r0:64]! 0x4d 0x05 0x40 0xf4 # CHECK: vst3.16 {d16, d18, d20}, [r0]! 0x4d 0x15 0x40 0xf4 @@ -1840,13 +1840,13 @@ # CHECK: vst3.32 {d17, d19, d21}, [r0]! 0x1f 0x00 0x40 0xf4 -# CHECK: vst4.8 {d16, d17, d18, d19}, [r0, :64] +# CHECK: vst4.8 {d16, d17, d18, d19}, [r0:64] 0x6f 0x00 0x40 0xf4 -# CHECK: vst4.16 {d16, d17, d18, d19}, [r0, :128] +# CHECK: vst4.16 {d16, d17, d18, d19}, [r0:128] 0x3d 0x01 0x40 0xf4 -# CHECK: vst4.8 {d16, d18, d20, d22}, [r0, :256]! +# CHECK: vst4.8 {d16, d18, d20, d22}, [r0:256]! 0x3d 0x11 0x40 0xf4 -# CHECK: vst4.8 {d17, d19, d21, d23}, [r0, :256]! +# CHECK: vst4.8 {d17, d19, d21, d23}, [r0:256]! 0x4d 0x01 0x40 0xf4 # CHECK: vst4.16 {d16, d18, d20, d22}, [r0]! 0x4d 0x11 0x40 0xf4 @@ -1857,15 +1857,15 @@ # CHECK: vst4.32 {d17, d19, d21, d23}, [r0]! 0x3f 0x01 0xc0 0xf4 -# CHECK: vst2.8 {d16[1], d17[1]}, [r0, :16] +# CHECK: vst2.8 {d16[1], d17[1]}, [r0:16] 0x5f 0x05 0xc0 0xf4 -# CHECK: vst2.16 {d16[1], d17[1]}, [r0, :32] +# CHECK: vst2.16 {d16[1], d17[1]}, [r0:32] 0x8f 0x09 0xc0 0xf4 # CHECK: vst2.32 {d16[1], d17[1]}, [r0] 0x6f 0x15 0xc0 0xf4 # CHECK: vst2.16 {d17[1], d19[1]}, [r0] 0x5f 0x19 0xc0 0xf4 -# CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64] +# CHECK: vst2.32 {d17[0], d19[0]}, [r0:64] 0x2f 0x02 0xc0 0xf4 # CHECK: vst3.8 {d16[1], d17[1], d18[1]}, [r0] @@ -1879,13 +1879,13 @@ # CHECK: vst3.32 {d16[0], d18[0], d20[0]}, [r0] 0x3f 0x03 0xc0 0xf4 -# CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] +# CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] 0x4f 0x07 0xc0 0xf4 # CHECK: vst4.16 {d16[1], d17[1], d18[1], d19[1]}, [r0] 0xaf 0x0b 0xc0 0xf4 -# CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] +# CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] 0xff 0x17 0xc0 0xf4 -# CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0, :64] +# CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0:64] 0x4f 0x1b 0xc0 0xf4 # CHECK: vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] @@ -1920,11 +1920,11 @@ # CHECK: vcvttmi.f32.f16 s2, s19 0x1d 0x76 0x66 0xf4 -# CHECK: vld1.8 {d23, d24, d25}, [r6, :64]! +# CHECK: vld1.8 {d23, d24, d25}, [r6:64]! 0x9d 0x62 0x6f 0xf4 -# CHECK: vld1.32 {d22, d23, d24, d25}, [pc, :64]! +# CHECK: vld1.32 {d22, d23, d24, d25}, [pc:64]! 0x9d 0xaa 0x41 0xf4 -# CHECK: vst1.32 {d26, d27}, [r1, :64]! +# CHECK: vst1.32 {d26, d27}, [r1:64]! 0x10 0x0f 0x83 0xf2 0x50 0x0f 0x83 0xf2 diff --git a/test/MC/Disassembler/ARM/neont-VLD-reencoding.txt b/test/MC/Disassembler/ARM/neont-VLD-reencoding.txt index e53739e73975..650614351fb0 100644 --- a/test/MC/Disassembler/ARM/neont-VLD-reencoding.txt +++ b/test/MC/Disassembler/ARM/neont-VLD-reencoding.txt @@ -28,13 +28,13 @@ 0xa0 0xf9 0xd0 0x04 # CHECK: vld1.16 {d0[0]}, [r0], r0 @ encoding: [0xa0,0xf9,0x00,0x04] -# CHECK: vld1.16 {d0[0]}, [r0, :16], r0 @ encoding: [0xa0,0xf9,0x10,0x04] +# CHECK: vld1.16 {d0[0]}, [r0:16], r0 @ encoding: [0xa0,0xf9,0x10,0x04] # CHECK: vld1.16 {d0[1]}, [r0], r0 @ encoding: [0xa0,0xf9,0x40,0x04] -# CHECK: vld1.16 {d0[1]}, [r0, :16], r0 @ encoding: [0xa0,0xf9,0x50,0x04] +# CHECK: vld1.16 {d0[1]}, [r0:16], r0 @ encoding: [0xa0,0xf9,0x50,0x04] # CHECK: vld1.16 {d0[2]}, [r0], r0 @ encoding: [0xa0,0xf9,0x80,0x04] -# CHECK: vld1.16 {d0[2]}, [r0, :16], r0 @ encoding: [0xa0,0xf9,0x90,0x04] +# CHECK: vld1.16 {d0[2]}, [r0:16], r0 @ encoding: [0xa0,0xf9,0x90,0x04] # CHECK: vld1.16 {d0[3]}, [r0], r0 @ encoding: [0xa0,0xf9,0xc0,0x04] -# CHECK: vld1.16 {d0[3]}, [r0, :16], r0 @ encoding: [0xa0,0xf9,0xd0,0x04] +# CHECK: vld1.16 {d0[3]}, [r0:16], r0 @ encoding: [0xa0,0xf9,0xd0,0x04] 0xa0 0xf9 0x00 0x08 0xa0 0xf9 0x30 0x08 @@ -42,20 +42,20 @@ 0xa0 0xf9 0xb0 0x08 # CHECK: vld1.32 {d0[0]}, [r0], r0 @ encoding: [0xa0,0xf9,0x00,0x08] -# CHECK: vld1.32 {d0[0]}, [r0, :32], r0 @ encoding: [0xa0,0xf9,0x30,0x08] +# CHECK: vld1.32 {d0[0]}, [r0:32], r0 @ encoding: [0xa0,0xf9,0x30,0x08] # CHECK: vld1.32 {d0[1]}, [r0], r0 @ encoding: [0xa0,0xf9,0x80,0x08] -# CHECK: vld1.32 {d0[1]}, [r0, :32], r0 @ encoding: [0xa0,0xf9,0xb0,0x08] +# CHECK: vld1.32 {d0[1]}, [r0:32], r0 @ encoding: [0xa0,0xf9,0xb0,0x08] 0xa0 0xf9 0x1f 0x04 0xa0 0xf9 0x8f 0x00 -# CHECK: vld1.16 {d0[0]}, [r0, :16] @ encoding: [0xa0,0xf9,0x1f,0x04] +# CHECK: vld1.16 {d0[0]}, [r0:16] @ encoding: [0xa0,0xf9,0x1f,0x04] # CHECK: vld1.8 {d0[4]}, [r0] @ encoding: [0xa0,0xf9,0x8f,0x00] 0xa0 0xf9 0x1d 0x04 0xa0 0xf9 0x8d 0x00 -# CHECK: vld1.16 {d0[0]}, [r0, :16]! @ encoding: [0xa0,0xf9,0x1d,0x04] +# CHECK: vld1.16 {d0[0]}, [r0:16]! @ encoding: [0xa0,0xf9,0x1d,0x04] # CHECK: vld1.8 {d0[4]}, [r0]! @ encoding: [0xa0,0xf9,0x8d,0x00] 0xa5 0xf9 0x10 0x04 @@ -63,15 +63,15 @@ 0xae 0xf9 0x1a 0x04 0xa5 0xf9 0x1a 0x94 -# CHECK: vld1.16 {d0[0]}, [r5, :16], r0 @ encoding: [0xa5,0xf9,0x10,0x04] -# CHECK: vld1.16 {d0[0]}, [r5, :16], r10 @ encoding: [0xa5,0xf9,0x1a,0x04] -# CHECK: vld1.16 {d0[0]}, [lr, :16], r10 @ encoding: [0xae,0xf9,0x1a,0x04] -# CHECK: vld1.16 {d9[0]}, [r5, :16], r10 @ encoding: [0xa5,0xf9,0x1a,0x94] +# CHECK: vld1.16 {d0[0]}, [r5:16], r0 @ encoding: [0xa5,0xf9,0x10,0x04] +# CHECK: vld1.16 {d0[0]}, [r5:16], r10 @ encoding: [0xa5,0xf9,0x1a,0x04] +# CHECK: vld1.16 {d0[0]}, [lr:16], r10 @ encoding: [0xae,0xf9,0x1a,0x04] +# CHECK: vld1.16 {d9[0]}, [r5:16], r10 @ encoding: [0xa5,0xf9,0x1a,0x94] 0xa0 0xf9 0x20 0x0b 0xa0 0xf9 0x20 0x07 0xa0 0xf9 0x20 0x03 -# CHECK: vld4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0, :128], r0 @ encoding: [0xa0,0xf9,0x20,0x0b] +# CHECK: vld4.32 {d0[0], d1[0], d2[0], d3[0]}, [r0:128], r0 @ encoding: [0xa0,0xf9,0x20,0x0b] # CHECK: vld4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r0 @ encoding: [0xa0,0xf9,0x20,0x07] # CHECK: vld4.8 {d0[1], d1[1], d2[1], d3[1]}, [r0], r0 @ encoding: [0xa0,0xf9,0x20,0x03] diff --git a/test/MC/Disassembler/ARM/neont-VST-reencoding.txt b/test/MC/Disassembler/ARM/neont-VST-reencoding.txt index eb3722c08531..5119d925d8bf 100644 --- a/test/MC/Disassembler/ARM/neont-VST-reencoding.txt +++ b/test/MC/Disassembler/ARM/neont-VST-reencoding.txt @@ -28,13 +28,13 @@ 0xc9 0xf9 0xd9 0x94 # CHECK: vst1.16 {d0[0]}, [r0], r0 @ encoding: [0x80,0xf9,0x00,0x04] -# CHECK: vst1.16 {d16[0]}, [r3, :16], r3 @ encoding: [0xc3,0xf9,0x13,0x04] +# CHECK: vst1.16 {d16[0]}, [r3:16], r3 @ encoding: [0xc3,0xf9,0x13,0x04] # CHECK: vst1.16 {d16[1]}, [r4], r3 @ encoding: [0xc4,0xf9,0x43,0x04] -# CHECK: vst1.16 {d16[1]}, [r5, :16], r5 @ encoding: [0xc5,0xf9,0x55,0x04] +# CHECK: vst1.16 {d16[1]}, [r5:16], r5 @ encoding: [0xc5,0xf9,0x55,0x04] # CHECK: vst1.16 {d16[2]}, [r6], r5 @ encoding: [0xc6,0xf9,0x85,0x04] -# CHECK: vst1.16 {d23[2]}, [r7, :16], r5 @ encoding: [0xc7,0xf9,0x95,0x74] +# CHECK: vst1.16 {d23[2]}, [r7:16], r5 @ encoding: [0xc7,0xf9,0x95,0x74] # CHECK: vst1.16 {d24[3]}, [r8], r7 @ encoding: [0xc8,0xf9,0xc7,0x84] -# CHECK: vst1.16 {d25[3]}, [r9, :16], r9 @ encoding: [0xc9,0xf9,0xd9,0x94] +# CHECK: vst1.16 {d25[3]}, [r9:16], r9 @ encoding: [0xc9,0xf9,0xd9,0x94] 0x8a 0xf9 0x01 0xa8 0xcb 0xf9 0x32 0x18 @@ -42,20 +42,20 @@ 0xcd 0xf9 0xb4 0x28 # CHECK: vst1.32 {d10[0]}, [r10], r1 @ encoding: [0x8a,0xf9,0x01,0xa8] -# CHECK: vst1.32 {d17[0]}, [r11, :32], r2 @ encoding: [0xcb,0xf9,0x32,0x18] +# CHECK: vst1.32 {d17[0]}, [r11:32], r2 @ encoding: [0xcb,0xf9,0x32,0x18] # CHECK: vst1.32 {d11[1]}, [r12], r3 @ encoding: [0x8c,0xf9,0x83,0xb8] -# CHECK: vst1.32 {d18[1]}, [sp, :32], r4 @ encoding: [0xcd,0xf9,0xb4,0x28] +# CHECK: vst1.32 {d18[1]}, [sp:32], r4 @ encoding: [0xcd,0xf9,0xb4,0x28] 0x81 0xf9 0x1f 0x44 0x82 0xf9 0x8f 0x30 -# CHECK: vst1.16 {d4[0]}, [r1, :16] @ encoding: [0x81,0xf9,0x1f,0x44] +# CHECK: vst1.16 {d4[0]}, [r1:16] @ encoding: [0x81,0xf9,0x1f,0x44] # CHECK: vst1.8 {d3[4]}, [r2] @ encoding: [0x82,0xf9,0x8f,0x30] 0x83 0xf9 0x1d 0x24 0x84 0xf9 0x8d 0x10 -# CHECK: vst1.16 {d2[0]}, [r3, :16]! @ encoding: [0x83,0xf9,0x1d,0x24] +# CHECK: vst1.16 {d2[0]}, [r3:16]! @ encoding: [0x83,0xf9,0x1d,0x24] # CHECK: vst1.8 {d1[4]}, [r4]! @ encoding: [0x84,0xf9,0x8d,0x10] 0x85 0xf9 0x10 0x04 @@ -63,15 +63,15 @@ 0x8e 0xf9 0x1a 0x84 0x85 0xf9 0x1a 0x94 -# CHECK: vst1.16 {d0[0]}, [r5, :16], r0 @ encoding: [0x85,0xf9,0x10,0x04] -# CHECK: vst1.16 {d7[0]}, [r5, :16], r10 @ encoding: [0x85,0xf9,0x1a,0x74] -# CHECK: vst1.16 {d8[0]}, [lr, :16], r10 @ encoding: [0x8e,0xf9,0x1a,0x84] -# CHECK: vst1.16 {d9[0]}, [r5, :16], r10 @ encoding: [0x85,0xf9,0x1a,0x94] +# CHECK: vst1.16 {d0[0]}, [r5:16], r0 @ encoding: [0x85,0xf9,0x10,0x04] +# CHECK: vst1.16 {d7[0]}, [r5:16], r10 @ encoding: [0x85,0xf9,0x1a,0x74] +# CHECK: vst1.16 {d8[0]}, [lr:16], r10 @ encoding: [0x8e,0xf9,0x1a,0x84] +# CHECK: vst1.16 {d9[0]}, [r5:16], r10 @ encoding: [0x85,0xf9,0x1a,0x94] 0x81 0xf9 0x24 0x0b 0x82 0xf9 0x25 0x07 0x83 0xf9 0x26 0x03 -# CHECK: vst4.32 {d0[0], d1[0], d2[0], d3[0]}, [r1, :128], r4 @ encoding: [0x81,0xf9,0x24,0x0b] +# CHECK: vst4.32 {d0[0], d1[0], d2[0], d3[0]}, [r1:128], r4 @ encoding: [0x81,0xf9,0x24,0x0b] # CHECK: vst4.16 {d0[0], d2[0], d4[0], d6[0]}, [r2], r5 @ encoding: [0x82,0xf9,0x25,0x07] # CHECK: vst4.8 {d0[1], d1[1], d2[1], d3[1]}, [r3], r6 @ encoding: [0x83,0xf9,0x26,0x03] diff --git a/test/MC/Disassembler/ARM/neont2.txt b/test/MC/Disassembler/ARM/neont2.txt index 7d7010febb5e..337457847213 100644 --- a/test/MC/Disassembler/ARM/neont2.txt +++ b/test/MC/Disassembler/ARM/neont2.txt @@ -1379,7 +1379,7 @@ # CHECK: vtbx.8 d20, {d16, d17, d18, d19}, d21 0x60 0xf9 0x1f 0x07 -# CHECK: vld1.8 {d16}, [r0, :64] +# CHECK: vld1.8 {d16}, [r0:64] 0x60 0xf9 0x4f 0x07 # CHECK: vld1.16 {d16}, [r0] 0x60 0xf9 0x8f 0x07 @@ -1387,37 +1387,37 @@ 0x60 0xf9 0xcf 0x07 # CHECK: vld1.64 {d16}, [r0] 0x60 0xf9 0x1f 0x0a -# CHECK: vld1.8 {d16, d17}, [r0, :64] +# CHECK: vld1.8 {d16, d17}, [r0:64] 0x60 0xf9 0x6f 0x0a -# CHECK: vld1.16 {d16, d17}, [r0, :128] +# CHECK: vld1.16 {d16, d17}, [r0:128] 0x60 0xf9 0x8f 0x0a # CHECK: vld1.32 {d16, d17}, [r0] 0x60 0xf9 0xcf 0x0a # CHECK: vld1.64 {d16, d17}, [r0] 0x60 0xf9 0x1f 0x08 -# CHECK: vld2.8 {d16, d17}, [r0, :64] +# CHECK: vld2.8 {d16, d17}, [r0:64] 0x60 0xf9 0x6f 0x08 -# CHECK: vld2.16 {d16, d17}, [r0, :128] +# CHECK: vld2.16 {d16, d17}, [r0:128] 0x60 0xf9 0x8f 0x08 # CHECK: vld2.32 {d16, d17}, [r0] 0x60 0xf9 0x1f 0x03 -# CHECK: vld2.8 {d16, d17, d18, d19}, [r0, :64] +# CHECK: vld2.8 {d16, d17, d18, d19}, [r0:64] 0x60 0xf9 0x6f 0x03 -# CHECK: vld2.16 {d16, d17, d18, d19}, [r0, :128] +# CHECK: vld2.16 {d16, d17, d18, d19}, [r0:128] 0x60 0xf9 0xbf 0x03 -# CHECK: vld2.32 {d16, d17, d18, d19}, [r0, :256] +# CHECK: vld2.32 {d16, d17, d18, d19}, [r0:256] 0x60 0xf9 0x1f 0x04 -# CHECK: vld3.8 {d16, d17, d18}, [r0, :64] +# CHECK: vld3.8 {d16, d17, d18}, [r0:64] 0x60 0xf9 0x4f 0x04 # CHECK: vld3.16 {d16, d17, d18}, [r0] 0x60 0xf9 0x8f 0x04 # CHECK: vld3.32 {d16, d17, d18}, [r0] 0x60 0xf9 0x1d 0x05 -# CHECK: vld3.8 {d16, d18, d20}, [r0, :64]! +# CHECK: vld3.8 {d16, d18, d20}, [r0:64]! 0x60 0xf9 0x1d 0x15 -# CHECK: vld3.8 {d17, d19, d21}, [r0, :64]! +# CHECK: vld3.8 {d17, d19, d21}, [r0:64]! 0x60 0xf9 0x4d 0x05 # CHECK: vld3.16 {d16, d18, d20}, [r0]! 0x60 0xf9 0x4d 0x15 @@ -1428,15 +1428,15 @@ # CHECK: vld3.32 {d17, d19, d21}, [r0]! 0x60 0xf9 0x1f 0x00 -# CHECK: vld4.8 {d16, d17, d18, d19}, [r0, :64] +# CHECK: vld4.8 {d16, d17, d18, d19}, [r0:64] 0x60 0xf9 0x6f 0x00 -# CHECK: vld4.16 {d16, d17, d18, d19}, [r0, :128] +# CHECK: vld4.16 {d16, d17, d18, d19}, [r0:128] 0x60 0xf9 0xbf 0x00 -# CHECK: vld4.32 {d16, d17, d18, d19}, [r0, :256] +# CHECK: vld4.32 {d16, d17, d18, d19}, [r0:256] 0x60 0xf9 0x3d 0x01 -# CHECK: vld4.8 {d16, d18, d20, d22}, [r0, :256]! +# CHECK: vld4.8 {d16, d18, d20, d22}, [r0:256]! 0x60 0xf9 0x3d 0x11 -# CHECK: vld4.8 {d17, d19, d21, d23}, [r0, :256]! +# CHECK: vld4.8 {d17, d19, d21, d23}, [r0:256]! 0x60 0xf9 0x4d 0x01 # CHECK: vld4.16 {d16, d18, d20, d22}, [r0]! 0x60 0xf9 0x4d 0x11 @@ -1449,20 +1449,20 @@ 0xe0 0xf9 0x6f 0x00 # CHECK: vld1.8 {d16[3]}, [r0] 0xe0 0xf9 0x9f 0x04 -# CHECK: vld1.16 {d16[2]}, [r0, :16] +# CHECK: vld1.16 {d16[2]}, [r0:16] 0xe0 0xf9 0xbf 0x08 -# CHECK: vld1.32 {d16[1]}, [r0, :32] +# CHECK: vld1.32 {d16[1]}, [r0:32] 0xe0 0xf9 0x3f 0x01 -# CHECK: vld2.8 {d16[1], d17[1]}, [r0, :16] +# CHECK: vld2.8 {d16[1], d17[1]}, [r0:16] 0xe0 0xf9 0x5f 0x05 -# CHECK: vld2.16 {d16[1], d17[1]}, [r0, :32] +# CHECK: vld2.16 {d16[1], d17[1]}, [r0:32] 0xe0 0xf9 0x8f 0x09 # CHECK: vld2.32 {d16[1], d17[1]}, [r0] 0xe0 0xf9 0x6f 0x15 # CHECK: vld2.16 {d17[1], d19[1]}, [r0] 0xe0 0xf9 0x5f 0x19 -# CHECK: vld2.32 {d17[0], d19[0]}, [r0, :64] +# CHECK: vld2.32 {d17[0], d19[0]}, [r0:64] 0xe0 0xf9 0x2f 0x02 # CHECK: vld3.8 {d16[1], d17[1], d18[1]}, [r0] @@ -1495,43 +1495,43 @@ # CHECK: vld3.32 {d0[], d2[], d4[]}, [r4], r5 0xe0 0xf9 0x3f 0x03 -# CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] +# CHECK: vld4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] 0xe0 0xf9 0x4f 0x07 # CHECK: vld4.16 {d16[1], d17[1], d18[1], d19[1]}, [r0] 0xe0 0xf9 0xaf 0x0b -# CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] +# CHECK: vld4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] 0xe0 0xf9 0x7f 0x07 -# CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r0, :64] +# CHECK: vld4.16 {d16[1], d18[1], d20[1], d22[1]}, [r0:64] 0xe0 0xf9 0x4f 0x1b # CHECK: vld4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] 0xa4 0xf9 0x0f 0x0f # CHECK: vld4.8 {d0[], d1[], d2[], d3[]}, [r4] 0xa4 0xf9 0x3f 0x0f -# CHECK: vld4.8 {d0[], d2[], d4[], d6[]}, [r4, :32] +# CHECK: vld4.8 {d0[], d2[], d4[], d6[]}, [r4:32] 0xa4 0xf9 0x1d 0x0f -# CHECK: vld4.8 {d0[], d1[], d2[], d3[]}, [r4, :32]! +# CHECK: vld4.8 {d0[], d1[], d2[], d3[]}, [r4:32]! 0xa4 0xf9 0x35 0x0f -# CHECK: vld4.8 {d0[], d2[], d4[], d6[]}, [r4, :32], r5 +# CHECK: vld4.8 {d0[], d2[], d4[], d6[]}, [r4:32], r5 0xa4 0xf9 0x4f 0x0f # CHECK: vld4.16 {d0[], d1[], d2[], d3[]}, [r4] 0xa4 0xf9 0x7f 0x0f -# CHECK: vld4.16 {d0[], d2[], d4[], d6[]}, [r4, :64] +# CHECK: vld4.16 {d0[], d2[], d4[], d6[]}, [r4:64] 0xa4 0xf9 0x5d 0x0f -# CHECK: vld4.16 {d0[], d1[], d2[], d3[]}, [r4, :64]! +# CHECK: vld4.16 {d0[], d1[], d2[], d3[]}, [r4:64]! 0xa4 0xf9 0x75 0x0f -# CHECK: vld4.16 {d0[], d2[], d4[], d6[]}, [r4, :64], r5 +# CHECK: vld4.16 {d0[], d2[], d4[], d6[]}, [r4:64], r5 0xa4 0xf9 0x8f 0x0f # CHECK: vld4.32 {d0[], d1[], d2[], d3[]}, [r4] 0xa4 0xf9 0xbf 0x0f -# CHECK: vld4.32 {d0[], d2[], d4[], d6[]}, [r4, :64] +# CHECK: vld4.32 {d0[], d2[], d4[], d6[]}, [r4:64] 0xa4 0xf9 0xdd 0x0f -# CHECK: vld4.32 {d0[], d1[], d2[], d3[]}, [r4, :128]! +# CHECK: vld4.32 {d0[], d1[], d2[], d3[]}, [r4:128]! 0xa4 0xf9 0xf5 0x0f -# CHECK: vld4.32 {d0[], d2[], d4[], d6[]}, [r4, :128], r5 +# CHECK: vld4.32 {d0[], d2[], d4[], d6[]}, [r4:128], r5 0x40 0xf9 0x1f 0x07 -# CHECK: vst1.8 {d16}, [r0, :64] +# CHECK: vst1.8 {d16}, [r0:64] 0x40 0xf9 0x4f 0x07 # CHECK: vst1.16 {d16}, [r0] 0x40 0xf9 0x8f 0x07 @@ -1539,37 +1539,37 @@ 0x40 0xf9 0xcf 0x07 # CHECK: vst1.64 {d16}, [r0] 0x40 0xf9 0x1f 0x0a -# CHECK: vst1.8 {d16, d17}, [r0, :64] +# CHECK: vst1.8 {d16, d17}, [r0:64] 0x40 0xf9 0x6f 0x0a -# CHECK: vst1.16 {d16, d17}, [r0, :128] +# CHECK: vst1.16 {d16, d17}, [r0:128] 0x40 0xf9 0x8f 0x0a # CHECK: vst1.32 {d16, d17}, [r0] 0x40 0xf9 0xcf 0x0a # CHECK: vst1.64 {d16, d17}, [r0] 0x40 0xf9 0x1f 0x08 -# CHECK: vst2.8 {d16, d17}, [r0, :64] +# CHECK: vst2.8 {d16, d17}, [r0:64] 0x40 0xf9 0x6f 0x08 -# CHECK: vst2.16 {d16, d17}, [r0, :128] +# CHECK: vst2.16 {d16, d17}, [r0:128] 0x40 0xf9 0x8f 0x08 # CHECK: vst2.32 {d16, d17}, [r0] 0x40 0xf9 0x1f 0x03 -# CHECK: vst2.8 {d16, d17, d18, d19}, [r0, :64] +# CHECK: vst2.8 {d16, d17, d18, d19}, [r0:64] 0x40 0xf9 0x6f 0x03 -# CHECK: vst2.16 {d16, d17, d18, d19}, [r0, :128] +# CHECK: vst2.16 {d16, d17, d18, d19}, [r0:128] 0x40 0xf9 0xbf 0x03 -# CHECK: vst2.32 {d16, d17, d18, d19}, [r0, :256] +# CHECK: vst2.32 {d16, d17, d18, d19}, [r0:256] 0x40 0xf9 0x1f 0x04 -# CHECK: vst3.8 {d16, d17, d18}, [r0, :64] +# CHECK: vst3.8 {d16, d17, d18}, [r0:64] 0x40 0xf9 0x4f 0x04 # CHECK: vst3.16 {d16, d17, d18}, [r0] 0x40 0xf9 0x8f 0x04 # CHECK: vst3.32 {d16, d17, d18}, [r0] 0x40 0xf9 0x1d 0x05 -# CHECK: vst3.8 {d16, d18, d20}, [r0, :64]! +# CHECK: vst3.8 {d16, d18, d20}, [r0:64]! 0x40 0xf9 0x1d 0x15 -# CHECK: vst3.8 {d17, d19, d21}, [r0, :64]! +# CHECK: vst3.8 {d17, d19, d21}, [r0:64]! 0x40 0xf9 0x4d 0x05 # CHECK: vst3.16 {d16, d18, d20}, [r0]! 0x40 0xf9 0x4d 0x15 @@ -1580,13 +1580,13 @@ # CHECK: vst3.32 {d17, d19, d21}, [r0]! 0x40 0xf9 0x1f 0x00 -# CHECK: vst4.8 {d16, d17, d18, d19}, [r0, :64] +# CHECK: vst4.8 {d16, d17, d18, d19}, [r0:64] 0x40 0xf9 0x6f 0x00 -# CHECK: vst4.16 {d16, d17, d18, d19}, [r0, :128] +# CHECK: vst4.16 {d16, d17, d18, d19}, [r0:128] 0x40 0xf9 0x3d 0x01 -# CHECK: vst4.8 {d16, d18, d20, d22}, [r0, :256]! +# CHECK: vst4.8 {d16, d18, d20, d22}, [r0:256]! 0x40 0xf9 0x3d 0x11 -# CHECK: vst4.8 {d17, d19, d21, d23}, [r0, :256]! +# CHECK: vst4.8 {d17, d19, d21, d23}, [r0:256]! 0x40 0xf9 0x4d 0x01 # CHECK: vst4.16 {d16, d18, d20, d22}, [r0]! 0x40 0xf9 0x4d 0x11 @@ -1597,15 +1597,15 @@ # CHECK: vst4.32 {d17, d19, d21, d23}, [r0]! 0xc0 0xf9 0x3f 0x01 -# CHECK: vst2.8 {d16[1], d17[1]}, [r0, :16] +# CHECK: vst2.8 {d16[1], d17[1]}, [r0:16] 0xc0 0xf9 0x5f 0x05 -# CHECK: vst2.16 {d16[1], d17[1]}, [r0, :32] +# CHECK: vst2.16 {d16[1], d17[1]}, [r0:32] 0xc0 0xf9 0x8f 0x09 # CHECK: vst2.32 {d16[1], d17[1]}, [r0] 0xc0 0xf9 0x6f 0x15 # CHECK: vst2.16 {d17[1], d19[1]}, [r0] 0xc0 0xf9 0x5f 0x19 -# CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64] +# CHECK: vst2.32 {d17[0], d19[0]}, [r0:64] 0xc0 0xf9 0x2f 0x02 # CHECK: vst3.8 {d16[1], d17[1], d18[1]}, [r0] @@ -1619,26 +1619,26 @@ # CHECK: vst3.32 {d16[0], d18[0], d20[0]}, [r0] 0xc0 0xf9 0x3f 0x03 -# CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32] +# CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] 0xc0 0xf9 0x4f 0x07 # CHECK: vst4.16 {d16[1], d17[1], d18[1], d19[1]}, [r0] 0xc0 0xf9 0xaf 0x0b -# CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128] +# CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] 0xc0 0xf9 0xff 0x17 -# CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0, :64] +# CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0:64] 0xc0 0xf9 0x4f 0x1b # CHECK: vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] 0x63 0xf9 0x37 0xc9 -# CHECK: vld2.8 {d28, d30}, [r3, :256], r7 +# CHECK: vld2.8 {d28, d30}, [r3:256], r7 # rdar://10798451 0xe7 0xf9 0x32 0x1d -# CHECK vld2.8 {d17[], d19[]}, [r7, :16], r2 +# CHECK vld2.8 {d17[], d19[]}, [r7:16], r2 0xe7 0xf9 0x3d 0x1d -# CHECK vld2.8 {d17[], d19[]}, [r7, :16]! +# CHECK vld2.8 {d17[], d19[]}, [r7:16]! 0xe7 0xf9 0x3f 0x1d -# CHECK vld2.8 {d17[], d19[]}, [r7, :16] +# CHECK vld2.8 {d17[], d19[]}, [r7:16] # rdar://11034702 0x04 0xf9 0x0d 0x87 @@ -2046,9 +2046,9 @@ # rdar://10798451 0xe7 0xf9 0x32 0x1d -# CHECK: vld2.8 {d17[], d19[]}, [r7, :16], r2 +# CHECK: vld2.8 {d17[], d19[]}, [r7:16], r2 0xe7 0xf9 0x3d 0x1d -# CHECK: vld2.8 {d17[], d19[]}, [r7, :16]! +# CHECK: vld2.8 {d17[], d19[]}, [r7:16]! 0xe7 0xf9 0x3f 0x1d -# CHECK: vld2.8 {d17[], d19[]}, [r7, :16] +# CHECK: vld2.8 {d17[], d19[]}, [r7:16] diff --git a/test/MC/Disassembler/ARM/thumb2.txt b/test/MC/Disassembler/ARM/thumb2.txt index 45dace3b09c5..31f75b39fa9c 100644 --- a/test/MC/Disassembler/ARM/thumb2.txt +++ b/test/MC/Disassembler/ARM/thumb2.txt @@ -254,9 +254,12 @@ #------------------------------------------------------------------------------ # CHECK: cbnz r7, #6 # CHECK: cbnz r7, #12 +# CHECK: cbz r4, #64 0x1f 0xb9 0x37 0xb9 +0x04 0xb3 + #------------------------------------------------------------------------------ # CDP/CDP2 @@ -554,6 +557,7 @@ # CHECK: ldr.w r8, [r8, r2, lsl #2] # CHECK: ldr.w r7, [sp, r2, lsl #1] # CHECK: ldr.w r7, [sp, r2] +# CHECK: ldr pc, [sp], #12 # CHECK: ldr r2, [r4, #255]! # CHECK: ldr r8, [sp, #4]! # CHECK: ldr lr, [sp, #-4]! @@ -567,6 +571,7 @@ 0x58 0xf8 0x22 0x80 0x5d 0xf8 0x12 0x70 0x5d 0xf8 0x02 0x70 +0x5d 0xf8 0x0c 0xfb 0x54 0xf8 0xff 0x2f 0x5d 0xf8 0x04 0x8f 0x5d 0xf8 0x04 0xed diff --git a/test/MC/Disassembler/ARM/unpredictable-BFI.txt b/test/MC/Disassembler/ARM/unpredictable-BFI.txt new file mode 100644 index 000000000000..a98f859c4c66 --- /dev/null +++ b/test/MC/Disassembler/ARM/unpredictable-BFI.txt @@ -0,0 +1,11 @@ +# RUN: llvm-mc --disassemble %s -triple=arm-apple-darwin9 2>&1 | FileCheck %s + +# rdar://11437956 + +# CHECK: warning: invalid instruction encoding +# CHECK: 0x90 0x00 0xc0 0xe7 +0x90 0x00 0xc0 0xe7 + +# CHECK: warning: invalid instruction encoding +# CHECK: 0x90 0x01 0xc0 0xe7 +0x90 0x01 0xc0 0xe7 diff --git a/test/MC/Disassembler/Mips/mips32.txt b/test/MC/Disassembler/Mips/mips32.txt index a1933190b141..70224860bc71 100644 --- a/test/MC/Disassembler/Mips/mips32.txt +++ b/test/MC/Disassembler/Mips/mips32.txt @@ -404,3 +404,9 @@ # CHECK: xori $9, $6, 17767 0x38 0xc9 0x45 0x67 + +# CHECK: .set push +# CHECK: .set mips32r2 +# CHECK: rdhwr $5, $29 +# CHECK: .set pop +0x7c 0x05 0xe8 0x3b diff --git a/test/MC/Disassembler/Mips/mips32_le.txt b/test/MC/Disassembler/Mips/mips32_le.txt index 08b36726baf3..48fa8e2c7fac 100644 --- a/test/MC/Disassembler/Mips/mips32_le.txt +++ b/test/MC/Disassembler/Mips/mips32_le.txt @@ -404,3 +404,9 @@ # CHECK: xori $9, $6, 17767 0x67 0x45 0xc9 0x38 + +# CHECK: .set push +# CHECK: .set mips32r2 +# CHECK: rdhwr $5, $29 +# CHECK: .set pop +0x3b 0xe8 0x05 0x7c diff --git a/test/MC/Disassembler/Mips/mips64.txt b/test/MC/Disassembler/Mips/mips64.txt index 0a88c40839fa..38b137766125 100644 --- a/test/MC/Disassembler/Mips/mips64.txt +++ b/test/MC/Disassembler/Mips/mips64.txt @@ -1,67 +1,67 @@ -# RUN: llvm-mc --disassemble %s -triple=mips64-unknown-linux | FileCheck %s
-# CHECK: .section __TEXT,__text,regular,pure_instructions
-# CHECK: daddiu $11, $26, 31949
-0x67 0x4b 0x7c 0xcd
-
-# CHECK: daddu $26, $1, $11
-0x00 0x2b 0xd0 0x2d
-
-# CHECK: ddiv $zero, $26, $22
-0x03 0x56 0x00 0x1e
-
-# CHECK: ddivu $zero, $9, $24
-0x01 0x38 0x00 0x1f
-
-# CHECK: dmfc1 $2, $f14
-0x44 0x22 0x70 0x00
-
-# CHECK: dmtc1 $23, $f5
-0x44 0xb7 0x28 0x00
-
-# CHECK: dmult $11, $26
-0x01 0x7a 0x00 0x1c
-
-# CHECK: dmultu $23, $13
-0x02 0xed 0x00 0x1d
-
-# CHECK: dsll $3, $24, 17
-0x00 0x18 0x1c 0x78
-
-# CHECK: dsllv $gp, $27, $24
-0x03 0x1b 0xe0 0x14
-
-# CHECK: dsra $1, $1, 30
-0x00 0x01 0x0f 0xbb
-
-# CHECK: dsrav $1, $1, $fp
-0x03 0xc1 0x08 0x17
-
-# CHECK: dsrl $10, $gp, 24
-0x00 0x1c 0x56 0x3a
-
-# CHECK: dsrlv $gp, $10, $23
-0x02 0xea 0xe0 0x16
-
-# CHECK: dsubu $gp, $27, $24
-0x03 0x78 0xe0 0x2f
-
-# CHECK: lw $27, -15155($1)
-0x8c 0x3b 0xc4 0xcd
-
-# CHECK: lui $1, 1
-0x3c 0x01 0x00 0x01
-
-# CHECK: lwu $3, -1746($3)
-0x9c 0x63 0xf9 0x2e
-
-# CHECK: lui $ra, 1
-0x3c 0x1f 0x00 0x01
-
-# CHECK: sw $26, -15159($1)
-0xac 0x3a 0xc4 0xc9
-
-# CHECK: ld $26, 3958($zero)
-0xdc 0x1a 0x0f 0x76
-
-# CHECK: sd $6, 17767($zero)
-0xfc 0x06 0x45 0x67
+# RUN: llvm-mc --disassemble %s -triple=mips64-unknown-linux | FileCheck %s +# CHECK: .section __TEXT,__text,regular,pure_instructions +# CHECK: daddiu $11, $26, 31949 +0x67 0x4b 0x7c 0xcd + +# CHECK: daddu $26, $1, $11 +0x00 0x2b 0xd0 0x2d + +# CHECK: ddiv $zero, $26, $22 +0x03 0x56 0x00 0x1e + +# CHECK: ddivu $zero, $9, $24 +0x01 0x38 0x00 0x1f + +# CHECK: dmfc1 $2, $f14 +0x44 0x22 0x70 0x00 + +# CHECK: dmtc1 $23, $f5 +0x44 0xb7 0x28 0x00 + +# CHECK: dmult $11, $26 +0x01 0x7a 0x00 0x1c + +# CHECK: dmultu $23, $13 +0x02 0xed 0x00 0x1d + +# CHECK: dsll $3, $24, 17 +0x00 0x18 0x1c 0x78 + +# CHECK: dsllv $gp, $27, $24 +0x03 0x1b 0xe0 0x14 + +# CHECK: dsra $1, $1, 30 +0x00 0x01 0x0f 0xbb + +# CHECK: dsrav $1, $1, $fp +0x03 0xc1 0x08 0x17 + +# CHECK: dsrl $10, $gp, 24 +0x00 0x1c 0x56 0x3a + +# CHECK: dsrlv $gp, $10, $23 +0x02 0xea 0xe0 0x16 + +# CHECK: dsubu $gp, $27, $24 +0x03 0x78 0xe0 0x2f + +# CHECK: lw $27, -15155($1) +0x8c 0x3b 0xc4 0xcd + +# CHECK: lui $1, 1 +0x3c 0x01 0x00 0x01 + +# CHECK: lwu $3, -1746($3) +0x9c 0x63 0xf9 0x2e + +# CHECK: lui $ra, 1 +0x3c 0x1f 0x00 0x01 + +# CHECK: sw $26, -15159($1) +0xac 0x3a 0xc4 0xc9 + +# CHECK: ld $26, 3958($zero) +0xdc 0x1a 0x0f 0x76 + +# CHECK: sd $6, 17767($zero) +0xfc 0x06 0x45 0x67 diff --git a/test/MC/Disassembler/Mips/mips64_le.txt b/test/MC/Disassembler/Mips/mips64_le.txt index fe8faffa8335..a7ef0e473bbe 100644 --- a/test/MC/Disassembler/Mips/mips64_le.txt +++ b/test/MC/Disassembler/Mips/mips64_le.txt @@ -1,67 +1,67 @@ -# RUN: llvm-mc --disassemble %s -triple=mips64el-unknown-linux | FileCheck %s
-# CHECK: .section __TEXT,__text,regular,pure_instructions
-# CHECK: daddiu $11, $26, 31949
-0xcd 0x7c 0x4b 0x67
-
-# CHECK: daddu $26, $1, $11
-0x2d 0xd0 0x2b 0x00
-
-# CHECK: ddiv $zero, $26, $22
-0x1e 0x00 0x56 0x03
-
-# CHECK: ddivu $zero, $9, $24
-0x1f 0x00 0x38 0x01
-
-# CHECK: dmfc1 $2, $f14
-0x00 0x70 0x22 0x44
-
-# CHECK: dmtc1 $23, $f5
-0x00 0x28 0xb7 0x44
-
-# CHECK: dmult $11, $26
-0x1c 0x00 0x7a 0x01
-
-# CHECK: dmultu $23, $13
-0x1d 0x00 0xed 0x02
-
-# CHECK: dsll $3, $24, 17
-0x78 0x1c 0x18 0x00
-
-# CHECK: dsllv $gp, $27, $24
-0x14 0xe0 0x1b 0x03
-
-# CHECK: dsra $1, $1, 30
-0xbb 0x0f 0x01 0x00
-
-# CHECK: dsrav $1, $1, $fp
-0x17 0x08 0xc1 0x03
-
-# CHECK: dsrl $10, $gp, 24
-0x3a 0x56 0x1c 0x00
-
-# CHECK: dsrlv $gp, $10, $23
-0x16 0xe0 0xea 0x02
-
-# CHECK: dsubu $gp, $27, $24
-0x2f 0xe0 0x78 0x03
-
-# CHECK: lw $27, -15155($1)
-0xcd 0xc4 0x3b 0x8c
-
-# CHECK: lui $1, 1
-0x01 0x00 0x01 0x3c
-
-# CHECK: lwu $3, -1746($3)
-0x2e 0xf9 0x63 0x9c
-
-# CHECK: lui $ra, 1
-0x01 0x00 0x1f 0x3c
-
-# CHECK: sw $26, -15159($1)
-0xc9 0xc4 0x3a 0xac
-
-# CHECK: ld $26, 3958($zero)
-0x76 0x0f 0x1a 0xdc
-
-# CHECK: sd $6, 17767($zero)
-0x67 0x45 0x06 0xfc
+# RUN: llvm-mc --disassemble %s -triple=mips64el-unknown-linux | FileCheck %s +# CHECK: .section __TEXT,__text,regular,pure_instructions +# CHECK: daddiu $11, $26, 31949 +0xcd 0x7c 0x4b 0x67 + +# CHECK: daddu $26, $1, $11 +0x2d 0xd0 0x2b 0x00 + +# CHECK: ddiv $zero, $26, $22 +0x1e 0x00 0x56 0x03 + +# CHECK: ddivu $zero, $9, $24 +0x1f 0x00 0x38 0x01 + +# CHECK: dmfc1 $2, $f14 +0x00 0x70 0x22 0x44 + +# CHECK: dmtc1 $23, $f5 +0x00 0x28 0xb7 0x44 + +# CHECK: dmult $11, $26 +0x1c 0x00 0x7a 0x01 + +# CHECK: dmultu $23, $13 +0x1d 0x00 0xed 0x02 + +# CHECK: dsll $3, $24, 17 +0x78 0x1c 0x18 0x00 + +# CHECK: dsllv $gp, $27, $24 +0x14 0xe0 0x1b 0x03 + +# CHECK: dsra $1, $1, 30 +0xbb 0x0f 0x01 0x00 + +# CHECK: dsrav $1, $1, $fp +0x17 0x08 0xc1 0x03 + +# CHECK: dsrl $10, $gp, 24 +0x3a 0x56 0x1c 0x00 + +# CHECK: dsrlv $gp, $10, $23 +0x16 0xe0 0xea 0x02 + +# CHECK: dsubu $gp, $27, $24 +0x2f 0xe0 0x78 0x03 + +# CHECK: lw $27, -15155($1) +0xcd 0xc4 0x3b 0x8c + +# CHECK: lui $1, 1 +0x01 0x00 0x01 0x3c + +# CHECK: lwu $3, -1746($3) +0x2e 0xf9 0x63 0x9c + +# CHECK: lui $ra, 1 +0x01 0x00 0x1f 0x3c + +# CHECK: sw $26, -15159($1) +0xc9 0xc4 0x3a 0xac + +# CHECK: ld $26, 3958($zero) +0x76 0x0f 0x1a 0xdc + +# CHECK: sd $6, 17767($zero) +0x67 0x45 0x06 0xfc diff --git a/test/MC/Disassembler/Mips/mips64r2.txt b/test/MC/Disassembler/Mips/mips64r2.txt index 2dfde0d231c6..0b421fc551e2 100644 --- a/test/MC/Disassembler/Mips/mips64r2.txt +++ b/test/MC/Disassembler/Mips/mips64r2.txt @@ -1,91 +1,91 @@ -# RUN: llvm-mc --disassemble %s -triple=mips64-unknown-linux -mattr +mips64r2 | FileCheck %s
-# CHECK: .section __TEXT,__text,regular,pure_instructions
-# CHECK: daddiu $11, $26, 31949
-0x67 0x4b 0x7c 0xcd
-
-# CHECK: daddu $26, $1, $11
-0x00 0x2b 0xd0 0x2d
-
-# CHECK: ddiv $zero, $26, $22
-0x03 0x56 0x00 0x1e
-
-# CHECK: ddivu $zero, $9, $24
-0x01 0x38 0x00 0x1f
-
-# CHECK: dmfc1 $2, $f14
-0x44 0x22 0x70 0x00
-
-# CHECK: dmtc1 $23, $f5
-0x44 0xb7 0x28 0x00
-
-# CHECK: dmult $11, $26
-0x01 0x7a 0x00 0x1c
-
-# CHECK: dmultu $23, $13
-0x02 0xed 0x00 0x1d
-
-# CHECK: dsll $3, $24, 17
-0x00 0x18 0x1c 0x78
-
-# CHECK: dsllv $gp, $27, $24
-0x03 0x1b 0xe0 0x14
-
-# CHECK: dsra $1, $1, 30
-0x00 0x01 0x0f 0xbb
-
-# CHECK: dsrav $1, $1, $fp
-0x03 0xc1 0x08 0x17
-
-# CHECK: dsrl $10, $gp, 24
-0x00 0x1c 0x56 0x3a
-
-# CHECK: dsrlv $gp, $10, $23
-0x02 0xea 0xe0 0x16
-
-# CHECK: dsubu $gp, $27, $24
-0x03 0x78 0xe0 0x2f
-
-# CHECK: lw $27, -15155($1)
-0x8c 0x3b 0xc4 0xcd
-
-# CHECK: lui $1, 1
-0x3c 0x01 0x00 0x01
-
-# CHECK: lwu $3, -1746($3)
-0x9c 0x63 0xf9 0x2e
-
-# CHECK: lui $ra, 1
-0x3c 0x1f 0x00 0x01
-
-# CHECK: sw $26, -15159($1)
-0xac 0x3a 0xc4 0xc9
-
-# CHECK: ld $26, 3958($zero)
-0xdc 0x1a 0x0f 0x76
-
-# CHECK: sd $6, 17767($zero)
-0xfc 0x06 0x45 0x67
-
-# CHECK: dclo $9, $24
-0x73 0x09 0x48 0x25
-
-# CHECK: dclz $26, $9
-0x71 0x3a 0xd0 0x24
-
-# CHECK: dext $7, $gp, 29, 31
-0x7f 0x87 0xf7 0x43
-
-# CHECK: dins $20, $gp, 15, 1
-0x7f 0x94 0x7b 0xc7
-
-# CHECK: dsbh $7, $gp
-0x7c 0x1c 0x38 0xa4
-
-# CHECK: dshd $3, $14
-0x7c 0x0e 0x19 0x64
-
-# CHECK: drotr $20, $27, 6
-0x00 0x3b 0xa1 0xba
-
-# CHECK: drotrv $24, $23, $5
-0x00 0xb7 0xc0 0x56
+# RUN: llvm-mc --disassemble %s -triple=mips64-unknown-linux -mattr +mips64r2 | FileCheck %s +# CHECK: .section __TEXT,__text,regular,pure_instructions +# CHECK: daddiu $11, $26, 31949 +0x67 0x4b 0x7c 0xcd + +# CHECK: daddu $26, $1, $11 +0x00 0x2b 0xd0 0x2d + +# CHECK: ddiv $zero, $26, $22 +0x03 0x56 0x00 0x1e + +# CHECK: ddivu $zero, $9, $24 +0x01 0x38 0x00 0x1f + +# CHECK: dmfc1 $2, $f14 +0x44 0x22 0x70 0x00 + +# CHECK: dmtc1 $23, $f5 +0x44 0xb7 0x28 0x00 + +# CHECK: dmult $11, $26 +0x01 0x7a 0x00 0x1c + +# CHECK: dmultu $23, $13 +0x02 0xed 0x00 0x1d + +# CHECK: dsll $3, $24, 17 +0x00 0x18 0x1c 0x78 + +# CHECK: dsllv $gp, $27, $24 +0x03 0x1b 0xe0 0x14 + +# CHECK: dsra $1, $1, 30 +0x00 0x01 0x0f 0xbb + +# CHECK: dsrav $1, $1, $fp +0x03 0xc1 0x08 0x17 + +# CHECK: dsrl $10, $gp, 24 +0x00 0x1c 0x56 0x3a + +# CHECK: dsrlv $gp, $10, $23 +0x02 0xea 0xe0 0x16 + +# CHECK: dsubu $gp, $27, $24 +0x03 0x78 0xe0 0x2f + +# CHECK: lw $27, -15155($1) +0x8c 0x3b 0xc4 0xcd + +# CHECK: lui $1, 1 +0x3c 0x01 0x00 0x01 + +# CHECK: lwu $3, -1746($3) +0x9c 0x63 0xf9 0x2e + +# CHECK: lui $ra, 1 +0x3c 0x1f 0x00 0x01 + +# CHECK: sw $26, -15159($1) +0xac 0x3a 0xc4 0xc9 + +# CHECK: ld $26, 3958($zero) +0xdc 0x1a 0x0f 0x76 + +# CHECK: sd $6, 17767($zero) +0xfc 0x06 0x45 0x67 + +# CHECK: dclo $9, $24 +0x73 0x09 0x48 0x25 + +# CHECK: dclz $26, $9 +0x71 0x3a 0xd0 0x24 + +# CHECK: dext $7, $gp, 29, 31 +0x7f 0x87 0xf7 0x43 + +# CHECK: dins $20, $gp, 15, 1 +0x7f 0x94 0x7b 0xc7 + +# CHECK: dsbh $7, $gp +0x7c 0x1c 0x38 0xa4 + +# CHECK: dshd $3, $14 +0x7c 0x0e 0x19 0x64 + +# CHECK: drotr $20, $27, 6 +0x00 0x3b 0xa1 0xba + +# CHECK: drotrv $24, $23, $5 +0x00 0xb7 0xc0 0x56 diff --git a/test/MC/Disassembler/Mips/mips64r2_le.txt b/test/MC/Disassembler/Mips/mips64r2_le.txt index 620d9ebe8da3..c1d326f6d674 100644 --- a/test/MC/Disassembler/Mips/mips64r2_le.txt +++ b/test/MC/Disassembler/Mips/mips64r2_le.txt @@ -1,91 +1,91 @@ -# RUN: llvm-mc --disassemble %s -triple=mips64el-unknown-linux -mattr +mips64r2 | FileCheck %s
-# CHECK: .section __TEXT,__text,regular,pure_instructions
-# CHECK: daddiu $11, $26, 31949
-0xcd 0x7c 0x4b 0x67
-
-# CHECK: daddu $26, $1, $11
-0x2d 0xd0 0x2b 0x00
-
-# CHECK: ddiv $zero, $26, $22
-0x1e 0x00 0x56 0x03
-
-# CHECK: ddivu $zero, $9, $24
-0x1f 0x00 0x38 0x01
-
-# CHECK: dmfc1 $2, $f14
-0x00 0x70 0x22 0x44
-
-# CHECK: dmtc1 $23, $f5
-0x00 0x28 0xb7 0x44
-
-# CHECK: dmult $11, $26
-0x1c 0x00 0x7a 0x01
-
-# CHECK: dmultu $23, $13
-0x1d 0x00 0xed 0x02
-
-# CHECK: dsll $3, $24, 17
-0x78 0x1c 0x18 0x00
-
-# CHECK: dsllv $gp, $27, $24
-0x14 0xe0 0x1b 0x03
-
-# CHECK: dsra $1, $1, 30
-0xbb 0x0f 0x01 0x00
-
-# CHECK: dsrav $1, $1, $fp
-0x17 0x08 0xc1 0x03
-
-# CHECK: dsrl $10, $gp, 24
-0x3a 0x56 0x1c 0x00
-
-# CHECK: dsrlv $gp, $10, $23
-0x16 0xe0 0xea 0x02
-
-# CHECK: dsubu $gp, $27, $24
-0x2f 0xe0 0x78 0x03
-
-# CHECK: lw $27, -15155($1)
-0xcd 0xc4 0x3b 0x8c
-
-# CHECK: lui $1, 1
-0x01 0x00 0x01 0x3c
-
-# CHECK: lwu $3, -1746($3)
-0x2e 0xf9 0x63 0x9c
-
-# CHECK: lui $ra, 1
-0x01 0x00 0x1f 0x3c
-
-# CHECK: sw $26, -15159($1)
-0xc9 0xc4 0x3a 0xac
-
-# CHECK: ld $26, 3958($zero)
-0x76 0x0f 0x1a 0xdc
-
-# CHECK: sd $6, 17767($zero)
-0x67 0x45 0x06 0xfc
-
-# CHECK: dclo $9, $24
-0x25 0x48 0x09 0x73
-
-# CHECK: dclz $26, $9
-0x24 0xd0 0x3a 0x71
-
-# CHECK: dext $7, $gp, 29, 31
-0x43 0xf7 0x87 0x7f
-
-# CHECK: dins $20, $gp, 15, 1
-0xc7 0x7b 0x94 0x7f
-
-# CHECK: dsbh $7, $gp
-0xa4 0x38 0x1c 0x7c
-
-# CHECK: dshd $3, $14
-0x64 0x19 0x0e 0x7c
-
-# CHECK: drotr $20, $27, 6
-0xba 0xa1 0x3b 0x00
-
-# CHECK: drotrv $24, $23, $5
-0x56 0xc0 0xb7 0x00
+# RUN: llvm-mc --disassemble %s -triple=mips64el-unknown-linux -mattr +mips64r2 | FileCheck %s +# CHECK: .section __TEXT,__text,regular,pure_instructions +# CHECK: daddiu $11, $26, 31949 +0xcd 0x7c 0x4b 0x67 + +# CHECK: daddu $26, $1, $11 +0x2d 0xd0 0x2b 0x00 + +# CHECK: ddiv $zero, $26, $22 +0x1e 0x00 0x56 0x03 + +# CHECK: ddivu $zero, $9, $24 +0x1f 0x00 0x38 0x01 + +# CHECK: dmfc1 $2, $f14 +0x00 0x70 0x22 0x44 + +# CHECK: dmtc1 $23, $f5 +0x00 0x28 0xb7 0x44 + +# CHECK: dmult $11, $26 +0x1c 0x00 0x7a 0x01 + +# CHECK: dmultu $23, $13 +0x1d 0x00 0xed 0x02 + +# CHECK: dsll $3, $24, 17 +0x78 0x1c 0x18 0x00 + +# CHECK: dsllv $gp, $27, $24 +0x14 0xe0 0x1b 0x03 + +# CHECK: dsra $1, $1, 30 +0xbb 0x0f 0x01 0x00 + +# CHECK: dsrav $1, $1, $fp +0x17 0x08 0xc1 0x03 + +# CHECK: dsrl $10, $gp, 24 +0x3a 0x56 0x1c 0x00 + +# CHECK: dsrlv $gp, $10, $23 +0x16 0xe0 0xea 0x02 + +# CHECK: dsubu $gp, $27, $24 +0x2f 0xe0 0x78 0x03 + +# CHECK: lw $27, -15155($1) +0xcd 0xc4 0x3b 0x8c + +# CHECK: lui $1, 1 +0x01 0x00 0x01 0x3c + +# CHECK: lwu $3, -1746($3) +0x2e 0xf9 0x63 0x9c + +# CHECK: lui $ra, 1 +0x01 0x00 0x1f 0x3c + +# CHECK: sw $26, -15159($1) +0xc9 0xc4 0x3a 0xac + +# CHECK: ld $26, 3958($zero) +0x76 0x0f 0x1a 0xdc + +# CHECK: sd $6, 17767($zero) +0x67 0x45 0x06 0xfc + +# CHECK: dclo $9, $24 +0x25 0x48 0x09 0x73 + +# CHECK: dclz $26, $9 +0x24 0xd0 0x3a 0x71 + +# CHECK: dext $7, $gp, 29, 31 +0x43 0xf7 0x87 0x7f + +# CHECK: dins $20, $gp, 15, 1 +0xc7 0x7b 0x94 0x7f + +# CHECK: dsbh $7, $gp +0xa4 0x38 0x1c 0x7c + +# CHECK: dshd $3, $14 +0x64 0x19 0x0e 0x7c + +# CHECK: drotr $20, $27, 6 +0xba 0xa1 0x3b 0x00 + +# CHECK: drotrv $24, $23, $5 +0x56 0xc0 0xb7 0x00 diff --git a/test/MC/Disassembler/X86/enhanced.txt b/test/MC/Disassembler/X86/enhanced.txt deleted file mode 100644 index deff735b69db..000000000000 --- a/test/MC/Disassembler/X86/enhanced.txt +++ /dev/null @@ -1,10 +0,0 @@ -# RUN: llvm-mc --edis %s -triple=x86_64-apple-darwin9 2>&1 | FileCheck %s - -# CHECK: [o:jne][w: ][0-p:-][0-l:10=10] <br> 0:[RIP/112](pc)=18446744073709551606 -0x0f 0x85 0xf6 0xff 0xff 0xff -# CHECK: [o:movq][w: ][1-r:%gs=r64][1-p::][1-l:8=8][p:,][w: ][0-r:%rcx=r109] <mov> 0:[RCX/109]=0 1:[GS/64]=8 -0x65 0x48 0x8b 0x0c 0x25 0x08 0x00 0x00 0x00 -# CHECK: [o:xorps][w: ][2-r:%xmm1=r130][p:,][w: ][0-r:%xmm2=r131] 0:[XMM2/131]=0 1:[XMM2/131]=0 2:[XMM1/130]=0 -0x0f 0x57 0xd1 -# CHECK: [o:andps][w: ][2-r:%xmm1=r130][p:,][w: ][0-r:%xmm2=r131] 0:[XMM2/131]=0 1:[XMM2/131]=0 2:[XMM1/130]=0 -0x0f 0x54 0xd1 diff --git a/test/MC/Disassembler/X86/hex-immediates.txt b/test/MC/Disassembler/X86/hex-immediates.txt new file mode 100644 index 000000000000..80d24487ee74 --- /dev/null +++ b/test/MC/Disassembler/X86/hex-immediates.txt @@ -0,0 +1,10 @@ +# RUN: llvm-mc --hdis %s -triple=x86_64-apple-darwin9 2>&1 | FileCheck %s + +# CHECK: movabsq $0x7fffffffffffffff, %rcx +0x48 0xb9 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x7f +# CHECK: leaq 0x3e2(%rip), %rdi +0x48 0x8d 0x3d 0xe2 0x03 0x00 0x00 +# CHECK: subq $0x40, %rsp +0x48 0x83 0xec 0x40 +# CHECK: leal (,%r14,4), %eax +0x42 0x8d 0x04 0xb5 0x00 0x00 0x00 0x00 diff --git a/test/MC/Disassembler/X86/intel-syntax-32.txt b/test/MC/Disassembler/X86/intel-syntax-32.txt new file mode 100644 index 000000000000..08bae6ec6753 --- /dev/null +++ b/test/MC/Disassembler/X86/intel-syntax-32.txt @@ -0,0 +1,13 @@ +# RUN: llvm-mc --disassemble %s -triple=i386 --output-asm-variant=1 | FileCheck %s + +# CHECK: sgdt +0x0f 0x01 0x00 + +# CHECK: sidt +0x0f 0x01 0x08 + +# CHECK: lgdt +0x0f 0x01 0x10 + +# CHECK: lidt +0x0f 0x01 0x18 diff --git a/test/MC/Disassembler/X86/simple-tests.txt b/test/MC/Disassembler/X86/simple-tests.txt index 672d23924321..9827a1809f1b 100644 --- a/test/MC/Disassembler/X86/simple-tests.txt +++ b/test/MC/Disassembler/X86/simple-tests.txt @@ -120,13 +120,13 @@ # CHECK: vandps (%rdx), %xmm1, %xmm7 0xc5 0xf0 0x54 0x3a -# CHECK: vcvtss2sil %xmm0, %eax +# CHECK: vcvtss2si %xmm0, %eax 0xc5 0xfa 0x2d 0xc0 -# CHECK: vcvtsd2sil %xmm0, %eax +# CHECK: vcvtsd2si %xmm0, %eax 0xc5 0xfb 0x2d 0xc0 -# CHECK: vcvtsd2siq %xmm0, %rax +# CHECK: vcvtsd2si %xmm0, %rax 0xc4 0xe1 0xfb 0x2d 0xc0 # CHECK: vmaskmovpd %xmm0, %xmm1, (%rax) @@ -437,10 +437,10 @@ # CHECK: vroundsd $0, %xmm0, %xmm0, %xmm0 0xc4 0xe3 0x7d 0x0b 0xc0 0x00 -# CHECK: vcvtsd2sil %xmm0, %eax +# CHECK: vcvtsd2si %xmm0, %eax 0xc4 0xe1 0x7f 0x2d 0xc0 -# CHECK: vcvtsd2siq %xmm0, %rax +# CHECK: vcvtsd2si %xmm0, %rax 0xc4 0xe1 0xff 0x2d 0xc0 # CHECK: vucomisd %xmm1, %xmm0 @@ -753,3 +753,18 @@ # CHECK: lock # CHECK-NEXT: xaddq %rcx, %rbx 0xf0 0x48 0x0f 0xc1 0xcb + +# rdar://13493622 lldb doesn't print the x86 rep/repne prefix when disassembling +# CHECK: repne +# CHECK-NEXT: movsd +0xf2 0xa5 +# CHECK: repne +# CHECK-NEXT: movsq +0xf2 0x48 0xa5 +# CHECK: repne +# CHECK-NEXT: movb $0, (%rax) +0xf2 0xc6 0x0 0x0 +# CHECK: rep +# CHECK-NEXT: lock +# CHECK-NEXT: incl (%rax) +0xf3 0xf0 0xff 0x00 diff --git a/test/MC/Disassembler/X86/x86-32.txt b/test/MC/Disassembler/X86/x86-32.txt index 899657b0d4a3..76d67d352ccf 100644 --- a/test/MC/Disassembler/X86/x86-32.txt +++ b/test/MC/Disassembler/X86/x86-32.txt @@ -156,13 +156,13 @@ # CHECK: vandps (%edx), %xmm1, %xmm7 0xc5 0xf0 0x54 0x3a -# CHECK: vcvtss2sil %xmm0, %eax +# CHECK: vcvtss2si %xmm0, %eax 0xc5 0xfa 0x2d 0xc0 -# CHECK: vcvtsd2sil %xmm0, %eax +# CHECK: vcvtsd2si %xmm0, %eax 0xc5 0xfb 0x2d 0xc0 -# CHECK: vcvtsd2sil %xmm0, %eax +# CHECK: vcvtsd2si %xmm0, %eax 0xc4 0xe1 0x7b 0x2d 0xc0 # CHECK: vmaskmovpd %xmm0, %xmm1, (%eax) @@ -460,10 +460,10 @@ # CHECK: vroundsd $0, %xmm0, %xmm0, %xmm0 0xc4 0xe3 0x7d 0x0b 0xc0 0x00 -# CHECK: vcvtsd2sil %xmm0, %eax +# CHECK: vcvtsd2si %xmm0, %eax 0xc4 0xe1 0x7f 0x2d 0xc0 -# CHECK: vcvtsd2sil %xmm0, %eax +# CHECK: vcvtsd2si %xmm0, %eax 0xc4 0xe1 0xff 0x2d 0xc0 # CHECK: vucomisd %xmm1, %xmm0 @@ -630,3 +630,21 @@ # CHECK: movntss %xmm0, (%edi) 0xf3 0x0f 0x2b 0x07 + +# CHECK: prefetch (%eax) +0x0f 0x0d 0x00 + +# CHECK: prefetchw (%eax) +0x0f 0x0d 0x08 + +# CHECK: adcxl %eax, %eax +0x66 0x0f 0x38 0xf6 0xc0 + +# CHECK: adcxl (%eax), %eax +0x66 0x0f 0x38 0xf6 0x00 + +# CHECK: adoxl %eax, %eax +0xf3 0x0f 0x38 0xf6 0xc0 + +# CHECK: adoxl (%eax), %eax +0xf3 0x0f 0x38 0xf6 0x00 diff --git a/test/MC/Disassembler/X86/x86-64.txt b/test/MC/Disassembler/X86/x86-64.txt index df449a403b89..5de1d5978433 100644 --- a/test/MC/Disassembler/X86/x86-64.txt +++ b/test/MC/Disassembler/X86/x86-64.txt @@ -2,64 +2,64 @@ # Coverage -# CHECK: vcmptrue_usps +# CHECK: vcmptrue_usps 0xc5 0x04 0xc2 0xc7 0x1f -# CHECK: vcmptrue_uspd +# CHECK: vcmptrue_uspd 0xc5 0x05 0xc2 0xc7 0x1f -# CHECK: vcmptrue_usss +# CHECK: vcmptrue_usss 0xc5 0x06 0xc2 0xc7 0x1f -# CHECK: vcmptrue_ussd +# CHECK: vcmptrue_ussd 0xc5 0x07 0xc2 0xc7 0x1f -# CHECK: vcmpeq_uqps +# CHECK: vcmpeq_uqps 0xc5 0x04 0xc2 0xc7 0x08 -# CHECK: vcmpeq_uqpd +# CHECK: vcmpeq_uqpd 0xc5 0x05 0xc2 0xc7 0x08 -# CHECK: vcmpeq_uqss +# CHECK: vcmpeq_uqss 0xc5 0x06 0xc2 0xc7 0x08 -# CHECK: vcmpeq_uqsd +# CHECK: vcmpeq_uqsd 0xc5 0x07 0xc2 0xc7 0x08 -# CHECK: vcmpeqps +# CHECK: vcmpeqps 0xc5 0x04 0xc2 0xc7 0x00 -# CHECK: vcmpeqpd +# CHECK: vcmpeqpd 0xc5 0x05 0xc2 0xc7 0x00 -# CHECK: vcmpeqss +# CHECK: vcmpeqss 0xc5 0x06 0xc2 0xc7 0x00 -# CHECK: vcmpeqsd +# CHECK: vcmpeqsd 0xc5 0x07 0xc2 0xc7 0x00 -# CHECK: cmpeqps +# CHECK: cmpeqps 0x0f 0xc2 0xc7 0x00 -# CHECK: cmpeqpd +# CHECK: cmpeqpd 0x66 0x0f 0xc2 0xc7 0x00 -# CHECK: cmpeqss +# CHECK: cmpeqss 0xf3 0x0f 0xc2 0xc7 0x00 -# CHECK: cmpeqsd +# CHECK: cmpeqsd 0xf2 0x0f 0xc2 0xc7 0x00 -# CHECK: cmpordps +# CHECK: cmpordps 0x0f 0xc2 0xc7 0x07 -# CHECK: cmpordpd +# CHECK: cmpordpd 0x66 0x0f 0xc2 0xc7 0x07 -# CHECK: cmpordss +# CHECK: cmpordss 0xf3 0x0f 0xc2 0xc7 0x07 -# CHECK: cmpordsd +# CHECK: cmpordsd 0xf2 0x0f 0xc2 0xc7 0x07 # CHECK: extrq $2, $3, %xmm0 @@ -79,3 +79,36 @@ # CHECK: movntss %xmm0, (%rdi) 0xf3 0x0f 0x2b 0x07 + +# CHECK: adcxl %eax, %eax +0x66 0x0f 0x38 0xf6 0xc0 + +# CHECK: adcxl (%rax), %eax +0x66 0x0f 0x38 0xf6 0x00 + +# CHECK: adcxq %rax, %rax +0x66 0x48 0x0f 0x38 0xf6 0xc0 + +# CHECK: adcxq (%rax), %rax +0x66 0x48 0x0f 0x38 0xf6 0x00 + +# CHECK: adoxl %eax, %eax +0xf3 0x0f 0x38 0xf6 0xc0 + +# CHECK: adoxl (%rax), %eax +0xf3 0x0f 0x38 0xf6 0x00 + +# CHECK: adoxq %rax, %rax +0xf3 0x48 0x0f 0x38 0xf6 0xc0 + +# CHECK: adoxq (%rax), %rax +0xf3 0x48 0x0f 0x38 0xf6 0x00 + +# CHECK: xbegin 53 +0xc7 0xf8 0x35 0x00 0x00 0x00 + +# CHECK: xend +0x0f 0x01 0xd5 + +# CHECK: xabort $13 +0xc6 0xf8 0x0d diff --git a/test/MC/Disassembler/XCore/lit.local.cfg b/test/MC/Disassembler/XCore/lit.local.cfg new file mode 100644 index 000000000000..15b65836e717 --- /dev/null +++ b/test/MC/Disassembler/XCore/lit.local.cfg @@ -0,0 +1,5 @@ +config.suffixes = ['.txt'] + +targets = set(config.root.targets_to_build.split()) +if not 'XCore' in targets: + config.unsupported = True diff --git a/test/MC/Disassembler/XCore/xcore.txt b/test/MC/Disassembler/XCore/xcore.txt new file mode 100644 index 000000000000..99e54e9857c5 --- /dev/null +++ b/test/MC/Disassembler/XCore/xcore.txt @@ -0,0 +1,695 @@ +# RUN: llvm-mc --disassemble %s -triple=xcore-xmos-elf | FileCheck %s +# CHECK: .section __TEXT,__text,regular,pure_instructions + +# 0r instructions + +# CHECK: clre +0xed 0x07 + +# CHECK: get r11, id +0xee 0x17 + +# CHECK: get r11, ed +0xfe 0x0f + +# CHECK: get r11, et +0xff 0x0f + +# CHECK: ssync +0xee 0x07 + +# CHECK: waiteu +0xec 0x07 + +# CHECK: dcall +0xfc 0x07 + +# CHECK: dentsp +0xec 0x17 + +# CHECK: drestsp +0xed 0x17 + +# CHECK: dret +0xfe 0x07 + +# CHECK: freet +0xef 0x07 + +# CHECK: get r11, kep +0xef 0x17 + +# CHECK: get r11, ksp +0xfc 0x17 + +# CHECK: kret +0xfd 0x07 + +# CHECK: ldw et, sp[4] +0xfe 0x17 + +# CHECK: ldw sed, sp[3] +0xfd 0x17 + +# CHECK: ldw spc, sp[1] +0xec 0x0f + +# CHECK: ldw ssr, sp[2] +0xee 0x0f + +# CHECK: set kep, r11 +0xff 0x07 + +# CHECK: stw et, sp[4] +0xfd 0x0f + +# CHECK: stw sed, sp[3] +0xfc 0x0f + +# CHECK: stw spc, sp[1] +0xed 0x0f + +# CHECK: stw ssr, sp[2] +0xef 0x0f + +# 1r instructions + +# CHECK: msync res[r0] +0xf0 0x1f + +# CHECK: mjoin res[r1] +0xf1 0x17 + +# CHECK: bau r2 +0xf2 0x27 + +# CHECK: set sp, r3 +0xf3 0x2f + +# CHECK: ecallt r4 +0xf4 0x4f + +# CHECK: ecallf r5 +0xe5 0x4f + +# CHECK: bla r6 +0xe6 0x27 + +# CHECK: bru r8 +0xe8 0x2f + +# CHECK: syncr res[r7] +0xf7 0x87 + +# CHECK: freer res[r8] +0xe8 0x17 + +# CHECK: setv res[r9], r11 +0xf9 0x47 + +# CHECK: setev res[r10], r11 +0xfa 0x3f + +# CHECK: eeu res[r11] +0xfb 0x07 + +# CHECK: set dp, r5 +0xe5 0x37 + +# CHECK: set cp, r0 +0xf0 0x37 + +# CHECK: dgetreg r11 +0xeb 0x3f + +# CHECK: edu res[r8] +0xe8 0x07 + +# CHECK: kcall r2 +0xe2 0x47 + +# CHECK: waitef r10 +0xfa 0x0f + +# CHECK: waitet r7 +0xe7 0x0f + +# CHECK: start t[r4] +0xe4 0x1f + +# CHECK: clrpt res[r9] +0xe9 0x87 + +# 2r instructions + +# CHECK: not r1, r8 +0x24 0x8f + +# CHECK: neg r7, r6 +0xce 0x97 + +# CHECK: andnot r10, r11 +0xab 0x2f + +# CHECK: mkmsk r11, r0 +0x4c 0xa7 + +# CHECK: getts r8, res[r1] +0x41 0x3f + +# CHECK: setpt res[r2], r3 +0xde 0x3e + +# CHECK: outct res[r1], r2 +0xc6 0x4e + +# CHECK: outt res[r5], r4 +0xd1 0x0f + +# CHECK: out res[r9], r10 +0xa9 0xaf + +# CHECK: outshr res[r0], r2 +0xd8 0xae + +# CHECK: inct r7, res[r4] +0xdc 0x87 + +# CHECK: int r8, res[r3] +0x53 0x8f + +# CHECK: in r10, res[r0] +0x48 0xb7 + +# CHECK: inshr r4, res[r2] +0x12 0xb7 + +# CHECK: chkct res[r6], r0 +0x08 0xcf + +# CHECK: testct r8, res[r3] +0x53 0xbf + +# CHECK: testwct r2, res[r9] +0x39 0xc7 + +# CHECK: setd res[r3], r4 +0x13 0x17 + +# CHECK: getst r7, res[r1] +0x1d 0x07 + +# CHECK: init t[r1]:sp, r2 +0xc9 0x16 + +# CHECK: init t[r10]:pc, r1 +0x26 0x07 + +# CHECK: init t[r2]:cp, r10 +0x4a 0x1f + +# CHECK: init t[r2]:dp, r3 +0xce 0x0e + +# CHECK: setpsc res[r8], r2 +0x28 0xc7 + +# CHECK: zext r3, r8 +0x2c 0x47 + +# CHECK: sext r9, r1 +0x45 0x37 + +# CHECK: tsetmr r7, r3 +0x1f 0x1f + +# CHECK: eef r1, res[r6] +0x96 0x2f + +# CHECK: eet r11, res[r0] +0x5c 0x27 + +# rus instructions + +# CHECK: chkct res[r1], 8 +0x34 0xcf + +# CHECK: getr r11, 2 +0x4e 0x87 + +# CHECK: mkmsk r4, 24 +0x72 0xa7 + +# CHECK: outct res[r3], 0 +0xdc 0x4e + +# CHECK: sext r8, 16 +0xb1 0x37 + +# CHECK: zext r2, 32 +0xd8 0x46 + +# CHECK: peek r0, res[r5] +0x81 0xbf + +# CHECK: endin r10, res[r1] +0x59 0x97 + +# l2r instructions + +# CHECK: bitrev r1, r10 +0x26 0xff 0xec 0x07 + +# CHECK: byterev r4, r1 +0x11 0xff 0xec 0x07 + +# CHECK: clz r11, r10 +0xae 0xff 0xec 0x0f + +# CHECK: get r3, ps[r6] +0x9e 0xff 0xec 0x17 + +# CHECK: setc res[r5], r9 +0x75 0xff 0xec 0x2f + +# CHECK: init t[r2]:lr, r1 +0xc6 0xfe 0xec 0x17 + +# CHECK: setclk res[r2], r1 +0xd6 0xfe 0xec 0x0f + +# CHECK: set ps[r9], r10 +0xa9 0xff 0xec 0x1f + +# CHECK: setrdy res[r3], r1 +0xc7 0xfe 0xec 0x2f + +# CHECK: settw res[r7], r2 +0x9b 0xff 0xec 0x27 + +# CHECK: getd r8, res[r3] +0x53 0xff 0xec 0x1f + +# CHECK: getn r10, res[r11] +0xbb 0xff 0xec 0x37 + +# CHECK: testlcl r2, res[r0] +0xc8 0xfe 0xec 0x27 + +# CHECK: setn res[r9], r7 +0x6d 0xff 0xec 0x37 + +# 3r instructions + +# CHECK: add r1, r2, r3 +0x1b 0x10 + +# CHECK: and r11, r10, r9 +0xb9 0x3e + +# CHECK: eq r6, r1, r2 +0x66 0x30 + +# CHECK: ld16s r8, r3[r4] +0xcc 0x82 + +# CHECK: ld8u r9, r1[r10] +0x16 0x8d + +# CHECK: ldw r9, r4[r5] +0x91 0x4b + +# CHECK: lss r7, r3, r0 +0x7c 0xc0 + +# CHECK: lsu r5, r8, r6 +0x12 0xcc + +# CHECK: or r1, r3, r2 +0x1e 0x40 + +# CHECK: shl r8, r2, r4 +0xc8 0x22 + +# CHECK: shr r9, r7, r1 +0x5d 0x29 + +# CHECK: sub r4, r2, r5 +0x89 0x1a + +# CHECK: set t[r0]:r1, r2 +0x18 0xb8 + +# 2rus instructions + +# CHECK: add r10, r2, 5 +0xe9 0x92 + +# CHECK: eq r2, r1, 0 +0x24 0xb0 + +# CHECK: ldw r5, r6[1] +0x19 0x09 + +# CHECK: shl r6, r5, 24 +0xa6 0xa5 + +# CHECK: shr r3, r8, 5 +0xf1 0xab + +# CHECK: stw r3, r2[0] +0x38 0x00 + +# CHECK: sub r2, r4, 11 +0x63 0x9d + +# l3r instructions + +# CHECK: ashr r5, r1, r11 +0xd7 0xfc 0xec 0x17 + +# CHECK: crc32 r5, r6, r1 +0x19 0xf9 0xec 0xaf + +# CHECK: divu r9, r1, r3 +0x97 0xf8 0xec 0x4f + +# CHECK: divs r6, r7, r2 +0x2e 0xf9 0xec 0x47 + +# CHECK: lda16 r11, r2[r1] +0xb9 0xf8 0xec 0x2f + +# CHECK: lda16 r9, r3[-r11] +0x1f 0xfd 0xec 0x37 + +# CHECK: ldaw r9, r1[r2] +0x96 0xf8 0xec 0x1f + +# CHECK: ldaw r8, r7[-r11] +0xcf 0xfd 0xec 0x27 + +# CHECK: mul r0, r4, r2 +0xc2 0xf8 0xec 0x3f + +# CHECK: remu r1, r2, r3 +0x1b 0xf8 0xec 0xcf + +# CHECK: rems r11, r10, r9 +0xb9 0xfe 0xec 0xc7 + +# CHECK: st16 r5, r3[r8] +0xdc 0xfc 0xec 0x87 + +# CHECK: st8 r9, r1[r3] +0x97 0xf8 0xec 0x8f + +# CHECK: stw r7, r10[r1] +0xf9 0xf9 0xec 0x07 + +# CHECK: xor r4, r3, r9 +0xcd 0xfc 0xec 0x0f + +# l2rus instructions + +# CHECK: ashr r5, r1, 3 +0x57 0xf8 0xec 0x97 + +# CHECK: ldaw r11, r10[6] +0x7a 0xfc 0xec 0x9f + +# CHECK: ldaw r8, r2[-9] +0x09 0xfd 0xec 0xa7 + +# CHECK: inpw r6, res[r1], 8 +0xe4 0xfc 0xee 0x97 + +# CHECK: outpw res[r3], r0, 2 +0x0e 0xf8 0xed 0x97 + +# ru6 / lru6 instructions + +# CHECK: bt r6, -5 +0x85 0x75 + +# CHECK: bt r10, -451 +0x07 0xf0 0x83 0x76 + +# CHECK: bt r8, 10 +0x0a 0x72 + +# CHECK: bt r1, 6451 +0x64 0xf0 0x73 0x70 + +# CHECK: bf r5, 8 +0x48 0x79 + +# CHECK: bf r6, 65 +0x01 0xf0 0x81 0x79 + +# CHECK: bf r1, 53 +0x75 0x78 + +# CHECK: bf r10, 101 +0x01 0xf0 0xa5 0x7a + +# CHECK: ldaw r11, dp[63] +0xff 0x62 + +# CHECK: ldaw r1, dp[456] +0x07 0xf0 0x48 0x60 + +# CHECK: ldaw cp, dp[5] +0x05 0x63 + +# CHECK: ldaw sp, dp[9929] +0x9b 0xf0 0x89 0x63 + +# CHECK: ldaw r3, sp[2] +0xc2 0x64 + +# CHECK: ldaw r8, sp[65535] +0xff 0xf3 0x3f 0x66 + +# CHECK: ldaw sp, sp[41] +0xa9 0x67 + +# CHECK: ldaw sp, sp[13121] +0xcd 0xf0 0x81 0x67 + +# CHECK: ldc r3, 30 +0xde 0x68 + +# CHECK: ldc r11, 1000 +0x0f 0xf0 0xe8 0x6a + +# CHECK: ldc sp, 0 +0x80 0x6b + +# CHECK: ldc lr, 81 +0x01 0xf0 0xd1 0x6b + +# CHECK: ldw r0, cp[4] +0x04 0x6c + +# CHECK: ldw r1, cp[32345] +0xf9 0xf1 0x59 0x6c + +# CHECK: ldw cp, cp[8] +0x08 0x6f + +# CHECK: ldw sp, cp[10222] +0x9f 0xf0 0xae 0x6f + +# CHECK: ldw r10, dp[16] +0x90 0x5a + +# CHECK: ldw r10, dp[76] +0x01 0xf0 0x8c 0x5a + +# CHECK: ldw lr, dp[8] +0xc8 0x5b + +# CHECK: ldw dp, dp[33221] +0x07 0xf2 0x45 0x5b + +# CHECK: ldw r8, sp[51] +0x33 0x5e + +# CHECK: ldw r8, sp[1225] +0x13 0xf0 0x09 0x5e + +# CHECK: ldw cp, sp[31] +0x1f 0x5f + +# CHECK: ldw sp, sp[1000] +0x0f 0xf0 0xa8 0x5f + +# CHECK: setc res[r5], 36 +0x64 0xe9 + +# CHECK: setc res[r2], 40312 +0x75 0xf2 0xb8 0xe8 + +# CHECK: stw r8, dp[14] +0x0e 0x52 + +# CHECK: stw r9, dp[654] +0x0a 0xf0 0x4e 0x52 + +# CHECK: stw lr, dp[23] +0xd7 0x53 + +# CHECK: stw sp, dp[44442] +0xb6 0xf2 0x9a 0x53 + +# CHECK: stw r1, sp[32] +0x60 0x54 + +# CHECK: stw r0, sp[8761] +0x88 0xf0 0x39 0x54 + +# CHECK: stw cp, sp[63] +0x3f 0x57 + +# CHECK: stw lr, sp[4391] +0x44 0xf0 0xe7 0x57 + +# u6 / lu6 instructions + +# CHECK: bu -20 +0x14 0x77 + +# CHECK: bu -1000 +0x0f 0xf0 0x28 0x77 + +# CHECK: bu 24 +0x18 0x73 + +# CHECK: bu 2231 +0x22 0xf0 0x37 0x73 + +# CHECK: extsp 9 +0x89 0x77 + +# CHECK: extsp 5721 +0x59 0xf0 0x99 0x77 + +# CHECK: clrsr 60 +0x3c 0x7b + +# CHECK: clrsr 64391 +0xee 0xf3 0x07 0x7b + +# CHECK: entsp 1 +0x41 0x77 + +# CHECK: entsp 70 +0x01 0xf0 0x46 0x77 + +# CHECK: ldaw r11, cp[5] +0x45 0x7f + +# CHECK: ldaw r11, cp[33000] +0x03 0xf2 0x68 0x7f + +# CHECK: retsp 40 +0xe8 0x77 + +# CHECK: retsp 52010 +0x2c 0xf3 0xea 0x77 + +# CHECK: setsr 42 +0x6a 0x7b + +# CHECK: setsr 21863 +0x55 0xf1 0x67 0x7b + +# CHECK: extdp 4 +0x84 0x73 + +# CHECK: extdp 554 +0x08 0xf0 0xaa 0x73 + +# CHECK: blat 9 +0x49 0x73 + +# CHECK: blat 61212 +0xbc 0xf3 0x5c 0x73 + +# CHECK: getsr r11, 54 +0x36 0x7f + +# CHECK: getsr r11, 442 +0x06 0xf0 0x3a 0x7f + +# CHECK: kcall 11 +0xcb 0x73 + +# CHECK: kcall 4001 +0x3e 0xf0 0xe1 0x73 + +# CHECK: kentsp 22 +0x96 0x7b + +# CHECK: kentsp 8793 +0x89 0xf0 0x99 0x7b + +# CHECK: krestsp 0 +0xc0 0x7b + +# CHECK: krestsp 55312 +0x60 0xf3 0xd0 0x7b + +# u10 / lu10 instructions + +# CHECK: ldap r11, 40 +0x28 0xd8 + +# CHECK: ldap r11, 53112 +0x33 0xf0 0x78 0xdb + +# CHECK: bl 8 +0x08 0xd0 + +# CHECK: bl 38631 +0x25 0xf0 0xe7 0xd2 + +# CHECK: bla cp[500] +0xf4 0xe1 + +# CHECK: bla cp[413742] +0x94 0xf1 0x2e 0xe0 + +# CHECK: ldw r11, cp[132] +0x84 0xe4 + +# CHECK: ldw r11, cp[102741] +0x64 0xf0 0x55 0xe5 + +# l6r instructions + +# CHECK: lmul r11, r0, r2, r5, r8, r10 +0xf9 0xfa 0x02 0x06 + +# l5r instructions + +# CHECK: ladd r10, r2, r5, r1, r7 +0xe5 0xf8 0xfb 0x06 + +# CHECK: ldivu r5, r6, r3, r9, r8 +0x54 0xfe 0x0b 0x07 + +# CHECK: lsub r1, r8, r7, r11, r5 +0xcf 0xfd 0x85 0x0f + +# l4r instructions + +# CHECK: crc8 r6, r3, r4, r11 +0x73 0xfd 0xe6 0x07 + +# CHECK: maccs r11, r8, r2, r4 +0xf8 0xfa 0xe8 0x0f + +# CHECK: maccu r0, r2, r5, r8 +0x44 0xfd 0xf2 0x07 diff --git a/test/MC/ELF/cfi-register.s b/test/MC/ELF/cfi-register.s new file mode 100644 index 000000000000..37723097030f --- /dev/null +++ b/test/MC/ELF/cfi-register.s @@ -0,0 +1,42 @@ +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump --dump-section-data | FileCheck %s + +f: + .cfi_startproc + nop + .cfi_register %rbp, %rax + nop + .cfi_endproc + +// CHECK: # Section 4 +// CHECK-NEXT: (('sh_name', 0x00000011) # '.eh_frame' +// CHECK-NEXT: ('sh_type', 0x00000001) +// CHECK-NEXT: ('sh_flags', 0x0000000000000002) +// CHECK-NEXT: ('sh_addr', 0x0000000000000000) +// CHECK-NEXT: ('sh_offset', 0x0000000000000048) +// CHECK-NEXT: ('sh_size', 0x0000000000000030) +// CHECK-NEXT: ('sh_link', 0x00000000) +// CHECK-NEXT: ('sh_info', 0x00000000) +// CHECK-NEXT: ('sh_addralign', 0x0000000000000008) +// CHECK-NEXT: ('sh_entsize', 0x0000000000000000) +// CHECK-NEXT: ('_section_data', '14000000 00000000 017a5200 01781001 1b0c0708 90010000 14000000 1c000000 00000000 02000000 00410906 00000000') +// CHECK-NEXT: ), +// CHECK-NEXT: # Section 5 +// CHECK-NEXT: (('sh_name', 0x0000000c) # '.rela.eh_frame' +// CHECK-NEXT: ('sh_type', 0x00000004) +// CHECK-NEXT: ('sh_flags', 0x0000000000000000) +// CHECK-NEXT: ('sh_addr', 0x0000000000000000) +// CHECK-NEXT: ('sh_offset', 0x0000000000000390) +// CHECK-NEXT: ('sh_size', 0x0000000000000018) +// CHECK-NEXT: ('sh_link', 0x00000007) +// CHECK-NEXT: ('sh_info', 0x00000004) +// CHECK-NEXT: ('sh_addralign', 0x0000000000000008) +// CHECK-NEXT: ('sh_entsize', 0x0000000000000018) +// CHECK-NEXT: ('_relocations', [ +// CHECK-NEXT: # Relocation 0 +// CHECK-NEXT: (('r_offset', 0x0000000000000020) +// CHECK-NEXT: ('r_sym', 0x00000002) +// CHECK-NEXT: ('r_type', 0x00000002) +// CHECK-NEXT: ('r_addend', 0x0000000000000000) +// CHECK-NEXT: ), +// CHECK-NEXT: ]) +// CHECK-NEXT: ), diff --git a/test/MC/ELF/cfi-undefined.s b/test/MC/ELF/cfi-undefined.s new file mode 100644 index 000000000000..28049faec285 --- /dev/null +++ b/test/MC/ELF/cfi-undefined.s @@ -0,0 +1,41 @@ +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump --dump-section-data | FileCheck %s + +f: + .cfi_startproc + nop + .cfi_undefined %rbp + nop + .cfi_endproc +// CHECK: # Section 4 +// CHECK-NEXT: (('sh_name', 0x00000011) # '.eh_frame' +// CHECK-NEXT: ('sh_type', 0x00000001) +// CHECK-NEXT: ('sh_flags', 0x0000000000000002) +// CHECK-NEXT: ('sh_addr', 0x0000000000000000) +// CHECK-NEXT: ('sh_offset', 0x0000000000000048) +// CHECK-NEXT: ('sh_size', 0x0000000000000030) +// CHECK-NEXT: ('sh_link', 0x00000000) +// CHECK-NEXT: ('sh_info', 0x00000000) +// CHECK-NEXT: ('sh_addralign', 0x0000000000000008) +// CHECK-NEXT: ('sh_entsize', 0x0000000000000000) +// CHECK-NEXT: ('_section_data', '14000000 00000000 017a5200 01781001 1b0c0708 90010000 14000000 1c000000 00000000 02000000 00410706 00000000') +// CHECK-NEXT: ), +// CHECK-NEXT: # Section 5 +// CHECK-NEXT: (('sh_name', 0x0000000c) # '.rela.eh_frame' +// CHECK-NEXT: ('sh_type', 0x00000004) +// CHECK-NEXT: ('sh_flags', 0x0000000000000000) +// CHECK-NEXT: ('sh_addr', 0x0000000000000000) +// CHECK-NEXT: ('sh_offset', 0x0000000000000390) +// CHECK-NEXT: ('sh_size', 0x0000000000000018) +// CHECK-NEXT: ('sh_link', 0x00000007) +// CHECK-NEXT: ('sh_info', 0x00000004) +// CHECK-NEXT: ('sh_addralign', 0x0000000000000008) +// CHECK-NEXT: ('sh_entsize', 0x0000000000000018) +// CHECK-NEXT: ('_relocations', [ +// CHECK-NEXT: # Relocation 0 +// CHECK-NEXT: (('r_offset', 0x0000000000000020) +// CHECK-NEXT: ('r_sym', 0x00000002) +// CHECK-NEXT: ('r_type', 0x00000002) +// CHECK-NEXT: ('r_addend', 0x0000000000000000) +// CHECK-NEXT: ), +// CHECK-NEXT: ]) +// CHECK-NEXT: ), diff --git a/test/MC/ELF/comp-dir.s b/test/MC/ELF/comp-dir.s new file mode 100644 index 000000000000..59e3d7ded261 --- /dev/null +++ b/test/MC/ELF/comp-dir.s @@ -0,0 +1,7 @@ +// RUN: llvm-mc -triple=x86_64-linux-unknown -g -fdebug-compilation-dir=/test/comp/dir %s -filetype=obj -o %t.o +// RUN: llvm-dwarfdump -debug-dump=info %t.o | FileCheck %s + +// CHECK: DW_AT_comp_dir [DW_FORM_string] ("{{([A-Za-z]:.*)?}}/test/comp/dir") + +f: + nop diff --git a/test/MC/ELF/gen-dwarf.s b/test/MC/ELF/gen-dwarf.s index b090e0802b10..85e02428fe3f 100644 --- a/test/MC/ELF/gen-dwarf.s +++ b/test/MC/ELF/gen-dwarf.s @@ -1,8 +1,9 @@ // RUN: llvm-mc -g -triple i686-pc-linux-gnu %s -filetype=obj -o - | elf-dump | FileCheck %s -// Test that on ELF the debug info has a relocation to debug_abbrev and one to -// to debug_line. +// Test that on ELF: +// 1. the debug info has a relocation to debug_abbrev and one to to debug_line. +// 2. the debug_aranges has relocations to text and debug_line. .text @@ -47,6 +48,34 @@ foo: // CHECK: # Section 8 // CHECK-NEXT: (('sh_name', 0x00000001) # '.debug_abbrev' +// Section 9 is .debug_aranges +// CHECK: # Section 9 +// CHECK-NEXT: (('sh_name', 0x0000001e) # '.debug_aranges' + +// Two relocations in .debug_aranges, one to text and one to debug_info. +// CHECK: # '.rel.debug_aranges' +// CHECK: # Relocation 0 +// CHECK-NEXT: (('r_offset', 0x00000006) +// CHECK-NEXT: ('r_sym', 0x000005) +// CHECK-NEXT: ('r_type', 0x01) +// CHECK-NEXT: ), +// CHECK-NEXT: # Relocation 1 +// CHECK-NEXT: (('r_offset', 0x00000010) +// CHECK-NEXT: ('r_sym', 0x000001) +// CHECK-NEXT: ('r_type', 0x01) +// CHECK-NEXT: ), + +// Symbol 1 is section 1 (.text) +// CHECK: # Symbol 1 +// CHECK-NEXT: (('st_name', 0x00000000) # '' +// CHECK-NEXT: ('st_value', 0x00000000) +// CHECK-NEXT: ('st_size', 0x00000000) +// CHECK-NEXT: ('st_bind', 0x0) +// CHECK-NEXT: ('st_type', 0x3) +// CHECK-NEXT: ('st_other', 0x00) +// CHECK-NEXT: ('st_shndx', 0x0001) +// CHECK-NEXT: ), + // Symbol 4 is section 4 (.debug_line) // CHECK: # Symbol 4 // CHECK-NEXT: (('st_name', 0x00000000) # '' @@ -58,6 +87,17 @@ foo: // CHECK-NEXT: ('st_shndx', 0x0004) // CHECK-NEXT: ), +// Symbol 5 is section 6 (.debug_info) +// CHECK: # Symbol 5 +// CHECK-NEXT: (('st_name', 0x00000000) # '' +// CHECK-NEXT: ('st_value', 0x00000000) +// CHECK-NEXT: ('st_size', 0x00000000) +// CHECK-NEXT: ('st_bind', 0x0) +// CHECK-NEXT: ('st_type', 0x3) +// CHECK-NEXT: ('st_other', 0x00) +// CHECK-NEXT: ('st_shndx', 0x0006) +// CHECK-NEXT: ), + // Symbol 6 is section 8 (.debug_abbrev) // CHECK: # Symbol 6 // CHECK-NEXT: (('st_name', 0x00000000) # '' diff --git a/test/MC/ELF/many-sections-2.s b/test/MC/ELF/many-sections-2.s new file mode 100644 index 000000000000..789ebf378d8e --- /dev/null +++ b/test/MC/ELF/many-sections-2.s @@ -0,0 +1,65281 @@ +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t +// RUN: llvm-readobj -s %t | FileCheck %s + +// CHECK: symtab_shndx + +.section saaaa +.section saaab +.section saaba +.section saabb +.section saaca +.section saacb +.section saada +.section saadb +.section saaea +.section saaeb +.section saafa +.section saafb +.section saaga +.section saagb +.section saaha +.section saahb +.section saaia +.section saaib +.section saaja +.section saajb +.section saaka +.section saakb +.section saala +.section saalb +.section saama +.section saamb +.section saana +.section saanb +.section saaoa +.section saaob +.section saapa +.section saapb +.section saaqa +.section saaqb +.section saara +.section saarb +.section saasa +.section saasb +.section saata +.section saatb +.section saaua +.section saaub +.section saava +.section saavb +.section saawa +.section saawb +.section saaxa +.section saaxb +.section saaya +.section saayb +.section saaza +.section saazb +.section saa1a +.section saa1b +.section saa2a +.section saa2b +.section saa3a +.section saa3b +.section saa4a +.section saa4b +.section saa5a +.section saa5b +.section saa6a +.section saa6b +.section saa7a +.section saa7b +.section saa8a +.section saa8b +.section saa9a +.section saa9b +.section saa0a +.section saa0b +.section sabaa +.section sabab +.section sabba +.section sabbb +.section sabca +.section sabcb +.section sabda +.section sabdb +.section sabea +.section sabeb +.section sabfa +.section sabfb +.section sabga +.section sabgb +.section sabha +.section sabhb +.section sabia +.section sabib +.section sabja +.section sabjb +.section sabka +.section sabkb +.section sabla +.section sablb +.section sabma +.section sabmb +.section sabna +.section sabnb +.section saboa +.section sabob +.section sabpa +.section sabpb +.section sabqa +.section sabqb +.section sabra +.section sabrb +.section sabsa +.section sabsb +.section sabta +.section sabtb +.section sabua +.section sabub +.section sabva +.section sabvb +.section sabwa +.section sabwb +.section sabxa +.section sabxb +.section sabya +.section sabyb +.section sabza +.section sabzb +.section sab1a +.section sab1b +.section sab2a +.section sab2b +.section sab3a +.section sab3b +.section sab4a +.section sab4b +.section sab5a +.section sab5b +.section sab6a +.section sab6b +.section sab7a +.section sab7b +.section sab8a +.section sab8b +.section sab9a +.section sab9b +.section sab0a +.section sab0b +.section sacaa +.section sacab +.section sacba +.section sacbb +.section sacca +.section saccb +.section sacda +.section sacdb +.section sacea +.section saceb +.section sacfa +.section sacfb +.section sacga +.section sacgb +.section sacha +.section sachb +.section sacia +.section sacib +.section sacja +.section sacjb +.section sacka +.section sackb +.section sacla +.section saclb +.section sacma +.section sacmb +.section sacna +.section sacnb +.section sacoa +.section sacob +.section sacpa +.section sacpb +.section sacqa +.section sacqb +.section sacra +.section sacrb +.section sacsa +.section sacsb +.section sacta +.section sactb +.section sacua +.section sacub +.section sacva +.section sacvb +.section sacwa +.section sacwb +.section sacxa +.section sacxb +.section sacya +.section sacyb +.section sacza +.section saczb +.section sac1a +.section sac1b +.section sac2a +.section sac2b +.section sac3a +.section sac3b +.section sac4a +.section sac4b +.section sac5a +.section sac5b +.section sac6a +.section sac6b +.section sac7a +.section sac7b +.section sac8a +.section sac8b +.section sac9a +.section sac9b +.section sac0a +.section sac0b +.section sadaa +.section sadab +.section sadba +.section sadbb +.section sadca +.section sadcb +.section sadda +.section saddb +.section sadea +.section sadeb +.section sadfa +.section sadfb +.section sadga +.section sadgb +.section sadha +.section sadhb +.section sadia +.section sadib +.section sadja +.section sadjb +.section sadka +.section sadkb +.section sadla +.section sadlb +.section sadma +.section sadmb +.section sadna +.section sadnb +.section sadoa +.section sadob +.section sadpa +.section sadpb +.section sadqa +.section sadqb +.section sadra +.section sadrb +.section sadsa +.section sadsb +.section sadta +.section sadtb +.section sadua +.section sadub +.section sadva +.section sadvb +.section sadwa +.section sadwb +.section sadxa +.section sadxb +.section sadya +.section sadyb +.section sadza +.section sadzb +.section sad1a +.section sad1b +.section sad2a +.section sad2b +.section sad3a +.section sad3b +.section sad4a +.section sad4b +.section sad5a +.section sad5b +.section sad6a +.section sad6b +.section sad7a +.section sad7b +.section sad8a +.section sad8b +.section sad9a +.section sad9b +.section sad0a +.section sad0b +.section saeaa +.section saeab +.section saeba +.section saebb +.section saeca +.section saecb +.section saeda +.section saedb +.section saeea +.section saeeb +.section saefa +.section saefb +.section saega +.section saegb +.section saeha +.section saehb +.section saeia +.section saeib +.section saeja +.section saejb +.section saeka +.section saekb +.section saela +.section saelb +.section saema +.section saemb +.section saena +.section saenb +.section saeoa +.section saeob +.section saepa +.section saepb +.section saeqa +.section saeqb +.section saera +.section saerb +.section saesa +.section saesb +.section saeta +.section saetb +.section saeua +.section saeub +.section saeva +.section saevb +.section saewa +.section saewb +.section saexa +.section saexb +.section saeya +.section saeyb +.section saeza +.section saezb +.section sae1a +.section sae1b +.section sae2a +.section sae2b +.section sae3a +.section sae3b +.section sae4a +.section sae4b +.section sae5a +.section sae5b +.section sae6a +.section sae6b +.section sae7a +.section sae7b +.section sae8a +.section sae8b +.section sae9a +.section sae9b +.section sae0a +.section sae0b +.section safaa +.section safab +.section safba +.section safbb +.section safca +.section safcb +.section safda +.section safdb +.section safea +.section safeb +.section saffa +.section saffb +.section safga +.section safgb +.section safha +.section safhb +.section safia +.section safib +.section safja +.section safjb +.section safka +.section safkb +.section safla +.section saflb +.section safma +.section safmb +.section safna +.section safnb +.section safoa +.section safob +.section safpa +.section safpb +.section safqa +.section safqb +.section safra +.section safrb +.section safsa +.section safsb +.section safta +.section saftb +.section safua +.section safub +.section safva +.section safvb +.section safwa +.section safwb +.section safxa +.section safxb +.section safya +.section safyb +.section safza +.section safzb +.section saf1a +.section saf1b +.section saf2a +.section saf2b +.section saf3a +.section saf3b +.section saf4a +.section saf4b +.section saf5a +.section saf5b +.section saf6a +.section saf6b +.section saf7a +.section saf7b +.section saf8a +.section saf8b +.section saf9a +.section saf9b +.section saf0a +.section saf0b +.section sagaa +.section sagab +.section sagba +.section sagbb +.section sagca +.section sagcb +.section sagda +.section sagdb +.section sagea +.section sageb +.section sagfa +.section sagfb +.section sagga +.section saggb +.section sagha +.section saghb +.section sagia +.section sagib +.section sagja +.section sagjb +.section sagka +.section sagkb +.section sagla +.section saglb +.section sagma +.section sagmb +.section sagna +.section sagnb +.section sagoa +.section sagob +.section sagpa +.section sagpb +.section sagqa +.section sagqb +.section sagra +.section sagrb +.section sagsa +.section sagsb +.section sagta +.section sagtb +.section sagua +.section sagub +.section sagva +.section sagvb +.section sagwa +.section sagwb +.section sagxa +.section sagxb +.section sagya +.section sagyb +.section sagza +.section sagzb +.section sag1a +.section sag1b +.section sag2a +.section sag2b +.section sag3a +.section sag3b +.section sag4a +.section sag4b +.section sag5a +.section sag5b +.section sag6a +.section sag6b +.section sag7a +.section sag7b +.section sag8a +.section sag8b +.section sag9a +.section sag9b +.section sag0a +.section sag0b +.section sahaa +.section sahab +.section sahba +.section sahbb +.section sahca +.section sahcb +.section sahda +.section sahdb +.section sahea +.section saheb +.section sahfa +.section sahfb +.section sahga +.section sahgb +.section sahha +.section sahhb +.section sahia +.section sahib +.section sahja +.section sahjb +.section sahka +.section sahkb +.section sahla +.section sahlb +.section sahma +.section sahmb +.section sahna +.section sahnb +.section sahoa +.section sahob +.section sahpa +.section sahpb +.section sahqa +.section sahqb +.section sahra +.section sahrb +.section sahsa +.section sahsb +.section sahta +.section sahtb +.section sahua +.section sahub +.section sahva +.section sahvb +.section sahwa +.section sahwb +.section sahxa +.section sahxb +.section sahya +.section sahyb +.section sahza +.section sahzb +.section sah1a +.section sah1b +.section sah2a +.section sah2b +.section sah3a +.section sah3b +.section sah4a +.section sah4b +.section sah5a +.section sah5b +.section sah6a +.section sah6b +.section sah7a +.section sah7b +.section sah8a +.section sah8b +.section sah9a +.section sah9b +.section sah0a +.section sah0b +.section saiaa +.section saiab +.section saiba +.section saibb +.section saica +.section saicb +.section saida +.section saidb +.section saiea +.section saieb +.section saifa +.section saifb +.section saiga +.section saigb +.section saiha +.section saihb +.section saiia +.section saiib +.section saija +.section saijb +.section saika +.section saikb +.section saila +.section sailb +.section saima +.section saimb +.section saina +.section sainb +.section saioa +.section saiob +.section saipa +.section saipb +.section saiqa +.section saiqb +.section saira +.section sairb +.section saisa +.section saisb +.section saita +.section saitb +.section saiua +.section saiub +.section saiva +.section saivb +.section saiwa +.section saiwb +.section saixa +.section saixb +.section saiya +.section saiyb +.section saiza +.section saizb +.section sai1a +.section sai1b +.section sai2a +.section sai2b +.section sai3a +.section sai3b +.section sai4a +.section sai4b +.section sai5a +.section sai5b +.section sai6a +.section sai6b +.section sai7a +.section sai7b +.section sai8a +.section sai8b +.section sai9a +.section sai9b +.section sai0a +.section sai0b +.section sajaa +.section sajab +.section sajba +.section sajbb +.section sajca +.section sajcb +.section sajda +.section sajdb +.section sajea +.section sajeb +.section sajfa +.section sajfb +.section sajga +.section sajgb +.section sajha +.section sajhb +.section sajia +.section sajib +.section sajja +.section sajjb +.section sajka +.section sajkb +.section sajla +.section sajlb +.section sajma +.section sajmb +.section sajna +.section sajnb +.section sajoa +.section sajob +.section sajpa +.section sajpb +.section sajqa +.section sajqb +.section sajra +.section sajrb +.section sajsa +.section sajsb +.section sajta +.section sajtb +.section sajua +.section sajub +.section sajva +.section sajvb +.section sajwa +.section sajwb +.section sajxa +.section sajxb +.section sajya +.section sajyb +.section sajza +.section sajzb +.section saj1a +.section saj1b +.section saj2a +.section saj2b +.section saj3a +.section saj3b +.section saj4a +.section saj4b +.section saj5a +.section saj5b +.section saj6a +.section saj6b +.section saj7a +.section saj7b +.section saj8a +.section saj8b +.section saj9a +.section saj9b +.section saj0a +.section saj0b +.section sakaa +.section sakab +.section sakba +.section sakbb +.section sakca +.section sakcb +.section sakda +.section sakdb +.section sakea +.section sakeb +.section sakfa +.section sakfb +.section sakga +.section sakgb +.section sakha +.section sakhb +.section sakia +.section sakib +.section sakja +.section sakjb +.section sakka +.section sakkb +.section sakla +.section saklb +.section sakma +.section sakmb +.section sakna +.section saknb +.section sakoa +.section sakob +.section sakpa +.section sakpb +.section sakqa +.section sakqb +.section sakra +.section sakrb +.section saksa +.section saksb +.section sakta +.section saktb +.section sakua +.section sakub +.section sakva +.section sakvb +.section sakwa +.section sakwb +.section sakxa +.section sakxb +.section sakya +.section sakyb +.section sakza +.section sakzb +.section sak1a +.section sak1b +.section sak2a +.section sak2b +.section sak3a +.section sak3b +.section sak4a +.section sak4b +.section sak5a +.section sak5b +.section sak6a +.section sak6b +.section sak7a +.section sak7b +.section sak8a +.section sak8b +.section sak9a +.section sak9b +.section sak0a +.section sak0b +.section salaa +.section salab +.section salba +.section salbb +.section salca +.section salcb +.section salda +.section saldb +.section salea +.section saleb +.section salfa +.section salfb +.section salga +.section salgb +.section salha +.section salhb +.section salia +.section salib +.section salja +.section saljb +.section salka +.section salkb +.section salla +.section sallb +.section salma +.section salmb +.section salna +.section salnb +.section saloa +.section salob +.section salpa +.section salpb +.section salqa +.section salqb +.section salra +.section salrb +.section salsa +.section salsb +.section salta +.section saltb +.section salua +.section salub +.section salva +.section salvb +.section salwa +.section salwb +.section salxa +.section salxb +.section salya +.section salyb +.section salza +.section salzb +.section sal1a +.section sal1b +.section sal2a +.section sal2b +.section sal3a +.section sal3b +.section sal4a +.section sal4b +.section sal5a +.section sal5b +.section sal6a +.section sal6b +.section sal7a +.section sal7b +.section sal8a +.section sal8b +.section sal9a +.section sal9b +.section sal0a +.section sal0b +.section samaa +.section samab +.section samba +.section sambb +.section samca +.section samcb +.section samda +.section samdb +.section samea +.section sameb +.section samfa +.section samfb +.section samga +.section samgb +.section samha +.section samhb +.section samia +.section samib +.section samja +.section samjb +.section samka +.section samkb +.section samla +.section samlb +.section samma +.section sammb +.section samna +.section samnb +.section samoa +.section samob +.section sampa +.section sampb +.section samqa +.section samqb +.section samra +.section samrb +.section samsa +.section samsb +.section samta +.section samtb +.section samua +.section samub +.section samva +.section samvb +.section samwa +.section samwb +.section samxa +.section samxb +.section samya +.section samyb +.section samza +.section samzb +.section sam1a +.section sam1b +.section sam2a +.section sam2b +.section sam3a +.section sam3b +.section sam4a +.section sam4b +.section sam5a +.section sam5b +.section sam6a +.section sam6b +.section sam7a +.section sam7b +.section sam8a +.section sam8b +.section sam9a +.section sam9b +.section sam0a +.section sam0b +.section sanaa +.section sanab +.section sanba +.section sanbb +.section sanca +.section sancb +.section sanda +.section sandb +.section sanea +.section saneb +.section sanfa +.section sanfb +.section sanga +.section sangb +.section sanha +.section sanhb +.section sania +.section sanib +.section sanja +.section sanjb +.section sanka +.section sankb +.section sanla +.section sanlb +.section sanma +.section sanmb +.section sanna +.section sannb +.section sanoa +.section sanob +.section sanpa +.section sanpb +.section sanqa +.section sanqb +.section sanra +.section sanrb +.section sansa +.section sansb +.section santa +.section santb +.section sanua +.section sanub +.section sanva +.section sanvb +.section sanwa +.section sanwb +.section sanxa +.section sanxb +.section sanya +.section sanyb +.section sanza +.section sanzb +.section san1a +.section san1b +.section san2a +.section san2b +.section san3a +.section san3b +.section san4a +.section san4b +.section san5a +.section san5b +.section san6a +.section san6b +.section san7a +.section san7b +.section san8a +.section san8b +.section san9a +.section san9b +.section san0a +.section san0b +.section saoaa +.section saoab +.section saoba +.section saobb +.section saoca +.section saocb +.section saoda +.section saodb +.section saoea +.section saoeb +.section saofa +.section saofb +.section saoga +.section saogb +.section saoha +.section saohb +.section saoia +.section saoib +.section saoja +.section saojb +.section saoka +.section saokb +.section saola +.section saolb +.section saoma +.section saomb +.section saona +.section saonb +.section saooa +.section saoob +.section saopa +.section saopb +.section saoqa +.section saoqb +.section saora +.section saorb +.section saosa +.section saosb +.section saota +.section saotb +.section saoua +.section saoub +.section saova +.section saovb +.section saowa +.section saowb +.section saoxa +.section saoxb +.section saoya +.section saoyb +.section saoza +.section saozb +.section sao1a +.section sao1b +.section sao2a +.section sao2b +.section sao3a +.section sao3b +.section sao4a +.section sao4b +.section sao5a +.section sao5b +.section sao6a +.section sao6b +.section sao7a +.section sao7b +.section sao8a +.section sao8b +.section sao9a +.section sao9b +.section sao0a +.section sao0b +.section sapaa +.section sapab +.section sapba +.section sapbb +.section sapca +.section sapcb +.section sapda +.section sapdb +.section sapea +.section sapeb +.section sapfa +.section sapfb +.section sapga +.section sapgb +.section sapha +.section saphb +.section sapia +.section sapib +.section sapja +.section sapjb +.section sapka +.section sapkb +.section sapla +.section saplb +.section sapma +.section sapmb +.section sapna +.section sapnb +.section sapoa +.section sapob +.section sappa +.section sappb +.section sapqa +.section sapqb +.section sapra +.section saprb +.section sapsa +.section sapsb +.section sapta +.section saptb +.section sapua +.section sapub +.section sapva +.section sapvb +.section sapwa +.section sapwb +.section sapxa +.section sapxb +.section sapya +.section sapyb +.section sapza +.section sapzb +.section sap1a +.section sap1b +.section sap2a +.section sap2b +.section sap3a +.section sap3b +.section sap4a +.section sap4b +.section sap5a +.section sap5b +.section sap6a +.section sap6b +.section sap7a +.section sap7b +.section sap8a +.section sap8b +.section sap9a +.section sap9b +.section sap0a +.section sap0b +.section saqaa +.section saqab +.section saqba +.section saqbb +.section saqca +.section saqcb +.section saqda +.section saqdb +.section saqea +.section saqeb +.section saqfa +.section saqfb +.section saqga +.section saqgb +.section saqha +.section saqhb +.section saqia +.section saqib +.section saqja +.section saqjb +.section saqka +.section saqkb +.section saqla +.section saqlb +.section saqma +.section saqmb +.section saqna +.section saqnb +.section saqoa +.section saqob +.section saqpa +.section saqpb +.section saqqa +.section saqqb +.section saqra +.section saqrb +.section saqsa +.section saqsb +.section saqta +.section saqtb +.section saqua +.section saqub +.section saqva +.section saqvb +.section saqwa +.section saqwb +.section saqxa +.section saqxb +.section saqya +.section saqyb +.section saqza +.section saqzb +.section saq1a +.section saq1b +.section saq2a +.section saq2b +.section saq3a +.section saq3b +.section saq4a +.section saq4b +.section saq5a +.section saq5b +.section saq6a +.section saq6b +.section saq7a +.section saq7b +.section saq8a +.section saq8b +.section saq9a +.section saq9b +.section saq0a +.section saq0b +.section saraa +.section sarab +.section sarba +.section sarbb +.section sarca +.section sarcb +.section sarda +.section sardb +.section sarea +.section sareb +.section sarfa +.section sarfb +.section sarga +.section sargb +.section sarha +.section sarhb +.section saria +.section sarib +.section sarja +.section sarjb +.section sarka +.section sarkb +.section sarla +.section sarlb +.section sarma +.section sarmb +.section sarna +.section sarnb +.section saroa +.section sarob +.section sarpa +.section sarpb +.section sarqa +.section sarqb +.section sarra +.section sarrb +.section sarsa +.section sarsb +.section sarta +.section sartb +.section sarua +.section sarub +.section sarva +.section sarvb +.section sarwa +.section sarwb +.section sarxa +.section sarxb +.section sarya +.section saryb +.section sarza +.section sarzb +.section sar1a +.section sar1b +.section sar2a +.section sar2b +.section sar3a +.section sar3b +.section sar4a +.section sar4b +.section sar5a +.section sar5b +.section sar6a +.section sar6b +.section sar7a +.section sar7b +.section sar8a +.section sar8b +.section sar9a +.section sar9b +.section sar0a +.section sar0b +.section sasaa +.section sasab +.section sasba +.section sasbb +.section sasca +.section sascb +.section sasda +.section sasdb +.section sasea +.section saseb +.section sasfa +.section sasfb +.section sasga +.section sasgb +.section sasha +.section sashb +.section sasia +.section sasib +.section sasja +.section sasjb +.section saska +.section saskb +.section sasla +.section saslb +.section sasma +.section sasmb +.section sasna +.section sasnb +.section sasoa +.section sasob +.section saspa +.section saspb +.section sasqa +.section sasqb +.section sasra +.section sasrb +.section sassa +.section sassb +.section sasta +.section sastb +.section sasua +.section sasub +.section sasva +.section sasvb +.section saswa +.section saswb +.section sasxa +.section sasxb +.section sasya +.section sasyb +.section sasza +.section saszb +.section sas1a +.section sas1b +.section sas2a +.section sas2b +.section sas3a +.section sas3b +.section sas4a +.section sas4b +.section sas5a +.section sas5b +.section sas6a +.section sas6b +.section sas7a +.section sas7b +.section sas8a +.section sas8b +.section sas9a +.section sas9b +.section sas0a +.section sas0b +.section sataa +.section satab +.section satba +.section satbb +.section satca +.section satcb +.section satda +.section satdb +.section satea +.section sateb +.section satfa +.section satfb +.section satga +.section satgb +.section satha +.section sathb +.section satia +.section satib +.section satja +.section satjb +.section satka +.section satkb +.section satla +.section satlb +.section satma +.section satmb +.section satna +.section satnb +.section satoa +.section satob +.section satpa +.section satpb +.section satqa +.section satqb +.section satra +.section satrb +.section satsa +.section satsb +.section satta +.section sattb +.section satua +.section satub +.section satva +.section satvb +.section satwa +.section satwb +.section satxa +.section satxb +.section satya +.section satyb +.section satza +.section satzb +.section sat1a +.section sat1b +.section sat2a +.section sat2b +.section sat3a +.section sat3b +.section sat4a +.section sat4b +.section sat5a +.section sat5b +.section sat6a +.section sat6b +.section sat7a +.section sat7b +.section sat8a +.section sat8b +.section sat9a +.section sat9b +.section sat0a +.section sat0b +.section sauaa +.section sauab +.section sauba +.section saubb +.section sauca +.section saucb +.section sauda +.section saudb +.section sauea +.section saueb +.section saufa +.section saufb +.section sauga +.section saugb +.section sauha +.section sauhb +.section sauia +.section sauib +.section sauja +.section saujb +.section sauka +.section saukb +.section saula +.section saulb +.section sauma +.section saumb +.section sauna +.section saunb +.section sauoa +.section sauob +.section saupa +.section saupb +.section sauqa +.section sauqb +.section saura +.section saurb +.section sausa +.section sausb +.section sauta +.section sautb +.section sauua +.section sauub +.section sauva +.section sauvb +.section sauwa +.section sauwb +.section sauxa +.section sauxb +.section sauya +.section sauyb +.section sauza +.section sauzb +.section sau1a +.section sau1b +.section sau2a +.section sau2b +.section sau3a +.section sau3b +.section sau4a +.section sau4b +.section sau5a +.section sau5b +.section sau6a +.section sau6b +.section sau7a +.section sau7b +.section sau8a +.section sau8b +.section sau9a +.section sau9b +.section sau0a +.section sau0b +.section savaa +.section savab +.section savba +.section savbb +.section savca +.section savcb +.section savda +.section savdb +.section savea +.section saveb +.section savfa +.section savfb +.section savga +.section savgb +.section savha +.section savhb +.section savia +.section savib +.section savja +.section savjb +.section savka +.section savkb +.section savla +.section savlb +.section savma +.section savmb +.section savna +.section savnb +.section savoa +.section savob +.section savpa +.section savpb +.section savqa +.section savqb +.section savra +.section savrb +.section savsa +.section savsb +.section savta +.section savtb +.section savua +.section savub +.section savva +.section savvb +.section savwa +.section savwb +.section savxa +.section savxb +.section savya +.section savyb +.section savza +.section savzb +.section sav1a +.section sav1b +.section sav2a +.section sav2b +.section sav3a +.section sav3b +.section sav4a +.section sav4b +.section sav5a +.section sav5b +.section sav6a +.section sav6b +.section sav7a +.section sav7b +.section sav8a +.section sav8b +.section sav9a +.section sav9b +.section sav0a +.section sav0b +.section sawaa +.section sawab +.section sawba +.section sawbb +.section sawca +.section sawcb +.section sawda +.section sawdb +.section sawea +.section saweb +.section sawfa +.section sawfb +.section sawga +.section sawgb +.section sawha +.section sawhb +.section sawia +.section sawib +.section sawja +.section sawjb +.section sawka +.section sawkb +.section sawla +.section sawlb +.section sawma +.section sawmb +.section sawna +.section sawnb +.section sawoa +.section sawob +.section sawpa +.section sawpb +.section sawqa +.section sawqb +.section sawra +.section sawrb +.section sawsa +.section sawsb +.section sawta +.section sawtb +.section sawua +.section sawub +.section sawva +.section sawvb +.section sawwa +.section sawwb +.section sawxa +.section sawxb +.section sawya +.section sawyb +.section sawza +.section sawzb +.section saw1a +.section saw1b +.section saw2a +.section saw2b +.section saw3a +.section saw3b +.section saw4a +.section saw4b +.section saw5a +.section saw5b +.section saw6a +.section saw6b +.section saw7a +.section saw7b +.section saw8a +.section saw8b +.section saw9a +.section saw9b +.section saw0a +.section saw0b +.section saxaa +.section saxab +.section saxba +.section saxbb +.section saxca +.section saxcb +.section saxda +.section saxdb +.section saxea +.section saxeb +.section saxfa +.section saxfb +.section saxga +.section saxgb +.section saxha +.section saxhb +.section saxia +.section saxib +.section saxja +.section saxjb +.section saxka +.section saxkb +.section saxla +.section saxlb +.section saxma +.section saxmb +.section saxna +.section saxnb +.section saxoa +.section saxob +.section saxpa +.section saxpb +.section saxqa +.section saxqb +.section saxra +.section saxrb +.section saxsa +.section saxsb +.section saxta +.section saxtb +.section saxua +.section saxub +.section saxva +.section saxvb +.section saxwa +.section saxwb +.section saxxa +.section saxxb +.section saxya +.section saxyb +.section saxza +.section saxzb +.section sax1a +.section sax1b +.section sax2a +.section sax2b +.section sax3a +.section sax3b +.section sax4a +.section sax4b +.section sax5a +.section sax5b +.section sax6a +.section sax6b +.section sax7a +.section sax7b +.section sax8a +.section sax8b +.section sax9a +.section sax9b +.section sax0a +.section sax0b +.section sayaa +.section sayab +.section sayba +.section saybb +.section sayca +.section saycb +.section sayda +.section saydb +.section sayea +.section sayeb +.section sayfa +.section sayfb +.section sayga +.section saygb +.section sayha +.section sayhb +.section sayia +.section sayib +.section sayja +.section sayjb +.section sayka +.section saykb +.section sayla +.section saylb +.section sayma +.section saymb +.section sayna +.section saynb +.section sayoa +.section sayob +.section saypa +.section saypb +.section sayqa +.section sayqb +.section sayra +.section sayrb +.section saysa +.section saysb +.section sayta +.section saytb +.section sayua +.section sayub +.section sayva +.section sayvb +.section saywa +.section saywb +.section sayxa +.section sayxb +.section sayya +.section sayyb +.section sayza +.section sayzb +.section say1a +.section say1b +.section say2a +.section say2b +.section say3a +.section say3b +.section say4a +.section say4b +.section say5a +.section say5b +.section say6a +.section say6b +.section say7a +.section say7b +.section say8a +.section say8b +.section say9a +.section say9b +.section say0a +.section say0b +.section sazaa +.section sazab +.section sazba +.section sazbb +.section sazca +.section sazcb +.section sazda +.section sazdb +.section sazea +.section sazeb +.section sazfa +.section sazfb +.section sazga +.section sazgb +.section sazha +.section sazhb +.section sazia +.section sazib +.section sazja +.section sazjb +.section sazka +.section sazkb +.section sazla +.section sazlb +.section sazma +.section sazmb +.section sazna +.section saznb +.section sazoa +.section sazob +.section sazpa +.section sazpb +.section sazqa +.section sazqb +.section sazra +.section sazrb +.section sazsa +.section sazsb +.section sazta +.section saztb +.section sazua +.section sazub +.section sazva +.section sazvb +.section sazwa +.section sazwb +.section sazxa +.section sazxb +.section sazya +.section sazyb +.section sazza +.section sazzb +.section saz1a +.section saz1b +.section saz2a +.section saz2b +.section saz3a +.section saz3b +.section saz4a +.section saz4b +.section saz5a +.section saz5b +.section saz6a +.section saz6b +.section saz7a +.section saz7b +.section saz8a +.section saz8b +.section saz9a +.section saz9b +.section saz0a +.section saz0b +.section sa1aa +.section sa1ab +.section sa1ba +.section sa1bb +.section sa1ca +.section sa1cb +.section sa1da +.section sa1db +.section sa1ea +.section sa1eb +.section sa1fa +.section sa1fb +.section sa1ga +.section sa1gb +.section sa1ha +.section sa1hb +.section sa1ia +.section sa1ib +.section sa1ja +.section sa1jb +.section sa1ka +.section sa1kb +.section sa1la +.section sa1lb +.section sa1ma +.section sa1mb +.section sa1na +.section sa1nb +.section sa1oa +.section sa1ob +.section sa1pa +.section sa1pb +.section sa1qa +.section sa1qb +.section sa1ra +.section sa1rb +.section sa1sa +.section sa1sb +.section sa1ta +.section sa1tb +.section sa1ua +.section sa1ub +.section sa1va +.section sa1vb +.section sa1wa +.section sa1wb +.section sa1xa +.section sa1xb +.section sa1ya +.section sa1yb +.section sa1za +.section sa1zb +.section sa11a +.section sa11b +.section sa12a +.section sa12b +.section sa13a +.section sa13b +.section sa14a +.section sa14b +.section sa15a +.section sa15b +.section sa16a +.section sa16b +.section sa17a +.section sa17b +.section sa18a +.section sa18b +.section sa19a +.section sa19b +.section sa10a +.section sa10b +.section sa2aa +.section sa2ab +.section sa2ba +.section sa2bb +.section sa2ca +.section sa2cb +.section sa2da +.section sa2db +.section sa2ea +.section sa2eb +.section sa2fa +.section sa2fb +.section sa2ga +.section sa2gb +.section sa2ha +.section sa2hb +.section sa2ia +.section sa2ib +.section sa2ja +.section sa2jb +.section sa2ka +.section sa2kb +.section sa2la +.section sa2lb +.section sa2ma +.section sa2mb +.section sa2na +.section sa2nb +.section sa2oa +.section sa2ob +.section sa2pa +.section sa2pb +.section sa2qa +.section sa2qb +.section sa2ra +.section sa2rb +.section sa2sa +.section sa2sb +.section sa2ta +.section sa2tb +.section sa2ua +.section sa2ub +.section sa2va +.section sa2vb +.section sa2wa +.section sa2wb +.section sa2xa +.section sa2xb +.section sa2ya +.section sa2yb +.section sa2za +.section sa2zb +.section sa21a +.section sa21b +.section sa22a +.section sa22b +.section sa23a +.section sa23b +.section sa24a +.section sa24b +.section sa25a +.section sa25b +.section sa26a +.section sa26b +.section sa27a +.section sa27b +.section sa28a +.section sa28b +.section sa29a +.section sa29b +.section sa20a +.section sa20b +.section sa3aa +.section sa3ab +.section sa3ba +.section sa3bb +.section sa3ca +.section sa3cb +.section sa3da +.section sa3db +.section sa3ea +.section sa3eb +.section sa3fa +.section sa3fb +.section sa3ga +.section sa3gb +.section sa3ha +.section sa3hb +.section sa3ia +.section sa3ib +.section sa3ja +.section sa3jb +.section sa3ka +.section sa3kb +.section sa3la +.section sa3lb +.section sa3ma +.section sa3mb +.section sa3na +.section sa3nb +.section sa3oa +.section sa3ob +.section sa3pa +.section sa3pb +.section sa3qa +.section sa3qb +.section sa3ra +.section sa3rb +.section sa3sa +.section sa3sb +.section sa3ta +.section sa3tb +.section sa3ua +.section sa3ub +.section sa3va +.section sa3vb +.section sa3wa +.section sa3wb +.section sa3xa +.section sa3xb +.section sa3ya +.section sa3yb +.section sa3za +.section sa3zb +.section sa31a +.section sa31b +.section sa32a +.section sa32b +.section sa33a +.section sa33b +.section sa34a +.section sa34b +.section sa35a +.section sa35b +.section sa36a +.section sa36b +.section sa37a +.section sa37b +.section sa38a +.section sa38b +.section sa39a +.section sa39b +.section sa30a +.section sa30b +.section sa4aa +.section sa4ab +.section sa4ba +.section sa4bb +.section sa4ca +.section sa4cb +.section sa4da +.section sa4db +.section sa4ea +.section sa4eb +.section sa4fa +.section sa4fb +.section sa4ga +.section sa4gb +.section sa4ha +.section sa4hb +.section sa4ia +.section sa4ib +.section sa4ja +.section sa4jb +.section sa4ka +.section sa4kb +.section sa4la +.section sa4lb +.section sa4ma +.section sa4mb +.section sa4na +.section sa4nb +.section sa4oa +.section sa4ob +.section sa4pa +.section sa4pb +.section sa4qa +.section sa4qb +.section sa4ra +.section sa4rb +.section sa4sa +.section sa4sb +.section sa4ta +.section sa4tb +.section sa4ua +.section sa4ub +.section sa4va +.section sa4vb +.section sa4wa +.section sa4wb +.section sa4xa +.section sa4xb +.section sa4ya +.section sa4yb +.section sa4za +.section sa4zb +.section sa41a +.section sa41b +.section sa42a +.section sa42b +.section sa43a +.section sa43b +.section sa44a +.section sa44b +.section sa45a +.section sa45b +.section sa46a +.section sa46b +.section sa47a +.section sa47b +.section sa48a +.section sa48b +.section sa49a +.section sa49b +.section sa40a +.section sa40b +.section sa5aa +.section sa5ab +.section sa5ba +.section sa5bb +.section sa5ca +.section sa5cb +.section sa5da +.section sa5db +.section sa5ea +.section sa5eb +.section sa5fa +.section sa5fb +.section sa5ga +.section sa5gb +.section sa5ha +.section sa5hb +.section sa5ia +.section sa5ib +.section sa5ja +.section sa5jb +.section sa5ka +.section sa5kb +.section sa5la +.section sa5lb +.section sa5ma +.section sa5mb +.section sa5na +.section sa5nb +.section sa5oa +.section sa5ob +.section sa5pa +.section sa5pb +.section sa5qa +.section sa5qb +.section sa5ra +.section sa5rb +.section sa5sa +.section sa5sb +.section sa5ta +.section sa5tb +.section sa5ua +.section sa5ub +.section sa5va +.section sa5vb +.section sa5wa +.section sa5wb +.section sa5xa +.section sa5xb +.section sa5ya +.section sa5yb +.section sa5za +.section sa5zb +.section sa51a +.section sa51b +.section sa52a +.section sa52b +.section sa53a +.section sa53b +.section sa54a +.section sa54b +.section sa55a +.section sa55b +.section sa56a +.section sa56b +.section sa57a +.section sa57b +.section sa58a +.section sa58b +.section sa59a +.section sa59b +.section sa50a +.section sa50b +.section sa6aa +.section sa6ab +.section sa6ba +.section sa6bb +.section sa6ca +.section sa6cb +.section sa6da +.section sa6db +.section sa6ea +.section sa6eb +.section sa6fa +.section sa6fb +.section sa6ga +.section sa6gb +.section sa6ha +.section sa6hb +.section sa6ia +.section sa6ib +.section sa6ja +.section sa6jb +.section sa6ka +.section sa6kb +.section sa6la +.section sa6lb +.section sa6ma +.section sa6mb +.section sa6na +.section sa6nb +.section sa6oa +.section sa6ob +.section sa6pa +.section sa6pb +.section sa6qa +.section sa6qb +.section sa6ra +.section sa6rb +.section sa6sa +.section sa6sb +.section sa6ta +.section sa6tb +.section sa6ua +.section sa6ub +.section sa6va +.section sa6vb +.section sa6wa +.section sa6wb +.section sa6xa +.section sa6xb +.section sa6ya +.section sa6yb +.section sa6za +.section sa6zb +.section sa61a +.section sa61b +.section sa62a +.section sa62b +.section sa63a +.section sa63b +.section sa64a +.section sa64b +.section sa65a +.section sa65b +.section sa66a +.section sa66b +.section sa67a +.section sa67b +.section sa68a +.section sa68b +.section sa69a +.section sa69b +.section sa60a +.section sa60b +.section sa7aa +.section sa7ab +.section sa7ba +.section sa7bb +.section sa7ca +.section sa7cb +.section sa7da +.section sa7db +.section sa7ea +.section sa7eb +.section sa7fa +.section sa7fb +.section sa7ga +.section sa7gb +.section sa7ha +.section sa7hb +.section sa7ia +.section sa7ib +.section sa7ja +.section sa7jb +.section sa7ka +.section sa7kb +.section sa7la +.section sa7lb +.section sa7ma +.section sa7mb +.section sa7na +.section sa7nb +.section sa7oa +.section sa7ob +.section sa7pa +.section sa7pb +.section sa7qa +.section sa7qb +.section sa7ra +.section sa7rb +.section sa7sa +.section sa7sb +.section sa7ta +.section sa7tb +.section sa7ua +.section sa7ub +.section sa7va +.section sa7vb +.section sa7wa +.section sa7wb +.section sa7xa +.section sa7xb +.section sa7ya +.section sa7yb +.section sa7za +.section sa7zb +.section sa71a +.section sa71b +.section sa72a +.section sa72b +.section sa73a +.section sa73b +.section sa74a +.section sa74b +.section sa75a +.section sa75b +.section sa76a +.section sa76b +.section sa77a +.section sa77b +.section sa78a +.section sa78b +.section sa79a +.section sa79b +.section sa70a +.section sa70b +.section sa8aa +.section sa8ab +.section sa8ba +.section sa8bb +.section sa8ca +.section sa8cb +.section sa8da +.section sa8db +.section sa8ea +.section sa8eb +.section sa8fa +.section sa8fb +.section sa8ga +.section sa8gb +.section sa8ha +.section sa8hb +.section sa8ia +.section sa8ib +.section sa8ja +.section sa8jb +.section sa8ka +.section sa8kb +.section sa8la +.section sa8lb +.section sa8ma +.section sa8mb +.section sa8na +.section sa8nb +.section sa8oa +.section sa8ob +.section sa8pa +.section sa8pb +.section sa8qa +.section sa8qb +.section sa8ra +.section sa8rb +.section sa8sa +.section sa8sb +.section sa8ta +.section sa8tb +.section sa8ua +.section sa8ub +.section sa8va +.section sa8vb +.section sa8wa +.section sa8wb +.section sa8xa +.section sa8xb +.section sa8ya +.section sa8yb +.section sa8za +.section sa8zb +.section sa81a +.section sa81b +.section sa82a +.section sa82b +.section sa83a +.section sa83b +.section sa84a +.section sa84b +.section sa85a +.section sa85b +.section sa86a +.section sa86b +.section sa87a +.section sa87b +.section sa88a +.section sa88b +.section sa89a +.section sa89b +.section sa80a +.section sa80b +.section sa9aa +.section sa9ab +.section sa9ba +.section sa9bb +.section sa9ca +.section sa9cb +.section sa9da +.section sa9db +.section sa9ea +.section sa9eb +.section sa9fa +.section sa9fb +.section sa9ga +.section sa9gb +.section sa9ha +.section sa9hb +.section sa9ia +.section sa9ib +.section sa9ja +.section sa9jb +.section sa9ka +.section sa9kb +.section sa9la +.section sa9lb +.section sa9ma +.section sa9mb +.section sa9na +.section sa9nb +.section sa9oa +.section sa9ob +.section sa9pa +.section sa9pb +.section sa9qa +.section sa9qb +.section sa9ra +.section sa9rb +.section sa9sa +.section sa9sb +.section sa9ta +.section sa9tb +.section sa9ua +.section sa9ub +.section sa9va +.section sa9vb +.section sa9wa +.section sa9wb +.section sa9xa +.section sa9xb +.section sa9ya +.section sa9yb +.section sa9za +.section sa9zb +.section sa91a +.section sa91b +.section sa92a +.section sa92b +.section sa93a +.section sa93b +.section sa94a +.section sa94b +.section sa95a +.section sa95b +.section sa96a +.section sa96b +.section sa97a +.section sa97b +.section sa98a +.section sa98b +.section sa99a +.section sa99b +.section sa90a +.section sa90b +.section sa0aa +.section sa0ab +.section sa0ba +.section sa0bb +.section sa0ca +.section sa0cb +.section sa0da +.section sa0db +.section sa0ea +.section sa0eb +.section sa0fa +.section sa0fb +.section sa0ga +.section sa0gb +.section sa0ha +.section sa0hb +.section sa0ia +.section sa0ib +.section sa0ja +.section sa0jb +.section sa0ka +.section sa0kb +.section sa0la +.section sa0lb +.section sa0ma +.section sa0mb +.section sa0na +.section sa0nb +.section sa0oa +.section sa0ob +.section sa0pa +.section sa0pb +.section sa0qa +.section sa0qb +.section sa0ra +.section sa0rb +.section sa0sa +.section sa0sb +.section sa0ta +.section sa0tb +.section sa0ua +.section sa0ub +.section sa0va +.section sa0vb +.section sa0wa +.section sa0wb +.section sa0xa +.section sa0xb +.section sa0ya +.section sa0yb +.section sa0za +.section sa0zb +.section sa01a +.section sa01b +.section sa02a +.section sa02b +.section sa03a +.section sa03b +.section sa04a +.section sa04b +.section sa05a +.section sa05b +.section sa06a +.section sa06b +.section sa07a +.section sa07b +.section sa08a +.section sa08b +.section sa09a +.section sa09b +.section sa00a +.section sa00b +.section sbaaa +.section sbaab +.section sbaba +.section sbabb +.section sbaca +.section sbacb +.section sbada +.section sbadb +.section sbaea +.section sbaeb +.section sbafa +.section sbafb +.section sbaga +.section sbagb +.section sbaha +.section sbahb +.section sbaia +.section sbaib +.section sbaja +.section sbajb +.section sbaka +.section sbakb +.section sbala +.section sbalb +.section sbama +.section sbamb +.section sbana +.section sbanb +.section sbaoa +.section sbaob +.section sbapa +.section sbapb +.section sbaqa +.section sbaqb +.section sbara +.section sbarb +.section sbasa +.section sbasb +.section sbata +.section sbatb +.section sbaua +.section sbaub +.section sbava +.section sbavb +.section sbawa +.section sbawb +.section sbaxa +.section sbaxb +.section sbaya +.section sbayb +.section sbaza +.section sbazb +.section sba1a +.section sba1b +.section sba2a +.section sba2b +.section sba3a +.section sba3b +.section sba4a +.section sba4b +.section sba5a +.section sba5b +.section sba6a +.section sba6b +.section sba7a +.section sba7b +.section sba8a +.section sba8b +.section sba9a +.section sba9b +.section sba0a +.section sba0b +.section sbbaa +.section sbbab +.section sbbba +.section sbbbb +.section sbbca +.section sbbcb +.section sbbda +.section sbbdb +.section sbbea +.section sbbeb +.section sbbfa +.section sbbfb +.section sbbga +.section sbbgb +.section sbbha +.section sbbhb +.section sbbia +.section sbbib +.section sbbja +.section sbbjb +.section sbbka +.section sbbkb +.section sbbla +.section sbblb +.section sbbma +.section sbbmb +.section sbbna +.section sbbnb +.section sbboa +.section sbbob +.section sbbpa +.section sbbpb +.section sbbqa +.section sbbqb +.section sbbra +.section sbbrb +.section sbbsa +.section sbbsb +.section sbbta +.section sbbtb +.section sbbua +.section sbbub +.section sbbva +.section sbbvb +.section sbbwa +.section sbbwb +.section sbbxa +.section sbbxb +.section sbbya +.section sbbyb +.section sbbza +.section sbbzb +.section sbb1a +.section sbb1b +.section sbb2a +.section sbb2b +.section sbb3a +.section sbb3b +.section sbb4a +.section sbb4b +.section sbb5a +.section sbb5b +.section sbb6a +.section sbb6b +.section sbb7a +.section sbb7b +.section sbb8a +.section sbb8b +.section sbb9a +.section sbb9b +.section sbb0a +.section sbb0b +.section sbcaa +.section sbcab +.section sbcba +.section sbcbb +.section sbcca +.section sbccb +.section sbcda +.section sbcdb +.section sbcea +.section sbceb +.section sbcfa +.section sbcfb +.section sbcga +.section sbcgb +.section sbcha +.section sbchb +.section sbcia +.section sbcib +.section sbcja +.section sbcjb +.section sbcka +.section sbckb +.section sbcla +.section sbclb +.section sbcma +.section sbcmb +.section sbcna +.section sbcnb +.section sbcoa +.section sbcob +.section sbcpa +.section sbcpb +.section sbcqa +.section sbcqb +.section sbcra +.section sbcrb +.section sbcsa +.section sbcsb +.section sbcta +.section sbctb +.section sbcua +.section sbcub +.section sbcva +.section sbcvb +.section sbcwa +.section sbcwb +.section sbcxa +.section sbcxb +.section sbcya +.section sbcyb +.section sbcza +.section sbczb +.section sbc1a +.section sbc1b +.section sbc2a +.section sbc2b +.section sbc3a +.section sbc3b +.section sbc4a +.section sbc4b +.section sbc5a +.section sbc5b +.section sbc6a +.section sbc6b +.section sbc7a +.section sbc7b +.section sbc8a +.section sbc8b +.section sbc9a +.section sbc9b +.section sbc0a +.section sbc0b +.section sbdaa +.section sbdab +.section sbdba +.section sbdbb +.section sbdca +.section sbdcb +.section sbdda +.section sbddb +.section sbdea +.section sbdeb +.section sbdfa +.section sbdfb +.section sbdga +.section sbdgb +.section sbdha +.section sbdhb +.section sbdia +.section sbdib +.section sbdja +.section sbdjb +.section sbdka +.section sbdkb +.section sbdla +.section sbdlb +.section sbdma +.section sbdmb +.section sbdna +.section sbdnb +.section sbdoa +.section sbdob +.section sbdpa +.section sbdpb +.section sbdqa +.section sbdqb +.section sbdra +.section sbdrb +.section sbdsa +.section sbdsb +.section sbdta +.section sbdtb +.section sbdua +.section sbdub +.section sbdva +.section sbdvb +.section sbdwa +.section sbdwb +.section sbdxa +.section sbdxb +.section sbdya +.section sbdyb +.section sbdza +.section sbdzb +.section sbd1a +.section sbd1b +.section sbd2a +.section sbd2b +.section sbd3a +.section sbd3b +.section sbd4a +.section sbd4b +.section sbd5a +.section sbd5b +.section sbd6a +.section sbd6b +.section sbd7a +.section sbd7b +.section sbd8a +.section sbd8b +.section sbd9a +.section sbd9b +.section sbd0a +.section sbd0b +.section sbeaa +.section sbeab +.section sbeba +.section sbebb +.section sbeca +.section sbecb +.section sbeda +.section sbedb +.section sbeea +.section sbeeb +.section sbefa +.section sbefb +.section sbega +.section sbegb +.section sbeha +.section sbehb +.section sbeia +.section sbeib +.section sbeja +.section sbejb +.section sbeka +.section sbekb +.section sbela +.section sbelb +.section sbema +.section sbemb +.section sbena +.section sbenb +.section sbeoa +.section sbeob +.section sbepa +.section sbepb +.section sbeqa +.section sbeqb +.section sbera +.section sberb +.section sbesa +.section sbesb +.section sbeta +.section sbetb +.section sbeua +.section sbeub +.section sbeva +.section sbevb +.section sbewa +.section sbewb +.section sbexa +.section sbexb +.section sbeya +.section sbeyb +.section sbeza +.section sbezb +.section sbe1a +.section sbe1b +.section sbe2a +.section sbe2b +.section sbe3a +.section sbe3b +.section sbe4a +.section sbe4b +.section sbe5a +.section sbe5b +.section sbe6a +.section sbe6b +.section sbe7a +.section sbe7b +.section sbe8a +.section sbe8b +.section sbe9a +.section sbe9b +.section sbe0a +.section sbe0b +.section sbfaa +.section sbfab +.section sbfba +.section sbfbb +.section sbfca +.section sbfcb +.section sbfda +.section sbfdb +.section sbfea +.section sbfeb +.section sbffa +.section sbffb +.section sbfga +.section sbfgb +.section sbfha +.section sbfhb +.section sbfia +.section sbfib +.section sbfja +.section sbfjb +.section sbfka +.section sbfkb +.section sbfla +.section sbflb +.section sbfma +.section sbfmb +.section sbfna +.section sbfnb +.section sbfoa +.section sbfob +.section sbfpa +.section sbfpb +.section sbfqa +.section sbfqb +.section sbfra +.section sbfrb +.section sbfsa +.section sbfsb +.section sbfta +.section sbftb +.section sbfua +.section sbfub +.section sbfva +.section sbfvb +.section sbfwa +.section sbfwb +.section sbfxa +.section sbfxb +.section sbfya +.section sbfyb +.section sbfza +.section sbfzb +.section sbf1a +.section sbf1b +.section sbf2a +.section sbf2b +.section sbf3a +.section sbf3b +.section sbf4a +.section sbf4b +.section sbf5a +.section sbf5b +.section sbf6a +.section sbf6b +.section sbf7a +.section sbf7b +.section sbf8a +.section sbf8b +.section sbf9a +.section sbf9b +.section sbf0a +.section sbf0b +.section sbgaa +.section sbgab +.section sbgba +.section sbgbb +.section sbgca +.section sbgcb +.section sbgda +.section sbgdb +.section sbgea +.section sbgeb +.section sbgfa +.section sbgfb +.section sbgga +.section sbggb +.section sbgha +.section sbghb +.section sbgia +.section sbgib +.section sbgja +.section sbgjb +.section sbgka +.section sbgkb +.section sbgla +.section sbglb +.section sbgma +.section sbgmb +.section sbgna +.section sbgnb +.section sbgoa +.section sbgob +.section sbgpa +.section sbgpb +.section sbgqa +.section sbgqb +.section sbgra +.section sbgrb +.section sbgsa +.section sbgsb +.section sbgta +.section sbgtb +.section sbgua +.section sbgub +.section sbgva +.section sbgvb +.section sbgwa +.section sbgwb +.section sbgxa +.section sbgxb +.section sbgya +.section sbgyb +.section sbgza +.section sbgzb +.section sbg1a +.section sbg1b +.section sbg2a +.section sbg2b +.section sbg3a +.section sbg3b +.section sbg4a +.section sbg4b +.section sbg5a +.section sbg5b +.section sbg6a +.section sbg6b +.section sbg7a +.section sbg7b +.section sbg8a +.section sbg8b +.section sbg9a +.section sbg9b +.section sbg0a +.section sbg0b +.section sbhaa +.section sbhab +.section sbhba +.section sbhbb +.section sbhca +.section sbhcb +.section sbhda +.section sbhdb +.section sbhea +.section sbheb +.section sbhfa +.section sbhfb +.section sbhga +.section sbhgb +.section sbhha +.section sbhhb +.section sbhia +.section sbhib +.section sbhja +.section sbhjb +.section sbhka +.section sbhkb +.section sbhla +.section sbhlb +.section sbhma +.section sbhmb +.section sbhna +.section sbhnb +.section sbhoa +.section sbhob +.section sbhpa +.section sbhpb +.section sbhqa +.section sbhqb +.section sbhra +.section sbhrb +.section sbhsa +.section sbhsb +.section sbhta +.section sbhtb +.section sbhua +.section sbhub +.section sbhva +.section sbhvb +.section sbhwa +.section sbhwb +.section sbhxa +.section sbhxb +.section sbhya +.section sbhyb +.section sbhza +.section sbhzb +.section sbh1a +.section sbh1b +.section sbh2a +.section sbh2b +.section sbh3a +.section sbh3b +.section sbh4a +.section sbh4b +.section sbh5a +.section sbh5b +.section sbh6a +.section sbh6b +.section sbh7a +.section sbh7b +.section sbh8a +.section sbh8b +.section sbh9a +.section sbh9b +.section sbh0a +.section sbh0b +.section sbiaa +.section sbiab +.section sbiba +.section sbibb +.section sbica +.section sbicb +.section sbida +.section sbidb +.section sbiea +.section sbieb +.section sbifa +.section sbifb +.section sbiga +.section sbigb +.section sbiha +.section sbihb +.section sbiia +.section sbiib +.section sbija +.section sbijb +.section sbika +.section sbikb +.section sbila +.section sbilb +.section sbima +.section sbimb +.section sbina +.section sbinb +.section sbioa +.section sbiob +.section sbipa +.section sbipb +.section sbiqa +.section sbiqb +.section sbira +.section sbirb +.section sbisa +.section sbisb +.section sbita +.section sbitb +.section sbiua +.section sbiub +.section sbiva +.section sbivb +.section sbiwa +.section sbiwb +.section sbixa +.section sbixb +.section sbiya +.section sbiyb +.section sbiza +.section sbizb +.section sbi1a +.section sbi1b +.section sbi2a +.section sbi2b +.section sbi3a +.section sbi3b +.section sbi4a +.section sbi4b +.section sbi5a +.section sbi5b +.section sbi6a +.section sbi6b +.section sbi7a +.section sbi7b +.section sbi8a +.section sbi8b +.section sbi9a +.section sbi9b +.section sbi0a +.section sbi0b +.section sbjaa +.section sbjab +.section sbjba +.section sbjbb +.section sbjca +.section sbjcb +.section sbjda +.section sbjdb +.section sbjea +.section sbjeb +.section sbjfa +.section sbjfb +.section sbjga +.section sbjgb +.section sbjha +.section sbjhb +.section sbjia +.section sbjib +.section sbjja +.section sbjjb +.section sbjka +.section sbjkb +.section sbjla +.section sbjlb +.section sbjma +.section sbjmb +.section sbjna +.section sbjnb +.section sbjoa +.section sbjob +.section sbjpa +.section sbjpb +.section sbjqa +.section sbjqb +.section sbjra +.section sbjrb +.section sbjsa +.section sbjsb +.section sbjta +.section sbjtb +.section sbjua +.section sbjub +.section sbjva +.section sbjvb +.section sbjwa +.section sbjwb +.section sbjxa +.section sbjxb +.section sbjya +.section sbjyb +.section sbjza +.section sbjzb +.section sbj1a +.section sbj1b +.section sbj2a +.section sbj2b +.section sbj3a +.section sbj3b +.section sbj4a +.section sbj4b +.section sbj5a +.section sbj5b +.section sbj6a +.section sbj6b +.section sbj7a +.section sbj7b +.section sbj8a +.section sbj8b +.section sbj9a +.section sbj9b +.section sbj0a +.section sbj0b +.section sbkaa +.section sbkab +.section sbkba +.section sbkbb +.section sbkca +.section sbkcb +.section sbkda +.section sbkdb +.section sbkea +.section sbkeb +.section sbkfa +.section sbkfb +.section sbkga +.section sbkgb +.section sbkha +.section sbkhb +.section sbkia +.section sbkib +.section sbkja +.section sbkjb +.section sbkka +.section sbkkb +.section sbkla +.section sbklb +.section sbkma +.section sbkmb +.section sbkna +.section sbknb +.section sbkoa +.section sbkob +.section sbkpa +.section sbkpb +.section sbkqa +.section sbkqb +.section sbkra +.section sbkrb +.section sbksa +.section sbksb +.section sbkta +.section sbktb +.section sbkua +.section sbkub +.section sbkva +.section sbkvb +.section sbkwa +.section sbkwb +.section sbkxa +.section sbkxb +.section sbkya +.section sbkyb +.section sbkza +.section sbkzb +.section sbk1a +.section sbk1b +.section sbk2a +.section sbk2b +.section sbk3a +.section sbk3b +.section sbk4a +.section sbk4b +.section sbk5a +.section sbk5b +.section sbk6a +.section sbk6b +.section sbk7a +.section sbk7b +.section sbk8a +.section sbk8b +.section sbk9a +.section sbk9b +.section sbk0a +.section sbk0b +.section sblaa +.section sblab +.section sblba +.section sblbb +.section sblca +.section sblcb +.section sblda +.section sbldb +.section sblea +.section sbleb +.section sblfa +.section sblfb +.section sblga +.section sblgb +.section sblha +.section sblhb +.section sblia +.section sblib +.section sblja +.section sbljb +.section sblka +.section sblkb +.section sblla +.section sbllb +.section sblma +.section sblmb +.section sblna +.section sblnb +.section sbloa +.section sblob +.section sblpa +.section sblpb +.section sblqa +.section sblqb +.section sblra +.section sblrb +.section sblsa +.section sblsb +.section sblta +.section sbltb +.section sblua +.section sblub +.section sblva +.section sblvb +.section sblwa +.section sblwb +.section sblxa +.section sblxb +.section sblya +.section sblyb +.section sblza +.section sblzb +.section sbl1a +.section sbl1b +.section sbl2a +.section sbl2b +.section sbl3a +.section sbl3b +.section sbl4a +.section sbl4b +.section sbl5a +.section sbl5b +.section sbl6a +.section sbl6b +.section sbl7a +.section sbl7b +.section sbl8a +.section sbl8b +.section sbl9a +.section sbl9b +.section sbl0a +.section sbl0b +.section sbmaa +.section sbmab +.section sbmba +.section sbmbb +.section sbmca +.section sbmcb +.section sbmda +.section sbmdb +.section sbmea +.section sbmeb +.section sbmfa +.section sbmfb +.section sbmga +.section sbmgb +.section sbmha +.section sbmhb +.section sbmia +.section sbmib +.section sbmja +.section sbmjb +.section sbmka +.section sbmkb +.section sbmla +.section sbmlb +.section sbmma +.section sbmmb +.section sbmna +.section sbmnb +.section sbmoa +.section sbmob +.section sbmpa +.section sbmpb +.section sbmqa +.section sbmqb +.section sbmra +.section sbmrb +.section sbmsa +.section sbmsb +.section sbmta +.section sbmtb +.section sbmua +.section sbmub +.section sbmva +.section sbmvb +.section sbmwa +.section sbmwb +.section sbmxa +.section sbmxb +.section sbmya +.section sbmyb +.section sbmza +.section sbmzb +.section sbm1a +.section sbm1b +.section sbm2a +.section sbm2b +.section sbm3a +.section sbm3b +.section sbm4a +.section sbm4b +.section sbm5a +.section sbm5b +.section sbm6a +.section sbm6b +.section sbm7a +.section sbm7b +.section sbm8a +.section sbm8b +.section sbm9a +.section sbm9b +.section sbm0a +.section sbm0b +.section sbnaa +.section sbnab +.section sbnba +.section sbnbb +.section sbnca +.section sbncb +.section sbnda +.section sbndb +.section sbnea +.section sbneb +.section sbnfa +.section sbnfb +.section sbnga +.section sbngb +.section sbnha +.section sbnhb +.section sbnia +.section sbnib +.section sbnja +.section sbnjb +.section sbnka +.section sbnkb +.section sbnla +.section sbnlb +.section sbnma +.section sbnmb +.section sbnna +.section sbnnb +.section sbnoa +.section sbnob +.section sbnpa +.section sbnpb +.section sbnqa +.section sbnqb +.section sbnra +.section sbnrb +.section sbnsa +.section sbnsb +.section sbnta +.section sbntb +.section sbnua +.section sbnub +.section sbnva +.section sbnvb +.section sbnwa +.section sbnwb +.section sbnxa +.section sbnxb +.section sbnya +.section sbnyb +.section sbnza +.section sbnzb +.section sbn1a +.section sbn1b +.section sbn2a +.section sbn2b +.section sbn3a +.section sbn3b +.section sbn4a +.section sbn4b +.section sbn5a +.section sbn5b +.section sbn6a +.section sbn6b +.section sbn7a +.section sbn7b +.section sbn8a +.section sbn8b +.section sbn9a +.section sbn9b +.section sbn0a +.section sbn0b +.section sboaa +.section sboab +.section sboba +.section sbobb +.section sboca +.section sbocb +.section sboda +.section sbodb +.section sboea +.section sboeb +.section sbofa +.section sbofb +.section sboga +.section sbogb +.section sboha +.section sbohb +.section sboia +.section sboib +.section sboja +.section sbojb +.section sboka +.section sbokb +.section sbola +.section sbolb +.section sboma +.section sbomb +.section sbona +.section sbonb +.section sbooa +.section sboob +.section sbopa +.section sbopb +.section sboqa +.section sboqb +.section sbora +.section sborb +.section sbosa +.section sbosb +.section sbota +.section sbotb +.section sboua +.section sboub +.section sbova +.section sbovb +.section sbowa +.section sbowb +.section sboxa +.section sboxb +.section sboya +.section sboyb +.section sboza +.section sbozb +.section sbo1a +.section sbo1b +.section sbo2a +.section sbo2b +.section sbo3a +.section sbo3b +.section sbo4a +.section sbo4b +.section sbo5a +.section sbo5b +.section sbo6a +.section sbo6b +.section sbo7a +.section sbo7b +.section sbo8a +.section sbo8b +.section sbo9a +.section sbo9b +.section sbo0a +.section sbo0b +.section sbpaa +.section sbpab +.section sbpba +.section sbpbb +.section sbpca +.section sbpcb +.section sbpda +.section sbpdb +.section sbpea +.section sbpeb +.section sbpfa +.section sbpfb +.section sbpga +.section sbpgb +.section sbpha +.section sbphb +.section sbpia +.section sbpib +.section sbpja +.section sbpjb +.section sbpka +.section sbpkb +.section sbpla +.section sbplb +.section sbpma +.section sbpmb +.section sbpna +.section sbpnb +.section sbpoa +.section sbpob +.section sbppa +.section sbppb +.section sbpqa +.section sbpqb +.section sbpra +.section sbprb +.section sbpsa +.section sbpsb +.section sbpta +.section sbptb +.section sbpua +.section sbpub +.section sbpva +.section sbpvb +.section sbpwa +.section sbpwb +.section sbpxa +.section sbpxb +.section sbpya +.section sbpyb +.section sbpza +.section sbpzb +.section sbp1a +.section sbp1b +.section sbp2a +.section sbp2b +.section sbp3a +.section sbp3b +.section sbp4a +.section sbp4b +.section sbp5a +.section sbp5b +.section sbp6a +.section sbp6b +.section sbp7a +.section sbp7b +.section sbp8a +.section sbp8b +.section sbp9a +.section sbp9b +.section sbp0a +.section sbp0b +.section sbqaa +.section sbqab +.section sbqba +.section sbqbb +.section sbqca +.section sbqcb +.section sbqda +.section sbqdb +.section sbqea +.section sbqeb +.section sbqfa +.section sbqfb +.section sbqga +.section sbqgb +.section sbqha +.section sbqhb +.section sbqia +.section sbqib +.section sbqja +.section sbqjb +.section sbqka +.section sbqkb +.section sbqla +.section sbqlb +.section sbqma +.section sbqmb +.section sbqna +.section sbqnb +.section sbqoa +.section sbqob +.section sbqpa +.section sbqpb +.section sbqqa +.section sbqqb +.section sbqra +.section sbqrb +.section sbqsa +.section sbqsb +.section sbqta +.section sbqtb +.section sbqua +.section sbqub +.section sbqva +.section sbqvb +.section sbqwa +.section sbqwb +.section sbqxa +.section sbqxb +.section sbqya +.section sbqyb +.section sbqza +.section sbqzb +.section sbq1a +.section sbq1b +.section sbq2a +.section sbq2b +.section sbq3a +.section sbq3b +.section sbq4a +.section sbq4b +.section sbq5a +.section sbq5b +.section sbq6a +.section sbq6b +.section sbq7a +.section sbq7b +.section sbq8a +.section sbq8b +.section sbq9a +.section sbq9b +.section sbq0a +.section sbq0b +.section sbraa +.section sbrab +.section sbrba +.section sbrbb +.section sbrca +.section sbrcb +.section sbrda +.section sbrdb +.section sbrea +.section sbreb +.section sbrfa +.section sbrfb +.section sbrga +.section sbrgb +.section sbrha +.section sbrhb +.section sbria +.section sbrib +.section sbrja +.section sbrjb +.section sbrka +.section sbrkb +.section sbrla +.section sbrlb +.section sbrma +.section sbrmb +.section sbrna +.section sbrnb +.section sbroa +.section sbrob +.section sbrpa +.section sbrpb +.section sbrqa +.section sbrqb +.section sbrra +.section sbrrb +.section sbrsa +.section sbrsb +.section sbrta +.section sbrtb +.section sbrua +.section sbrub +.section sbrva +.section sbrvb +.section sbrwa +.section sbrwb +.section sbrxa +.section sbrxb +.section sbrya +.section sbryb +.section sbrza +.section sbrzb +.section sbr1a +.section sbr1b +.section sbr2a +.section sbr2b +.section sbr3a +.section sbr3b +.section sbr4a +.section sbr4b +.section sbr5a +.section sbr5b +.section sbr6a +.section sbr6b +.section sbr7a +.section sbr7b +.section sbr8a +.section sbr8b +.section sbr9a +.section sbr9b +.section sbr0a +.section sbr0b +.section sbsaa +.section sbsab +.section sbsba +.section sbsbb +.section sbsca +.section sbscb +.section sbsda +.section sbsdb +.section sbsea +.section sbseb +.section sbsfa +.section sbsfb +.section sbsga +.section sbsgb +.section sbsha +.section sbshb +.section sbsia +.section sbsib +.section sbsja +.section sbsjb +.section sbska +.section sbskb +.section sbsla +.section sbslb +.section sbsma +.section sbsmb +.section sbsna +.section sbsnb +.section sbsoa +.section sbsob +.section sbspa +.section sbspb +.section sbsqa +.section sbsqb +.section sbsra +.section sbsrb +.section sbssa +.section sbssb +.section sbsta +.section sbstb +.section sbsua +.section sbsub +.section sbsva +.section sbsvb +.section sbswa +.section sbswb +.section sbsxa +.section sbsxb +.section sbsya +.section sbsyb +.section sbsza +.section sbszb +.section sbs1a +.section sbs1b +.section sbs2a +.section sbs2b +.section sbs3a +.section sbs3b +.section sbs4a +.section sbs4b +.section sbs5a +.section sbs5b +.section sbs6a +.section sbs6b +.section sbs7a +.section sbs7b +.section sbs8a +.section sbs8b +.section sbs9a +.section sbs9b +.section sbs0a +.section sbs0b +.section sbtaa +.section sbtab +.section sbtba +.section sbtbb +.section sbtca +.section sbtcb +.section sbtda +.section sbtdb +.section sbtea +.section sbteb +.section sbtfa +.section sbtfb +.section sbtga +.section sbtgb +.section sbtha +.section sbthb +.section sbtia +.section sbtib +.section sbtja +.section sbtjb +.section sbtka +.section sbtkb +.section sbtla +.section sbtlb +.section sbtma +.section sbtmb +.section sbtna +.section sbtnb +.section sbtoa +.section sbtob +.section sbtpa +.section sbtpb +.section sbtqa +.section sbtqb +.section sbtra +.section sbtrb +.section sbtsa +.section sbtsb +.section sbtta +.section sbttb +.section sbtua +.section sbtub +.section sbtva +.section sbtvb +.section sbtwa +.section sbtwb +.section sbtxa +.section sbtxb +.section sbtya +.section sbtyb +.section sbtza +.section sbtzb +.section sbt1a +.section sbt1b +.section sbt2a +.section sbt2b +.section sbt3a +.section sbt3b +.section sbt4a +.section sbt4b +.section sbt5a +.section sbt5b +.section sbt6a +.section sbt6b +.section sbt7a +.section sbt7b +.section sbt8a +.section sbt8b +.section sbt9a +.section sbt9b +.section sbt0a +.section sbt0b +.section sbuaa +.section sbuab +.section sbuba +.section sbubb +.section sbuca +.section sbucb +.section sbuda +.section sbudb +.section sbuea +.section sbueb +.section sbufa +.section sbufb +.section sbuga +.section sbugb +.section sbuha +.section sbuhb +.section sbuia +.section sbuib +.section sbuja +.section sbujb +.section sbuka +.section sbukb +.section sbula +.section sbulb +.section sbuma +.section sbumb +.section sbuna +.section sbunb +.section sbuoa +.section sbuob +.section sbupa +.section sbupb +.section sbuqa +.section sbuqb +.section sbura +.section sburb +.section sbusa +.section sbusb +.section sbuta +.section sbutb +.section sbuua +.section sbuub +.section sbuva +.section sbuvb +.section sbuwa +.section sbuwb +.section sbuxa +.section sbuxb +.section sbuya +.section sbuyb +.section sbuza +.section sbuzb +.section sbu1a +.section sbu1b +.section sbu2a +.section sbu2b +.section sbu3a +.section sbu3b +.section sbu4a +.section sbu4b +.section sbu5a +.section sbu5b +.section sbu6a +.section sbu6b +.section sbu7a +.section sbu7b +.section sbu8a +.section sbu8b +.section sbu9a +.section sbu9b +.section sbu0a +.section sbu0b +.section sbvaa +.section sbvab +.section sbvba +.section sbvbb +.section sbvca +.section sbvcb +.section sbvda +.section sbvdb +.section sbvea +.section sbveb +.section sbvfa +.section sbvfb +.section sbvga +.section sbvgb +.section sbvha +.section sbvhb +.section sbvia +.section sbvib +.section sbvja +.section sbvjb +.section sbvka +.section sbvkb +.section sbvla +.section sbvlb +.section sbvma +.section sbvmb +.section sbvna +.section sbvnb +.section sbvoa +.section sbvob +.section sbvpa +.section sbvpb +.section sbvqa +.section sbvqb +.section sbvra +.section sbvrb +.section sbvsa +.section sbvsb +.section sbvta +.section sbvtb +.section sbvua +.section sbvub +.section sbvva +.section sbvvb +.section sbvwa +.section sbvwb +.section sbvxa +.section sbvxb +.section sbvya +.section sbvyb +.section sbvza +.section sbvzb +.section sbv1a +.section sbv1b +.section sbv2a +.section sbv2b +.section sbv3a +.section sbv3b +.section sbv4a +.section sbv4b +.section sbv5a +.section sbv5b +.section sbv6a +.section sbv6b +.section sbv7a +.section sbv7b +.section sbv8a +.section sbv8b +.section sbv9a +.section sbv9b +.section sbv0a +.section sbv0b +.section sbwaa +.section sbwab +.section sbwba +.section sbwbb +.section sbwca +.section sbwcb +.section sbwda +.section sbwdb +.section sbwea +.section sbweb +.section sbwfa +.section sbwfb +.section sbwga +.section sbwgb +.section sbwha +.section sbwhb +.section sbwia +.section sbwib +.section sbwja +.section sbwjb +.section sbwka +.section sbwkb +.section sbwla +.section sbwlb +.section sbwma +.section sbwmb +.section sbwna +.section sbwnb +.section sbwoa +.section sbwob +.section sbwpa +.section sbwpb +.section sbwqa +.section sbwqb +.section sbwra +.section sbwrb +.section sbwsa +.section sbwsb +.section sbwta +.section sbwtb +.section sbwua +.section sbwub +.section sbwva +.section sbwvb +.section sbwwa +.section sbwwb +.section sbwxa +.section sbwxb +.section sbwya +.section sbwyb +.section sbwza +.section sbwzb +.section sbw1a +.section sbw1b +.section sbw2a +.section sbw2b +.section sbw3a +.section sbw3b +.section sbw4a +.section sbw4b +.section sbw5a +.section sbw5b +.section sbw6a +.section sbw6b +.section sbw7a +.section sbw7b +.section sbw8a +.section sbw8b +.section sbw9a +.section sbw9b +.section sbw0a +.section sbw0b +.section sbxaa +.section sbxab +.section sbxba +.section sbxbb +.section sbxca +.section sbxcb +.section sbxda +.section sbxdb +.section sbxea +.section sbxeb +.section sbxfa +.section sbxfb +.section sbxga +.section sbxgb +.section sbxha +.section sbxhb +.section sbxia +.section sbxib +.section sbxja +.section sbxjb +.section sbxka +.section sbxkb +.section sbxla +.section sbxlb +.section sbxma +.section sbxmb +.section sbxna +.section sbxnb +.section sbxoa +.section sbxob +.section sbxpa +.section sbxpb +.section sbxqa +.section sbxqb +.section sbxra +.section sbxrb +.section sbxsa +.section sbxsb +.section sbxta +.section sbxtb +.section sbxua +.section sbxub +.section sbxva +.section sbxvb +.section sbxwa +.section sbxwb +.section sbxxa +.section sbxxb +.section sbxya +.section sbxyb +.section sbxza +.section sbxzb +.section sbx1a +.section sbx1b +.section sbx2a +.section sbx2b +.section sbx3a +.section sbx3b +.section sbx4a +.section sbx4b +.section sbx5a +.section sbx5b +.section sbx6a +.section sbx6b +.section sbx7a +.section sbx7b +.section sbx8a +.section sbx8b +.section sbx9a +.section sbx9b +.section sbx0a +.section sbx0b +.section sbyaa +.section sbyab +.section sbyba +.section sbybb +.section sbyca +.section sbycb +.section sbyda +.section sbydb +.section sbyea +.section sbyeb +.section sbyfa +.section sbyfb +.section sbyga +.section sbygb +.section sbyha +.section sbyhb +.section sbyia +.section sbyib +.section sbyja +.section sbyjb +.section sbyka +.section sbykb +.section sbyla +.section sbylb +.section sbyma +.section sbymb +.section sbyna +.section sbynb +.section sbyoa +.section sbyob +.section sbypa +.section sbypb +.section sbyqa +.section sbyqb +.section sbyra +.section sbyrb +.section sbysa +.section sbysb +.section sbyta +.section sbytb +.section sbyua +.section sbyub +.section sbyva +.section sbyvb +.section sbywa +.section sbywb +.section sbyxa +.section sbyxb +.section sbyya +.section sbyyb +.section sbyza +.section sbyzb +.section sby1a +.section sby1b +.section sby2a +.section sby2b +.section sby3a +.section sby3b +.section sby4a +.section sby4b +.section sby5a +.section sby5b +.section sby6a +.section sby6b +.section sby7a +.section sby7b +.section sby8a +.section sby8b +.section sby9a +.section sby9b +.section sby0a +.section sby0b +.section sbzaa +.section sbzab +.section sbzba +.section sbzbb +.section sbzca +.section sbzcb +.section sbzda +.section sbzdb +.section sbzea +.section sbzeb +.section sbzfa +.section sbzfb +.section sbzga +.section sbzgb +.section sbzha +.section sbzhb +.section sbzia +.section sbzib +.section sbzja +.section sbzjb +.section sbzka +.section sbzkb +.section sbzla +.section sbzlb +.section sbzma +.section sbzmb +.section sbzna +.section sbznb +.section sbzoa +.section sbzob +.section sbzpa +.section sbzpb +.section sbzqa +.section sbzqb +.section sbzra +.section sbzrb +.section sbzsa +.section sbzsb +.section sbzta +.section sbztb +.section sbzua +.section sbzub +.section sbzva +.section sbzvb +.section sbzwa +.section sbzwb +.section sbzxa +.section sbzxb +.section sbzya +.section sbzyb +.section sbzza +.section sbzzb +.section sbz1a +.section sbz1b +.section sbz2a +.section sbz2b +.section sbz3a +.section sbz3b +.section sbz4a +.section sbz4b +.section sbz5a +.section sbz5b +.section sbz6a +.section sbz6b +.section sbz7a +.section sbz7b +.section sbz8a +.section sbz8b +.section sbz9a +.section sbz9b +.section sbz0a +.section sbz0b +.section sb1aa +.section sb1ab +.section sb1ba +.section sb1bb +.section sb1ca +.section sb1cb +.section sb1da +.section sb1db +.section sb1ea +.section sb1eb +.section sb1fa +.section sb1fb +.section sb1ga +.section sb1gb +.section sb1ha +.section sb1hb +.section sb1ia +.section sb1ib +.section sb1ja +.section sb1jb +.section sb1ka +.section sb1kb +.section sb1la +.section sb1lb +.section sb1ma +.section sb1mb +.section sb1na +.section sb1nb +.section sb1oa +.section sb1ob +.section sb1pa +.section sb1pb +.section sb1qa +.section sb1qb +.section sb1ra +.section sb1rb +.section sb1sa +.section sb1sb +.section sb1ta +.section sb1tb +.section sb1ua +.section sb1ub +.section sb1va +.section sb1vb +.section sb1wa +.section sb1wb +.section sb1xa +.section sb1xb +.section sb1ya +.section sb1yb +.section sb1za +.section sb1zb +.section sb11a +.section sb11b +.section sb12a +.section sb12b +.section sb13a +.section sb13b +.section sb14a +.section sb14b +.section sb15a +.section sb15b +.section sb16a +.section sb16b +.section sb17a +.section sb17b +.section sb18a +.section sb18b +.section sb19a +.section sb19b +.section sb10a +.section sb10b +.section sb2aa +.section sb2ab +.section sb2ba +.section sb2bb +.section sb2ca +.section sb2cb +.section sb2da +.section sb2db +.section sb2ea +.section sb2eb +.section sb2fa +.section sb2fb +.section sb2ga +.section sb2gb +.section sb2ha +.section sb2hb +.section sb2ia +.section sb2ib +.section sb2ja +.section sb2jb +.section sb2ka +.section sb2kb +.section sb2la +.section sb2lb +.section sb2ma +.section sb2mb +.section sb2na +.section sb2nb +.section sb2oa +.section sb2ob +.section sb2pa +.section sb2pb +.section sb2qa +.section sb2qb +.section sb2ra +.section sb2rb +.section sb2sa +.section sb2sb +.section sb2ta +.section sb2tb +.section sb2ua +.section sb2ub +.section sb2va +.section sb2vb +.section sb2wa +.section sb2wb +.section sb2xa +.section sb2xb +.section sb2ya +.section sb2yb +.section sb2za +.section sb2zb +.section sb21a +.section sb21b +.section sb22a +.section sb22b +.section sb23a +.section sb23b +.section sb24a +.section sb24b +.section sb25a +.section sb25b +.section sb26a +.section sb26b +.section sb27a +.section sb27b +.section sb28a +.section sb28b +.section sb29a +.section sb29b +.section sb20a +.section sb20b +.section sb3aa +.section sb3ab +.section sb3ba +.section sb3bb +.section sb3ca +.section sb3cb +.section sb3da +.section sb3db +.section sb3ea +.section sb3eb +.section sb3fa +.section sb3fb +.section sb3ga +.section sb3gb +.section sb3ha +.section sb3hb +.section sb3ia +.section sb3ib +.section sb3ja +.section sb3jb +.section sb3ka +.section sb3kb +.section sb3la +.section sb3lb +.section sb3ma +.section sb3mb +.section sb3na +.section sb3nb +.section sb3oa +.section sb3ob +.section sb3pa +.section sb3pb +.section sb3qa +.section sb3qb +.section sb3ra +.section sb3rb +.section sb3sa +.section sb3sb +.section sb3ta +.section sb3tb +.section sb3ua +.section sb3ub +.section sb3va +.section sb3vb +.section sb3wa +.section sb3wb +.section sb3xa +.section sb3xb +.section sb3ya +.section sb3yb +.section sb3za +.section sb3zb +.section sb31a +.section sb31b +.section sb32a +.section sb32b +.section sb33a +.section sb33b +.section sb34a +.section sb34b +.section sb35a +.section sb35b +.section sb36a +.section sb36b +.section sb37a +.section sb37b +.section sb38a +.section sb38b +.section sb39a +.section sb39b +.section sb30a +.section sb30b +.section sb4aa +.section sb4ab +.section sb4ba +.section sb4bb +.section sb4ca +.section sb4cb +.section sb4da +.section sb4db +.section sb4ea +.section sb4eb +.section sb4fa +.section sb4fb +.section sb4ga +.section sb4gb +.section sb4ha +.section sb4hb +.section sb4ia +.section sb4ib +.section sb4ja +.section sb4jb +.section sb4ka +.section sb4kb +.section sb4la +.section sb4lb +.section sb4ma +.section sb4mb +.section sb4na +.section sb4nb +.section sb4oa +.section sb4ob +.section sb4pa +.section sb4pb +.section sb4qa +.section sb4qb +.section sb4ra +.section sb4rb +.section sb4sa +.section sb4sb +.section sb4ta +.section sb4tb +.section sb4ua +.section sb4ub +.section sb4va +.section sb4vb +.section sb4wa +.section sb4wb +.section sb4xa +.section sb4xb +.section sb4ya +.section sb4yb +.section sb4za +.section sb4zb +.section sb41a +.section sb41b +.section sb42a +.section sb42b +.section sb43a +.section sb43b +.section sb44a +.section sb44b +.section sb45a +.section sb45b +.section sb46a +.section sb46b +.section sb47a +.section sb47b +.section sb48a +.section sb48b +.section sb49a +.section sb49b +.section sb40a +.section sb40b +.section sb5aa +.section sb5ab +.section sb5ba +.section sb5bb +.section sb5ca +.section sb5cb +.section sb5da +.section sb5db +.section sb5ea +.section sb5eb +.section sb5fa +.section sb5fb +.section sb5ga +.section sb5gb +.section sb5ha +.section sb5hb +.section sb5ia +.section sb5ib +.section sb5ja +.section sb5jb +.section sb5ka +.section sb5kb +.section sb5la +.section sb5lb +.section sb5ma +.section sb5mb +.section sb5na +.section sb5nb +.section sb5oa +.section sb5ob +.section sb5pa +.section sb5pb +.section sb5qa +.section sb5qb +.section sb5ra +.section sb5rb +.section sb5sa +.section sb5sb +.section sb5ta +.section sb5tb +.section sb5ua +.section sb5ub +.section sb5va +.section sb5vb +.section sb5wa +.section sb5wb +.section sb5xa +.section sb5xb +.section sb5ya +.section sb5yb +.section sb5za +.section sb5zb +.section sb51a +.section sb51b +.section sb52a +.section sb52b +.section sb53a +.section sb53b +.section sb54a +.section sb54b +.section sb55a +.section sb55b +.section sb56a +.section sb56b +.section sb57a +.section sb57b +.section sb58a +.section sb58b +.section sb59a +.section sb59b +.section sb50a +.section sb50b +.section sb6aa +.section sb6ab +.section sb6ba +.section sb6bb +.section sb6ca +.section sb6cb +.section sb6da +.section sb6db +.section sb6ea +.section sb6eb +.section sb6fa +.section sb6fb +.section sb6ga +.section sb6gb +.section sb6ha +.section sb6hb +.section sb6ia +.section sb6ib +.section sb6ja +.section sb6jb +.section sb6ka +.section sb6kb +.section sb6la +.section sb6lb +.section sb6ma +.section sb6mb +.section sb6na +.section sb6nb +.section sb6oa +.section sb6ob +.section sb6pa +.section sb6pb +.section sb6qa +.section sb6qb +.section sb6ra +.section sb6rb +.section sb6sa +.section sb6sb +.section sb6ta +.section sb6tb +.section sb6ua +.section sb6ub +.section sb6va +.section sb6vb +.section sb6wa +.section sb6wb +.section sb6xa +.section sb6xb +.section sb6ya +.section sb6yb +.section sb6za +.section sb6zb +.section sb61a +.section sb61b +.section sb62a +.section sb62b +.section sb63a +.section sb63b +.section sb64a +.section sb64b +.section sb65a +.section sb65b +.section sb66a +.section sb66b +.section sb67a +.section sb67b +.section sb68a +.section sb68b +.section sb69a +.section sb69b +.section sb60a +.section sb60b +.section sb7aa +.section sb7ab +.section sb7ba +.section sb7bb +.section sb7ca +.section sb7cb +.section sb7da +.section sb7db +.section sb7ea +.section sb7eb +.section sb7fa +.section sb7fb +.section sb7ga +.section sb7gb +.section sb7ha +.section sb7hb +.section sb7ia +.section sb7ib +.section sb7ja +.section sb7jb +.section sb7ka +.section sb7kb +.section sb7la +.section sb7lb +.section sb7ma +.section sb7mb +.section sb7na +.section sb7nb +.section sb7oa +.section sb7ob +.section sb7pa +.section sb7pb +.section sb7qa +.section sb7qb +.section sb7ra +.section sb7rb +.section sb7sa +.section sb7sb +.section sb7ta +.section sb7tb +.section sb7ua +.section sb7ub +.section sb7va +.section sb7vb +.section sb7wa +.section sb7wb +.section sb7xa +.section sb7xb +.section sb7ya +.section sb7yb +.section sb7za +.section sb7zb +.section sb71a +.section sb71b +.section sb72a +.section sb72b +.section sb73a +.section sb73b +.section sb74a +.section sb74b +.section sb75a +.section sb75b +.section sb76a +.section sb76b +.section sb77a +.section sb77b +.section sb78a +.section sb78b +.section sb79a +.section sb79b +.section sb70a +.section sb70b +.section sb8aa +.section sb8ab +.section sb8ba +.section sb8bb +.section sb8ca +.section sb8cb +.section sb8da +.section sb8db +.section sb8ea +.section sb8eb +.section sb8fa +.section sb8fb +.section sb8ga +.section sb8gb +.section sb8ha +.section sb8hb +.section sb8ia +.section sb8ib +.section sb8ja +.section sb8jb +.section sb8ka +.section sb8kb +.section sb8la +.section sb8lb +.section sb8ma +.section sb8mb +.section sb8na +.section sb8nb +.section sb8oa +.section sb8ob +.section sb8pa +.section sb8pb +.section sb8qa +.section sb8qb +.section sb8ra +.section sb8rb +.section sb8sa +.section sb8sb +.section sb8ta +.section sb8tb +.section sb8ua +.section sb8ub +.section sb8va +.section sb8vb +.section sb8wa +.section sb8wb +.section sb8xa +.section sb8xb +.section sb8ya +.section sb8yb +.section sb8za +.section sb8zb +.section sb81a +.section sb81b +.section sb82a +.section sb82b +.section sb83a +.section sb83b +.section sb84a +.section sb84b +.section sb85a +.section sb85b +.section sb86a +.section sb86b +.section sb87a +.section sb87b +.section sb88a +.section sb88b +.section sb89a +.section sb89b +.section sb80a +.section sb80b +.section sb9aa +.section sb9ab +.section sb9ba +.section sb9bb +.section sb9ca +.section sb9cb +.section sb9da +.section sb9db +.section sb9ea +.section sb9eb +.section sb9fa +.section sb9fb +.section sb9ga +.section sb9gb +.section sb9ha +.section sb9hb +.section sb9ia +.section sb9ib +.section sb9ja +.section sb9jb +.section sb9ka +.section sb9kb +.section sb9la +.section sb9lb +.section sb9ma +.section sb9mb +.section sb9na +.section sb9nb +.section sb9oa +.section sb9ob +.section sb9pa +.section sb9pb +.section sb9qa +.section sb9qb +.section sb9ra +.section sb9rb +.section sb9sa +.section sb9sb +.section sb9ta +.section sb9tb +.section sb9ua +.section sb9ub +.section sb9va +.section sb9vb +.section sb9wa +.section sb9wb +.section sb9xa +.section sb9xb +.section sb9ya +.section sb9yb +.section sb9za +.section sb9zb +.section sb91a +.section sb91b +.section sb92a +.section sb92b +.section sb93a +.section sb93b +.section sb94a +.section sb94b +.section sb95a +.section sb95b +.section sb96a +.section sb96b +.section sb97a +.section sb97b +.section sb98a +.section sb98b +.section sb99a +.section sb99b +.section sb90a +.section sb90b +.section sb0aa +.section sb0ab +.section sb0ba +.section sb0bb +.section sb0ca +.section sb0cb +.section sb0da +.section sb0db +.section sb0ea +.section sb0eb +.section sb0fa +.section sb0fb +.section sb0ga +.section sb0gb +.section sb0ha +.section sb0hb +.section sb0ia +.section sb0ib +.section sb0ja +.section sb0jb +.section sb0ka +.section sb0kb +.section sb0la +.section sb0lb +.section sb0ma +.section sb0mb +.section sb0na +.section sb0nb +.section sb0oa +.section sb0ob +.section sb0pa +.section sb0pb +.section sb0qa +.section sb0qb +.section sb0ra +.section sb0rb +.section sb0sa +.section sb0sb +.section sb0ta +.section sb0tb +.section sb0ua +.section sb0ub +.section sb0va +.section sb0vb +.section sb0wa +.section sb0wb +.section sb0xa +.section sb0xb +.section sb0ya +.section sb0yb +.section sb0za +.section sb0zb +.section sb01a +.section sb01b +.section sb02a +.section sb02b +.section sb03a +.section sb03b +.section sb04a +.section sb04b +.section sb05a +.section sb05b +.section sb06a +.section sb06b +.section sb07a +.section sb07b +.section sb08a +.section sb08b +.section sb09a +.section sb09b +.section sb00a +.section sb00b +.section scaaa +.section scaab +.section scaba +.section scabb +.section scaca +.section scacb +.section scada +.section scadb +.section scaea +.section scaeb +.section scafa +.section scafb +.section scaga +.section scagb +.section scaha +.section scahb +.section scaia +.section scaib +.section scaja +.section scajb +.section scaka +.section scakb +.section scala +.section scalb +.section scama +.section scamb +.section scana +.section scanb +.section scaoa +.section scaob +.section scapa +.section scapb +.section scaqa +.section scaqb +.section scara +.section scarb +.section scasa +.section scasb +.section scata +.section scatb +.section scaua +.section scaub +.section scava +.section scavb +.section scawa +.section scawb +.section scaxa +.section scaxb +.section scaya +.section scayb +.section scaza +.section scazb +.section sca1a +.section sca1b +.section sca2a +.section sca2b +.section sca3a +.section sca3b +.section sca4a +.section sca4b +.section sca5a +.section sca5b +.section sca6a +.section sca6b +.section sca7a +.section sca7b +.section sca8a +.section sca8b +.section sca9a +.section sca9b +.section sca0a +.section sca0b +.section scbaa +.section scbab +.section scbba +.section scbbb +.section scbca +.section scbcb +.section scbda +.section scbdb +.section scbea +.section scbeb +.section scbfa +.section scbfb +.section scbga +.section scbgb +.section scbha +.section scbhb +.section scbia +.section scbib +.section scbja +.section scbjb +.section scbka +.section scbkb +.section scbla +.section scblb +.section scbma +.section scbmb +.section scbna +.section scbnb +.section scboa +.section scbob +.section scbpa +.section scbpb +.section scbqa +.section scbqb +.section scbra +.section scbrb +.section scbsa +.section scbsb +.section scbta +.section scbtb +.section scbua +.section scbub +.section scbva +.section scbvb +.section scbwa +.section scbwb +.section scbxa +.section scbxb +.section scbya +.section scbyb +.section scbza +.section scbzb +.section scb1a +.section scb1b +.section scb2a +.section scb2b +.section scb3a +.section scb3b +.section scb4a +.section scb4b +.section scb5a +.section scb5b +.section scb6a +.section scb6b +.section scb7a +.section scb7b +.section scb8a +.section scb8b +.section scb9a +.section scb9b +.section scb0a +.section scb0b +.section sccaa +.section sccab +.section sccba +.section sccbb +.section sccca +.section scccb +.section sccda +.section sccdb +.section sccea +.section scceb +.section sccfa +.section sccfb +.section sccga +.section sccgb +.section sccha +.section scchb +.section sccia +.section sccib +.section sccja +.section sccjb +.section sccka +.section scckb +.section sccla +.section scclb +.section sccma +.section sccmb +.section sccna +.section sccnb +.section sccoa +.section sccob +.section sccpa +.section sccpb +.section sccqa +.section sccqb +.section sccra +.section sccrb +.section sccsa +.section sccsb +.section sccta +.section scctb +.section sccua +.section sccub +.section sccva +.section sccvb +.section sccwa +.section sccwb +.section sccxa +.section sccxb +.section sccya +.section sccyb +.section sccza +.section scczb +.section scc1a +.section scc1b +.section scc2a +.section scc2b +.section scc3a +.section scc3b +.section scc4a +.section scc4b +.section scc5a +.section scc5b +.section scc6a +.section scc6b +.section scc7a +.section scc7b +.section scc8a +.section scc8b +.section scc9a +.section scc9b +.section scc0a +.section scc0b +.section scdaa +.section scdab +.section scdba +.section scdbb +.section scdca +.section scdcb +.section scdda +.section scddb +.section scdea +.section scdeb +.section scdfa +.section scdfb +.section scdga +.section scdgb +.section scdha +.section scdhb +.section scdia +.section scdib +.section scdja +.section scdjb +.section scdka +.section scdkb +.section scdla +.section scdlb +.section scdma +.section scdmb +.section scdna +.section scdnb +.section scdoa +.section scdob +.section scdpa +.section scdpb +.section scdqa +.section scdqb +.section scdra +.section scdrb +.section scdsa +.section scdsb +.section scdta +.section scdtb +.section scdua +.section scdub +.section scdva +.section scdvb +.section scdwa +.section scdwb +.section scdxa +.section scdxb +.section scdya +.section scdyb +.section scdza +.section scdzb +.section scd1a +.section scd1b +.section scd2a +.section scd2b +.section scd3a +.section scd3b +.section scd4a +.section scd4b +.section scd5a +.section scd5b +.section scd6a +.section scd6b +.section scd7a +.section scd7b +.section scd8a +.section scd8b +.section scd9a +.section scd9b +.section scd0a +.section scd0b +.section sceaa +.section sceab +.section sceba +.section scebb +.section sceca +.section scecb +.section sceda +.section scedb +.section sceea +.section sceeb +.section scefa +.section scefb +.section scega +.section scegb +.section sceha +.section scehb +.section sceia +.section sceib +.section sceja +.section scejb +.section sceka +.section scekb +.section scela +.section scelb +.section scema +.section scemb +.section scena +.section scenb +.section sceoa +.section sceob +.section scepa +.section scepb +.section sceqa +.section sceqb +.section scera +.section scerb +.section scesa +.section scesb +.section sceta +.section scetb +.section sceua +.section sceub +.section sceva +.section scevb +.section scewa +.section scewb +.section scexa +.section scexb +.section sceya +.section sceyb +.section sceza +.section scezb +.section sce1a +.section sce1b +.section sce2a +.section sce2b +.section sce3a +.section sce3b +.section sce4a +.section sce4b +.section sce5a +.section sce5b +.section sce6a +.section sce6b +.section sce7a +.section sce7b +.section sce8a +.section sce8b +.section sce9a +.section sce9b +.section sce0a +.section sce0b +.section scfaa +.section scfab +.section scfba +.section scfbb +.section scfca +.section scfcb +.section scfda +.section scfdb +.section scfea +.section scfeb +.section scffa +.section scffb +.section scfga +.section scfgb +.section scfha +.section scfhb +.section scfia +.section scfib +.section scfja +.section scfjb +.section scfka +.section scfkb +.section scfla +.section scflb +.section scfma +.section scfmb +.section scfna +.section scfnb +.section scfoa +.section scfob +.section scfpa +.section scfpb +.section scfqa +.section scfqb +.section scfra +.section scfrb +.section scfsa +.section scfsb +.section scfta +.section scftb +.section scfua +.section scfub +.section scfva +.section scfvb +.section scfwa +.section scfwb +.section scfxa +.section scfxb +.section scfya +.section scfyb +.section scfza +.section scfzb +.section scf1a +.section scf1b +.section scf2a +.section scf2b +.section scf3a +.section scf3b +.section scf4a +.section scf4b +.section scf5a +.section scf5b +.section scf6a +.section scf6b +.section scf7a +.section scf7b +.section scf8a +.section scf8b +.section scf9a +.section scf9b +.section scf0a +.section scf0b +.section scgaa +.section scgab +.section scgba +.section scgbb +.section scgca +.section scgcb +.section scgda +.section scgdb +.section scgea +.section scgeb +.section scgfa +.section scgfb +.section scgga +.section scggb +.section scgha +.section scghb +.section scgia +.section scgib +.section scgja +.section scgjb +.section scgka +.section scgkb +.section scgla +.section scglb +.section scgma +.section scgmb +.section scgna +.section scgnb +.section scgoa +.section scgob +.section scgpa +.section scgpb +.section scgqa +.section scgqb +.section scgra +.section scgrb +.section scgsa +.section scgsb +.section scgta +.section scgtb +.section scgua +.section scgub +.section scgva +.section scgvb +.section scgwa +.section scgwb +.section scgxa +.section scgxb +.section scgya +.section scgyb +.section scgza +.section scgzb +.section scg1a +.section scg1b +.section scg2a +.section scg2b +.section scg3a +.section scg3b +.section scg4a +.section scg4b +.section scg5a +.section scg5b +.section scg6a +.section scg6b +.section scg7a +.section scg7b +.section scg8a +.section scg8b +.section scg9a +.section scg9b +.section scg0a +.section scg0b +.section schaa +.section schab +.section schba +.section schbb +.section schca +.section schcb +.section schda +.section schdb +.section schea +.section scheb +.section schfa +.section schfb +.section schga +.section schgb +.section schha +.section schhb +.section schia +.section schib +.section schja +.section schjb +.section schka +.section schkb +.section schla +.section schlb +.section schma +.section schmb +.section schna +.section schnb +.section schoa +.section schob +.section schpa +.section schpb +.section schqa +.section schqb +.section schra +.section schrb +.section schsa +.section schsb +.section schta +.section schtb +.section schua +.section schub +.section schva +.section schvb +.section schwa +.section schwb +.section schxa +.section schxb +.section schya +.section schyb +.section schza +.section schzb +.section sch1a +.section sch1b +.section sch2a +.section sch2b +.section sch3a +.section sch3b +.section sch4a +.section sch4b +.section sch5a +.section sch5b +.section sch6a +.section sch6b +.section sch7a +.section sch7b +.section sch8a +.section sch8b +.section sch9a +.section sch9b +.section sch0a +.section sch0b +.section sciaa +.section sciab +.section sciba +.section scibb +.section scica +.section scicb +.section scida +.section scidb +.section sciea +.section scieb +.section scifa +.section scifb +.section sciga +.section scigb +.section sciha +.section scihb +.section sciia +.section sciib +.section scija +.section scijb +.section scika +.section scikb +.section scila +.section scilb +.section scima +.section scimb +.section scina +.section scinb +.section scioa +.section sciob +.section scipa +.section scipb +.section sciqa +.section sciqb +.section scira +.section scirb +.section scisa +.section scisb +.section scita +.section scitb +.section sciua +.section sciub +.section sciva +.section scivb +.section sciwa +.section sciwb +.section scixa +.section scixb +.section sciya +.section sciyb +.section sciza +.section scizb +.section sci1a +.section sci1b +.section sci2a +.section sci2b +.section sci3a +.section sci3b +.section sci4a +.section sci4b +.section sci5a +.section sci5b +.section sci6a +.section sci6b +.section sci7a +.section sci7b +.section sci8a +.section sci8b +.section sci9a +.section sci9b +.section sci0a +.section sci0b +.section scjaa +.section scjab +.section scjba +.section scjbb +.section scjca +.section scjcb +.section scjda +.section scjdb +.section scjea +.section scjeb +.section scjfa +.section scjfb +.section scjga +.section scjgb +.section scjha +.section scjhb +.section scjia +.section scjib +.section scjja +.section scjjb +.section scjka +.section scjkb +.section scjla +.section scjlb +.section scjma +.section scjmb +.section scjna +.section scjnb +.section scjoa +.section scjob +.section scjpa +.section scjpb +.section scjqa +.section scjqb +.section scjra +.section scjrb +.section scjsa +.section scjsb +.section scjta +.section scjtb +.section scjua +.section scjub +.section scjva +.section scjvb +.section scjwa +.section scjwb +.section scjxa +.section scjxb +.section scjya +.section scjyb +.section scjza +.section scjzb +.section scj1a +.section scj1b +.section scj2a +.section scj2b +.section scj3a +.section scj3b +.section scj4a +.section scj4b +.section scj5a +.section scj5b +.section scj6a +.section scj6b +.section scj7a +.section scj7b +.section scj8a +.section scj8b +.section scj9a +.section scj9b +.section scj0a +.section scj0b +.section sckaa +.section sckab +.section sckba +.section sckbb +.section sckca +.section sckcb +.section sckda +.section sckdb +.section sckea +.section sckeb +.section sckfa +.section sckfb +.section sckga +.section sckgb +.section sckha +.section sckhb +.section sckia +.section sckib +.section sckja +.section sckjb +.section sckka +.section sckkb +.section sckla +.section scklb +.section sckma +.section sckmb +.section sckna +.section scknb +.section sckoa +.section sckob +.section sckpa +.section sckpb +.section sckqa +.section sckqb +.section sckra +.section sckrb +.section scksa +.section scksb +.section sckta +.section scktb +.section sckua +.section sckub +.section sckva +.section sckvb +.section sckwa +.section sckwb +.section sckxa +.section sckxb +.section sckya +.section sckyb +.section sckza +.section sckzb +.section sck1a +.section sck1b +.section sck2a +.section sck2b +.section sck3a +.section sck3b +.section sck4a +.section sck4b +.section sck5a +.section sck5b +.section sck6a +.section sck6b +.section sck7a +.section sck7b +.section sck8a +.section sck8b +.section sck9a +.section sck9b +.section sck0a +.section sck0b +.section sclaa +.section sclab +.section sclba +.section sclbb +.section sclca +.section sclcb +.section sclda +.section scldb +.section sclea +.section scleb +.section sclfa +.section sclfb +.section sclga +.section sclgb +.section sclha +.section sclhb +.section sclia +.section sclib +.section sclja +.section scljb +.section sclka +.section sclkb +.section sclla +.section scllb +.section sclma +.section sclmb +.section sclna +.section sclnb +.section scloa +.section sclob +.section sclpa +.section sclpb +.section sclqa +.section sclqb +.section sclra +.section sclrb +.section sclsa +.section sclsb +.section sclta +.section scltb +.section sclua +.section sclub +.section sclva +.section sclvb +.section sclwa +.section sclwb +.section sclxa +.section sclxb +.section sclya +.section sclyb +.section sclza +.section sclzb +.section scl1a +.section scl1b +.section scl2a +.section scl2b +.section scl3a +.section scl3b +.section scl4a +.section scl4b +.section scl5a +.section scl5b +.section scl6a +.section scl6b +.section scl7a +.section scl7b +.section scl8a +.section scl8b +.section scl9a +.section scl9b +.section scl0a +.section scl0b +.section scmaa +.section scmab +.section scmba +.section scmbb +.section scmca +.section scmcb +.section scmda +.section scmdb +.section scmea +.section scmeb +.section scmfa +.section scmfb +.section scmga +.section scmgb +.section scmha +.section scmhb +.section scmia +.section scmib +.section scmja +.section scmjb +.section scmka +.section scmkb +.section scmla +.section scmlb +.section scmma +.section scmmb +.section scmna +.section scmnb +.section scmoa +.section scmob +.section scmpa +.section scmpb +.section scmqa +.section scmqb +.section scmra +.section scmrb +.section scmsa +.section scmsb +.section scmta +.section scmtb +.section scmua +.section scmub +.section scmva +.section scmvb +.section scmwa +.section scmwb +.section scmxa +.section scmxb +.section scmya +.section scmyb +.section scmza +.section scmzb +.section scm1a +.section scm1b +.section scm2a +.section scm2b +.section scm3a +.section scm3b +.section scm4a +.section scm4b +.section scm5a +.section scm5b +.section scm6a +.section scm6b +.section scm7a +.section scm7b +.section scm8a +.section scm8b +.section scm9a +.section scm9b +.section scm0a +.section scm0b +.section scnaa +.section scnab +.section scnba +.section scnbb +.section scnca +.section scncb +.section scnda +.section scndb +.section scnea +.section scneb +.section scnfa +.section scnfb +.section scnga +.section scngb +.section scnha +.section scnhb +.section scnia +.section scnib +.section scnja +.section scnjb +.section scnka +.section scnkb +.section scnla +.section scnlb +.section scnma +.section scnmb +.section scnna +.section scnnb +.section scnoa +.section scnob +.section scnpa +.section scnpb +.section scnqa +.section scnqb +.section scnra +.section scnrb +.section scnsa +.section scnsb +.section scnta +.section scntb +.section scnua +.section scnub +.section scnva +.section scnvb +.section scnwa +.section scnwb +.section scnxa +.section scnxb +.section scnya +.section scnyb +.section scnza +.section scnzb +.section scn1a +.section scn1b +.section scn2a +.section scn2b +.section scn3a +.section scn3b +.section scn4a +.section scn4b +.section scn5a +.section scn5b +.section scn6a +.section scn6b +.section scn7a +.section scn7b +.section scn8a +.section scn8b +.section scn9a +.section scn9b +.section scn0a +.section scn0b +.section scoaa +.section scoab +.section scoba +.section scobb +.section scoca +.section scocb +.section scoda +.section scodb +.section scoea +.section scoeb +.section scofa +.section scofb +.section scoga +.section scogb +.section scoha +.section scohb +.section scoia +.section scoib +.section scoja +.section scojb +.section scoka +.section scokb +.section scola +.section scolb +.section scoma +.section scomb +.section scona +.section sconb +.section scooa +.section scoob +.section scopa +.section scopb +.section scoqa +.section scoqb +.section scora +.section scorb +.section scosa +.section scosb +.section scota +.section scotb +.section scoua +.section scoub +.section scova +.section scovb +.section scowa +.section scowb +.section scoxa +.section scoxb +.section scoya +.section scoyb +.section scoza +.section scozb +.section sco1a +.section sco1b +.section sco2a +.section sco2b +.section sco3a +.section sco3b +.section sco4a +.section sco4b +.section sco5a +.section sco5b +.section sco6a +.section sco6b +.section sco7a +.section sco7b +.section sco8a +.section sco8b +.section sco9a +.section sco9b +.section sco0a +.section sco0b +.section scpaa +.section scpab +.section scpba +.section scpbb +.section scpca +.section scpcb +.section scpda +.section scpdb +.section scpea +.section scpeb +.section scpfa +.section scpfb +.section scpga +.section scpgb +.section scpha +.section scphb +.section scpia +.section scpib +.section scpja +.section scpjb +.section scpka +.section scpkb +.section scpla +.section scplb +.section scpma +.section scpmb +.section scpna +.section scpnb +.section scpoa +.section scpob +.section scppa +.section scppb +.section scpqa +.section scpqb +.section scpra +.section scprb +.section scpsa +.section scpsb +.section scpta +.section scptb +.section scpua +.section scpub +.section scpva +.section scpvb +.section scpwa +.section scpwb +.section scpxa +.section scpxb +.section scpya +.section scpyb +.section scpza +.section scpzb +.section scp1a +.section scp1b +.section scp2a +.section scp2b +.section scp3a +.section scp3b +.section scp4a +.section scp4b +.section scp5a +.section scp5b +.section scp6a +.section scp6b +.section scp7a +.section scp7b +.section scp8a +.section scp8b +.section scp9a +.section scp9b +.section scp0a +.section scp0b +.section scqaa +.section scqab +.section scqba +.section scqbb +.section scqca +.section scqcb +.section scqda +.section scqdb +.section scqea +.section scqeb +.section scqfa +.section scqfb +.section scqga +.section scqgb +.section scqha +.section scqhb +.section scqia +.section scqib +.section scqja +.section scqjb +.section scqka +.section scqkb +.section scqla +.section scqlb +.section scqma +.section scqmb +.section scqna +.section scqnb +.section scqoa +.section scqob +.section scqpa +.section scqpb +.section scqqa +.section scqqb +.section scqra +.section scqrb +.section scqsa +.section scqsb +.section scqta +.section scqtb +.section scqua +.section scqub +.section scqva +.section scqvb +.section scqwa +.section scqwb +.section scqxa +.section scqxb +.section scqya +.section scqyb +.section scqza +.section scqzb +.section scq1a +.section scq1b +.section scq2a +.section scq2b +.section scq3a +.section scq3b +.section scq4a +.section scq4b +.section scq5a +.section scq5b +.section scq6a +.section scq6b +.section scq7a +.section scq7b +.section scq8a +.section scq8b +.section scq9a +.section scq9b +.section scq0a +.section scq0b +.section scraa +.section scrab +.section scrba +.section scrbb +.section scrca +.section scrcb +.section scrda +.section scrdb +.section screa +.section screb +.section scrfa +.section scrfb +.section scrga +.section scrgb +.section scrha +.section scrhb +.section scria +.section scrib +.section scrja +.section scrjb +.section scrka +.section scrkb +.section scrla +.section scrlb +.section scrma +.section scrmb +.section scrna +.section scrnb +.section scroa +.section scrob +.section scrpa +.section scrpb +.section scrqa +.section scrqb +.section scrra +.section scrrb +.section scrsa +.section scrsb +.section scrta +.section scrtb +.section scrua +.section scrub +.section scrva +.section scrvb +.section scrwa +.section scrwb +.section scrxa +.section scrxb +.section scrya +.section scryb +.section scrza +.section scrzb +.section scr1a +.section scr1b +.section scr2a +.section scr2b +.section scr3a +.section scr3b +.section scr4a +.section scr4b +.section scr5a +.section scr5b +.section scr6a +.section scr6b +.section scr7a +.section scr7b +.section scr8a +.section scr8b +.section scr9a +.section scr9b +.section scr0a +.section scr0b +.section scsaa +.section scsab +.section scsba +.section scsbb +.section scsca +.section scscb +.section scsda +.section scsdb +.section scsea +.section scseb +.section scsfa +.section scsfb +.section scsga +.section scsgb +.section scsha +.section scshb +.section scsia +.section scsib +.section scsja +.section scsjb +.section scska +.section scskb +.section scsla +.section scslb +.section scsma +.section scsmb +.section scsna +.section scsnb +.section scsoa +.section scsob +.section scspa +.section scspb +.section scsqa +.section scsqb +.section scsra +.section scsrb +.section scssa +.section scssb +.section scsta +.section scstb +.section scsua +.section scsub +.section scsva +.section scsvb +.section scswa +.section scswb +.section scsxa +.section scsxb +.section scsya +.section scsyb +.section scsza +.section scszb +.section scs1a +.section scs1b +.section scs2a +.section scs2b +.section scs3a +.section scs3b +.section scs4a +.section scs4b +.section scs5a +.section scs5b +.section scs6a +.section scs6b +.section scs7a +.section scs7b +.section scs8a +.section scs8b +.section scs9a +.section scs9b +.section scs0a +.section scs0b +.section sctaa +.section sctab +.section sctba +.section sctbb +.section sctca +.section sctcb +.section sctda +.section sctdb +.section sctea +.section scteb +.section sctfa +.section sctfb +.section sctga +.section sctgb +.section sctha +.section scthb +.section sctia +.section sctib +.section sctja +.section sctjb +.section sctka +.section sctkb +.section sctla +.section sctlb +.section sctma +.section sctmb +.section sctna +.section sctnb +.section sctoa +.section sctob +.section sctpa +.section sctpb +.section sctqa +.section sctqb +.section sctra +.section sctrb +.section sctsa +.section sctsb +.section sctta +.section scttb +.section sctua +.section sctub +.section sctva +.section sctvb +.section sctwa +.section sctwb +.section sctxa +.section sctxb +.section sctya +.section sctyb +.section sctza +.section sctzb +.section sct1a +.section sct1b +.section sct2a +.section sct2b +.section sct3a +.section sct3b +.section sct4a +.section sct4b +.section sct5a +.section sct5b +.section sct6a +.section sct6b +.section sct7a +.section sct7b +.section sct8a +.section sct8b +.section sct9a +.section sct9b +.section sct0a +.section sct0b +.section scuaa +.section scuab +.section scuba +.section scubb +.section scuca +.section scucb +.section scuda +.section scudb +.section scuea +.section scueb +.section scufa +.section scufb +.section scuga +.section scugb +.section scuha +.section scuhb +.section scuia +.section scuib +.section scuja +.section scujb +.section scuka +.section scukb +.section scula +.section sculb +.section scuma +.section scumb +.section scuna +.section scunb +.section scuoa +.section scuob +.section scupa +.section scupb +.section scuqa +.section scuqb +.section scura +.section scurb +.section scusa +.section scusb +.section scuta +.section scutb +.section scuua +.section scuub +.section scuva +.section scuvb +.section scuwa +.section scuwb +.section scuxa +.section scuxb +.section scuya +.section scuyb +.section scuza +.section scuzb +.section scu1a +.section scu1b +.section scu2a +.section scu2b +.section scu3a +.section scu3b +.section scu4a +.section scu4b +.section scu5a +.section scu5b +.section scu6a +.section scu6b +.section scu7a +.section scu7b +.section scu8a +.section scu8b +.section scu9a +.section scu9b +.section scu0a +.section scu0b +.section scvaa +.section scvab +.section scvba +.section scvbb +.section scvca +.section scvcb +.section scvda +.section scvdb +.section scvea +.section scveb +.section scvfa +.section scvfb +.section scvga +.section scvgb +.section scvha +.section scvhb +.section scvia +.section scvib +.section scvja +.section scvjb +.section scvka +.section scvkb +.section scvla +.section scvlb +.section scvma +.section scvmb +.section scvna +.section scvnb +.section scvoa +.section scvob +.section scvpa +.section scvpb +.section scvqa +.section scvqb +.section scvra +.section scvrb +.section scvsa +.section scvsb +.section scvta +.section scvtb +.section scvua +.section scvub +.section scvva +.section scvvb +.section scvwa +.section scvwb +.section scvxa +.section scvxb +.section scvya +.section scvyb +.section scvza +.section scvzb +.section scv1a +.section scv1b +.section scv2a +.section scv2b +.section scv3a +.section scv3b +.section scv4a +.section scv4b +.section scv5a +.section scv5b +.section scv6a +.section scv6b +.section scv7a +.section scv7b +.section scv8a +.section scv8b +.section scv9a +.section scv9b +.section scv0a +.section scv0b +.section scwaa +.section scwab +.section scwba +.section scwbb +.section scwca +.section scwcb +.section scwda +.section scwdb +.section scwea +.section scweb +.section scwfa +.section scwfb +.section scwga +.section scwgb +.section scwha +.section scwhb +.section scwia +.section scwib +.section scwja +.section scwjb +.section scwka +.section scwkb +.section scwla +.section scwlb +.section scwma +.section scwmb +.section scwna +.section scwnb +.section scwoa +.section scwob +.section scwpa +.section scwpb +.section scwqa +.section scwqb +.section scwra +.section scwrb +.section scwsa +.section scwsb +.section scwta +.section scwtb +.section scwua +.section scwub +.section scwva +.section scwvb +.section scwwa +.section scwwb +.section scwxa +.section scwxb +.section scwya +.section scwyb +.section scwza +.section scwzb +.section scw1a +.section scw1b +.section scw2a +.section scw2b +.section scw3a +.section scw3b +.section scw4a +.section scw4b +.section scw5a +.section scw5b +.section scw6a +.section scw6b +.section scw7a +.section scw7b +.section scw8a +.section scw8b +.section scw9a +.section scw9b +.section scw0a +.section scw0b +.section scxaa +.section scxab +.section scxba +.section scxbb +.section scxca +.section scxcb +.section scxda +.section scxdb +.section scxea +.section scxeb +.section scxfa +.section scxfb +.section scxga +.section scxgb +.section scxha +.section scxhb +.section scxia +.section scxib +.section scxja +.section scxjb +.section scxka +.section scxkb +.section scxla +.section scxlb +.section scxma +.section scxmb +.section scxna +.section scxnb +.section scxoa +.section scxob +.section scxpa +.section scxpb +.section scxqa +.section scxqb +.section scxra +.section scxrb +.section scxsa +.section scxsb +.section scxta +.section scxtb +.section scxua +.section scxub +.section scxva +.section scxvb +.section scxwa +.section scxwb +.section scxxa +.section scxxb +.section scxya +.section scxyb +.section scxza +.section scxzb +.section scx1a +.section scx1b +.section scx2a +.section scx2b +.section scx3a +.section scx3b +.section scx4a +.section scx4b +.section scx5a +.section scx5b +.section scx6a +.section scx6b +.section scx7a +.section scx7b +.section scx8a +.section scx8b +.section scx9a +.section scx9b +.section scx0a +.section scx0b +.section scyaa +.section scyab +.section scyba +.section scybb +.section scyca +.section scycb +.section scyda +.section scydb +.section scyea +.section scyeb +.section scyfa +.section scyfb +.section scyga +.section scygb +.section scyha +.section scyhb +.section scyia +.section scyib +.section scyja +.section scyjb +.section scyka +.section scykb +.section scyla +.section scylb +.section scyma +.section scymb +.section scyna +.section scynb +.section scyoa +.section scyob +.section scypa +.section scypb +.section scyqa +.section scyqb +.section scyra +.section scyrb +.section scysa +.section scysb +.section scyta +.section scytb +.section scyua +.section scyub +.section scyva +.section scyvb +.section scywa +.section scywb +.section scyxa +.section scyxb +.section scyya +.section scyyb +.section scyza +.section scyzb +.section scy1a +.section scy1b +.section scy2a +.section scy2b +.section scy3a +.section scy3b +.section scy4a +.section scy4b +.section scy5a +.section scy5b +.section scy6a +.section scy6b +.section scy7a +.section scy7b +.section scy8a +.section scy8b +.section scy9a +.section scy9b +.section scy0a +.section scy0b +.section sczaa +.section sczab +.section sczba +.section sczbb +.section sczca +.section sczcb +.section sczda +.section sczdb +.section sczea +.section sczeb +.section sczfa +.section sczfb +.section sczga +.section sczgb +.section sczha +.section sczhb +.section sczia +.section sczib +.section sczja +.section sczjb +.section sczka +.section sczkb +.section sczla +.section sczlb +.section sczma +.section sczmb +.section sczna +.section scznb +.section sczoa +.section sczob +.section sczpa +.section sczpb +.section sczqa +.section sczqb +.section sczra +.section sczrb +.section sczsa +.section sczsb +.section sczta +.section scztb +.section sczua +.section sczub +.section sczva +.section sczvb +.section sczwa +.section sczwb +.section sczxa +.section sczxb +.section sczya +.section sczyb +.section sczza +.section sczzb +.section scz1a +.section scz1b +.section scz2a +.section scz2b +.section scz3a +.section scz3b +.section scz4a +.section scz4b +.section scz5a +.section scz5b +.section scz6a +.section scz6b +.section scz7a +.section scz7b +.section scz8a +.section scz8b +.section scz9a +.section scz9b +.section scz0a +.section scz0b +.section sc1aa +.section sc1ab +.section sc1ba +.section sc1bb +.section sc1ca +.section sc1cb +.section sc1da +.section sc1db +.section sc1ea +.section sc1eb +.section sc1fa +.section sc1fb +.section sc1ga +.section sc1gb +.section sc1ha +.section sc1hb +.section sc1ia +.section sc1ib +.section sc1ja +.section sc1jb +.section sc1ka +.section sc1kb +.section sc1la +.section sc1lb +.section sc1ma +.section sc1mb +.section sc1na +.section sc1nb +.section sc1oa +.section sc1ob +.section sc1pa +.section sc1pb +.section sc1qa +.section sc1qb +.section sc1ra +.section sc1rb +.section sc1sa +.section sc1sb +.section sc1ta +.section sc1tb +.section sc1ua +.section sc1ub +.section sc1va +.section sc1vb +.section sc1wa +.section sc1wb +.section sc1xa +.section sc1xb +.section sc1ya +.section sc1yb +.section sc1za +.section sc1zb +.section sc11a +.section sc11b +.section sc12a +.section sc12b +.section sc13a +.section sc13b +.section sc14a +.section sc14b +.section sc15a +.section sc15b +.section sc16a +.section sc16b +.section sc17a +.section sc17b +.section sc18a +.section sc18b +.section sc19a +.section sc19b +.section sc10a +.section sc10b +.section sc2aa +.section sc2ab +.section sc2ba +.section sc2bb +.section sc2ca +.section sc2cb +.section sc2da +.section sc2db +.section sc2ea +.section sc2eb +.section sc2fa +.section sc2fb +.section sc2ga +.section sc2gb +.section sc2ha +.section sc2hb +.section sc2ia +.section sc2ib +.section sc2ja +.section sc2jb +.section sc2ka +.section sc2kb +.section sc2la +.section sc2lb +.section sc2ma +.section sc2mb +.section sc2na +.section sc2nb +.section sc2oa +.section sc2ob +.section sc2pa +.section sc2pb +.section sc2qa +.section sc2qb +.section sc2ra +.section sc2rb +.section sc2sa +.section sc2sb +.section sc2ta +.section sc2tb +.section sc2ua +.section sc2ub +.section sc2va +.section sc2vb +.section sc2wa +.section sc2wb +.section sc2xa +.section sc2xb +.section sc2ya +.section sc2yb +.section sc2za +.section sc2zb +.section sc21a +.section sc21b +.section sc22a +.section sc22b +.section sc23a +.section sc23b +.section sc24a +.section sc24b +.section sc25a +.section sc25b +.section sc26a +.section sc26b +.section sc27a +.section sc27b +.section sc28a +.section sc28b +.section sc29a +.section sc29b +.section sc20a +.section sc20b +.section sc3aa +.section sc3ab +.section sc3ba +.section sc3bb +.section sc3ca +.section sc3cb +.section sc3da +.section sc3db +.section sc3ea +.section sc3eb +.section sc3fa +.section sc3fb +.section sc3ga +.section sc3gb +.section sc3ha +.section sc3hb +.section sc3ia +.section sc3ib +.section sc3ja +.section sc3jb +.section sc3ka +.section sc3kb +.section sc3la +.section sc3lb +.section sc3ma +.section sc3mb +.section sc3na +.section sc3nb +.section sc3oa +.section sc3ob +.section sc3pa +.section sc3pb +.section sc3qa +.section sc3qb +.section sc3ra +.section sc3rb +.section sc3sa +.section sc3sb +.section sc3ta +.section sc3tb +.section sc3ua +.section sc3ub +.section sc3va +.section sc3vb +.section sc3wa +.section sc3wb +.section sc3xa +.section sc3xb +.section sc3ya +.section sc3yb +.section sc3za +.section sc3zb +.section sc31a +.section sc31b +.section sc32a +.section sc32b +.section sc33a +.section sc33b +.section sc34a +.section sc34b +.section sc35a +.section sc35b +.section sc36a +.section sc36b +.section sc37a +.section sc37b +.section sc38a +.section sc38b +.section sc39a +.section sc39b +.section sc30a +.section sc30b +.section sc4aa +.section sc4ab +.section sc4ba +.section sc4bb +.section sc4ca +.section sc4cb +.section sc4da +.section sc4db +.section sc4ea +.section sc4eb +.section sc4fa +.section sc4fb +.section sc4ga +.section sc4gb +.section sc4ha +.section sc4hb +.section sc4ia +.section sc4ib +.section sc4ja +.section sc4jb +.section sc4ka +.section sc4kb +.section sc4la +.section sc4lb +.section sc4ma +.section sc4mb +.section sc4na +.section sc4nb +.section sc4oa +.section sc4ob +.section sc4pa +.section sc4pb +.section sc4qa +.section sc4qb +.section sc4ra +.section sc4rb +.section sc4sa +.section sc4sb +.section sc4ta +.section sc4tb +.section sc4ua +.section sc4ub +.section sc4va +.section sc4vb +.section sc4wa +.section sc4wb +.section sc4xa +.section sc4xb +.section sc4ya +.section sc4yb +.section sc4za +.section sc4zb +.section sc41a +.section sc41b +.section sc42a +.section sc42b +.section sc43a +.section sc43b +.section sc44a +.section sc44b +.section sc45a +.section sc45b +.section sc46a +.section sc46b +.section sc47a +.section sc47b +.section sc48a +.section sc48b +.section sc49a +.section sc49b +.section sc40a +.section sc40b +.section sc5aa +.section sc5ab +.section sc5ba +.section sc5bb +.section sc5ca +.section sc5cb +.section sc5da +.section sc5db +.section sc5ea +.section sc5eb +.section sc5fa +.section sc5fb +.section sc5ga +.section sc5gb +.section sc5ha +.section sc5hb +.section sc5ia +.section sc5ib +.section sc5ja +.section sc5jb +.section sc5ka +.section sc5kb +.section sc5la +.section sc5lb +.section sc5ma +.section sc5mb +.section sc5na +.section sc5nb +.section sc5oa +.section sc5ob +.section sc5pa +.section sc5pb +.section sc5qa +.section sc5qb +.section sc5ra +.section sc5rb +.section sc5sa +.section sc5sb +.section sc5ta +.section sc5tb +.section sc5ua +.section sc5ub +.section sc5va +.section sc5vb +.section sc5wa +.section sc5wb +.section sc5xa +.section sc5xb +.section sc5ya +.section sc5yb +.section sc5za +.section sc5zb +.section sc51a +.section sc51b +.section sc52a +.section sc52b +.section sc53a +.section sc53b +.section sc54a +.section sc54b +.section sc55a +.section sc55b +.section sc56a +.section sc56b +.section sc57a +.section sc57b +.section sc58a +.section sc58b +.section sc59a +.section sc59b +.section sc50a +.section sc50b +.section sc6aa +.section sc6ab +.section sc6ba +.section sc6bb +.section sc6ca +.section sc6cb +.section sc6da +.section sc6db +.section sc6ea +.section sc6eb +.section sc6fa +.section sc6fb +.section sc6ga +.section sc6gb +.section sc6ha +.section sc6hb +.section sc6ia +.section sc6ib +.section sc6ja +.section sc6jb +.section sc6ka +.section sc6kb +.section sc6la +.section sc6lb +.section sc6ma +.section sc6mb +.section sc6na +.section sc6nb +.section sc6oa +.section sc6ob +.section sc6pa +.section sc6pb +.section sc6qa +.section sc6qb +.section sc6ra +.section sc6rb +.section sc6sa +.section sc6sb +.section sc6ta +.section sc6tb +.section sc6ua +.section sc6ub +.section sc6va +.section sc6vb +.section sc6wa +.section sc6wb +.section sc6xa +.section sc6xb +.section sc6ya +.section sc6yb +.section sc6za +.section sc6zb +.section sc61a +.section sc61b +.section sc62a +.section sc62b +.section sc63a +.section sc63b +.section sc64a +.section sc64b +.section sc65a +.section sc65b +.section sc66a +.section sc66b +.section sc67a +.section sc67b +.section sc68a +.section sc68b +.section sc69a +.section sc69b +.section sc60a +.section sc60b +.section sc7aa +.section sc7ab +.section sc7ba +.section sc7bb +.section sc7ca +.section sc7cb +.section sc7da +.section sc7db +.section sc7ea +.section sc7eb +.section sc7fa +.section sc7fb +.section sc7ga +.section sc7gb +.section sc7ha +.section sc7hb +.section sc7ia +.section sc7ib +.section sc7ja +.section sc7jb +.section sc7ka +.section sc7kb +.section sc7la +.section sc7lb +.section sc7ma +.section sc7mb +.section sc7na +.section sc7nb +.section sc7oa +.section sc7ob +.section sc7pa +.section sc7pb +.section sc7qa +.section sc7qb +.section sc7ra +.section sc7rb +.section sc7sa +.section sc7sb +.section sc7ta +.section sc7tb +.section sc7ua +.section sc7ub +.section sc7va +.section sc7vb +.section sc7wa +.section sc7wb +.section sc7xa +.section sc7xb +.section sc7ya +.section sc7yb +.section sc7za +.section sc7zb +.section sc71a +.section sc71b +.section sc72a +.section sc72b +.section sc73a +.section sc73b +.section sc74a +.section sc74b +.section sc75a +.section sc75b +.section sc76a +.section sc76b +.section sc77a +.section sc77b +.section sc78a +.section sc78b +.section sc79a +.section sc79b +.section sc70a +.section sc70b +.section sc8aa +.section sc8ab +.section sc8ba +.section sc8bb +.section sc8ca +.section sc8cb +.section sc8da +.section sc8db +.section sc8ea +.section sc8eb +.section sc8fa +.section sc8fb +.section sc8ga +.section sc8gb +.section sc8ha +.section sc8hb +.section sc8ia +.section sc8ib +.section sc8ja +.section sc8jb +.section sc8ka +.section sc8kb +.section sc8la +.section sc8lb +.section sc8ma +.section sc8mb +.section sc8na +.section sc8nb +.section sc8oa +.section sc8ob +.section sc8pa +.section sc8pb +.section sc8qa +.section sc8qb +.section sc8ra +.section sc8rb +.section sc8sa +.section sc8sb +.section sc8ta +.section sc8tb +.section sc8ua +.section sc8ub +.section sc8va +.section sc8vb +.section sc8wa +.section sc8wb +.section sc8xa +.section sc8xb +.section sc8ya +.section sc8yb +.section sc8za +.section sc8zb +.section sc81a +.section sc81b +.section sc82a +.section sc82b +.section sc83a +.section sc83b +.section sc84a +.section sc84b +.section sc85a +.section sc85b +.section sc86a +.section sc86b +.section sc87a +.section sc87b +.section sc88a +.section sc88b +.section sc89a +.section sc89b +.section sc80a +.section sc80b +.section sc9aa +.section sc9ab +.section sc9ba +.section sc9bb +.section sc9ca +.section sc9cb +.section sc9da +.section sc9db +.section sc9ea +.section sc9eb +.section sc9fa +.section sc9fb +.section sc9ga +.section sc9gb +.section sc9ha +.section sc9hb +.section sc9ia +.section sc9ib +.section sc9ja +.section sc9jb +.section sc9ka +.section sc9kb +.section sc9la +.section sc9lb +.section sc9ma +.section sc9mb +.section sc9na +.section sc9nb +.section sc9oa +.section sc9ob +.section sc9pa +.section sc9pb +.section sc9qa +.section sc9qb +.section sc9ra +.section sc9rb +.section sc9sa +.section sc9sb +.section sc9ta +.section sc9tb +.section sc9ua +.section sc9ub +.section sc9va +.section sc9vb +.section sc9wa +.section sc9wb +.section sc9xa +.section sc9xb +.section sc9ya +.section sc9yb +.section sc9za +.section sc9zb +.section sc91a +.section sc91b +.section sc92a +.section sc92b +.section sc93a +.section sc93b +.section sc94a +.section sc94b +.section sc95a +.section sc95b +.section sc96a +.section sc96b +.section sc97a +.section sc97b +.section sc98a +.section sc98b +.section sc99a +.section sc99b +.section sc90a +.section sc90b +.section sc0aa +.section sc0ab +.section sc0ba +.section sc0bb +.section sc0ca +.section sc0cb +.section sc0da +.section sc0db +.section sc0ea +.section sc0eb +.section sc0fa +.section sc0fb +.section sc0ga +.section sc0gb +.section sc0ha +.section sc0hb +.section sc0ia +.section sc0ib +.section sc0ja +.section sc0jb +.section sc0ka +.section sc0kb +.section sc0la +.section sc0lb +.section sc0ma +.section sc0mb +.section sc0na +.section sc0nb +.section sc0oa +.section sc0ob +.section sc0pa +.section sc0pb +.section sc0qa +.section sc0qb +.section sc0ra +.section sc0rb +.section sc0sa +.section sc0sb +.section sc0ta +.section sc0tb +.section sc0ua +.section sc0ub +.section sc0va +.section sc0vb +.section sc0wa +.section sc0wb +.section sc0xa +.section sc0xb +.section sc0ya +.section sc0yb +.section sc0za +.section sc0zb +.section sc01a +.section sc01b +.section sc02a +.section sc02b +.section sc03a +.section sc03b +.section sc04a +.section sc04b +.section sc05a +.section sc05b +.section sc06a +.section sc06b +.section sc07a +.section sc07b +.section sc08a +.section sc08b +.section sc09a +.section sc09b +.section sc00a +.section sc00b +.section sdaaa +.section sdaab +.section sdaba +.section sdabb +.section sdaca +.section sdacb +.section sdada +.section sdadb +.section sdaea +.section sdaeb +.section sdafa +.section sdafb +.section sdaga +.section sdagb +.section sdaha +.section sdahb +.section sdaia +.section sdaib +.section sdaja +.section sdajb +.section sdaka +.section sdakb +.section sdala +.section sdalb +.section sdama +.section sdamb +.section sdana +.section sdanb +.section sdaoa +.section sdaob +.section sdapa +.section sdapb +.section sdaqa +.section sdaqb +.section sdara +.section sdarb +.section sdasa +.section sdasb +.section sdata +.section sdatb +.section sdaua +.section sdaub +.section sdava +.section sdavb +.section sdawa +.section sdawb +.section sdaxa +.section sdaxb +.section sdaya +.section sdayb +.section sdaza +.section sdazb +.section sda1a +.section sda1b +.section sda2a +.section sda2b +.section sda3a +.section sda3b +.section sda4a +.section sda4b +.section sda5a +.section sda5b +.section sda6a +.section sda6b +.section sda7a +.section sda7b +.section sda8a +.section sda8b +.section sda9a +.section sda9b +.section sda0a +.section sda0b +.section sdbaa +.section sdbab +.section sdbba +.section sdbbb +.section sdbca +.section sdbcb +.section sdbda +.section sdbdb +.section sdbea +.section sdbeb +.section sdbfa +.section sdbfb +.section sdbga +.section sdbgb +.section sdbha +.section sdbhb +.section sdbia +.section sdbib +.section sdbja +.section sdbjb +.section sdbka +.section sdbkb +.section sdbla +.section sdblb +.section sdbma +.section sdbmb +.section sdbna +.section sdbnb +.section sdboa +.section sdbob +.section sdbpa +.section sdbpb +.section sdbqa +.section sdbqb +.section sdbra +.section sdbrb +.section sdbsa +.section sdbsb +.section sdbta +.section sdbtb +.section sdbua +.section sdbub +.section sdbva +.section sdbvb +.section sdbwa +.section sdbwb +.section sdbxa +.section sdbxb +.section sdbya +.section sdbyb +.section sdbza +.section sdbzb +.section sdb1a +.section sdb1b +.section sdb2a +.section sdb2b +.section sdb3a +.section sdb3b +.section sdb4a +.section sdb4b +.section sdb5a +.section sdb5b +.section sdb6a +.section sdb6b +.section sdb7a +.section sdb7b +.section sdb8a +.section sdb8b +.section sdb9a +.section sdb9b +.section sdb0a +.section sdb0b +.section sdcaa +.section sdcab +.section sdcba +.section sdcbb +.section sdcca +.section sdccb +.section sdcda +.section sdcdb +.section sdcea +.section sdceb +.section sdcfa +.section sdcfb +.section sdcga +.section sdcgb +.section sdcha +.section sdchb +.section sdcia +.section sdcib +.section sdcja +.section sdcjb +.section sdcka +.section sdckb +.section sdcla +.section sdclb +.section sdcma +.section sdcmb +.section sdcna +.section sdcnb +.section sdcoa +.section sdcob +.section sdcpa +.section sdcpb +.section sdcqa +.section sdcqb +.section sdcra +.section sdcrb +.section sdcsa +.section sdcsb +.section sdcta +.section sdctb +.section sdcua +.section sdcub +.section sdcva +.section sdcvb +.section sdcwa +.section sdcwb +.section sdcxa +.section sdcxb +.section sdcya +.section sdcyb +.section sdcza +.section sdczb +.section sdc1a +.section sdc1b +.section sdc2a +.section sdc2b +.section sdc3a +.section sdc3b +.section sdc4a +.section sdc4b +.section sdc5a +.section sdc5b +.section sdc6a +.section sdc6b +.section sdc7a +.section sdc7b +.section sdc8a +.section sdc8b +.section sdc9a +.section sdc9b +.section sdc0a +.section sdc0b +.section sddaa +.section sddab +.section sddba +.section sddbb +.section sddca +.section sddcb +.section sddda +.section sdddb +.section sddea +.section sddeb +.section sddfa +.section sddfb +.section sddga +.section sddgb +.section sddha +.section sddhb +.section sddia +.section sddib +.section sddja +.section sddjb +.section sddka +.section sddkb +.section sddla +.section sddlb +.section sddma +.section sddmb +.section sddna +.section sddnb +.section sddoa +.section sddob +.section sddpa +.section sddpb +.section sddqa +.section sddqb +.section sddra +.section sddrb +.section sddsa +.section sddsb +.section sddta +.section sddtb +.section sddua +.section sddub +.section sddva +.section sddvb +.section sddwa +.section sddwb +.section sddxa +.section sddxb +.section sddya +.section sddyb +.section sddza +.section sddzb +.section sdd1a +.section sdd1b +.section sdd2a +.section sdd2b +.section sdd3a +.section sdd3b +.section sdd4a +.section sdd4b +.section sdd5a +.section sdd5b +.section sdd6a +.section sdd6b +.section sdd7a +.section sdd7b +.section sdd8a +.section sdd8b +.section sdd9a +.section sdd9b +.section sdd0a +.section sdd0b +.section sdeaa +.section sdeab +.section sdeba +.section sdebb +.section sdeca +.section sdecb +.section sdeda +.section sdedb +.section sdeea +.section sdeeb +.section sdefa +.section sdefb +.section sdega +.section sdegb +.section sdeha +.section sdehb +.section sdeia +.section sdeib +.section sdeja +.section sdejb +.section sdeka +.section sdekb +.section sdela +.section sdelb +.section sdema +.section sdemb +.section sdena +.section sdenb +.section sdeoa +.section sdeob +.section sdepa +.section sdepb +.section sdeqa +.section sdeqb +.section sdera +.section sderb +.section sdesa +.section sdesb +.section sdeta +.section sdetb +.section sdeua +.section sdeub +.section sdeva +.section sdevb +.section sdewa +.section sdewb +.section sdexa +.section sdexb +.section sdeya +.section sdeyb +.section sdeza +.section sdezb +.section sde1a +.section sde1b +.section sde2a +.section sde2b +.section sde3a +.section sde3b +.section sde4a +.section sde4b +.section sde5a +.section sde5b +.section sde6a +.section sde6b +.section sde7a +.section sde7b +.section sde8a +.section sde8b +.section sde9a +.section sde9b +.section sde0a +.section sde0b +.section sdfaa +.section sdfab +.section sdfba +.section sdfbb +.section sdfca +.section sdfcb +.section sdfda +.section sdfdb +.section sdfea +.section sdfeb +.section sdffa +.section sdffb +.section sdfga +.section sdfgb +.section sdfha +.section sdfhb +.section sdfia +.section sdfib +.section sdfja +.section sdfjb +.section sdfka +.section sdfkb +.section sdfla +.section sdflb +.section sdfma +.section sdfmb +.section sdfna +.section sdfnb +.section sdfoa +.section sdfob +.section sdfpa +.section sdfpb +.section sdfqa +.section sdfqb +.section sdfra +.section sdfrb +.section sdfsa +.section sdfsb +.section sdfta +.section sdftb +.section sdfua +.section sdfub +.section sdfva +.section sdfvb +.section sdfwa +.section sdfwb +.section sdfxa +.section sdfxb +.section sdfya +.section sdfyb +.section sdfza +.section sdfzb +.section sdf1a +.section sdf1b +.section sdf2a +.section sdf2b +.section sdf3a +.section sdf3b +.section sdf4a +.section sdf4b +.section sdf5a +.section sdf5b +.section sdf6a +.section sdf6b +.section sdf7a +.section sdf7b +.section sdf8a +.section sdf8b +.section sdf9a +.section sdf9b +.section sdf0a +.section sdf0b +.section sdgaa +.section sdgab +.section sdgba +.section sdgbb +.section sdgca +.section sdgcb +.section sdgda +.section sdgdb +.section sdgea +.section sdgeb +.section sdgfa +.section sdgfb +.section sdgga +.section sdggb +.section sdgha +.section sdghb +.section sdgia +.section sdgib +.section sdgja +.section sdgjb +.section sdgka +.section sdgkb +.section sdgla +.section sdglb +.section sdgma +.section sdgmb +.section sdgna +.section sdgnb +.section sdgoa +.section sdgob +.section sdgpa +.section sdgpb +.section sdgqa +.section sdgqb +.section sdgra +.section sdgrb +.section sdgsa +.section sdgsb +.section sdgta +.section sdgtb +.section sdgua +.section sdgub +.section sdgva +.section sdgvb +.section sdgwa +.section sdgwb +.section sdgxa +.section sdgxb +.section sdgya +.section sdgyb +.section sdgza +.section sdgzb +.section sdg1a +.section sdg1b +.section sdg2a +.section sdg2b +.section sdg3a +.section sdg3b +.section sdg4a +.section sdg4b +.section sdg5a +.section sdg5b +.section sdg6a +.section sdg6b +.section sdg7a +.section sdg7b +.section sdg8a +.section sdg8b +.section sdg9a +.section sdg9b +.section sdg0a +.section sdg0b +.section sdhaa +.section sdhab +.section sdhba +.section sdhbb +.section sdhca +.section sdhcb +.section sdhda +.section sdhdb +.section sdhea +.section sdheb +.section sdhfa +.section sdhfb +.section sdhga +.section sdhgb +.section sdhha +.section sdhhb +.section sdhia +.section sdhib +.section sdhja +.section sdhjb +.section sdhka +.section sdhkb +.section sdhla +.section sdhlb +.section sdhma +.section sdhmb +.section sdhna +.section sdhnb +.section sdhoa +.section sdhob +.section sdhpa +.section sdhpb +.section sdhqa +.section sdhqb +.section sdhra +.section sdhrb +.section sdhsa +.section sdhsb +.section sdhta +.section sdhtb +.section sdhua +.section sdhub +.section sdhva +.section sdhvb +.section sdhwa +.section sdhwb +.section sdhxa +.section sdhxb +.section sdhya +.section sdhyb +.section sdhza +.section sdhzb +.section sdh1a +.section sdh1b +.section sdh2a +.section sdh2b +.section sdh3a +.section sdh3b +.section sdh4a +.section sdh4b +.section sdh5a +.section sdh5b +.section sdh6a +.section sdh6b +.section sdh7a +.section sdh7b +.section sdh8a +.section sdh8b +.section sdh9a +.section sdh9b +.section sdh0a +.section sdh0b +.section sdiaa +.section sdiab +.section sdiba +.section sdibb +.section sdica +.section sdicb +.section sdida +.section sdidb +.section sdiea +.section sdieb +.section sdifa +.section sdifb +.section sdiga +.section sdigb +.section sdiha +.section sdihb +.section sdiia +.section sdiib +.section sdija +.section sdijb +.section sdika +.section sdikb +.section sdila +.section sdilb +.section sdima +.section sdimb +.section sdina +.section sdinb +.section sdioa +.section sdiob +.section sdipa +.section sdipb +.section sdiqa +.section sdiqb +.section sdira +.section sdirb +.section sdisa +.section sdisb +.section sdita +.section sditb +.section sdiua +.section sdiub +.section sdiva +.section sdivb +.section sdiwa +.section sdiwb +.section sdixa +.section sdixb +.section sdiya +.section sdiyb +.section sdiza +.section sdizb +.section sdi1a +.section sdi1b +.section sdi2a +.section sdi2b +.section sdi3a +.section sdi3b +.section sdi4a +.section sdi4b +.section sdi5a +.section sdi5b +.section sdi6a +.section sdi6b +.section sdi7a +.section sdi7b +.section sdi8a +.section sdi8b +.section sdi9a +.section sdi9b +.section sdi0a +.section sdi0b +.section sdjaa +.section sdjab +.section sdjba +.section sdjbb +.section sdjca +.section sdjcb +.section sdjda +.section sdjdb +.section sdjea +.section sdjeb +.section sdjfa +.section sdjfb +.section sdjga +.section sdjgb +.section sdjha +.section sdjhb +.section sdjia +.section sdjib +.section sdjja +.section sdjjb +.section sdjka +.section sdjkb +.section sdjla +.section sdjlb +.section sdjma +.section sdjmb +.section sdjna +.section sdjnb +.section sdjoa +.section sdjob +.section sdjpa +.section sdjpb +.section sdjqa +.section sdjqb +.section sdjra +.section sdjrb +.section sdjsa +.section sdjsb +.section sdjta +.section sdjtb +.section sdjua +.section sdjub +.section sdjva +.section sdjvb +.section sdjwa +.section sdjwb +.section sdjxa +.section sdjxb +.section sdjya +.section sdjyb +.section sdjza +.section sdjzb +.section sdj1a +.section sdj1b +.section sdj2a +.section sdj2b +.section sdj3a +.section sdj3b +.section sdj4a +.section sdj4b +.section sdj5a +.section sdj5b +.section sdj6a +.section sdj6b +.section sdj7a +.section sdj7b +.section sdj8a +.section sdj8b +.section sdj9a +.section sdj9b +.section sdj0a +.section sdj0b +.section sdkaa +.section sdkab +.section sdkba +.section sdkbb +.section sdkca +.section sdkcb +.section sdkda +.section sdkdb +.section sdkea +.section sdkeb +.section sdkfa +.section sdkfb +.section sdkga +.section sdkgb +.section sdkha +.section sdkhb +.section sdkia +.section sdkib +.section sdkja +.section sdkjb +.section sdkka +.section sdkkb +.section sdkla +.section sdklb +.section sdkma +.section sdkmb +.section sdkna +.section sdknb +.section sdkoa +.section sdkob +.section sdkpa +.section sdkpb +.section sdkqa +.section sdkqb +.section sdkra +.section sdkrb +.section sdksa +.section sdksb +.section sdkta +.section sdktb +.section sdkua +.section sdkub +.section sdkva +.section sdkvb +.section sdkwa +.section sdkwb +.section sdkxa +.section sdkxb +.section sdkya +.section sdkyb +.section sdkza +.section sdkzb +.section sdk1a +.section sdk1b +.section sdk2a +.section sdk2b +.section sdk3a +.section sdk3b +.section sdk4a +.section sdk4b +.section sdk5a +.section sdk5b +.section sdk6a +.section sdk6b +.section sdk7a +.section sdk7b +.section sdk8a +.section sdk8b +.section sdk9a +.section sdk9b +.section sdk0a +.section sdk0b +.section sdlaa +.section sdlab +.section sdlba +.section sdlbb +.section sdlca +.section sdlcb +.section sdlda +.section sdldb +.section sdlea +.section sdleb +.section sdlfa +.section sdlfb +.section sdlga +.section sdlgb +.section sdlha +.section sdlhb +.section sdlia +.section sdlib +.section sdlja +.section sdljb +.section sdlka +.section sdlkb +.section sdlla +.section sdllb +.section sdlma +.section sdlmb +.section sdlna +.section sdlnb +.section sdloa +.section sdlob +.section sdlpa +.section sdlpb +.section sdlqa +.section sdlqb +.section sdlra +.section sdlrb +.section sdlsa +.section sdlsb +.section sdlta +.section sdltb +.section sdlua +.section sdlub +.section sdlva +.section sdlvb +.section sdlwa +.section sdlwb +.section sdlxa +.section sdlxb +.section sdlya +.section sdlyb +.section sdlza +.section sdlzb +.section sdl1a +.section sdl1b +.section sdl2a +.section sdl2b +.section sdl3a +.section sdl3b +.section sdl4a +.section sdl4b +.section sdl5a +.section sdl5b +.section sdl6a +.section sdl6b +.section sdl7a +.section sdl7b +.section sdl8a +.section sdl8b +.section sdl9a +.section sdl9b +.section sdl0a +.section sdl0b +.section sdmaa +.section sdmab +.section sdmba +.section sdmbb +.section sdmca +.section sdmcb +.section sdmda +.section sdmdb +.section sdmea +.section sdmeb +.section sdmfa +.section sdmfb +.section sdmga +.section sdmgb +.section sdmha +.section sdmhb +.section sdmia +.section sdmib +.section sdmja +.section sdmjb +.section sdmka +.section sdmkb +.section sdmla +.section sdmlb +.section sdmma +.section sdmmb +.section sdmna +.section sdmnb +.section sdmoa +.section sdmob +.section sdmpa +.section sdmpb +.section sdmqa +.section sdmqb +.section sdmra +.section sdmrb +.section sdmsa +.section sdmsb +.section sdmta +.section sdmtb +.section sdmua +.section sdmub +.section sdmva +.section sdmvb +.section sdmwa +.section sdmwb +.section sdmxa +.section sdmxb +.section sdmya +.section sdmyb +.section sdmza +.section sdmzb +.section sdm1a +.section sdm1b +.section sdm2a +.section sdm2b +.section sdm3a +.section sdm3b +.section sdm4a +.section sdm4b +.section sdm5a +.section sdm5b +.section sdm6a +.section sdm6b +.section sdm7a +.section sdm7b +.section sdm8a +.section sdm8b +.section sdm9a +.section sdm9b +.section sdm0a +.section sdm0b +.section sdnaa +.section sdnab +.section sdnba +.section sdnbb +.section sdnca +.section sdncb +.section sdnda +.section sdndb +.section sdnea +.section sdneb +.section sdnfa +.section sdnfb +.section sdnga +.section sdngb +.section sdnha +.section sdnhb +.section sdnia +.section sdnib +.section sdnja +.section sdnjb +.section sdnka +.section sdnkb +.section sdnla +.section sdnlb +.section sdnma +.section sdnmb +.section sdnna +.section sdnnb +.section sdnoa +.section sdnob +.section sdnpa +.section sdnpb +.section sdnqa +.section sdnqb +.section sdnra +.section sdnrb +.section sdnsa +.section sdnsb +.section sdnta +.section sdntb +.section sdnua +.section sdnub +.section sdnva +.section sdnvb +.section sdnwa +.section sdnwb +.section sdnxa +.section sdnxb +.section sdnya +.section sdnyb +.section sdnza +.section sdnzb +.section sdn1a +.section sdn1b +.section sdn2a +.section sdn2b +.section sdn3a +.section sdn3b +.section sdn4a +.section sdn4b +.section sdn5a +.section sdn5b +.section sdn6a +.section sdn6b +.section sdn7a +.section sdn7b +.section sdn8a +.section sdn8b +.section sdn9a +.section sdn9b +.section sdn0a +.section sdn0b +.section sdoaa +.section sdoab +.section sdoba +.section sdobb +.section sdoca +.section sdocb +.section sdoda +.section sdodb +.section sdoea +.section sdoeb +.section sdofa +.section sdofb +.section sdoga +.section sdogb +.section sdoha +.section sdohb +.section sdoia +.section sdoib +.section sdoja +.section sdojb +.section sdoka +.section sdokb +.section sdola +.section sdolb +.section sdoma +.section sdomb +.section sdona +.section sdonb +.section sdooa +.section sdoob +.section sdopa +.section sdopb +.section sdoqa +.section sdoqb +.section sdora +.section sdorb +.section sdosa +.section sdosb +.section sdota +.section sdotb +.section sdoua +.section sdoub +.section sdova +.section sdovb +.section sdowa +.section sdowb +.section sdoxa +.section sdoxb +.section sdoya +.section sdoyb +.section sdoza +.section sdozb +.section sdo1a +.section sdo1b +.section sdo2a +.section sdo2b +.section sdo3a +.section sdo3b +.section sdo4a +.section sdo4b +.section sdo5a +.section sdo5b +.section sdo6a +.section sdo6b +.section sdo7a +.section sdo7b +.section sdo8a +.section sdo8b +.section sdo9a +.section sdo9b +.section sdo0a +.section sdo0b +.section sdpaa +.section sdpab +.section sdpba +.section sdpbb +.section sdpca +.section sdpcb +.section sdpda +.section sdpdb +.section sdpea +.section sdpeb +.section sdpfa +.section sdpfb +.section sdpga +.section sdpgb +.section sdpha +.section sdphb +.section sdpia +.section sdpib +.section sdpja +.section sdpjb +.section sdpka +.section sdpkb +.section sdpla +.section sdplb +.section sdpma +.section sdpmb +.section sdpna +.section sdpnb +.section sdpoa +.section sdpob +.section sdppa +.section sdppb +.section sdpqa +.section sdpqb +.section sdpra +.section sdprb +.section sdpsa +.section sdpsb +.section sdpta +.section sdptb +.section sdpua +.section sdpub +.section sdpva +.section sdpvb +.section sdpwa +.section sdpwb +.section sdpxa +.section sdpxb +.section sdpya +.section sdpyb +.section sdpza +.section sdpzb +.section sdp1a +.section sdp1b +.section sdp2a +.section sdp2b +.section sdp3a +.section sdp3b +.section sdp4a +.section sdp4b +.section sdp5a +.section sdp5b +.section sdp6a +.section sdp6b +.section sdp7a +.section sdp7b +.section sdp8a +.section sdp8b +.section sdp9a +.section sdp9b +.section sdp0a +.section sdp0b +.section sdqaa +.section sdqab +.section sdqba +.section sdqbb +.section sdqca +.section sdqcb +.section sdqda +.section sdqdb +.section sdqea +.section sdqeb +.section sdqfa +.section sdqfb +.section sdqga +.section sdqgb +.section sdqha +.section sdqhb +.section sdqia +.section sdqib +.section sdqja +.section sdqjb +.section sdqka +.section sdqkb +.section sdqla +.section sdqlb +.section sdqma +.section sdqmb +.section sdqna +.section sdqnb +.section sdqoa +.section sdqob +.section sdqpa +.section sdqpb +.section sdqqa +.section sdqqb +.section sdqra +.section sdqrb +.section sdqsa +.section sdqsb +.section sdqta +.section sdqtb +.section sdqua +.section sdqub +.section sdqva +.section sdqvb +.section sdqwa +.section sdqwb +.section sdqxa +.section sdqxb +.section sdqya +.section sdqyb +.section sdqza +.section sdqzb +.section sdq1a +.section sdq1b +.section sdq2a +.section sdq2b +.section sdq3a +.section sdq3b +.section sdq4a +.section sdq4b +.section sdq5a +.section sdq5b +.section sdq6a +.section sdq6b +.section sdq7a +.section sdq7b +.section sdq8a +.section sdq8b +.section sdq9a +.section sdq9b +.section sdq0a +.section sdq0b +.section sdraa +.section sdrab +.section sdrba +.section sdrbb +.section sdrca +.section sdrcb +.section sdrda +.section sdrdb +.section sdrea +.section sdreb +.section sdrfa +.section sdrfb +.section sdrga +.section sdrgb +.section sdrha +.section sdrhb +.section sdria +.section sdrib +.section sdrja +.section sdrjb +.section sdrka +.section sdrkb +.section sdrla +.section sdrlb +.section sdrma +.section sdrmb +.section sdrna +.section sdrnb +.section sdroa +.section sdrob +.section sdrpa +.section sdrpb +.section sdrqa +.section sdrqb +.section sdrra +.section sdrrb +.section sdrsa +.section sdrsb +.section sdrta +.section sdrtb +.section sdrua +.section sdrub +.section sdrva +.section sdrvb +.section sdrwa +.section sdrwb +.section sdrxa +.section sdrxb +.section sdrya +.section sdryb +.section sdrza +.section sdrzb +.section sdr1a +.section sdr1b +.section sdr2a +.section sdr2b +.section sdr3a +.section sdr3b +.section sdr4a +.section sdr4b +.section sdr5a +.section sdr5b +.section sdr6a +.section sdr6b +.section sdr7a +.section sdr7b +.section sdr8a +.section sdr8b +.section sdr9a +.section sdr9b +.section sdr0a +.section sdr0b +.section sdsaa +.section sdsab +.section sdsba +.section sdsbb +.section sdsca +.section sdscb +.section sdsda +.section sdsdb +.section sdsea +.section sdseb +.section sdsfa +.section sdsfb +.section sdsga +.section sdsgb +.section sdsha +.section sdshb +.section sdsia +.section sdsib +.section sdsja +.section sdsjb +.section sdska +.section sdskb +.section sdsla +.section sdslb +.section sdsma +.section sdsmb +.section sdsna +.section sdsnb +.section sdsoa +.section sdsob +.section sdspa +.section sdspb +.section sdsqa +.section sdsqb +.section sdsra +.section sdsrb +.section sdssa +.section sdssb +.section sdsta +.section sdstb +.section sdsua +.section sdsub +.section sdsva +.section sdsvb +.section sdswa +.section sdswb +.section sdsxa +.section sdsxb +.section sdsya +.section sdsyb +.section sdsza +.section sdszb +.section sds1a +.section sds1b +.section sds2a +.section sds2b +.section sds3a +.section sds3b +.section sds4a +.section sds4b +.section sds5a +.section sds5b +.section sds6a +.section sds6b +.section sds7a +.section sds7b +.section sds8a +.section sds8b +.section sds9a +.section sds9b +.section sds0a +.section sds0b +.section sdtaa +.section sdtab +.section sdtba +.section sdtbb +.section sdtca +.section sdtcb +.section sdtda +.section sdtdb +.section sdtea +.section sdteb +.section sdtfa +.section sdtfb +.section sdtga +.section sdtgb +.section sdtha +.section sdthb +.section sdtia +.section sdtib +.section sdtja +.section sdtjb +.section sdtka +.section sdtkb +.section sdtla +.section sdtlb +.section sdtma +.section sdtmb +.section sdtna +.section sdtnb +.section sdtoa +.section sdtob +.section sdtpa +.section sdtpb +.section sdtqa +.section sdtqb +.section sdtra +.section sdtrb +.section sdtsa +.section sdtsb +.section sdtta +.section sdttb +.section sdtua +.section sdtub +.section sdtva +.section sdtvb +.section sdtwa +.section sdtwb +.section sdtxa +.section sdtxb +.section sdtya +.section sdtyb +.section sdtza +.section sdtzb +.section sdt1a +.section sdt1b +.section sdt2a +.section sdt2b +.section sdt3a +.section sdt3b +.section sdt4a +.section sdt4b +.section sdt5a +.section sdt5b +.section sdt6a +.section sdt6b +.section sdt7a +.section sdt7b +.section sdt8a +.section sdt8b +.section sdt9a +.section sdt9b +.section sdt0a +.section sdt0b +.section sduaa +.section sduab +.section sduba +.section sdubb +.section sduca +.section sducb +.section sduda +.section sdudb +.section sduea +.section sdueb +.section sdufa +.section sdufb +.section sduga +.section sdugb +.section sduha +.section sduhb +.section sduia +.section sduib +.section sduja +.section sdujb +.section sduka +.section sdukb +.section sdula +.section sdulb +.section sduma +.section sdumb +.section sduna +.section sdunb +.section sduoa +.section sduob +.section sdupa +.section sdupb +.section sduqa +.section sduqb +.section sdura +.section sdurb +.section sdusa +.section sdusb +.section sduta +.section sdutb +.section sduua +.section sduub +.section sduva +.section sduvb +.section sduwa +.section sduwb +.section sduxa +.section sduxb +.section sduya +.section sduyb +.section sduza +.section sduzb +.section sdu1a +.section sdu1b +.section sdu2a +.section sdu2b +.section sdu3a +.section sdu3b +.section sdu4a +.section sdu4b +.section sdu5a +.section sdu5b +.section sdu6a +.section sdu6b +.section sdu7a +.section sdu7b +.section sdu8a +.section sdu8b +.section sdu9a +.section sdu9b +.section sdu0a +.section sdu0b +.section sdvaa +.section sdvab +.section sdvba +.section sdvbb +.section sdvca +.section sdvcb +.section sdvda +.section sdvdb +.section sdvea +.section sdveb +.section sdvfa +.section sdvfb +.section sdvga +.section sdvgb +.section sdvha +.section sdvhb +.section sdvia +.section sdvib +.section sdvja +.section sdvjb +.section sdvka +.section sdvkb +.section sdvla +.section sdvlb +.section sdvma +.section sdvmb +.section sdvna +.section sdvnb +.section sdvoa +.section sdvob +.section sdvpa +.section sdvpb +.section sdvqa +.section sdvqb +.section sdvra +.section sdvrb +.section sdvsa +.section sdvsb +.section sdvta +.section sdvtb +.section sdvua +.section sdvub +.section sdvva +.section sdvvb +.section sdvwa +.section sdvwb +.section sdvxa +.section sdvxb +.section sdvya +.section sdvyb +.section sdvza +.section sdvzb +.section sdv1a +.section sdv1b +.section sdv2a +.section sdv2b +.section sdv3a +.section sdv3b +.section sdv4a +.section sdv4b +.section sdv5a +.section sdv5b +.section sdv6a +.section sdv6b +.section sdv7a +.section sdv7b +.section sdv8a +.section sdv8b +.section sdv9a +.section sdv9b +.section sdv0a +.section sdv0b +.section sdwaa +.section sdwab +.section sdwba +.section sdwbb +.section sdwca +.section sdwcb +.section sdwda +.section sdwdb +.section sdwea +.section sdweb +.section sdwfa +.section sdwfb +.section sdwga +.section sdwgb +.section sdwha +.section sdwhb +.section sdwia +.section sdwib +.section sdwja +.section sdwjb +.section sdwka +.section sdwkb +.section sdwla +.section sdwlb +.section sdwma +.section sdwmb +.section sdwna +.section sdwnb +.section sdwoa +.section sdwob +.section sdwpa +.section sdwpb +.section sdwqa +.section sdwqb +.section sdwra +.section sdwrb +.section sdwsa +.section sdwsb +.section sdwta +.section sdwtb +.section sdwua +.section sdwub +.section sdwva +.section sdwvb +.section sdwwa +.section sdwwb +.section sdwxa +.section sdwxb +.section sdwya +.section sdwyb +.section sdwza +.section sdwzb +.section sdw1a +.section sdw1b +.section sdw2a +.section sdw2b +.section sdw3a +.section sdw3b +.section sdw4a +.section sdw4b +.section sdw5a +.section sdw5b +.section sdw6a +.section sdw6b +.section sdw7a +.section sdw7b +.section sdw8a +.section sdw8b +.section sdw9a +.section sdw9b +.section sdw0a +.section sdw0b +.section sdxaa +.section sdxab +.section sdxba +.section sdxbb +.section sdxca +.section sdxcb +.section sdxda +.section sdxdb +.section sdxea +.section sdxeb +.section sdxfa +.section sdxfb +.section sdxga +.section sdxgb +.section sdxha +.section sdxhb +.section sdxia +.section sdxib +.section sdxja +.section sdxjb +.section sdxka +.section sdxkb +.section sdxla +.section sdxlb +.section sdxma +.section sdxmb +.section sdxna +.section sdxnb +.section sdxoa +.section sdxob +.section sdxpa +.section sdxpb +.section sdxqa +.section sdxqb +.section sdxra +.section sdxrb +.section sdxsa +.section sdxsb +.section sdxta +.section sdxtb +.section sdxua +.section sdxub +.section sdxva +.section sdxvb +.section sdxwa +.section sdxwb +.section sdxxa +.section sdxxb +.section sdxya +.section sdxyb +.section sdxza +.section sdxzb +.section sdx1a +.section sdx1b +.section sdx2a +.section sdx2b +.section sdx3a +.section sdx3b +.section sdx4a +.section sdx4b +.section sdx5a +.section sdx5b +.section sdx6a +.section sdx6b +.section sdx7a +.section sdx7b +.section sdx8a +.section sdx8b +.section sdx9a +.section sdx9b +.section sdx0a +.section sdx0b +.section sdyaa +.section sdyab +.section sdyba +.section sdybb +.section sdyca +.section sdycb +.section sdyda +.section sdydb +.section sdyea +.section sdyeb +.section sdyfa +.section sdyfb +.section sdyga +.section sdygb +.section sdyha +.section sdyhb +.section sdyia +.section sdyib +.section sdyja +.section sdyjb +.section sdyka +.section sdykb +.section sdyla +.section sdylb +.section sdyma +.section sdymb +.section sdyna +.section sdynb +.section sdyoa +.section sdyob +.section sdypa +.section sdypb +.section sdyqa +.section sdyqb +.section sdyra +.section sdyrb +.section sdysa +.section sdysb +.section sdyta +.section sdytb +.section sdyua +.section sdyub +.section sdyva +.section sdyvb +.section sdywa +.section sdywb +.section sdyxa +.section sdyxb +.section sdyya +.section sdyyb +.section sdyza +.section sdyzb +.section sdy1a +.section sdy1b +.section sdy2a +.section sdy2b +.section sdy3a +.section sdy3b +.section sdy4a +.section sdy4b +.section sdy5a +.section sdy5b +.section sdy6a +.section sdy6b +.section sdy7a +.section sdy7b +.section sdy8a +.section sdy8b +.section sdy9a +.section sdy9b +.section sdy0a +.section sdy0b +.section sdzaa +.section sdzab +.section sdzba +.section sdzbb +.section sdzca +.section sdzcb +.section sdzda +.section sdzdb +.section sdzea +.section sdzeb +.section sdzfa +.section sdzfb +.section sdzga +.section sdzgb +.section sdzha +.section sdzhb +.section sdzia +.section sdzib +.section sdzja +.section sdzjb +.section sdzka +.section sdzkb +.section sdzla +.section sdzlb +.section sdzma +.section sdzmb +.section sdzna +.section sdznb +.section sdzoa +.section sdzob +.section sdzpa +.section sdzpb +.section sdzqa +.section sdzqb +.section sdzra +.section sdzrb +.section sdzsa +.section sdzsb +.section sdzta +.section sdztb +.section sdzua +.section sdzub +.section sdzva +.section sdzvb +.section sdzwa +.section sdzwb +.section sdzxa +.section sdzxb +.section sdzya +.section sdzyb +.section sdzza +.section sdzzb +.section sdz1a +.section sdz1b +.section sdz2a +.section sdz2b +.section sdz3a +.section sdz3b +.section sdz4a +.section sdz4b +.section sdz5a +.section sdz5b +.section sdz6a +.section sdz6b +.section sdz7a +.section sdz7b +.section sdz8a +.section sdz8b +.section sdz9a +.section sdz9b +.section sdz0a +.section sdz0b +.section sd1aa +.section sd1ab +.section sd1ba +.section sd1bb +.section sd1ca +.section sd1cb +.section sd1da +.section sd1db +.section sd1ea +.section sd1eb +.section sd1fa +.section sd1fb +.section sd1ga +.section sd1gb +.section sd1ha +.section sd1hb +.section sd1ia +.section sd1ib +.section sd1ja +.section sd1jb +.section sd1ka +.section sd1kb +.section sd1la +.section sd1lb +.section sd1ma +.section sd1mb +.section sd1na +.section sd1nb +.section sd1oa +.section sd1ob +.section sd1pa +.section sd1pb +.section sd1qa +.section sd1qb +.section sd1ra +.section sd1rb +.section sd1sa +.section sd1sb +.section sd1ta +.section sd1tb +.section sd1ua +.section sd1ub +.section sd1va +.section sd1vb +.section sd1wa +.section sd1wb +.section sd1xa +.section sd1xb +.section sd1ya +.section sd1yb +.section sd1za +.section sd1zb +.section sd11a +.section sd11b +.section sd12a +.section sd12b +.section sd13a +.section sd13b +.section sd14a +.section sd14b +.section sd15a +.section sd15b +.section sd16a +.section sd16b +.section sd17a +.section sd17b +.section sd18a +.section sd18b +.section sd19a +.section sd19b +.section sd10a +.section sd10b +.section sd2aa +.section sd2ab +.section sd2ba +.section sd2bb +.section sd2ca +.section sd2cb +.section sd2da +.section sd2db +.section sd2ea +.section sd2eb +.section sd2fa +.section sd2fb +.section sd2ga +.section sd2gb +.section sd2ha +.section sd2hb +.section sd2ia +.section sd2ib +.section sd2ja +.section sd2jb +.section sd2ka +.section sd2kb +.section sd2la +.section sd2lb +.section sd2ma +.section sd2mb +.section sd2na +.section sd2nb +.section sd2oa +.section sd2ob +.section sd2pa +.section sd2pb +.section sd2qa +.section sd2qb +.section sd2ra +.section sd2rb +.section sd2sa +.section sd2sb +.section sd2ta +.section sd2tb +.section sd2ua +.section sd2ub +.section sd2va +.section sd2vb +.section sd2wa +.section sd2wb +.section sd2xa +.section sd2xb +.section sd2ya +.section sd2yb +.section sd2za +.section sd2zb +.section sd21a +.section sd21b +.section sd22a +.section sd22b +.section sd23a +.section sd23b +.section sd24a +.section sd24b +.section sd25a +.section sd25b +.section sd26a +.section sd26b +.section sd27a +.section sd27b +.section sd28a +.section sd28b +.section sd29a +.section sd29b +.section sd20a +.section sd20b +.section sd3aa +.section sd3ab +.section sd3ba +.section sd3bb +.section sd3ca +.section sd3cb +.section sd3da +.section sd3db +.section sd3ea +.section sd3eb +.section sd3fa +.section sd3fb +.section sd3ga +.section sd3gb +.section sd3ha +.section sd3hb +.section sd3ia +.section sd3ib +.section sd3ja +.section sd3jb +.section sd3ka +.section sd3kb +.section sd3la +.section sd3lb +.section sd3ma +.section sd3mb +.section sd3na +.section sd3nb +.section sd3oa +.section sd3ob +.section sd3pa +.section sd3pb +.section sd3qa +.section sd3qb +.section sd3ra +.section sd3rb +.section sd3sa +.section sd3sb +.section sd3ta +.section sd3tb +.section sd3ua +.section sd3ub +.section sd3va +.section sd3vb +.section sd3wa +.section sd3wb +.section sd3xa +.section sd3xb +.section sd3ya +.section sd3yb +.section sd3za +.section sd3zb +.section sd31a +.section sd31b +.section sd32a +.section sd32b +.section sd33a +.section sd33b +.section sd34a +.section sd34b +.section sd35a +.section sd35b +.section sd36a +.section sd36b +.section sd37a +.section sd37b +.section sd38a +.section sd38b +.section sd39a +.section sd39b +.section sd30a +.section sd30b +.section sd4aa +.section sd4ab +.section sd4ba +.section sd4bb +.section sd4ca +.section sd4cb +.section sd4da +.section sd4db +.section sd4ea +.section sd4eb +.section sd4fa +.section sd4fb +.section sd4ga +.section sd4gb +.section sd4ha +.section sd4hb +.section sd4ia +.section sd4ib +.section sd4ja +.section sd4jb +.section sd4ka +.section sd4kb +.section sd4la +.section sd4lb +.section sd4ma +.section sd4mb +.section sd4na +.section sd4nb +.section sd4oa +.section sd4ob +.section sd4pa +.section sd4pb +.section sd4qa +.section sd4qb +.section sd4ra +.section sd4rb +.section sd4sa +.section sd4sb +.section sd4ta +.section sd4tb +.section sd4ua +.section sd4ub +.section sd4va +.section sd4vb +.section sd4wa +.section sd4wb +.section sd4xa +.section sd4xb +.section sd4ya +.section sd4yb +.section sd4za +.section sd4zb +.section sd41a +.section sd41b +.section sd42a +.section sd42b +.section sd43a +.section sd43b +.section sd44a +.section sd44b +.section sd45a +.section sd45b +.section sd46a +.section sd46b +.section sd47a +.section sd47b +.section sd48a +.section sd48b +.section sd49a +.section sd49b +.section sd40a +.section sd40b +.section sd5aa +.section sd5ab +.section sd5ba +.section sd5bb +.section sd5ca +.section sd5cb +.section sd5da +.section sd5db +.section sd5ea +.section sd5eb +.section sd5fa +.section sd5fb +.section sd5ga +.section sd5gb +.section sd5ha +.section sd5hb +.section sd5ia +.section sd5ib +.section sd5ja +.section sd5jb +.section sd5ka +.section sd5kb +.section sd5la +.section sd5lb +.section sd5ma +.section sd5mb +.section sd5na +.section sd5nb +.section sd5oa +.section sd5ob +.section sd5pa +.section sd5pb +.section sd5qa +.section sd5qb +.section sd5ra +.section sd5rb +.section sd5sa +.section sd5sb +.section sd5ta +.section sd5tb +.section sd5ua +.section sd5ub +.section sd5va +.section sd5vb +.section sd5wa +.section sd5wb +.section sd5xa +.section sd5xb +.section sd5ya +.section sd5yb +.section sd5za +.section sd5zb +.section sd51a +.section sd51b +.section sd52a +.section sd52b +.section sd53a +.section sd53b +.section sd54a +.section sd54b +.section sd55a +.section sd55b +.section sd56a +.section sd56b +.section sd57a +.section sd57b +.section sd58a +.section sd58b +.section sd59a +.section sd59b +.section sd50a +.section sd50b +.section sd6aa +.section sd6ab +.section sd6ba +.section sd6bb +.section sd6ca +.section sd6cb +.section sd6da +.section sd6db +.section sd6ea +.section sd6eb +.section sd6fa +.section sd6fb +.section sd6ga +.section sd6gb +.section sd6ha +.section sd6hb +.section sd6ia +.section sd6ib +.section sd6ja +.section sd6jb +.section sd6ka +.section sd6kb +.section sd6la +.section sd6lb +.section sd6ma +.section sd6mb +.section sd6na +.section sd6nb +.section sd6oa +.section sd6ob +.section sd6pa +.section sd6pb +.section sd6qa +.section sd6qb +.section sd6ra +.section sd6rb +.section sd6sa +.section sd6sb +.section sd6ta +.section sd6tb +.section sd6ua +.section sd6ub +.section sd6va +.section sd6vb +.section sd6wa +.section sd6wb +.section sd6xa +.section sd6xb +.section sd6ya +.section sd6yb +.section sd6za +.section sd6zb +.section sd61a +.section sd61b +.section sd62a +.section sd62b +.section sd63a +.section sd63b +.section sd64a +.section sd64b +.section sd65a +.section sd65b +.section sd66a +.section sd66b +.section sd67a +.section sd67b +.section sd68a +.section sd68b +.section sd69a +.section sd69b +.section sd60a +.section sd60b +.section sd7aa +.section sd7ab +.section sd7ba +.section sd7bb +.section sd7ca +.section sd7cb +.section sd7da +.section sd7db +.section sd7ea +.section sd7eb +.section sd7fa +.section sd7fb +.section sd7ga +.section sd7gb +.section sd7ha +.section sd7hb +.section sd7ia +.section sd7ib +.section sd7ja +.section sd7jb +.section sd7ka +.section sd7kb +.section sd7la +.section sd7lb +.section sd7ma +.section sd7mb +.section sd7na +.section sd7nb +.section sd7oa +.section sd7ob +.section sd7pa +.section sd7pb +.section sd7qa +.section sd7qb +.section sd7ra +.section sd7rb +.section sd7sa +.section sd7sb +.section sd7ta +.section sd7tb +.section sd7ua +.section sd7ub +.section sd7va +.section sd7vb +.section sd7wa +.section sd7wb +.section sd7xa +.section sd7xb +.section sd7ya +.section sd7yb +.section sd7za +.section sd7zb +.section sd71a +.section sd71b +.section sd72a +.section sd72b +.section sd73a +.section sd73b +.section sd74a +.section sd74b +.section sd75a +.section sd75b +.section sd76a +.section sd76b +.section sd77a +.section sd77b +.section sd78a +.section sd78b +.section sd79a +.section sd79b +.section sd70a +.section sd70b +.section sd8aa +.section sd8ab +.section sd8ba +.section sd8bb +.section sd8ca +.section sd8cb +.section sd8da +.section sd8db +.section sd8ea +.section sd8eb +.section sd8fa +.section sd8fb +.section sd8ga +.section sd8gb +.section sd8ha +.section sd8hb +.section sd8ia +.section sd8ib +.section sd8ja +.section sd8jb +.section sd8ka +.section sd8kb +.section sd8la +.section sd8lb +.section sd8ma +.section sd8mb +.section sd8na +.section sd8nb +.section sd8oa +.section sd8ob +.section sd8pa +.section sd8pb +.section sd8qa +.section sd8qb +.section sd8ra +.section sd8rb +.section sd8sa +.section sd8sb +.section sd8ta +.section sd8tb +.section sd8ua +.section sd8ub +.section sd8va +.section sd8vb +.section sd8wa +.section sd8wb +.section sd8xa +.section sd8xb +.section sd8ya +.section sd8yb +.section sd8za +.section sd8zb +.section sd81a +.section sd81b +.section sd82a +.section sd82b +.section sd83a +.section sd83b +.section sd84a +.section sd84b +.section sd85a +.section sd85b +.section sd86a +.section sd86b +.section sd87a +.section sd87b +.section sd88a +.section sd88b +.section sd89a +.section sd89b +.section sd80a +.section sd80b +.section sd9aa +.section sd9ab +.section sd9ba +.section sd9bb +.section sd9ca +.section sd9cb +.section sd9da +.section sd9db +.section sd9ea +.section sd9eb +.section sd9fa +.section sd9fb +.section sd9ga +.section sd9gb +.section sd9ha +.section sd9hb +.section sd9ia +.section sd9ib +.section sd9ja +.section sd9jb +.section sd9ka +.section sd9kb +.section sd9la +.section sd9lb +.section sd9ma +.section sd9mb +.section sd9na +.section sd9nb +.section sd9oa +.section sd9ob +.section sd9pa +.section sd9pb +.section sd9qa +.section sd9qb +.section sd9ra +.section sd9rb +.section sd9sa +.section sd9sb +.section sd9ta +.section sd9tb +.section sd9ua +.section sd9ub +.section sd9va +.section sd9vb +.section sd9wa +.section sd9wb +.section sd9xa +.section sd9xb +.section sd9ya +.section sd9yb +.section sd9za +.section sd9zb +.section sd91a +.section sd91b +.section sd92a +.section sd92b +.section sd93a +.section sd93b +.section sd94a +.section sd94b +.section sd95a +.section sd95b +.section sd96a +.section sd96b +.section sd97a +.section sd97b +.section sd98a +.section sd98b +.section sd99a +.section sd99b +.section sd90a +.section sd90b +.section sd0aa +.section sd0ab +.section sd0ba +.section sd0bb +.section sd0ca +.section sd0cb +.section sd0da +.section sd0db +.section sd0ea +.section sd0eb +.section sd0fa +.section sd0fb +.section sd0ga +.section sd0gb +.section sd0ha +.section sd0hb +.section sd0ia +.section sd0ib +.section sd0ja +.section sd0jb +.section sd0ka +.section sd0kb +.section sd0la +.section sd0lb +.section sd0ma +.section sd0mb +.section sd0na +.section sd0nb +.section sd0oa +.section sd0ob +.section sd0pa +.section sd0pb +.section sd0qa +.section sd0qb +.section sd0ra +.section sd0rb +.section sd0sa +.section sd0sb +.section sd0ta +.section sd0tb +.section sd0ua +.section sd0ub +.section sd0va +.section sd0vb +.section sd0wa +.section sd0wb +.section sd0xa +.section sd0xb +.section sd0ya +.section sd0yb +.section sd0za +.section sd0zb +.section sd01a +.section sd01b +.section sd02a +.section sd02b +.section sd03a +.section sd03b +.section sd04a +.section sd04b +.section sd05a +.section sd05b +.section sd06a +.section sd06b +.section sd07a +.section sd07b +.section sd08a +.section sd08b +.section sd09a +.section sd09b +.section sd00a +.section sd00b +.section seaaa +.section seaab +.section seaba +.section seabb +.section seaca +.section seacb +.section seada +.section seadb +.section seaea +.section seaeb +.section seafa +.section seafb +.section seaga +.section seagb +.section seaha +.section seahb +.section seaia +.section seaib +.section seaja +.section seajb +.section seaka +.section seakb +.section seala +.section sealb +.section seama +.section seamb +.section seana +.section seanb +.section seaoa +.section seaob +.section seapa +.section seapb +.section seaqa +.section seaqb +.section seara +.section searb +.section seasa +.section seasb +.section seata +.section seatb +.section seaua +.section seaub +.section seava +.section seavb +.section seawa +.section seawb +.section seaxa +.section seaxb +.section seaya +.section seayb +.section seaza +.section seazb +.section sea1a +.section sea1b +.section sea2a +.section sea2b +.section sea3a +.section sea3b +.section sea4a +.section sea4b +.section sea5a +.section sea5b +.section sea6a +.section sea6b +.section sea7a +.section sea7b +.section sea8a +.section sea8b +.section sea9a +.section sea9b +.section sea0a +.section sea0b +.section sebaa +.section sebab +.section sebba +.section sebbb +.section sebca +.section sebcb +.section sebda +.section sebdb +.section sebea +.section sebeb +.section sebfa +.section sebfb +.section sebga +.section sebgb +.section sebha +.section sebhb +.section sebia +.section sebib +.section sebja +.section sebjb +.section sebka +.section sebkb +.section sebla +.section seblb +.section sebma +.section sebmb +.section sebna +.section sebnb +.section seboa +.section sebob +.section sebpa +.section sebpb +.section sebqa +.section sebqb +.section sebra +.section sebrb +.section sebsa +.section sebsb +.section sebta +.section sebtb +.section sebua +.section sebub +.section sebva +.section sebvb +.section sebwa +.section sebwb +.section sebxa +.section sebxb +.section sebya +.section sebyb +.section sebza +.section sebzb +.section seb1a +.section seb1b +.section seb2a +.section seb2b +.section seb3a +.section seb3b +.section seb4a +.section seb4b +.section seb5a +.section seb5b +.section seb6a +.section seb6b +.section seb7a +.section seb7b +.section seb8a +.section seb8b +.section seb9a +.section seb9b +.section seb0a +.section seb0b +.section secaa +.section secab +.section secba +.section secbb +.section secca +.section seccb +.section secda +.section secdb +.section secea +.section seceb +.section secfa +.section secfb +.section secga +.section secgb +.section secha +.section sechb +.section secia +.section secib +.section secja +.section secjb +.section secka +.section seckb +.section secla +.section seclb +.section secma +.section secmb +.section secna +.section secnb +.section secoa +.section secob +.section secpa +.section secpb +.section secqa +.section secqb +.section secra +.section secrb +.section secsa +.section secsb +.section secta +.section sectb +.section secua +.section secub +.section secva +.section secvb +.section secwa +.section secwb +.section secxa +.section secxb +.section secya +.section secyb +.section secza +.section seczb +.section sec1a +.section sec1b +.section sec2a +.section sec2b +.section sec3a +.section sec3b +.section sec4a +.section sec4b +.section sec5a +.section sec5b +.section sec6a +.section sec6b +.section sec7a +.section sec7b +.section sec8a +.section sec8b +.section sec9a +.section sec9b +.section sec0a +.section sec0b +.section sedaa +.section sedab +.section sedba +.section sedbb +.section sedca +.section sedcb +.section sedda +.section seddb +.section sedea +.section sedeb +.section sedfa +.section sedfb +.section sedga +.section sedgb +.section sedha +.section sedhb +.section sedia +.section sedib +.section sedja +.section sedjb +.section sedka +.section sedkb +.section sedla +.section sedlb +.section sedma +.section sedmb +.section sedna +.section sednb +.section sedoa +.section sedob +.section sedpa +.section sedpb +.section sedqa +.section sedqb +.section sedra +.section sedrb +.section sedsa +.section sedsb +.section sedta +.section sedtb +.section sedua +.section sedub +.section sedva +.section sedvb +.section sedwa +.section sedwb +.section sedxa +.section sedxb +.section sedya +.section sedyb +.section sedza +.section sedzb +.section sed1a +.section sed1b +.section sed2a +.section sed2b +.section sed3a +.section sed3b +.section sed4a +.section sed4b +.section sed5a +.section sed5b +.section sed6a +.section sed6b +.section sed7a +.section sed7b +.section sed8a +.section sed8b +.section sed9a +.section sed9b +.section sed0a +.section sed0b +.section seeaa +.section seeab +.section seeba +.section seebb +.section seeca +.section seecb +.section seeda +.section seedb +.section seeea +.section seeeb +.section seefa +.section seefb +.section seega +.section seegb +.section seeha +.section seehb +.section seeia +.section seeib +.section seeja +.section seejb +.section seeka +.section seekb +.section seela +.section seelb +.section seema +.section seemb +.section seena +.section seenb +.section seeoa +.section seeob +.section seepa +.section seepb +.section seeqa +.section seeqb +.section seera +.section seerb +.section seesa +.section seesb +.section seeta +.section seetb +.section seeua +.section seeub +.section seeva +.section seevb +.section seewa +.section seewb +.section seexa +.section seexb +.section seeya +.section seeyb +.section seeza +.section seezb +.section see1a +.section see1b +.section see2a +.section see2b +.section see3a +.section see3b +.section see4a +.section see4b +.section see5a +.section see5b +.section see6a +.section see6b +.section see7a +.section see7b +.section see8a +.section see8b +.section see9a +.section see9b +.section see0a +.section see0b +.section sefaa +.section sefab +.section sefba +.section sefbb +.section sefca +.section sefcb +.section sefda +.section sefdb +.section sefea +.section sefeb +.section seffa +.section seffb +.section sefga +.section sefgb +.section sefha +.section sefhb +.section sefia +.section sefib +.section sefja +.section sefjb +.section sefka +.section sefkb +.section sefla +.section seflb +.section sefma +.section sefmb +.section sefna +.section sefnb +.section sefoa +.section sefob +.section sefpa +.section sefpb +.section sefqa +.section sefqb +.section sefra +.section sefrb +.section sefsa +.section sefsb +.section sefta +.section seftb +.section sefua +.section sefub +.section sefva +.section sefvb +.section sefwa +.section sefwb +.section sefxa +.section sefxb +.section sefya +.section sefyb +.section sefza +.section sefzb +.section sef1a +.section sef1b +.section sef2a +.section sef2b +.section sef3a +.section sef3b +.section sef4a +.section sef4b +.section sef5a +.section sef5b +.section sef6a +.section sef6b +.section sef7a +.section sef7b +.section sef8a +.section sef8b +.section sef9a +.section sef9b +.section sef0a +.section sef0b +.section segaa +.section segab +.section segba +.section segbb +.section segca +.section segcb +.section segda +.section segdb +.section segea +.section segeb +.section segfa +.section segfb +.section segga +.section seggb +.section segha +.section seghb +.section segia +.section segib +.section segja +.section segjb +.section segka +.section segkb +.section segla +.section seglb +.section segma +.section segmb +.section segna +.section segnb +.section segoa +.section segob +.section segpa +.section segpb +.section segqa +.section segqb +.section segra +.section segrb +.section segsa +.section segsb +.section segta +.section segtb +.section segua +.section segub +.section segva +.section segvb +.section segwa +.section segwb +.section segxa +.section segxb +.section segya +.section segyb +.section segza +.section segzb +.section seg1a +.section seg1b +.section seg2a +.section seg2b +.section seg3a +.section seg3b +.section seg4a +.section seg4b +.section seg5a +.section seg5b +.section seg6a +.section seg6b +.section seg7a +.section seg7b +.section seg8a +.section seg8b +.section seg9a +.section seg9b +.section seg0a +.section seg0b +.section sehaa +.section sehab +.section sehba +.section sehbb +.section sehca +.section sehcb +.section sehda +.section sehdb +.section sehea +.section seheb +.section sehfa +.section sehfb +.section sehga +.section sehgb +.section sehha +.section sehhb +.section sehia +.section sehib +.section sehja +.section sehjb +.section sehka +.section sehkb +.section sehla +.section sehlb +.section sehma +.section sehmb +.section sehna +.section sehnb +.section sehoa +.section sehob +.section sehpa +.section sehpb +.section sehqa +.section sehqb +.section sehra +.section sehrb +.section sehsa +.section sehsb +.section sehta +.section sehtb +.section sehua +.section sehub +.section sehva +.section sehvb +.section sehwa +.section sehwb +.section sehxa +.section sehxb +.section sehya +.section sehyb +.section sehza +.section sehzb +.section seh1a +.section seh1b +.section seh2a +.section seh2b +.section seh3a +.section seh3b +.section seh4a +.section seh4b +.section seh5a +.section seh5b +.section seh6a +.section seh6b +.section seh7a +.section seh7b +.section seh8a +.section seh8b +.section seh9a +.section seh9b +.section seh0a +.section seh0b +.section seiaa +.section seiab +.section seiba +.section seibb +.section seica +.section seicb +.section seida +.section seidb +.section seiea +.section seieb +.section seifa +.section seifb +.section seiga +.section seigb +.section seiha +.section seihb +.section seiia +.section seiib +.section seija +.section seijb +.section seika +.section seikb +.section seila +.section seilb +.section seima +.section seimb +.section seina +.section seinb +.section seioa +.section seiob +.section seipa +.section seipb +.section seiqa +.section seiqb +.section seira +.section seirb +.section seisa +.section seisb +.section seita +.section seitb +.section seiua +.section seiub +.section seiva +.section seivb +.section seiwa +.section seiwb +.section seixa +.section seixb +.section seiya +.section seiyb +.section seiza +.section seizb +.section sei1a +.section sei1b +.section sei2a +.section sei2b +.section sei3a +.section sei3b +.section sei4a +.section sei4b +.section sei5a +.section sei5b +.section sei6a +.section sei6b +.section sei7a +.section sei7b +.section sei8a +.section sei8b +.section sei9a +.section sei9b +.section sei0a +.section sei0b +.section sejaa +.section sejab +.section sejba +.section sejbb +.section sejca +.section sejcb +.section sejda +.section sejdb +.section sejea +.section sejeb +.section sejfa +.section sejfb +.section sejga +.section sejgb +.section sejha +.section sejhb +.section sejia +.section sejib +.section sejja +.section sejjb +.section sejka +.section sejkb +.section sejla +.section sejlb +.section sejma +.section sejmb +.section sejna +.section sejnb +.section sejoa +.section sejob +.section sejpa +.section sejpb +.section sejqa +.section sejqb +.section sejra +.section sejrb +.section sejsa +.section sejsb +.section sejta +.section sejtb +.section sejua +.section sejub +.section sejva +.section sejvb +.section sejwa +.section sejwb +.section sejxa +.section sejxb +.section sejya +.section sejyb +.section sejza +.section sejzb +.section sej1a +.section sej1b +.section sej2a +.section sej2b +.section sej3a +.section sej3b +.section sej4a +.section sej4b +.section sej5a +.section sej5b +.section sej6a +.section sej6b +.section sej7a +.section sej7b +.section sej8a +.section sej8b +.section sej9a +.section sej9b +.section sej0a +.section sej0b +.section sekaa +.section sekab +.section sekba +.section sekbb +.section sekca +.section sekcb +.section sekda +.section sekdb +.section sekea +.section sekeb +.section sekfa +.section sekfb +.section sekga +.section sekgb +.section sekha +.section sekhb +.section sekia +.section sekib +.section sekja +.section sekjb +.section sekka +.section sekkb +.section sekla +.section seklb +.section sekma +.section sekmb +.section sekna +.section seknb +.section sekoa +.section sekob +.section sekpa +.section sekpb +.section sekqa +.section sekqb +.section sekra +.section sekrb +.section seksa +.section seksb +.section sekta +.section sektb +.section sekua +.section sekub +.section sekva +.section sekvb +.section sekwa +.section sekwb +.section sekxa +.section sekxb +.section sekya +.section sekyb +.section sekza +.section sekzb +.section sek1a +.section sek1b +.section sek2a +.section sek2b +.section sek3a +.section sek3b +.section sek4a +.section sek4b +.section sek5a +.section sek5b +.section sek6a +.section sek6b +.section sek7a +.section sek7b +.section sek8a +.section sek8b +.section sek9a +.section sek9b +.section sek0a +.section sek0b +.section selaa +.section selab +.section selba +.section selbb +.section selca +.section selcb +.section selda +.section seldb +.section selea +.section seleb +.section selfa +.section selfb +.section selga +.section selgb +.section selha +.section selhb +.section selia +.section selib +.section selja +.section seljb +.section selka +.section selkb +.section sella +.section sellb +.section selma +.section selmb +.section selna +.section selnb +.section seloa +.section selob +.section selpa +.section selpb +.section selqa +.section selqb +.section selra +.section selrb +.section selsa +.section selsb +.section selta +.section seltb +.section selua +.section selub +.section selva +.section selvb +.section selwa +.section selwb +.section selxa +.section selxb +.section selya +.section selyb +.section selza +.section selzb +.section sel1a +.section sel1b +.section sel2a +.section sel2b +.section sel3a +.section sel3b +.section sel4a +.section sel4b +.section sel5a +.section sel5b +.section sel6a +.section sel6b +.section sel7a +.section sel7b +.section sel8a +.section sel8b +.section sel9a +.section sel9b +.section sel0a +.section sel0b +.section semaa +.section semab +.section semba +.section sembb +.section semca +.section semcb +.section semda +.section semdb +.section semea +.section semeb +.section semfa +.section semfb +.section semga +.section semgb +.section semha +.section semhb +.section semia +.section semib +.section semja +.section semjb +.section semka +.section semkb +.section semla +.section semlb +.section semma +.section semmb +.section semna +.section semnb +.section semoa +.section semob +.section sempa +.section sempb +.section semqa +.section semqb +.section semra +.section semrb +.section semsa +.section semsb +.section semta +.section semtb +.section semua +.section semub +.section semva +.section semvb +.section semwa +.section semwb +.section semxa +.section semxb +.section semya +.section semyb +.section semza +.section semzb +.section sem1a +.section sem1b +.section sem2a +.section sem2b +.section sem3a +.section sem3b +.section sem4a +.section sem4b +.section sem5a +.section sem5b +.section sem6a +.section sem6b +.section sem7a +.section sem7b +.section sem8a +.section sem8b +.section sem9a +.section sem9b +.section sem0a +.section sem0b +.section senaa +.section senab +.section senba +.section senbb +.section senca +.section sencb +.section senda +.section sendb +.section senea +.section seneb +.section senfa +.section senfb +.section senga +.section sengb +.section senha +.section senhb +.section senia +.section senib +.section senja +.section senjb +.section senka +.section senkb +.section senla +.section senlb +.section senma +.section senmb +.section senna +.section sennb +.section senoa +.section senob +.section senpa +.section senpb +.section senqa +.section senqb +.section senra +.section senrb +.section sensa +.section sensb +.section senta +.section sentb +.section senua +.section senub +.section senva +.section senvb +.section senwa +.section senwb +.section senxa +.section senxb +.section senya +.section senyb +.section senza +.section senzb +.section sen1a +.section sen1b +.section sen2a +.section sen2b +.section sen3a +.section sen3b +.section sen4a +.section sen4b +.section sen5a +.section sen5b +.section sen6a +.section sen6b +.section sen7a +.section sen7b +.section sen8a +.section sen8b +.section sen9a +.section sen9b +.section sen0a +.section sen0b +.section seoaa +.section seoab +.section seoba +.section seobb +.section seoca +.section seocb +.section seoda +.section seodb +.section seoea +.section seoeb +.section seofa +.section seofb +.section seoga +.section seogb +.section seoha +.section seohb +.section seoia +.section seoib +.section seoja +.section seojb +.section seoka +.section seokb +.section seola +.section seolb +.section seoma +.section seomb +.section seona +.section seonb +.section seooa +.section seoob +.section seopa +.section seopb +.section seoqa +.section seoqb +.section seora +.section seorb +.section seosa +.section seosb +.section seota +.section seotb +.section seoua +.section seoub +.section seova +.section seovb +.section seowa +.section seowb +.section seoxa +.section seoxb +.section seoya +.section seoyb +.section seoza +.section seozb +.section seo1a +.section seo1b +.section seo2a +.section seo2b +.section seo3a +.section seo3b +.section seo4a +.section seo4b +.section seo5a +.section seo5b +.section seo6a +.section seo6b +.section seo7a +.section seo7b +.section seo8a +.section seo8b +.section seo9a +.section seo9b +.section seo0a +.section seo0b +.section sepaa +.section sepab +.section sepba +.section sepbb +.section sepca +.section sepcb +.section sepda +.section sepdb +.section sepea +.section sepeb +.section sepfa +.section sepfb +.section sepga +.section sepgb +.section sepha +.section sephb +.section sepia +.section sepib +.section sepja +.section sepjb +.section sepka +.section sepkb +.section sepla +.section seplb +.section sepma +.section sepmb +.section sepna +.section sepnb +.section sepoa +.section sepob +.section seppa +.section seppb +.section sepqa +.section sepqb +.section sepra +.section seprb +.section sepsa +.section sepsb +.section septa +.section septb +.section sepua +.section sepub +.section sepva +.section sepvb +.section sepwa +.section sepwb +.section sepxa +.section sepxb +.section sepya +.section sepyb +.section sepza +.section sepzb +.section sep1a +.section sep1b +.section sep2a +.section sep2b +.section sep3a +.section sep3b +.section sep4a +.section sep4b +.section sep5a +.section sep5b +.section sep6a +.section sep6b +.section sep7a +.section sep7b +.section sep8a +.section sep8b +.section sep9a +.section sep9b +.section sep0a +.section sep0b +.section seqaa +.section seqab +.section seqba +.section seqbb +.section seqca +.section seqcb +.section seqda +.section seqdb +.section seqea +.section seqeb +.section seqfa +.section seqfb +.section seqga +.section seqgb +.section seqha +.section seqhb +.section seqia +.section seqib +.section seqja +.section seqjb +.section seqka +.section seqkb +.section seqla +.section seqlb +.section seqma +.section seqmb +.section seqna +.section seqnb +.section seqoa +.section seqob +.section seqpa +.section seqpb +.section seqqa +.section seqqb +.section seqra +.section seqrb +.section seqsa +.section seqsb +.section seqta +.section seqtb +.section sequa +.section sequb +.section seqva +.section seqvb +.section seqwa +.section seqwb +.section seqxa +.section seqxb +.section seqya +.section seqyb +.section seqza +.section seqzb +.section seq1a +.section seq1b +.section seq2a +.section seq2b +.section seq3a +.section seq3b +.section seq4a +.section seq4b +.section seq5a +.section seq5b +.section seq6a +.section seq6b +.section seq7a +.section seq7b +.section seq8a +.section seq8b +.section seq9a +.section seq9b +.section seq0a +.section seq0b +.section seraa +.section serab +.section serba +.section serbb +.section serca +.section sercb +.section serda +.section serdb +.section serea +.section sereb +.section serfa +.section serfb +.section serga +.section sergb +.section serha +.section serhb +.section seria +.section serib +.section serja +.section serjb +.section serka +.section serkb +.section serla +.section serlb +.section serma +.section sermb +.section serna +.section sernb +.section seroa +.section serob +.section serpa +.section serpb +.section serqa +.section serqb +.section serra +.section serrb +.section sersa +.section sersb +.section serta +.section sertb +.section serua +.section serub +.section serva +.section servb +.section serwa +.section serwb +.section serxa +.section serxb +.section serya +.section seryb +.section serza +.section serzb +.section ser1a +.section ser1b +.section ser2a +.section ser2b +.section ser3a +.section ser3b +.section ser4a +.section ser4b +.section ser5a +.section ser5b +.section ser6a +.section ser6b +.section ser7a +.section ser7b +.section ser8a +.section ser8b +.section ser9a +.section ser9b +.section ser0a +.section ser0b +.section sesaa +.section sesab +.section sesba +.section sesbb +.section sesca +.section sescb +.section sesda +.section sesdb +.section sesea +.section seseb +.section sesfa +.section sesfb +.section sesga +.section sesgb +.section sesha +.section seshb +.section sesia +.section sesib +.section sesja +.section sesjb +.section seska +.section seskb +.section sesla +.section seslb +.section sesma +.section sesmb +.section sesna +.section sesnb +.section sesoa +.section sesob +.section sespa +.section sespb +.section sesqa +.section sesqb +.section sesra +.section sesrb +.section sessa +.section sessb +.section sesta +.section sestb +.section sesua +.section sesub +.section sesva +.section sesvb +.section seswa +.section seswb +.section sesxa +.section sesxb +.section sesya +.section sesyb +.section sesza +.section seszb +.section ses1a +.section ses1b +.section ses2a +.section ses2b +.section ses3a +.section ses3b +.section ses4a +.section ses4b +.section ses5a +.section ses5b +.section ses6a +.section ses6b +.section ses7a +.section ses7b +.section ses8a +.section ses8b +.section ses9a +.section ses9b +.section ses0a +.section ses0b +.section setaa +.section setab +.section setba +.section setbb +.section setca +.section setcb +.section setda +.section setdb +.section setea +.section seteb +.section setfa +.section setfb +.section setga +.section setgb +.section setha +.section sethb +.section setia +.section setib +.section setja +.section setjb +.section setka +.section setkb +.section setla +.section setlb +.section setma +.section setmb +.section setna +.section setnb +.section setoa +.section setob +.section setpa +.section setpb +.section setqa +.section setqb +.section setra +.section setrb +.section setsa +.section setsb +.section setta +.section settb +.section setua +.section setub +.section setva +.section setvb +.section setwa +.section setwb +.section setxa +.section setxb +.section setya +.section setyb +.section setza +.section setzb +.section set1a +.section set1b +.section set2a +.section set2b +.section set3a +.section set3b +.section set4a +.section set4b +.section set5a +.section set5b +.section set6a +.section set6b +.section set7a +.section set7b +.section set8a +.section set8b +.section set9a +.section set9b +.section set0a +.section set0b +.section seuaa +.section seuab +.section seuba +.section seubb +.section seuca +.section seucb +.section seuda +.section seudb +.section seuea +.section seueb +.section seufa +.section seufb +.section seuga +.section seugb +.section seuha +.section seuhb +.section seuia +.section seuib +.section seuja +.section seujb +.section seuka +.section seukb +.section seula +.section seulb +.section seuma +.section seumb +.section seuna +.section seunb +.section seuoa +.section seuob +.section seupa +.section seupb +.section seuqa +.section seuqb +.section seura +.section seurb +.section seusa +.section seusb +.section seuta +.section seutb +.section seuua +.section seuub +.section seuva +.section seuvb +.section seuwa +.section seuwb +.section seuxa +.section seuxb +.section seuya +.section seuyb +.section seuza +.section seuzb +.section seu1a +.section seu1b +.section seu2a +.section seu2b +.section seu3a +.section seu3b +.section seu4a +.section seu4b +.section seu5a +.section seu5b +.section seu6a +.section seu6b +.section seu7a +.section seu7b +.section seu8a +.section seu8b +.section seu9a +.section seu9b +.section seu0a +.section seu0b +.section sevaa +.section sevab +.section sevba +.section sevbb +.section sevca +.section sevcb +.section sevda +.section sevdb +.section sevea +.section seveb +.section sevfa +.section sevfb +.section sevga +.section sevgb +.section sevha +.section sevhb +.section sevia +.section sevib +.section sevja +.section sevjb +.section sevka +.section sevkb +.section sevla +.section sevlb +.section sevma +.section sevmb +.section sevna +.section sevnb +.section sevoa +.section sevob +.section sevpa +.section sevpb +.section sevqa +.section sevqb +.section sevra +.section sevrb +.section sevsa +.section sevsb +.section sevta +.section sevtb +.section sevua +.section sevub +.section sevva +.section sevvb +.section sevwa +.section sevwb +.section sevxa +.section sevxb +.section sevya +.section sevyb +.section sevza +.section sevzb +.section sev1a +.section sev1b +.section sev2a +.section sev2b +.section sev3a +.section sev3b +.section sev4a +.section sev4b +.section sev5a +.section sev5b +.section sev6a +.section sev6b +.section sev7a +.section sev7b +.section sev8a +.section sev8b +.section sev9a +.section sev9b +.section sev0a +.section sev0b +.section sewaa +.section sewab +.section sewba +.section sewbb +.section sewca +.section sewcb +.section sewda +.section sewdb +.section sewea +.section seweb +.section sewfa +.section sewfb +.section sewga +.section sewgb +.section sewha +.section sewhb +.section sewia +.section sewib +.section sewja +.section sewjb +.section sewka +.section sewkb +.section sewla +.section sewlb +.section sewma +.section sewmb +.section sewna +.section sewnb +.section sewoa +.section sewob +.section sewpa +.section sewpb +.section sewqa +.section sewqb +.section sewra +.section sewrb +.section sewsa +.section sewsb +.section sewta +.section sewtb +.section sewua +.section sewub +.section sewva +.section sewvb +.section sewwa +.section sewwb +.section sewxa +.section sewxb +.section sewya +.section sewyb +.section sewza +.section sewzb +.section sew1a +.section sew1b +.section sew2a +.section sew2b +.section sew3a +.section sew3b +.section sew4a +.section sew4b +.section sew5a +.section sew5b +.section sew6a +.section sew6b +.section sew7a +.section sew7b +.section sew8a +.section sew8b +.section sew9a +.section sew9b +.section sew0a +.section sew0b +.section sexaa +.section sexab +.section sexba +.section sexbb +.section sexca +.section sexcb +.section sexda +.section sexdb +.section sexea +.section sexeb +.section sexfa +.section sexfb +.section sexga +.section sexgb +.section sexha +.section sexhb +.section sexia +.section sexib +.section sexja +.section sexjb +.section sexka +.section sexkb +.section sexla +.section sexlb +.section sexma +.section sexmb +.section sexna +.section sexnb +.section sexoa +.section sexob +.section sexpa +.section sexpb +.section sexqa +.section sexqb +.section sexra +.section sexrb +.section sexsa +.section sexsb +.section sexta +.section sextb +.section sexua +.section sexub +.section sexva +.section sexvb +.section sexwa +.section sexwb +.section sexxa +.section sexxb +.section sexya +.section sexyb +.section sexza +.section sexzb +.section sex1a +.section sex1b +.section sex2a +.section sex2b +.section sex3a +.section sex3b +.section sex4a +.section sex4b +.section sex5a +.section sex5b +.section sex6a +.section sex6b +.section sex7a +.section sex7b +.section sex8a +.section sex8b +.section sex9a +.section sex9b +.section sex0a +.section sex0b +.section seyaa +.section seyab +.section seyba +.section seybb +.section seyca +.section seycb +.section seyda +.section seydb +.section seyea +.section seyeb +.section seyfa +.section seyfb +.section seyga +.section seygb +.section seyha +.section seyhb +.section seyia +.section seyib +.section seyja +.section seyjb +.section seyka +.section seykb +.section seyla +.section seylb +.section seyma +.section seymb +.section seyna +.section seynb +.section seyoa +.section seyob +.section seypa +.section seypb +.section seyqa +.section seyqb +.section seyra +.section seyrb +.section seysa +.section seysb +.section seyta +.section seytb +.section seyua +.section seyub +.section seyva +.section seyvb +.section seywa +.section seywb +.section seyxa +.section seyxb +.section seyya +.section seyyb +.section seyza +.section seyzb +.section sey1a +.section sey1b +.section sey2a +.section sey2b +.section sey3a +.section sey3b +.section sey4a +.section sey4b +.section sey5a +.section sey5b +.section sey6a +.section sey6b +.section sey7a +.section sey7b +.section sey8a +.section sey8b +.section sey9a +.section sey9b +.section sey0a +.section sey0b +.section sezaa +.section sezab +.section sezba +.section sezbb +.section sezca +.section sezcb +.section sezda +.section sezdb +.section sezea +.section sezeb +.section sezfa +.section sezfb +.section sezga +.section sezgb +.section sezha +.section sezhb +.section sezia +.section sezib +.section sezja +.section sezjb +.section sezka +.section sezkb +.section sezla +.section sezlb +.section sezma +.section sezmb +.section sezna +.section seznb +.section sezoa +.section sezob +.section sezpa +.section sezpb +.section sezqa +.section sezqb +.section sezra +.section sezrb +.section sezsa +.section sezsb +.section sezta +.section seztb +.section sezua +.section sezub +.section sezva +.section sezvb +.section sezwa +.section sezwb +.section sezxa +.section sezxb +.section sezya +.section sezyb +.section sezza +.section sezzb +.section sez1a +.section sez1b +.section sez2a +.section sez2b +.section sez3a +.section sez3b +.section sez4a +.section sez4b +.section sez5a +.section sez5b +.section sez6a +.section sez6b +.section sez7a +.section sez7b +.section sez8a +.section sez8b +.section sez9a +.section sez9b +.section sez0a +.section sez0b +.section se1aa +.section se1ab +.section se1ba +.section se1bb +.section se1ca +.section se1cb +.section se1da +.section se1db +.section se1ea +.section se1eb +.section se1fa +.section se1fb +.section se1ga +.section se1gb +.section se1ha +.section se1hb +.section se1ia +.section se1ib +.section se1ja +.section se1jb +.section se1ka +.section se1kb +.section se1la +.section se1lb +.section se1ma +.section se1mb +.section se1na +.section se1nb +.section se1oa +.section se1ob +.section se1pa +.section se1pb +.section se1qa +.section se1qb +.section se1ra +.section se1rb +.section se1sa +.section se1sb +.section se1ta +.section se1tb +.section se1ua +.section se1ub +.section se1va +.section se1vb +.section se1wa +.section se1wb +.section se1xa +.section se1xb +.section se1ya +.section se1yb +.section se1za +.section se1zb +.section se11a +.section se11b +.section se12a +.section se12b +.section se13a +.section se13b +.section se14a +.section se14b +.section se15a +.section se15b +.section se16a +.section se16b +.section se17a +.section se17b +.section se18a +.section se18b +.section se19a +.section se19b +.section se10a +.section se10b +.section se2aa +.section se2ab +.section se2ba +.section se2bb +.section se2ca +.section se2cb +.section se2da +.section se2db +.section se2ea +.section se2eb +.section se2fa +.section se2fb +.section se2ga +.section se2gb +.section se2ha +.section se2hb +.section se2ia +.section se2ib +.section se2ja +.section se2jb +.section se2ka +.section se2kb +.section se2la +.section se2lb +.section se2ma +.section se2mb +.section se2na +.section se2nb +.section se2oa +.section se2ob +.section se2pa +.section se2pb +.section se2qa +.section se2qb +.section se2ra +.section se2rb +.section se2sa +.section se2sb +.section se2ta +.section se2tb +.section se2ua +.section se2ub +.section se2va +.section se2vb +.section se2wa +.section se2wb +.section se2xa +.section se2xb +.section se2ya +.section se2yb +.section se2za +.section se2zb +.section se21a +.section se21b +.section se22a +.section se22b +.section se23a +.section se23b +.section se24a +.section se24b +.section se25a +.section se25b +.section se26a +.section se26b +.section se27a +.section se27b +.section se28a +.section se28b +.section se29a +.section se29b +.section se20a +.section se20b +.section se3aa +.section se3ab +.section se3ba +.section se3bb +.section se3ca +.section se3cb +.section se3da +.section se3db +.section se3ea +.section se3eb +.section se3fa +.section se3fb +.section se3ga +.section se3gb +.section se3ha +.section se3hb +.section se3ia +.section se3ib +.section se3ja +.section se3jb +.section se3ka +.section se3kb +.section se3la +.section se3lb +.section se3ma +.section se3mb +.section se3na +.section se3nb +.section se3oa +.section se3ob +.section se3pa +.section se3pb +.section se3qa +.section se3qb +.section se3ra +.section se3rb +.section se3sa +.section se3sb +.section se3ta +.section se3tb +.section se3ua +.section se3ub +.section se3va +.section se3vb +.section se3wa +.section se3wb +.section se3xa +.section se3xb +.section se3ya +.section se3yb +.section se3za +.section se3zb +.section se31a +.section se31b +.section se32a +.section se32b +.section se33a +.section se33b +.section se34a +.section se34b +.section se35a +.section se35b +.section se36a +.section se36b +.section se37a +.section se37b +.section se38a +.section se38b +.section se39a +.section se39b +.section se30a +.section se30b +.section se4aa +.section se4ab +.section se4ba +.section se4bb +.section se4ca +.section se4cb +.section se4da +.section se4db +.section se4ea +.section se4eb +.section se4fa +.section se4fb +.section se4ga +.section se4gb +.section se4ha +.section se4hb +.section se4ia +.section se4ib +.section se4ja +.section se4jb +.section se4ka +.section se4kb +.section se4la +.section se4lb +.section se4ma +.section se4mb +.section se4na +.section se4nb +.section se4oa +.section se4ob +.section se4pa +.section se4pb +.section se4qa +.section se4qb +.section se4ra +.section se4rb +.section se4sa +.section se4sb +.section se4ta +.section se4tb +.section se4ua +.section se4ub +.section se4va +.section se4vb +.section se4wa +.section se4wb +.section se4xa +.section se4xb +.section se4ya +.section se4yb +.section se4za +.section se4zb +.section se41a +.section se41b +.section se42a +.section se42b +.section se43a +.section se43b +.section se44a +.section se44b +.section se45a +.section se45b +.section se46a +.section se46b +.section se47a +.section se47b +.section se48a +.section se48b +.section se49a +.section se49b +.section se40a +.section se40b +.section se5aa +.section se5ab +.section se5ba +.section se5bb +.section se5ca +.section se5cb +.section se5da +.section se5db +.section se5ea +.section se5eb +.section se5fa +.section se5fb +.section se5ga +.section se5gb +.section se5ha +.section se5hb +.section se5ia +.section se5ib +.section se5ja +.section se5jb +.section se5ka +.section se5kb +.section se5la +.section se5lb +.section se5ma +.section se5mb +.section se5na +.section se5nb +.section se5oa +.section se5ob +.section se5pa +.section se5pb +.section se5qa +.section se5qb +.section se5ra +.section se5rb +.section se5sa +.section se5sb +.section se5ta +.section se5tb +.section se5ua +.section se5ub +.section se5va +.section se5vb +.section se5wa +.section se5wb +.section se5xa +.section se5xb +.section se5ya +.section se5yb +.section se5za +.section se5zb +.section se51a +.section se51b +.section se52a +.section se52b +.section se53a +.section se53b +.section se54a +.section se54b +.section se55a +.section se55b +.section se56a +.section se56b +.section se57a +.section se57b +.section se58a +.section se58b +.section se59a +.section se59b +.section se50a +.section se50b +.section se6aa +.section se6ab +.section se6ba +.section se6bb +.section se6ca +.section se6cb +.section se6da +.section se6db +.section se6ea +.section se6eb +.section se6fa +.section se6fb +.section se6ga +.section se6gb +.section se6ha +.section se6hb +.section se6ia +.section se6ib +.section se6ja +.section se6jb +.section se6ka +.section se6kb +.section se6la +.section se6lb +.section se6ma +.section se6mb +.section se6na +.section se6nb +.section se6oa +.section se6ob +.section se6pa +.section se6pb +.section se6qa +.section se6qb +.section se6ra +.section se6rb +.section se6sa +.section se6sb +.section se6ta +.section se6tb +.section se6ua +.section se6ub +.section se6va +.section se6vb +.section se6wa +.section se6wb +.section se6xa +.section se6xb +.section se6ya +.section se6yb +.section se6za +.section se6zb +.section se61a +.section se61b +.section se62a +.section se62b +.section se63a +.section se63b +.section se64a +.section se64b +.section se65a +.section se65b +.section se66a +.section se66b +.section se67a +.section se67b +.section se68a +.section se68b +.section se69a +.section se69b +.section se60a +.section se60b +.section se7aa +.section se7ab +.section se7ba +.section se7bb +.section se7ca +.section se7cb +.section se7da +.section se7db +.section se7ea +.section se7eb +.section se7fa +.section se7fb +.section se7ga +.section se7gb +.section se7ha +.section se7hb +.section se7ia +.section se7ib +.section se7ja +.section se7jb +.section se7ka +.section se7kb +.section se7la +.section se7lb +.section se7ma +.section se7mb +.section se7na +.section se7nb +.section se7oa +.section se7ob +.section se7pa +.section se7pb +.section se7qa +.section se7qb +.section se7ra +.section se7rb +.section se7sa +.section se7sb +.section se7ta +.section se7tb +.section se7ua +.section se7ub +.section se7va +.section se7vb +.section se7wa +.section se7wb +.section se7xa +.section se7xb +.section se7ya +.section se7yb +.section se7za +.section se7zb +.section se71a +.section se71b +.section se72a +.section se72b +.section se73a +.section se73b +.section se74a +.section se74b +.section se75a +.section se75b +.section se76a +.section se76b +.section se77a +.section se77b +.section se78a +.section se78b +.section se79a +.section se79b +.section se70a +.section se70b +.section se8aa +.section se8ab +.section se8ba +.section se8bb +.section se8ca +.section se8cb +.section se8da +.section se8db +.section se8ea +.section se8eb +.section se8fa +.section se8fb +.section se8ga +.section se8gb +.section se8ha +.section se8hb +.section se8ia +.section se8ib +.section se8ja +.section se8jb +.section se8ka +.section se8kb +.section se8la +.section se8lb +.section se8ma +.section se8mb +.section se8na +.section se8nb +.section se8oa +.section se8ob +.section se8pa +.section se8pb +.section se8qa +.section se8qb +.section se8ra +.section se8rb +.section se8sa +.section se8sb +.section se8ta +.section se8tb +.section se8ua +.section se8ub +.section se8va +.section se8vb +.section se8wa +.section se8wb +.section se8xa +.section se8xb +.section se8ya +.section se8yb +.section se8za +.section se8zb +.section se81a +.section se81b +.section se82a +.section se82b +.section se83a +.section se83b +.section se84a +.section se84b +.section se85a +.section se85b +.section se86a +.section se86b +.section se87a +.section se87b +.section se88a +.section se88b +.section se89a +.section se89b +.section se80a +.section se80b +.section se9aa +.section se9ab +.section se9ba +.section se9bb +.section se9ca +.section se9cb +.section se9da +.section se9db +.section se9ea +.section se9eb +.section se9fa +.section se9fb +.section se9ga +.section se9gb +.section se9ha +.section se9hb +.section se9ia +.section se9ib +.section se9ja +.section se9jb +.section se9ka +.section se9kb +.section se9la +.section se9lb +.section se9ma +.section se9mb +.section se9na +.section se9nb +.section se9oa +.section se9ob +.section se9pa +.section se9pb +.section se9qa +.section se9qb +.section se9ra +.section se9rb +.section se9sa +.section se9sb +.section se9ta +.section se9tb +.section se9ua +.section se9ub +.section se9va +.section se9vb +.section se9wa +.section se9wb +.section se9xa +.section se9xb +.section se9ya +.section se9yb +.section se9za +.section se9zb +.section se91a +.section se91b +.section se92a +.section se92b +.section se93a +.section se93b +.section se94a +.section se94b +.section se95a +.section se95b +.section se96a +.section se96b +.section se97a +.section se97b +.section se98a +.section se98b +.section se99a +.section se99b +.section se90a +.section se90b +.section se0aa +.section se0ab +.section se0ba +.section se0bb +.section se0ca +.section se0cb +.section se0da +.section se0db +.section se0ea +.section se0eb +.section se0fa +.section se0fb +.section se0ga +.section se0gb +.section se0ha +.section se0hb +.section se0ia +.section se0ib +.section se0ja +.section se0jb +.section se0ka +.section se0kb +.section se0la +.section se0lb +.section se0ma +.section se0mb +.section se0na +.section se0nb +.section se0oa +.section se0ob +.section se0pa +.section se0pb +.section se0qa +.section se0qb +.section se0ra +.section se0rb +.section se0sa +.section se0sb +.section se0ta +.section se0tb +.section se0ua +.section se0ub +.section se0va +.section se0vb +.section se0wa +.section se0wb +.section se0xa +.section se0xb +.section se0ya +.section se0yb +.section se0za +.section se0zb +.section se01a +.section se01b +.section se02a +.section se02b +.section se03a +.section se03b +.section se04a +.section se04b +.section se05a +.section se05b +.section se06a +.section se06b +.section se07a +.section se07b +.section se08a +.section se08b +.section se09a +.section se09b +.section se00a +.section se00b +.section sfaaa +.section sfaab +.section sfaba +.section sfabb +.section sfaca +.section sfacb +.section sfada +.section sfadb +.section sfaea +.section sfaeb +.section sfafa +.section sfafb +.section sfaga +.section sfagb +.section sfaha +.section sfahb +.section sfaia +.section sfaib +.section sfaja +.section sfajb +.section sfaka +.section sfakb +.section sfala +.section sfalb +.section sfama +.section sfamb +.section sfana +.section sfanb +.section sfaoa +.section sfaob +.section sfapa +.section sfapb +.section sfaqa +.section sfaqb +.section sfara +.section sfarb +.section sfasa +.section sfasb +.section sfata +.section sfatb +.section sfaua +.section sfaub +.section sfava +.section sfavb +.section sfawa +.section sfawb +.section sfaxa +.section sfaxb +.section sfaya +.section sfayb +.section sfaza +.section sfazb +.section sfa1a +.section sfa1b +.section sfa2a +.section sfa2b +.section sfa3a +.section sfa3b +.section sfa4a +.section sfa4b +.section sfa5a +.section sfa5b +.section sfa6a +.section sfa6b +.section sfa7a +.section sfa7b +.section sfa8a +.section sfa8b +.section sfa9a +.section sfa9b +.section sfa0a +.section sfa0b +.section sfbaa +.section sfbab +.section sfbba +.section sfbbb +.section sfbca +.section sfbcb +.section sfbda +.section sfbdb +.section sfbea +.section sfbeb +.section sfbfa +.section sfbfb +.section sfbga +.section sfbgb +.section sfbha +.section sfbhb +.section sfbia +.section sfbib +.section sfbja +.section sfbjb +.section sfbka +.section sfbkb +.section sfbla +.section sfblb +.section sfbma +.section sfbmb +.section sfbna +.section sfbnb +.section sfboa +.section sfbob +.section sfbpa +.section sfbpb +.section sfbqa +.section sfbqb +.section sfbra +.section sfbrb +.section sfbsa +.section sfbsb +.section sfbta +.section sfbtb +.section sfbua +.section sfbub +.section sfbva +.section sfbvb +.section sfbwa +.section sfbwb +.section sfbxa +.section sfbxb +.section sfbya +.section sfbyb +.section sfbza +.section sfbzb +.section sfb1a +.section sfb1b +.section sfb2a +.section sfb2b +.section sfb3a +.section sfb3b +.section sfb4a +.section sfb4b +.section sfb5a +.section sfb5b +.section sfb6a +.section sfb6b +.section sfb7a +.section sfb7b +.section sfb8a +.section sfb8b +.section sfb9a +.section sfb9b +.section sfb0a +.section sfb0b +.section sfcaa +.section sfcab +.section sfcba +.section sfcbb +.section sfcca +.section sfccb +.section sfcda +.section sfcdb +.section sfcea +.section sfceb +.section sfcfa +.section sfcfb +.section sfcga +.section sfcgb +.section sfcha +.section sfchb +.section sfcia +.section sfcib +.section sfcja +.section sfcjb +.section sfcka +.section sfckb +.section sfcla +.section sfclb +.section sfcma +.section sfcmb +.section sfcna +.section sfcnb +.section sfcoa +.section sfcob +.section sfcpa +.section sfcpb +.section sfcqa +.section sfcqb +.section sfcra +.section sfcrb +.section sfcsa +.section sfcsb +.section sfcta +.section sfctb +.section sfcua +.section sfcub +.section sfcva +.section sfcvb +.section sfcwa +.section sfcwb +.section sfcxa +.section sfcxb +.section sfcya +.section sfcyb +.section sfcza +.section sfczb +.section sfc1a +.section sfc1b +.section sfc2a +.section sfc2b +.section sfc3a +.section sfc3b +.section sfc4a +.section sfc4b +.section sfc5a +.section sfc5b +.section sfc6a +.section sfc6b +.section sfc7a +.section sfc7b +.section sfc8a +.section sfc8b +.section sfc9a +.section sfc9b +.section sfc0a +.section sfc0b +.section sfdaa +.section sfdab +.section sfdba +.section sfdbb +.section sfdca +.section sfdcb +.section sfdda +.section sfddb +.section sfdea +.section sfdeb +.section sfdfa +.section sfdfb +.section sfdga +.section sfdgb +.section sfdha +.section sfdhb +.section sfdia +.section sfdib +.section sfdja +.section sfdjb +.section sfdka +.section sfdkb +.section sfdla +.section sfdlb +.section sfdma +.section sfdmb +.section sfdna +.section sfdnb +.section sfdoa +.section sfdob +.section sfdpa +.section sfdpb +.section sfdqa +.section sfdqb +.section sfdra +.section sfdrb +.section sfdsa +.section sfdsb +.section sfdta +.section sfdtb +.section sfdua +.section sfdub +.section sfdva +.section sfdvb +.section sfdwa +.section sfdwb +.section sfdxa +.section sfdxb +.section sfdya +.section sfdyb +.section sfdza +.section sfdzb +.section sfd1a +.section sfd1b +.section sfd2a +.section sfd2b +.section sfd3a +.section sfd3b +.section sfd4a +.section sfd4b +.section sfd5a +.section sfd5b +.section sfd6a +.section sfd6b +.section sfd7a +.section sfd7b +.section sfd8a +.section sfd8b +.section sfd9a +.section sfd9b +.section sfd0a +.section sfd0b +.section sfeaa +.section sfeab +.section sfeba +.section sfebb +.section sfeca +.section sfecb +.section sfeda +.section sfedb +.section sfeea +.section sfeeb +.section sfefa +.section sfefb +.section sfega +.section sfegb +.section sfeha +.section sfehb +.section sfeia +.section sfeib +.section sfeja +.section sfejb +.section sfeka +.section sfekb +.section sfela +.section sfelb +.section sfema +.section sfemb +.section sfena +.section sfenb +.section sfeoa +.section sfeob +.section sfepa +.section sfepb +.section sfeqa +.section sfeqb +.section sfera +.section sferb +.section sfesa +.section sfesb +.section sfeta +.section sfetb +.section sfeua +.section sfeub +.section sfeva +.section sfevb +.section sfewa +.section sfewb +.section sfexa +.section sfexb +.section sfeya +.section sfeyb +.section sfeza +.section sfezb +.section sfe1a +.section sfe1b +.section sfe2a +.section sfe2b +.section sfe3a +.section sfe3b +.section sfe4a +.section sfe4b +.section sfe5a +.section sfe5b +.section sfe6a +.section sfe6b +.section sfe7a +.section sfe7b +.section sfe8a +.section sfe8b +.section sfe9a +.section sfe9b +.section sfe0a +.section sfe0b +.section sffaa +.section sffab +.section sffba +.section sffbb +.section sffca +.section sffcb +.section sffda +.section sffdb +.section sffea +.section sffeb +.section sfffa +.section sfffb +.section sffga +.section sffgb +.section sffha +.section sffhb +.section sffia +.section sffib +.section sffja +.section sffjb +.section sffka +.section sffkb +.section sffla +.section sfflb +.section sffma +.section sffmb +.section sffna +.section sffnb +.section sffoa +.section sffob +.section sffpa +.section sffpb +.section sffqa +.section sffqb +.section sffra +.section sffrb +.section sffsa +.section sffsb +.section sffta +.section sfftb +.section sffua +.section sffub +.section sffva +.section sffvb +.section sffwa +.section sffwb +.section sffxa +.section sffxb +.section sffya +.section sffyb +.section sffza +.section sffzb +.section sff1a +.section sff1b +.section sff2a +.section sff2b +.section sff3a +.section sff3b +.section sff4a +.section sff4b +.section sff5a +.section sff5b +.section sff6a +.section sff6b +.section sff7a +.section sff7b +.section sff8a +.section sff8b +.section sff9a +.section sff9b +.section sff0a +.section sff0b +.section sfgaa +.section sfgab +.section sfgba +.section sfgbb +.section sfgca +.section sfgcb +.section sfgda +.section sfgdb +.section sfgea +.section sfgeb +.section sfgfa +.section sfgfb +.section sfgga +.section sfggb +.section sfgha +.section sfghb +.section sfgia +.section sfgib +.section sfgja +.section sfgjb +.section sfgka +.section sfgkb +.section sfgla +.section sfglb +.section sfgma +.section sfgmb +.section sfgna +.section sfgnb +.section sfgoa +.section sfgob +.section sfgpa +.section sfgpb +.section sfgqa +.section sfgqb +.section sfgra +.section sfgrb +.section sfgsa +.section sfgsb +.section sfgta +.section sfgtb +.section sfgua +.section sfgub +.section sfgva +.section sfgvb +.section sfgwa +.section sfgwb +.section sfgxa +.section sfgxb +.section sfgya +.section sfgyb +.section sfgza +.section sfgzb +.section sfg1a +.section sfg1b +.section sfg2a +.section sfg2b +.section sfg3a +.section sfg3b +.section sfg4a +.section sfg4b +.section sfg5a +.section sfg5b +.section sfg6a +.section sfg6b +.section sfg7a +.section sfg7b +.section sfg8a +.section sfg8b +.section sfg9a +.section sfg9b +.section sfg0a +.section sfg0b +.section sfhaa +.section sfhab +.section sfhba +.section sfhbb +.section sfhca +.section sfhcb +.section sfhda +.section sfhdb +.section sfhea +.section sfheb +.section sfhfa +.section sfhfb +.section sfhga +.section sfhgb +.section sfhha +.section sfhhb +.section sfhia +.section sfhib +.section sfhja +.section sfhjb +.section sfhka +.section sfhkb +.section sfhla +.section sfhlb +.section sfhma +.section sfhmb +.section sfhna +.section sfhnb +.section sfhoa +.section sfhob +.section sfhpa +.section sfhpb +.section sfhqa +.section sfhqb +.section sfhra +.section sfhrb +.section sfhsa +.section sfhsb +.section sfhta +.section sfhtb +.section sfhua +.section sfhub +.section sfhva +.section sfhvb +.section sfhwa +.section sfhwb +.section sfhxa +.section sfhxb +.section sfhya +.section sfhyb +.section sfhza +.section sfhzb +.section sfh1a +.section sfh1b +.section sfh2a +.section sfh2b +.section sfh3a +.section sfh3b +.section sfh4a +.section sfh4b +.section sfh5a +.section sfh5b +.section sfh6a +.section sfh6b +.section sfh7a +.section sfh7b +.section sfh8a +.section sfh8b +.section sfh9a +.section sfh9b +.section sfh0a +.section sfh0b +.section sfiaa +.section sfiab +.section sfiba +.section sfibb +.section sfica +.section sficb +.section sfida +.section sfidb +.section sfiea +.section sfieb +.section sfifa +.section sfifb +.section sfiga +.section sfigb +.section sfiha +.section sfihb +.section sfiia +.section sfiib +.section sfija +.section sfijb +.section sfika +.section sfikb +.section sfila +.section sfilb +.section sfima +.section sfimb +.section sfina +.section sfinb +.section sfioa +.section sfiob +.section sfipa +.section sfipb +.section sfiqa +.section sfiqb +.section sfira +.section sfirb +.section sfisa +.section sfisb +.section sfita +.section sfitb +.section sfiua +.section sfiub +.section sfiva +.section sfivb +.section sfiwa +.section sfiwb +.section sfixa +.section sfixb +.section sfiya +.section sfiyb +.section sfiza +.section sfizb +.section sfi1a +.section sfi1b +.section sfi2a +.section sfi2b +.section sfi3a +.section sfi3b +.section sfi4a +.section sfi4b +.section sfi5a +.section sfi5b +.section sfi6a +.section sfi6b +.section sfi7a +.section sfi7b +.section sfi8a +.section sfi8b +.section sfi9a +.section sfi9b +.section sfi0a +.section sfi0b +.section sfjaa +.section sfjab +.section sfjba +.section sfjbb +.section sfjca +.section sfjcb +.section sfjda +.section sfjdb +.section sfjea +.section sfjeb +.section sfjfa +.section sfjfb +.section sfjga +.section sfjgb +.section sfjha +.section sfjhb +.section sfjia +.section sfjib +.section sfjja +.section sfjjb +.section sfjka +.section sfjkb +.section sfjla +.section sfjlb +.section sfjma +.section sfjmb +.section sfjna +.section sfjnb +.section sfjoa +.section sfjob +.section sfjpa +.section sfjpb +.section sfjqa +.section sfjqb +.section sfjra +.section sfjrb +.section sfjsa +.section sfjsb +.section sfjta +.section sfjtb +.section sfjua +.section sfjub +.section sfjva +.section sfjvb +.section sfjwa +.section sfjwb +.section sfjxa +.section sfjxb +.section sfjya +.section sfjyb +.section sfjza +.section sfjzb +.section sfj1a +.section sfj1b +.section sfj2a +.section sfj2b +.section sfj3a +.section sfj3b +.section sfj4a +.section sfj4b +.section sfj5a +.section sfj5b +.section sfj6a +.section sfj6b +.section sfj7a +.section sfj7b +.section sfj8a +.section sfj8b +.section sfj9a +.section sfj9b +.section sfj0a +.section sfj0b +.section sfkaa +.section sfkab +.section sfkba +.section sfkbb +.section sfkca +.section sfkcb +.section sfkda +.section sfkdb +.section sfkea +.section sfkeb +.section sfkfa +.section sfkfb +.section sfkga +.section sfkgb +.section sfkha +.section sfkhb +.section sfkia +.section sfkib +.section sfkja +.section sfkjb +.section sfkka +.section sfkkb +.section sfkla +.section sfklb +.section sfkma +.section sfkmb +.section sfkna +.section sfknb +.section sfkoa +.section sfkob +.section sfkpa +.section sfkpb +.section sfkqa +.section sfkqb +.section sfkra +.section sfkrb +.section sfksa +.section sfksb +.section sfkta +.section sfktb +.section sfkua +.section sfkub +.section sfkva +.section sfkvb +.section sfkwa +.section sfkwb +.section sfkxa +.section sfkxb +.section sfkya +.section sfkyb +.section sfkza +.section sfkzb +.section sfk1a +.section sfk1b +.section sfk2a +.section sfk2b +.section sfk3a +.section sfk3b +.section sfk4a +.section sfk4b +.section sfk5a +.section sfk5b +.section sfk6a +.section sfk6b +.section sfk7a +.section sfk7b +.section sfk8a +.section sfk8b +.section sfk9a +.section sfk9b +.section sfk0a +.section sfk0b +.section sflaa +.section sflab +.section sflba +.section sflbb +.section sflca +.section sflcb +.section sflda +.section sfldb +.section sflea +.section sfleb +.section sflfa +.section sflfb +.section sflga +.section sflgb +.section sflha +.section sflhb +.section sflia +.section sflib +.section sflja +.section sfljb +.section sflka +.section sflkb +.section sflla +.section sfllb +.section sflma +.section sflmb +.section sflna +.section sflnb +.section sfloa +.section sflob +.section sflpa +.section sflpb +.section sflqa +.section sflqb +.section sflra +.section sflrb +.section sflsa +.section sflsb +.section sflta +.section sfltb +.section sflua +.section sflub +.section sflva +.section sflvb +.section sflwa +.section sflwb +.section sflxa +.section sflxb +.section sflya +.section sflyb +.section sflza +.section sflzb +.section sfl1a +.section sfl1b +.section sfl2a +.section sfl2b +.section sfl3a +.section sfl3b +.section sfl4a +.section sfl4b +.section sfl5a +.section sfl5b +.section sfl6a +.section sfl6b +.section sfl7a +.section sfl7b +.section sfl8a +.section sfl8b +.section sfl9a +.section sfl9b +.section sfl0a +.section sfl0b +.section sfmaa +.section sfmab +.section sfmba +.section sfmbb +.section sfmca +.section sfmcb +.section sfmda +.section sfmdb +.section sfmea +.section sfmeb +.section sfmfa +.section sfmfb +.section sfmga +.section sfmgb +.section sfmha +.section sfmhb +.section sfmia +.section sfmib +.section sfmja +.section sfmjb +.section sfmka +.section sfmkb +.section sfmla +.section sfmlb +.section sfmma +.section sfmmb +.section sfmna +.section sfmnb +.section sfmoa +.section sfmob +.section sfmpa +.section sfmpb +.section sfmqa +.section sfmqb +.section sfmra +.section sfmrb +.section sfmsa +.section sfmsb +.section sfmta +.section sfmtb +.section sfmua +.section sfmub +.section sfmva +.section sfmvb +.section sfmwa +.section sfmwb +.section sfmxa +.section sfmxb +.section sfmya +.section sfmyb +.section sfmza +.section sfmzb +.section sfm1a +.section sfm1b +.section sfm2a +.section sfm2b +.section sfm3a +.section sfm3b +.section sfm4a +.section sfm4b +.section sfm5a +.section sfm5b +.section sfm6a +.section sfm6b +.section sfm7a +.section sfm7b +.section sfm8a +.section sfm8b +.section sfm9a +.section sfm9b +.section sfm0a +.section sfm0b +.section sfnaa +.section sfnab +.section sfnba +.section sfnbb +.section sfnca +.section sfncb +.section sfnda +.section sfndb +.section sfnea +.section sfneb +.section sfnfa +.section sfnfb +.section sfnga +.section sfngb +.section sfnha +.section sfnhb +.section sfnia +.section sfnib +.section sfnja +.section sfnjb +.section sfnka +.section sfnkb +.section sfnla +.section sfnlb +.section sfnma +.section sfnmb +.section sfnna +.section sfnnb +.section sfnoa +.section sfnob +.section sfnpa +.section sfnpb +.section sfnqa +.section sfnqb +.section sfnra +.section sfnrb +.section sfnsa +.section sfnsb +.section sfnta +.section sfntb +.section sfnua +.section sfnub +.section sfnva +.section sfnvb +.section sfnwa +.section sfnwb +.section sfnxa +.section sfnxb +.section sfnya +.section sfnyb +.section sfnza +.section sfnzb +.section sfn1a +.section sfn1b +.section sfn2a +.section sfn2b +.section sfn3a +.section sfn3b +.section sfn4a +.section sfn4b +.section sfn5a +.section sfn5b +.section sfn6a +.section sfn6b +.section sfn7a +.section sfn7b +.section sfn8a +.section sfn8b +.section sfn9a +.section sfn9b +.section sfn0a +.section sfn0b +.section sfoaa +.section sfoab +.section sfoba +.section sfobb +.section sfoca +.section sfocb +.section sfoda +.section sfodb +.section sfoea +.section sfoeb +.section sfofa +.section sfofb +.section sfoga +.section sfogb +.section sfoha +.section sfohb +.section sfoia +.section sfoib +.section sfoja +.section sfojb +.section sfoka +.section sfokb +.section sfola +.section sfolb +.section sfoma +.section sfomb +.section sfona +.section sfonb +.section sfooa +.section sfoob +.section sfopa +.section sfopb +.section sfoqa +.section sfoqb +.section sfora +.section sforb +.section sfosa +.section sfosb +.section sfota +.section sfotb +.section sfoua +.section sfoub +.section sfova +.section sfovb +.section sfowa +.section sfowb +.section sfoxa +.section sfoxb +.section sfoya +.section sfoyb +.section sfoza +.section sfozb +.section sfo1a +.section sfo1b +.section sfo2a +.section sfo2b +.section sfo3a +.section sfo3b +.section sfo4a +.section sfo4b +.section sfo5a +.section sfo5b +.section sfo6a +.section sfo6b +.section sfo7a +.section sfo7b +.section sfo8a +.section sfo8b +.section sfo9a +.section sfo9b +.section sfo0a +.section sfo0b +.section sfpaa +.section sfpab +.section sfpba +.section sfpbb +.section sfpca +.section sfpcb +.section sfpda +.section sfpdb +.section sfpea +.section sfpeb +.section sfpfa +.section sfpfb +.section sfpga +.section sfpgb +.section sfpha +.section sfphb +.section sfpia +.section sfpib +.section sfpja +.section sfpjb +.section sfpka +.section sfpkb +.section sfpla +.section sfplb +.section sfpma +.section sfpmb +.section sfpna +.section sfpnb +.section sfpoa +.section sfpob +.section sfppa +.section sfppb +.section sfpqa +.section sfpqb +.section sfpra +.section sfprb +.section sfpsa +.section sfpsb +.section sfpta +.section sfptb +.section sfpua +.section sfpub +.section sfpva +.section sfpvb +.section sfpwa +.section sfpwb +.section sfpxa +.section sfpxb +.section sfpya +.section sfpyb +.section sfpza +.section sfpzb +.section sfp1a +.section sfp1b +.section sfp2a +.section sfp2b +.section sfp3a +.section sfp3b +.section sfp4a +.section sfp4b +.section sfp5a +.section sfp5b +.section sfp6a +.section sfp6b +.section sfp7a +.section sfp7b +.section sfp8a +.section sfp8b +.section sfp9a +.section sfp9b +.section sfp0a +.section sfp0b +.section sfqaa +.section sfqab +.section sfqba +.section sfqbb +.section sfqca +.section sfqcb +.section sfqda +.section sfqdb +.section sfqea +.section sfqeb +.section sfqfa +.section sfqfb +.section sfqga +.section sfqgb +.section sfqha +.section sfqhb +.section sfqia +.section sfqib +.section sfqja +.section sfqjb +.section sfqka +.section sfqkb +.section sfqla +.section sfqlb +.section sfqma +.section sfqmb +.section sfqna +.section sfqnb +.section sfqoa +.section sfqob +.section sfqpa +.section sfqpb +.section sfqqa +.section sfqqb +.section sfqra +.section sfqrb +.section sfqsa +.section sfqsb +.section sfqta +.section sfqtb +.section sfqua +.section sfqub +.section sfqva +.section sfqvb +.section sfqwa +.section sfqwb +.section sfqxa +.section sfqxb +.section sfqya +.section sfqyb +.section sfqza +.section sfqzb +.section sfq1a +.section sfq1b +.section sfq2a +.section sfq2b +.section sfq3a +.section sfq3b +.section sfq4a +.section sfq4b +.section sfq5a +.section sfq5b +.section sfq6a +.section sfq6b +.section sfq7a +.section sfq7b +.section sfq8a +.section sfq8b +.section sfq9a +.section sfq9b +.section sfq0a +.section sfq0b +.section sfraa +.section sfrab +.section sfrba +.section sfrbb +.section sfrca +.section sfrcb +.section sfrda +.section sfrdb +.section sfrea +.section sfreb +.section sfrfa +.section sfrfb +.section sfrga +.section sfrgb +.section sfrha +.section sfrhb +.section sfria +.section sfrib +.section sfrja +.section sfrjb +.section sfrka +.section sfrkb +.section sfrla +.section sfrlb +.section sfrma +.section sfrmb +.section sfrna +.section sfrnb +.section sfroa +.section sfrob +.section sfrpa +.section sfrpb +.section sfrqa +.section sfrqb +.section sfrra +.section sfrrb +.section sfrsa +.section sfrsb +.section sfrta +.section sfrtb +.section sfrua +.section sfrub +.section sfrva +.section sfrvb +.section sfrwa +.section sfrwb +.section sfrxa +.section sfrxb +.section sfrya +.section sfryb +.section sfrza +.section sfrzb +.section sfr1a +.section sfr1b +.section sfr2a +.section sfr2b +.section sfr3a +.section sfr3b +.section sfr4a +.section sfr4b +.section sfr5a +.section sfr5b +.section sfr6a +.section sfr6b +.section sfr7a +.section sfr7b +.section sfr8a +.section sfr8b +.section sfr9a +.section sfr9b +.section sfr0a +.section sfr0b +.section sfsaa +.section sfsab +.section sfsba +.section sfsbb +.section sfsca +.section sfscb +.section sfsda +.section sfsdb +.section sfsea +.section sfseb +.section sfsfa +.section sfsfb +.section sfsga +.section sfsgb +.section sfsha +.section sfshb +.section sfsia +.section sfsib +.section sfsja +.section sfsjb +.section sfska +.section sfskb +.section sfsla +.section sfslb +.section sfsma +.section sfsmb +.section sfsna +.section sfsnb +.section sfsoa +.section sfsob +.section sfspa +.section sfspb +.section sfsqa +.section sfsqb +.section sfsra +.section sfsrb +.section sfssa +.section sfssb +.section sfsta +.section sfstb +.section sfsua +.section sfsub +.section sfsva +.section sfsvb +.section sfswa +.section sfswb +.section sfsxa +.section sfsxb +.section sfsya +.section sfsyb +.section sfsza +.section sfszb +.section sfs1a +.section sfs1b +.section sfs2a +.section sfs2b +.section sfs3a +.section sfs3b +.section sfs4a +.section sfs4b +.section sfs5a +.section sfs5b +.section sfs6a +.section sfs6b +.section sfs7a +.section sfs7b +.section sfs8a +.section sfs8b +.section sfs9a +.section sfs9b +.section sfs0a +.section sfs0b +.section sftaa +.section sftab +.section sftba +.section sftbb +.section sftca +.section sftcb +.section sftda +.section sftdb +.section sftea +.section sfteb +.section sftfa +.section sftfb +.section sftga +.section sftgb +.section sftha +.section sfthb +.section sftia +.section sftib +.section sftja +.section sftjb +.section sftka +.section sftkb +.section sftla +.section sftlb +.section sftma +.section sftmb +.section sftna +.section sftnb +.section sftoa +.section sftob +.section sftpa +.section sftpb +.section sftqa +.section sftqb +.section sftra +.section sftrb +.section sftsa +.section sftsb +.section sftta +.section sfttb +.section sftua +.section sftub +.section sftva +.section sftvb +.section sftwa +.section sftwb +.section sftxa +.section sftxb +.section sftya +.section sftyb +.section sftza +.section sftzb +.section sft1a +.section sft1b +.section sft2a +.section sft2b +.section sft3a +.section sft3b +.section sft4a +.section sft4b +.section sft5a +.section sft5b +.section sft6a +.section sft6b +.section sft7a +.section sft7b +.section sft8a +.section sft8b +.section sft9a +.section sft9b +.section sft0a +.section sft0b +.section sfuaa +.section sfuab +.section sfuba +.section sfubb +.section sfuca +.section sfucb +.section sfuda +.section sfudb +.section sfuea +.section sfueb +.section sfufa +.section sfufb +.section sfuga +.section sfugb +.section sfuha +.section sfuhb +.section sfuia +.section sfuib +.section sfuja +.section sfujb +.section sfuka +.section sfukb +.section sfula +.section sfulb +.section sfuma +.section sfumb +.section sfuna +.section sfunb +.section sfuoa +.section sfuob +.section sfupa +.section sfupb +.section sfuqa +.section sfuqb +.section sfura +.section sfurb +.section sfusa +.section sfusb +.section sfuta +.section sfutb +.section sfuua +.section sfuub +.section sfuva +.section sfuvb +.section sfuwa +.section sfuwb +.section sfuxa +.section sfuxb +.section sfuya +.section sfuyb +.section sfuza +.section sfuzb +.section sfu1a +.section sfu1b +.section sfu2a +.section sfu2b +.section sfu3a +.section sfu3b +.section sfu4a +.section sfu4b +.section sfu5a +.section sfu5b +.section sfu6a +.section sfu6b +.section sfu7a +.section sfu7b +.section sfu8a +.section sfu8b +.section sfu9a +.section sfu9b +.section sfu0a +.section sfu0b +.section sfvaa +.section sfvab +.section sfvba +.section sfvbb +.section sfvca +.section sfvcb +.section sfvda +.section sfvdb +.section sfvea +.section sfveb +.section sfvfa +.section sfvfb +.section sfvga +.section sfvgb +.section sfvha +.section sfvhb +.section sfvia +.section sfvib +.section sfvja +.section sfvjb +.section sfvka +.section sfvkb +.section sfvla +.section sfvlb +.section sfvma +.section sfvmb +.section sfvna +.section sfvnb +.section sfvoa +.section sfvob +.section sfvpa +.section sfvpb +.section sfvqa +.section sfvqb +.section sfvra +.section sfvrb +.section sfvsa +.section sfvsb +.section sfvta +.section sfvtb +.section sfvua +.section sfvub +.section sfvva +.section sfvvb +.section sfvwa +.section sfvwb +.section sfvxa +.section sfvxb +.section sfvya +.section sfvyb +.section sfvza +.section sfvzb +.section sfv1a +.section sfv1b +.section sfv2a +.section sfv2b +.section sfv3a +.section sfv3b +.section sfv4a +.section sfv4b +.section sfv5a +.section sfv5b +.section sfv6a +.section sfv6b +.section sfv7a +.section sfv7b +.section sfv8a +.section sfv8b +.section sfv9a +.section sfv9b +.section sfv0a +.section sfv0b +.section sfwaa +.section sfwab +.section sfwba +.section sfwbb +.section sfwca +.section sfwcb +.section sfwda +.section sfwdb +.section sfwea +.section sfweb +.section sfwfa +.section sfwfb +.section sfwga +.section sfwgb +.section sfwha +.section sfwhb +.section sfwia +.section sfwib +.section sfwja +.section sfwjb +.section sfwka +.section sfwkb +.section sfwla +.section sfwlb +.section sfwma +.section sfwmb +.section sfwna +.section sfwnb +.section sfwoa +.section sfwob +.section sfwpa +.section sfwpb +.section sfwqa +.section sfwqb +.section sfwra +.section sfwrb +.section sfwsa +.section sfwsb +.section sfwta +.section sfwtb +.section sfwua +.section sfwub +.section sfwva +.section sfwvb +.section sfwwa +.section sfwwb +.section sfwxa +.section sfwxb +.section sfwya +.section sfwyb +.section sfwza +.section sfwzb +.section sfw1a +.section sfw1b +.section sfw2a +.section sfw2b +.section sfw3a +.section sfw3b +.section sfw4a +.section sfw4b +.section sfw5a +.section sfw5b +.section sfw6a +.section sfw6b +.section sfw7a +.section sfw7b +.section sfw8a +.section sfw8b +.section sfw9a +.section sfw9b +.section sfw0a +.section sfw0b +.section sfxaa +.section sfxab +.section sfxba +.section sfxbb +.section sfxca +.section sfxcb +.section sfxda +.section sfxdb +.section sfxea +.section sfxeb +.section sfxfa +.section sfxfb +.section sfxga +.section sfxgb +.section sfxha +.section sfxhb +.section sfxia +.section sfxib +.section sfxja +.section sfxjb +.section sfxka +.section sfxkb +.section sfxla +.section sfxlb +.section sfxma +.section sfxmb +.section sfxna +.section sfxnb +.section sfxoa +.section sfxob +.section sfxpa +.section sfxpb +.section sfxqa +.section sfxqb +.section sfxra +.section sfxrb +.section sfxsa +.section sfxsb +.section sfxta +.section sfxtb +.section sfxua +.section sfxub +.section sfxva +.section sfxvb +.section sfxwa +.section sfxwb +.section sfxxa +.section sfxxb +.section sfxya +.section sfxyb +.section sfxza +.section sfxzb +.section sfx1a +.section sfx1b +.section sfx2a +.section sfx2b +.section sfx3a +.section sfx3b +.section sfx4a +.section sfx4b +.section sfx5a +.section sfx5b +.section sfx6a +.section sfx6b +.section sfx7a +.section sfx7b +.section sfx8a +.section sfx8b +.section sfx9a +.section sfx9b +.section sfx0a +.section sfx0b +.section sfyaa +.section sfyab +.section sfyba +.section sfybb +.section sfyca +.section sfycb +.section sfyda +.section sfydb +.section sfyea +.section sfyeb +.section sfyfa +.section sfyfb +.section sfyga +.section sfygb +.section sfyha +.section sfyhb +.section sfyia +.section sfyib +.section sfyja +.section sfyjb +.section sfyka +.section sfykb +.section sfyla +.section sfylb +.section sfyma +.section sfymb +.section sfyna +.section sfynb +.section sfyoa +.section sfyob +.section sfypa +.section sfypb +.section sfyqa +.section sfyqb +.section sfyra +.section sfyrb +.section sfysa +.section sfysb +.section sfyta +.section sfytb +.section sfyua +.section sfyub +.section sfyva +.section sfyvb +.section sfywa +.section sfywb +.section sfyxa +.section sfyxb +.section sfyya +.section sfyyb +.section sfyza +.section sfyzb +.section sfy1a +.section sfy1b +.section sfy2a +.section sfy2b +.section sfy3a +.section sfy3b +.section sfy4a +.section sfy4b +.section sfy5a +.section sfy5b +.section sfy6a +.section sfy6b +.section sfy7a +.section sfy7b +.section sfy8a +.section sfy8b +.section sfy9a +.section sfy9b +.section sfy0a +.section sfy0b +.section sfzaa +.section sfzab +.section sfzba +.section sfzbb +.section sfzca +.section sfzcb +.section sfzda +.section sfzdb +.section sfzea +.section sfzeb +.section sfzfa +.section sfzfb +.section sfzga +.section sfzgb +.section sfzha +.section sfzhb +.section sfzia +.section sfzib +.section sfzja +.section sfzjb +.section sfzka +.section sfzkb +.section sfzla +.section sfzlb +.section sfzma +.section sfzmb +.section sfzna +.section sfznb +.section sfzoa +.section sfzob +.section sfzpa +.section sfzpb +.section sfzqa +.section sfzqb +.section sfzra +.section sfzrb +.section sfzsa +.section sfzsb +.section sfzta +.section sfztb +.section sfzua +.section sfzub +.section sfzva +.section sfzvb +.section sfzwa +.section sfzwb +.section sfzxa +.section sfzxb +.section sfzya +.section sfzyb +.section sfzza +.section sfzzb +.section sfz1a +.section sfz1b +.section sfz2a +.section sfz2b +.section sfz3a +.section sfz3b +.section sfz4a +.section sfz4b +.section sfz5a +.section sfz5b +.section sfz6a +.section sfz6b +.section sfz7a +.section sfz7b +.section sfz8a +.section sfz8b +.section sfz9a +.section sfz9b +.section sfz0a +.section sfz0b +.section sf1aa +.section sf1ab +.section sf1ba +.section sf1bb +.section sf1ca +.section sf1cb +.section sf1da +.section sf1db +.section sf1ea +.section sf1eb +.section sf1fa +.section sf1fb +.section sf1ga +.section sf1gb +.section sf1ha +.section sf1hb +.section sf1ia +.section sf1ib +.section sf1ja +.section sf1jb +.section sf1ka +.section sf1kb +.section sf1la +.section sf1lb +.section sf1ma +.section sf1mb +.section sf1na +.section sf1nb +.section sf1oa +.section sf1ob +.section sf1pa +.section sf1pb +.section sf1qa +.section sf1qb +.section sf1ra +.section sf1rb +.section sf1sa +.section sf1sb +.section sf1ta +.section sf1tb +.section sf1ua +.section sf1ub +.section sf1va +.section sf1vb +.section sf1wa +.section sf1wb +.section sf1xa +.section sf1xb +.section sf1ya +.section sf1yb +.section sf1za +.section sf1zb +.section sf11a +.section sf11b +.section sf12a +.section sf12b +.section sf13a +.section sf13b +.section sf14a +.section sf14b +.section sf15a +.section sf15b +.section sf16a +.section sf16b +.section sf17a +.section sf17b +.section sf18a +.section sf18b +.section sf19a +.section sf19b +.section sf10a +.section sf10b +.section sf2aa +.section sf2ab +.section sf2ba +.section sf2bb +.section sf2ca +.section sf2cb +.section sf2da +.section sf2db +.section sf2ea +.section sf2eb +.section sf2fa +.section sf2fb +.section sf2ga +.section sf2gb +.section sf2ha +.section sf2hb +.section sf2ia +.section sf2ib +.section sf2ja +.section sf2jb +.section sf2ka +.section sf2kb +.section sf2la +.section sf2lb +.section sf2ma +.section sf2mb +.section sf2na +.section sf2nb +.section sf2oa +.section sf2ob +.section sf2pa +.section sf2pb +.section sf2qa +.section sf2qb +.section sf2ra +.section sf2rb +.section sf2sa +.section sf2sb +.section sf2ta +.section sf2tb +.section sf2ua +.section sf2ub +.section sf2va +.section sf2vb +.section sf2wa +.section sf2wb +.section sf2xa +.section sf2xb +.section sf2ya +.section sf2yb +.section sf2za +.section sf2zb +.section sf21a +.section sf21b +.section sf22a +.section sf22b +.section sf23a +.section sf23b +.section sf24a +.section sf24b +.section sf25a +.section sf25b +.section sf26a +.section sf26b +.section sf27a +.section sf27b +.section sf28a +.section sf28b +.section sf29a +.section sf29b +.section sf20a +.section sf20b +.section sf3aa +.section sf3ab +.section sf3ba +.section sf3bb +.section sf3ca +.section sf3cb +.section sf3da +.section sf3db +.section sf3ea +.section sf3eb +.section sf3fa +.section sf3fb +.section sf3ga +.section sf3gb +.section sf3ha +.section sf3hb +.section sf3ia +.section sf3ib +.section sf3ja +.section sf3jb +.section sf3ka +.section sf3kb +.section sf3la +.section sf3lb +.section sf3ma +.section sf3mb +.section sf3na +.section sf3nb +.section sf3oa +.section sf3ob +.section sf3pa +.section sf3pb +.section sf3qa +.section sf3qb +.section sf3ra +.section sf3rb +.section sf3sa +.section sf3sb +.section sf3ta +.section sf3tb +.section sf3ua +.section sf3ub +.section sf3va +.section sf3vb +.section sf3wa +.section sf3wb +.section sf3xa +.section sf3xb +.section sf3ya +.section sf3yb +.section sf3za +.section sf3zb +.section sf31a +.section sf31b +.section sf32a +.section sf32b +.section sf33a +.section sf33b +.section sf34a +.section sf34b +.section sf35a +.section sf35b +.section sf36a +.section sf36b +.section sf37a +.section sf37b +.section sf38a +.section sf38b +.section sf39a +.section sf39b +.section sf30a +.section sf30b +.section sf4aa +.section sf4ab +.section sf4ba +.section sf4bb +.section sf4ca +.section sf4cb +.section sf4da +.section sf4db +.section sf4ea +.section sf4eb +.section sf4fa +.section sf4fb +.section sf4ga +.section sf4gb +.section sf4ha +.section sf4hb +.section sf4ia +.section sf4ib +.section sf4ja +.section sf4jb +.section sf4ka +.section sf4kb +.section sf4la +.section sf4lb +.section sf4ma +.section sf4mb +.section sf4na +.section sf4nb +.section sf4oa +.section sf4ob +.section sf4pa +.section sf4pb +.section sf4qa +.section sf4qb +.section sf4ra +.section sf4rb +.section sf4sa +.section sf4sb +.section sf4ta +.section sf4tb +.section sf4ua +.section sf4ub +.section sf4va +.section sf4vb +.section sf4wa +.section sf4wb +.section sf4xa +.section sf4xb +.section sf4ya +.section sf4yb +.section sf4za +.section sf4zb +.section sf41a +.section sf41b +.section sf42a +.section sf42b +.section sf43a +.section sf43b +.section sf44a +.section sf44b +.section sf45a +.section sf45b +.section sf46a +.section sf46b +.section sf47a +.section sf47b +.section sf48a +.section sf48b +.section sf49a +.section sf49b +.section sf40a +.section sf40b +.section sf5aa +.section sf5ab +.section sf5ba +.section sf5bb +.section sf5ca +.section sf5cb +.section sf5da +.section sf5db +.section sf5ea +.section sf5eb +.section sf5fa +.section sf5fb +.section sf5ga +.section sf5gb +.section sf5ha +.section sf5hb +.section sf5ia +.section sf5ib +.section sf5ja +.section sf5jb +.section sf5ka +.section sf5kb +.section sf5la +.section sf5lb +.section sf5ma +.section sf5mb +.section sf5na +.section sf5nb +.section sf5oa +.section sf5ob +.section sf5pa +.section sf5pb +.section sf5qa +.section sf5qb +.section sf5ra +.section sf5rb +.section sf5sa +.section sf5sb +.section sf5ta +.section sf5tb +.section sf5ua +.section sf5ub +.section sf5va +.section sf5vb +.section sf5wa +.section sf5wb +.section sf5xa +.section sf5xb +.section sf5ya +.section sf5yb +.section sf5za +.section sf5zb +.section sf51a +.section sf51b +.section sf52a +.section sf52b +.section sf53a +.section sf53b +.section sf54a +.section sf54b +.section sf55a +.section sf55b +.section sf56a +.section sf56b +.section sf57a +.section sf57b +.section sf58a +.section sf58b +.section sf59a +.section sf59b +.section sf50a +.section sf50b +.section sf6aa +.section sf6ab +.section sf6ba +.section sf6bb +.section sf6ca +.section sf6cb +.section sf6da +.section sf6db +.section sf6ea +.section sf6eb +.section sf6fa +.section sf6fb +.section sf6ga +.section sf6gb +.section sf6ha +.section sf6hb +.section sf6ia +.section sf6ib +.section sf6ja +.section sf6jb +.section sf6ka +.section sf6kb +.section sf6la +.section sf6lb +.section sf6ma +.section sf6mb +.section sf6na +.section sf6nb +.section sf6oa +.section sf6ob +.section sf6pa +.section sf6pb +.section sf6qa +.section sf6qb +.section sf6ra +.section sf6rb +.section sf6sa +.section sf6sb +.section sf6ta +.section sf6tb +.section sf6ua +.section sf6ub +.section sf6va +.section sf6vb +.section sf6wa +.section sf6wb +.section sf6xa +.section sf6xb +.section sf6ya +.section sf6yb +.section sf6za +.section sf6zb +.section sf61a +.section sf61b +.section sf62a +.section sf62b +.section sf63a +.section sf63b +.section sf64a +.section sf64b +.section sf65a +.section sf65b +.section sf66a +.section sf66b +.section sf67a +.section sf67b +.section sf68a +.section sf68b +.section sf69a +.section sf69b +.section sf60a +.section sf60b +.section sf7aa +.section sf7ab +.section sf7ba +.section sf7bb +.section sf7ca +.section sf7cb +.section sf7da +.section sf7db +.section sf7ea +.section sf7eb +.section sf7fa +.section sf7fb +.section sf7ga +.section sf7gb +.section sf7ha +.section sf7hb +.section sf7ia +.section sf7ib +.section sf7ja +.section sf7jb +.section sf7ka +.section sf7kb +.section sf7la +.section sf7lb +.section sf7ma +.section sf7mb +.section sf7na +.section sf7nb +.section sf7oa +.section sf7ob +.section sf7pa +.section sf7pb +.section sf7qa +.section sf7qb +.section sf7ra +.section sf7rb +.section sf7sa +.section sf7sb +.section sf7ta +.section sf7tb +.section sf7ua +.section sf7ub +.section sf7va +.section sf7vb +.section sf7wa +.section sf7wb +.section sf7xa +.section sf7xb +.section sf7ya +.section sf7yb +.section sf7za +.section sf7zb +.section sf71a +.section sf71b +.section sf72a +.section sf72b +.section sf73a +.section sf73b +.section sf74a +.section sf74b +.section sf75a +.section sf75b +.section sf76a +.section sf76b +.section sf77a +.section sf77b +.section sf78a +.section sf78b +.section sf79a +.section sf79b +.section sf70a +.section sf70b +.section sf8aa +.section sf8ab +.section sf8ba +.section sf8bb +.section sf8ca +.section sf8cb +.section sf8da +.section sf8db +.section sf8ea +.section sf8eb +.section sf8fa +.section sf8fb +.section sf8ga +.section sf8gb +.section sf8ha +.section sf8hb +.section sf8ia +.section sf8ib +.section sf8ja +.section sf8jb +.section sf8ka +.section sf8kb +.section sf8la +.section sf8lb +.section sf8ma +.section sf8mb +.section sf8na +.section sf8nb +.section sf8oa +.section sf8ob +.section sf8pa +.section sf8pb +.section sf8qa +.section sf8qb +.section sf8ra +.section sf8rb +.section sf8sa +.section sf8sb +.section sf8ta +.section sf8tb +.section sf8ua +.section sf8ub +.section sf8va +.section sf8vb +.section sf8wa +.section sf8wb +.section sf8xa +.section sf8xb +.section sf8ya +.section sf8yb +.section sf8za +.section sf8zb +.section sf81a +.section sf81b +.section sf82a +.section sf82b +.section sf83a +.section sf83b +.section sf84a +.section sf84b +.section sf85a +.section sf85b +.section sf86a +.section sf86b +.section sf87a +.section sf87b +.section sf88a +.section sf88b +.section sf89a +.section sf89b +.section sf80a +.section sf80b +.section sf9aa +.section sf9ab +.section sf9ba +.section sf9bb +.section sf9ca +.section sf9cb +.section sf9da +.section sf9db +.section sf9ea +.section sf9eb +.section sf9fa +.section sf9fb +.section sf9ga +.section sf9gb +.section sf9ha +.section sf9hb +.section sf9ia +.section sf9ib +.section sf9ja +.section sf9jb +.section sf9ka +.section sf9kb +.section sf9la +.section sf9lb +.section sf9ma +.section sf9mb +.section sf9na +.section sf9nb +.section sf9oa +.section sf9ob +.section sf9pa +.section sf9pb +.section sf9qa +.section sf9qb +.section sf9ra +.section sf9rb +.section sf9sa +.section sf9sb +.section sf9ta +.section sf9tb +.section sf9ua +.section sf9ub +.section sf9va +.section sf9vb +.section sf9wa +.section sf9wb +.section sf9xa +.section sf9xb +.section sf9ya +.section sf9yb +.section sf9za +.section sf9zb +.section sf91a +.section sf91b +.section sf92a +.section sf92b +.section sf93a +.section sf93b +.section sf94a +.section sf94b +.section sf95a +.section sf95b +.section sf96a +.section sf96b +.section sf97a +.section sf97b +.section sf98a +.section sf98b +.section sf99a +.section sf99b +.section sf90a +.section sf90b +.section sf0aa +.section sf0ab +.section sf0ba +.section sf0bb +.section sf0ca +.section sf0cb +.section sf0da +.section sf0db +.section sf0ea +.section sf0eb +.section sf0fa +.section sf0fb +.section sf0ga +.section sf0gb +.section sf0ha +.section sf0hb +.section sf0ia +.section sf0ib +.section sf0ja +.section sf0jb +.section sf0ka +.section sf0kb +.section sf0la +.section sf0lb +.section sf0ma +.section sf0mb +.section sf0na +.section sf0nb +.section sf0oa +.section sf0ob +.section sf0pa +.section sf0pb +.section sf0qa +.section sf0qb +.section sf0ra +.section sf0rb +.section sf0sa +.section sf0sb +.section sf0ta +.section sf0tb +.section sf0ua +.section sf0ub +.section sf0va +.section sf0vb +.section sf0wa +.section sf0wb +.section sf0xa +.section sf0xb +.section sf0ya +.section sf0yb +.section sf0za +.section sf0zb +.section sf01a +.section sf01b +.section sf02a +.section sf02b +.section sf03a +.section sf03b +.section sf04a +.section sf04b +.section sf05a +.section sf05b +.section sf06a +.section sf06b +.section sf07a +.section sf07b +.section sf08a +.section sf08b +.section sf09a +.section sf09b +.section sf00a +.section sf00b +.section sgaaa +.section sgaab +.section sgaba +.section sgabb +.section sgaca +.section sgacb +.section sgada +.section sgadb +.section sgaea +.section sgaeb +.section sgafa +.section sgafb +.section sgaga +.section sgagb +.section sgaha +.section sgahb +.section sgaia +.section sgaib +.section sgaja +.section sgajb +.section sgaka +.section sgakb +.section sgala +.section sgalb +.section sgama +.section sgamb +.section sgana +.section sganb +.section sgaoa +.section sgaob +.section sgapa +.section sgapb +.section sgaqa +.section sgaqb +.section sgara +.section sgarb +.section sgasa +.section sgasb +.section sgata +.section sgatb +.section sgaua +.section sgaub +.section sgava +.section sgavb +.section sgawa +.section sgawb +.section sgaxa +.section sgaxb +.section sgaya +.section sgayb +.section sgaza +.section sgazb +.section sga1a +.section sga1b +.section sga2a +.section sga2b +.section sga3a +.section sga3b +.section sga4a +.section sga4b +.section sga5a +.section sga5b +.section sga6a +.section sga6b +.section sga7a +.section sga7b +.section sga8a +.section sga8b +.section sga9a +.section sga9b +.section sga0a +.section sga0b +.section sgbaa +.section sgbab +.section sgbba +.section sgbbb +.section sgbca +.section sgbcb +.section sgbda +.section sgbdb +.section sgbea +.section sgbeb +.section sgbfa +.section sgbfb +.section sgbga +.section sgbgb +.section sgbha +.section sgbhb +.section sgbia +.section sgbib +.section sgbja +.section sgbjb +.section sgbka +.section sgbkb +.section sgbla +.section sgblb +.section sgbma +.section sgbmb +.section sgbna +.section sgbnb +.section sgboa +.section sgbob +.section sgbpa +.section sgbpb +.section sgbqa +.section sgbqb +.section sgbra +.section sgbrb +.section sgbsa +.section sgbsb +.section sgbta +.section sgbtb +.section sgbua +.section sgbub +.section sgbva +.section sgbvb +.section sgbwa +.section sgbwb +.section sgbxa +.section sgbxb +.section sgbya +.section sgbyb +.section sgbza +.section sgbzb +.section sgb1a +.section sgb1b +.section sgb2a +.section sgb2b +.section sgb3a +.section sgb3b +.section sgb4a +.section sgb4b +.section sgb5a +.section sgb5b +.section sgb6a +.section sgb6b +.section sgb7a +.section sgb7b +.section sgb8a +.section sgb8b +.section sgb9a +.section sgb9b +.section sgb0a +.section sgb0b +.section sgcaa +.section sgcab +.section sgcba +.section sgcbb +.section sgcca +.section sgccb +.section sgcda +.section sgcdb +.section sgcea +.section sgceb +.section sgcfa +.section sgcfb +.section sgcga +.section sgcgb +.section sgcha +.section sgchb +.section sgcia +.section sgcib +.section sgcja +.section sgcjb +.section sgcka +.section sgckb +.section sgcla +.section sgclb +.section sgcma +.section sgcmb +.section sgcna +.section sgcnb +.section sgcoa +.section sgcob +.section sgcpa +.section sgcpb +.section sgcqa +.section sgcqb +.section sgcra +.section sgcrb +.section sgcsa +.section sgcsb +.section sgcta +.section sgctb +.section sgcua +.section sgcub +.section sgcva +.section sgcvb +.section sgcwa +.section sgcwb +.section sgcxa +.section sgcxb +.section sgcya +.section sgcyb +.section sgcza +.section sgczb +.section sgc1a +.section sgc1b +.section sgc2a +.section sgc2b +.section sgc3a +.section sgc3b +.section sgc4a +.section sgc4b +.section sgc5a +.section sgc5b +.section sgc6a +.section sgc6b +.section sgc7a +.section sgc7b +.section sgc8a +.section sgc8b +.section sgc9a +.section sgc9b +.section sgc0a +.section sgc0b +.section sgdaa +.section sgdab +.section sgdba +.section sgdbb +.section sgdca +.section sgdcb +.section sgdda +.section sgddb +.section sgdea +.section sgdeb +.section sgdfa +.section sgdfb +.section sgdga +.section sgdgb +.section sgdha +.section sgdhb +.section sgdia +.section sgdib +.section sgdja +.section sgdjb +.section sgdka +.section sgdkb +.section sgdla +.section sgdlb +.section sgdma +.section sgdmb +.section sgdna +.section sgdnb +.section sgdoa +.section sgdob +.section sgdpa +.section sgdpb +.section sgdqa +.section sgdqb +.section sgdra +.section sgdrb +.section sgdsa +.section sgdsb +.section sgdta +.section sgdtb +.section sgdua +.section sgdub +.section sgdva +.section sgdvb +.section sgdwa +.section sgdwb +.section sgdxa +.section sgdxb +.section sgdya +.section sgdyb +.section sgdza +.section sgdzb +.section sgd1a +.section sgd1b +.section sgd2a +.section sgd2b +.section sgd3a +.section sgd3b +.section sgd4a +.section sgd4b +.section sgd5a +.section sgd5b +.section sgd6a +.section sgd6b +.section sgd7a +.section sgd7b +.section sgd8a +.section sgd8b +.section sgd9a +.section sgd9b +.section sgd0a +.section sgd0b +.section sgeaa +.section sgeab +.section sgeba +.section sgebb +.section sgeca +.section sgecb +.section sgeda +.section sgedb +.section sgeea +.section sgeeb +.section sgefa +.section sgefb +.section sgega +.section sgegb +.section sgeha +.section sgehb +.section sgeia +.section sgeib +.section sgeja +.section sgejb +.section sgeka +.section sgekb +.section sgela +.section sgelb +.section sgema +.section sgemb +.section sgena +.section sgenb +.section sgeoa +.section sgeob +.section sgepa +.section sgepb +.section sgeqa +.section sgeqb +.section sgera +.section sgerb +.section sgesa +.section sgesb +.section sgeta +.section sgetb +.section sgeua +.section sgeub +.section sgeva +.section sgevb +.section sgewa +.section sgewb +.section sgexa +.section sgexb +.section sgeya +.section sgeyb +.section sgeza +.section sgezb +.section sge1a +.section sge1b +.section sge2a +.section sge2b +.section sge3a +.section sge3b +.section sge4a +.section sge4b +.section sge5a +.section sge5b +.section sge6a +.section sge6b +.section sge7a +.section sge7b +.section sge8a +.section sge8b +.section sge9a +.section sge9b +.section sge0a +.section sge0b +.section sgfaa +.section sgfab +.section sgfba +.section sgfbb +.section sgfca +.section sgfcb +.section sgfda +.section sgfdb +.section sgfea +.section sgfeb +.section sgffa +.section sgffb +.section sgfga +.section sgfgb +.section sgfha +.section sgfhb +.section sgfia +.section sgfib +.section sgfja +.section sgfjb +.section sgfka +.section sgfkb +.section sgfla +.section sgflb +.section sgfma +.section sgfmb +.section sgfna +.section sgfnb +.section sgfoa +.section sgfob +.section sgfpa +.section sgfpb +.section sgfqa +.section sgfqb +.section sgfra +.section sgfrb +.section sgfsa +.section sgfsb +.section sgfta +.section sgftb +.section sgfua +.section sgfub +.section sgfva +.section sgfvb +.section sgfwa +.section sgfwb +.section sgfxa +.section sgfxb +.section sgfya +.section sgfyb +.section sgfza +.section sgfzb +.section sgf1a +.section sgf1b +.section sgf2a +.section sgf2b +.section sgf3a +.section sgf3b +.section sgf4a +.section sgf4b +.section sgf5a +.section sgf5b +.section sgf6a +.section sgf6b +.section sgf7a +.section sgf7b +.section sgf8a +.section sgf8b +.section sgf9a +.section sgf9b +.section sgf0a +.section sgf0b +.section sggaa +.section sggab +.section sggba +.section sggbb +.section sggca +.section sggcb +.section sggda +.section sggdb +.section sggea +.section sggeb +.section sggfa +.section sggfb +.section sggga +.section sgggb +.section sggha +.section sgghb +.section sggia +.section sggib +.section sggja +.section sggjb +.section sggka +.section sggkb +.section sggla +.section sgglb +.section sggma +.section sggmb +.section sggna +.section sggnb +.section sggoa +.section sggob +.section sggpa +.section sggpb +.section sggqa +.section sggqb +.section sggra +.section sggrb +.section sggsa +.section sggsb +.section sggta +.section sggtb +.section sggua +.section sggub +.section sggva +.section sggvb +.section sggwa +.section sggwb +.section sggxa +.section sggxb +.section sggya +.section sggyb +.section sggza +.section sggzb +.section sgg1a +.section sgg1b +.section sgg2a +.section sgg2b +.section sgg3a +.section sgg3b +.section sgg4a +.section sgg4b +.section sgg5a +.section sgg5b +.section sgg6a +.section sgg6b +.section sgg7a +.section sgg7b +.section sgg8a +.section sgg8b +.section sgg9a +.section sgg9b +.section sgg0a +.section sgg0b +.section sghaa +.section sghab +.section sghba +.section sghbb +.section sghca +.section sghcb +.section sghda +.section sghdb +.section sghea +.section sgheb +.section sghfa +.section sghfb +.section sghga +.section sghgb +.section sghha +.section sghhb +.section sghia +.section sghib +.section sghja +.section sghjb +.section sghka +.section sghkb +.section sghla +.section sghlb +.section sghma +.section sghmb +.section sghna +.section sghnb +.section sghoa +.section sghob +.section sghpa +.section sghpb +.section sghqa +.section sghqb +.section sghra +.section sghrb +.section sghsa +.section sghsb +.section sghta +.section sghtb +.section sghua +.section sghub +.section sghva +.section sghvb +.section sghwa +.section sghwb +.section sghxa +.section sghxb +.section sghya +.section sghyb +.section sghza +.section sghzb +.section sgh1a +.section sgh1b +.section sgh2a +.section sgh2b +.section sgh3a +.section sgh3b +.section sgh4a +.section sgh4b +.section sgh5a +.section sgh5b +.section sgh6a +.section sgh6b +.section sgh7a +.section sgh7b +.section sgh8a +.section sgh8b +.section sgh9a +.section sgh9b +.section sgh0a +.section sgh0b +.section sgiaa +.section sgiab +.section sgiba +.section sgibb +.section sgica +.section sgicb +.section sgida +.section sgidb +.section sgiea +.section sgieb +.section sgifa +.section sgifb +.section sgiga +.section sgigb +.section sgiha +.section sgihb +.section sgiia +.section sgiib +.section sgija +.section sgijb +.section sgika +.section sgikb +.section sgila +.section sgilb +.section sgima +.section sgimb +.section sgina +.section sginb +.section sgioa +.section sgiob +.section sgipa +.section sgipb +.section sgiqa +.section sgiqb +.section sgira +.section sgirb +.section sgisa +.section sgisb +.section sgita +.section sgitb +.section sgiua +.section sgiub +.section sgiva +.section sgivb +.section sgiwa +.section sgiwb +.section sgixa +.section sgixb +.section sgiya +.section sgiyb +.section sgiza +.section sgizb +.section sgi1a +.section sgi1b +.section sgi2a +.section sgi2b +.section sgi3a +.section sgi3b +.section sgi4a +.section sgi4b +.section sgi5a +.section sgi5b +.section sgi6a +.section sgi6b +.section sgi7a +.section sgi7b +.section sgi8a +.section sgi8b +.section sgi9a +.section sgi9b +.section sgi0a +.section sgi0b +.section sgjaa +.section sgjab +.section sgjba +.section sgjbb +.section sgjca +.section sgjcb +.section sgjda +.section sgjdb +.section sgjea +.section sgjeb +.section sgjfa +.section sgjfb +.section sgjga +.section sgjgb +.section sgjha +.section sgjhb +.section sgjia +.section sgjib +.section sgjja +.section sgjjb +.section sgjka +.section sgjkb +.section sgjla +.section sgjlb +.section sgjma +.section sgjmb +.section sgjna +.section sgjnb +.section sgjoa +.section sgjob +.section sgjpa +.section sgjpb +.section sgjqa +.section sgjqb +.section sgjra +.section sgjrb +.section sgjsa +.section sgjsb +.section sgjta +.section sgjtb +.section sgjua +.section sgjub +.section sgjva +.section sgjvb +.section sgjwa +.section sgjwb +.section sgjxa +.section sgjxb +.section sgjya +.section sgjyb +.section sgjza +.section sgjzb +.section sgj1a +.section sgj1b +.section sgj2a +.section sgj2b +.section sgj3a +.section sgj3b +.section sgj4a +.section sgj4b +.section sgj5a +.section sgj5b +.section sgj6a +.section sgj6b +.section sgj7a +.section sgj7b +.section sgj8a +.section sgj8b +.section sgj9a +.section sgj9b +.section sgj0a +.section sgj0b +.section sgkaa +.section sgkab +.section sgkba +.section sgkbb +.section sgkca +.section sgkcb +.section sgkda +.section sgkdb +.section sgkea +.section sgkeb +.section sgkfa +.section sgkfb +.section sgkga +.section sgkgb +.section sgkha +.section sgkhb +.section sgkia +.section sgkib +.section sgkja +.section sgkjb +.section sgkka +.section sgkkb +.section sgkla +.section sgklb +.section sgkma +.section sgkmb +.section sgkna +.section sgknb +.section sgkoa +.section sgkob +.section sgkpa +.section sgkpb +.section sgkqa +.section sgkqb +.section sgkra +.section sgkrb +.section sgksa +.section sgksb +.section sgkta +.section sgktb +.section sgkua +.section sgkub +.section sgkva +.section sgkvb +.section sgkwa +.section sgkwb +.section sgkxa +.section sgkxb +.section sgkya +.section sgkyb +.section sgkza +.section sgkzb +.section sgk1a +.section sgk1b +.section sgk2a +.section sgk2b +.section sgk3a +.section sgk3b +.section sgk4a +.section sgk4b +.section sgk5a +.section sgk5b +.section sgk6a +.section sgk6b +.section sgk7a +.section sgk7b +.section sgk8a +.section sgk8b +.section sgk9a +.section sgk9b +.section sgk0a +.section sgk0b +.section sglaa +.section sglab +.section sglba +.section sglbb +.section sglca +.section sglcb +.section sglda +.section sgldb +.section sglea +.section sgleb +.section sglfa +.section sglfb +.section sglga +.section sglgb +.section sglha +.section sglhb +.section sglia +.section sglib +.section sglja +.section sgljb +.section sglka +.section sglkb +.section sglla +.section sgllb +.section sglma +.section sglmb +.section sglna +.section sglnb +.section sgloa +.section sglob +.section sglpa +.section sglpb +.section sglqa +.section sglqb +.section sglra +.section sglrb +.section sglsa +.section sglsb +.section sglta +.section sgltb +.section sglua +.section sglub +.section sglva +.section sglvb +.section sglwa +.section sglwb +.section sglxa +.section sglxb +.section sglya +.section sglyb +.section sglza +.section sglzb +.section sgl1a +.section sgl1b +.section sgl2a +.section sgl2b +.section sgl3a +.section sgl3b +.section sgl4a +.section sgl4b +.section sgl5a +.section sgl5b +.section sgl6a +.section sgl6b +.section sgl7a +.section sgl7b +.section sgl8a +.section sgl8b +.section sgl9a +.section sgl9b +.section sgl0a +.section sgl0b +.section sgmaa +.section sgmab +.section sgmba +.section sgmbb +.section sgmca +.section sgmcb +.section sgmda +.section sgmdb +.section sgmea +.section sgmeb +.section sgmfa +.section sgmfb +.section sgmga +.section sgmgb +.section sgmha +.section sgmhb +.section sgmia +.section sgmib +.section sgmja +.section sgmjb +.section sgmka +.section sgmkb +.section sgmla +.section sgmlb +.section sgmma +.section sgmmb +.section sgmna +.section sgmnb +.section sgmoa +.section sgmob +.section sgmpa +.section sgmpb +.section sgmqa +.section sgmqb +.section sgmra +.section sgmrb +.section sgmsa +.section sgmsb +.section sgmta +.section sgmtb +.section sgmua +.section sgmub +.section sgmva +.section sgmvb +.section sgmwa +.section sgmwb +.section sgmxa +.section sgmxb +.section sgmya +.section sgmyb +.section sgmza +.section sgmzb +.section sgm1a +.section sgm1b +.section sgm2a +.section sgm2b +.section sgm3a +.section sgm3b +.section sgm4a +.section sgm4b +.section sgm5a +.section sgm5b +.section sgm6a +.section sgm6b +.section sgm7a +.section sgm7b +.section sgm8a +.section sgm8b +.section sgm9a +.section sgm9b +.section sgm0a +.section sgm0b +.section sgnaa +.section sgnab +.section sgnba +.section sgnbb +.section sgnca +.section sgncb +.section sgnda +.section sgndb +.section sgnea +.section sgneb +.section sgnfa +.section sgnfb +.section sgnga +.section sgngb +.section sgnha +.section sgnhb +.section sgnia +.section sgnib +.section sgnja +.section sgnjb +.section sgnka +.section sgnkb +.section sgnla +.section sgnlb +.section sgnma +.section sgnmb +.section sgnna +.section sgnnb +.section sgnoa +.section sgnob +.section sgnpa +.section sgnpb +.section sgnqa +.section sgnqb +.section sgnra +.section sgnrb +.section sgnsa +.section sgnsb +.section sgnta +.section sgntb +.section sgnua +.section sgnub +.section sgnva +.section sgnvb +.section sgnwa +.section sgnwb +.section sgnxa +.section sgnxb +.section sgnya +.section sgnyb +.section sgnza +.section sgnzb +.section sgn1a +.section sgn1b +.section sgn2a +.section sgn2b +.section sgn3a +.section sgn3b +.section sgn4a +.section sgn4b +.section sgn5a +.section sgn5b +.section sgn6a +.section sgn6b +.section sgn7a +.section sgn7b +.section sgn8a +.section sgn8b +.section sgn9a +.section sgn9b +.section sgn0a +.section sgn0b +.section sgoaa +.section sgoab +.section sgoba +.section sgobb +.section sgoca +.section sgocb +.section sgoda +.section sgodb +.section sgoea +.section sgoeb +.section sgofa +.section sgofb +.section sgoga +.section sgogb +.section sgoha +.section sgohb +.section sgoia +.section sgoib +.section sgoja +.section sgojb +.section sgoka +.section sgokb +.section sgola +.section sgolb +.section sgoma +.section sgomb +.section sgona +.section sgonb +.section sgooa +.section sgoob +.section sgopa +.section sgopb +.section sgoqa +.section sgoqb +.section sgora +.section sgorb +.section sgosa +.section sgosb +.section sgota +.section sgotb +.section sgoua +.section sgoub +.section sgova +.section sgovb +.section sgowa +.section sgowb +.section sgoxa +.section sgoxb +.section sgoya +.section sgoyb +.section sgoza +.section sgozb +.section sgo1a +.section sgo1b +.section sgo2a +.section sgo2b +.section sgo3a +.section sgo3b +.section sgo4a +.section sgo4b +.section sgo5a +.section sgo5b +.section sgo6a +.section sgo6b +.section sgo7a +.section sgo7b +.section sgo8a +.section sgo8b +.section sgo9a +.section sgo9b +.section sgo0a +.section sgo0b +.section sgpaa +.section sgpab +.section sgpba +.section sgpbb +.section sgpca +.section sgpcb +.section sgpda +.section sgpdb +.section sgpea +.section sgpeb +.section sgpfa +.section sgpfb +.section sgpga +.section sgpgb +.section sgpha +.section sgphb +.section sgpia +.section sgpib +.section sgpja +.section sgpjb +.section sgpka +.section sgpkb +.section sgpla +.section sgplb +.section sgpma +.section sgpmb +.section sgpna +.section sgpnb +.section sgpoa +.section sgpob +.section sgppa +.section sgppb +.section sgpqa +.section sgpqb +.section sgpra +.section sgprb +.section sgpsa +.section sgpsb +.section sgpta +.section sgptb +.section sgpua +.section sgpub +.section sgpva +.section sgpvb +.section sgpwa +.section sgpwb +.section sgpxa +.section sgpxb +.section sgpya +.section sgpyb +.section sgpza +.section sgpzb +.section sgp1a +.section sgp1b +.section sgp2a +.section sgp2b +.section sgp3a +.section sgp3b +.section sgp4a +.section sgp4b +.section sgp5a +.section sgp5b +.section sgp6a +.section sgp6b +.section sgp7a +.section sgp7b +.section sgp8a +.section sgp8b +.section sgp9a +.section sgp9b +.section sgp0a +.section sgp0b +.section sgqaa +.section sgqab +.section sgqba +.section sgqbb +.section sgqca +.section sgqcb +.section sgqda +.section sgqdb +.section sgqea +.section sgqeb +.section sgqfa +.section sgqfb +.section sgqga +.section sgqgb +.section sgqha +.section sgqhb +.section sgqia +.section sgqib +.section sgqja +.section sgqjb +.section sgqka +.section sgqkb +.section sgqla +.section sgqlb +.section sgqma +.section sgqmb +.section sgqna +.section sgqnb +.section sgqoa +.section sgqob +.section sgqpa +.section sgqpb +.section sgqqa +.section sgqqb +.section sgqra +.section sgqrb +.section sgqsa +.section sgqsb +.section sgqta +.section sgqtb +.section sgqua +.section sgqub +.section sgqva +.section sgqvb +.section sgqwa +.section sgqwb +.section sgqxa +.section sgqxb +.section sgqya +.section sgqyb +.section sgqza +.section sgqzb +.section sgq1a +.section sgq1b +.section sgq2a +.section sgq2b +.section sgq3a +.section sgq3b +.section sgq4a +.section sgq4b +.section sgq5a +.section sgq5b +.section sgq6a +.section sgq6b +.section sgq7a +.section sgq7b +.section sgq8a +.section sgq8b +.section sgq9a +.section sgq9b +.section sgq0a +.section sgq0b +.section sgraa +.section sgrab +.section sgrba +.section sgrbb +.section sgrca +.section sgrcb +.section sgrda +.section sgrdb +.section sgrea +.section sgreb +.section sgrfa +.section sgrfb +.section sgrga +.section sgrgb +.section sgrha +.section sgrhb +.section sgria +.section sgrib +.section sgrja +.section sgrjb +.section sgrka +.section sgrkb +.section sgrla +.section sgrlb +.section sgrma +.section sgrmb +.section sgrna +.section sgrnb +.section sgroa +.section sgrob +.section sgrpa +.section sgrpb +.section sgrqa +.section sgrqb +.section sgrra +.section sgrrb +.section sgrsa +.section sgrsb +.section sgrta +.section sgrtb +.section sgrua +.section sgrub +.section sgrva +.section sgrvb +.section sgrwa +.section sgrwb +.section sgrxa +.section sgrxb +.section sgrya +.section sgryb +.section sgrza +.section sgrzb +.section sgr1a +.section sgr1b +.section sgr2a +.section sgr2b +.section sgr3a +.section sgr3b +.section sgr4a +.section sgr4b +.section sgr5a +.section sgr5b +.section sgr6a +.section sgr6b +.section sgr7a +.section sgr7b +.section sgr8a +.section sgr8b +.section sgr9a +.section sgr9b +.section sgr0a +.section sgr0b +.section sgsaa +.section sgsab +.section sgsba +.section sgsbb +.section sgsca +.section sgscb +.section sgsda +.section sgsdb +.section sgsea +.section sgseb +.section sgsfa +.section sgsfb +.section sgsga +.section sgsgb +.section sgsha +.section sgshb +.section sgsia +.section sgsib +.section sgsja +.section sgsjb +.section sgska +.section sgskb +.section sgsla +.section sgslb +.section sgsma +.section sgsmb +.section sgsna +.section sgsnb +.section sgsoa +.section sgsob +.section sgspa +.section sgspb +.section sgsqa +.section sgsqb +.section sgsra +.section sgsrb +.section sgssa +.section sgssb +.section sgsta +.section sgstb +.section sgsua +.section sgsub +.section sgsva +.section sgsvb +.section sgswa +.section sgswb +.section sgsxa +.section sgsxb +.section sgsya +.section sgsyb +.section sgsza +.section sgszb +.section sgs1a +.section sgs1b +.section sgs2a +.section sgs2b +.section sgs3a +.section sgs3b +.section sgs4a +.section sgs4b +.section sgs5a +.section sgs5b +.section sgs6a +.section sgs6b +.section sgs7a +.section sgs7b +.section sgs8a +.section sgs8b +.section sgs9a +.section sgs9b +.section sgs0a +.section sgs0b +.section sgtaa +.section sgtab +.section sgtba +.section sgtbb +.section sgtca +.section sgtcb +.section sgtda +.section sgtdb +.section sgtea +.section sgteb +.section sgtfa +.section sgtfb +.section sgtga +.section sgtgb +.section sgtha +.section sgthb +.section sgtia +.section sgtib +.section sgtja +.section sgtjb +.section sgtka +.section sgtkb +.section sgtla +.section sgtlb +.section sgtma +.section sgtmb +.section sgtna +.section sgtnb +.section sgtoa +.section sgtob +.section sgtpa +.section sgtpb +.section sgtqa +.section sgtqb +.section sgtra +.section sgtrb +.section sgtsa +.section sgtsb +.section sgtta +.section sgttb +.section sgtua +.section sgtub +.section sgtva +.section sgtvb +.section sgtwa +.section sgtwb +.section sgtxa +.section sgtxb +.section sgtya +.section sgtyb +.section sgtza +.section sgtzb +.section sgt1a +.section sgt1b +.section sgt2a +.section sgt2b +.section sgt3a +.section sgt3b +.section sgt4a +.section sgt4b +.section sgt5a +.section sgt5b +.section sgt6a +.section sgt6b +.section sgt7a +.section sgt7b +.section sgt8a +.section sgt8b +.section sgt9a +.section sgt9b +.section sgt0a +.section sgt0b +.section sguaa +.section sguab +.section sguba +.section sgubb +.section sguca +.section sgucb +.section sguda +.section sgudb +.section sguea +.section sgueb +.section sgufa +.section sgufb +.section sguga +.section sgugb +.section sguha +.section sguhb +.section sguia +.section sguib +.section sguja +.section sgujb +.section sguka +.section sgukb +.section sgula +.section sgulb +.section sguma +.section sgumb +.section sguna +.section sgunb +.section sguoa +.section sguob +.section sgupa +.section sgupb +.section sguqa +.section sguqb +.section sgura +.section sgurb +.section sgusa +.section sgusb +.section sguta +.section sgutb +.section sguua +.section sguub +.section sguva +.section sguvb +.section sguwa +.section sguwb +.section sguxa +.section sguxb +.section sguya +.section sguyb +.section sguza +.section sguzb +.section sgu1a +.section sgu1b +.section sgu2a +.section sgu2b +.section sgu3a +.section sgu3b +.section sgu4a +.section sgu4b +.section sgu5a +.section sgu5b +.section sgu6a +.section sgu6b +.section sgu7a +.section sgu7b +.section sgu8a +.section sgu8b +.section sgu9a +.section sgu9b +.section sgu0a +.section sgu0b +.section sgvaa +.section sgvab +.section sgvba +.section sgvbb +.section sgvca +.section sgvcb +.section sgvda +.section sgvdb +.section sgvea +.section sgveb +.section sgvfa +.section sgvfb +.section sgvga +.section sgvgb +.section sgvha +.section sgvhb +.section sgvia +.section sgvib +.section sgvja +.section sgvjb +.section sgvka +.section sgvkb +.section sgvla +.section sgvlb +.section sgvma +.section sgvmb +.section sgvna +.section sgvnb +.section sgvoa +.section sgvob +.section sgvpa +.section sgvpb +.section sgvqa +.section sgvqb +.section sgvra +.section sgvrb +.section sgvsa +.section sgvsb +.section sgvta +.section sgvtb +.section sgvua +.section sgvub +.section sgvva +.section sgvvb +.section sgvwa +.section sgvwb +.section sgvxa +.section sgvxb +.section sgvya +.section sgvyb +.section sgvza +.section sgvzb +.section sgv1a +.section sgv1b +.section sgv2a +.section sgv2b +.section sgv3a +.section sgv3b +.section sgv4a +.section sgv4b +.section sgv5a +.section sgv5b +.section sgv6a +.section sgv6b +.section sgv7a +.section sgv7b +.section sgv8a +.section sgv8b +.section sgv9a +.section sgv9b +.section sgv0a +.section sgv0b +.section sgwaa +.section sgwab +.section sgwba +.section sgwbb +.section sgwca +.section sgwcb +.section sgwda +.section sgwdb +.section sgwea +.section sgweb +.section sgwfa +.section sgwfb +.section sgwga +.section sgwgb +.section sgwha +.section sgwhb +.section sgwia +.section sgwib +.section sgwja +.section sgwjb +.section sgwka +.section sgwkb +.section sgwla +.section sgwlb +.section sgwma +.section sgwmb +.section sgwna +.section sgwnb +.section sgwoa +.section sgwob +.section sgwpa +.section sgwpb +.section sgwqa +.section sgwqb +.section sgwra +.section sgwrb +.section sgwsa +.section sgwsb +.section sgwta +.section sgwtb +.section sgwua +.section sgwub +.section sgwva +.section sgwvb +.section sgwwa +.section sgwwb +.section sgwxa +.section sgwxb +.section sgwya +.section sgwyb +.section sgwza +.section sgwzb +.section sgw1a +.section sgw1b +.section sgw2a +.section sgw2b +.section sgw3a +.section sgw3b +.section sgw4a +.section sgw4b +.section sgw5a +.section sgw5b +.section sgw6a +.section sgw6b +.section sgw7a +.section sgw7b +.section sgw8a +.section sgw8b +.section sgw9a +.section sgw9b +.section sgw0a +.section sgw0b +.section sgxaa +.section sgxab +.section sgxba +.section sgxbb +.section sgxca +.section sgxcb +.section sgxda +.section sgxdb +.section sgxea +.section sgxeb +.section sgxfa +.section sgxfb +.section sgxga +.section sgxgb +.section sgxha +.section sgxhb +.section sgxia +.section sgxib +.section sgxja +.section sgxjb +.section sgxka +.section sgxkb +.section sgxla +.section sgxlb +.section sgxma +.section sgxmb +.section sgxna +.section sgxnb +.section sgxoa +.section sgxob +.section sgxpa +.section sgxpb +.section sgxqa +.section sgxqb +.section sgxra +.section sgxrb +.section sgxsa +.section sgxsb +.section sgxta +.section sgxtb +.section sgxua +.section sgxub +.section sgxva +.section sgxvb +.section sgxwa +.section sgxwb +.section sgxxa +.section sgxxb +.section sgxya +.section sgxyb +.section sgxza +.section sgxzb +.section sgx1a +.section sgx1b +.section sgx2a +.section sgx2b +.section sgx3a +.section sgx3b +.section sgx4a +.section sgx4b +.section sgx5a +.section sgx5b +.section sgx6a +.section sgx6b +.section sgx7a +.section sgx7b +.section sgx8a +.section sgx8b +.section sgx9a +.section sgx9b +.section sgx0a +.section sgx0b +.section sgyaa +.section sgyab +.section sgyba +.section sgybb +.section sgyca +.section sgycb +.section sgyda +.section sgydb +.section sgyea +.section sgyeb +.section sgyfa +.section sgyfb +.section sgyga +.section sgygb +.section sgyha +.section sgyhb +.section sgyia +.section sgyib +.section sgyja +.section sgyjb +.section sgyka +.section sgykb +.section sgyla +.section sgylb +.section sgyma +.section sgymb +.section sgyna +.section sgynb +.section sgyoa +.section sgyob +.section sgypa +.section sgypb +.section sgyqa +.section sgyqb +.section sgyra +.section sgyrb +.section sgysa +.section sgysb +.section sgyta +.section sgytb +.section sgyua +.section sgyub +.section sgyva +.section sgyvb +.section sgywa +.section sgywb +.section sgyxa +.section sgyxb +.section sgyya +.section sgyyb +.section sgyza +.section sgyzb +.section sgy1a +.section sgy1b +.section sgy2a +.section sgy2b +.section sgy3a +.section sgy3b +.section sgy4a +.section sgy4b +.section sgy5a +.section sgy5b +.section sgy6a +.section sgy6b +.section sgy7a +.section sgy7b +.section sgy8a +.section sgy8b +.section sgy9a +.section sgy9b +.section sgy0a +.section sgy0b +.section sgzaa +.section sgzab +.section sgzba +.section sgzbb +.section sgzca +.section sgzcb +.section sgzda +.section sgzdb +.section sgzea +.section sgzeb +.section sgzfa +.section sgzfb +.section sgzga +.section sgzgb +.section sgzha +.section sgzhb +.section sgzia +.section sgzib +.section sgzja +.section sgzjb +.section sgzka +.section sgzkb +.section sgzla +.section sgzlb +.section sgzma +.section sgzmb +.section sgzna +.section sgznb +.section sgzoa +.section sgzob +.section sgzpa +.section sgzpb +.section sgzqa +.section sgzqb +.section sgzra +.section sgzrb +.section sgzsa +.section sgzsb +.section sgzta +.section sgztb +.section sgzua +.section sgzub +.section sgzva +.section sgzvb +.section sgzwa +.section sgzwb +.section sgzxa +.section sgzxb +.section sgzya +.section sgzyb +.section sgzza +.section sgzzb +.section sgz1a +.section sgz1b +.section sgz2a +.section sgz2b +.section sgz3a +.section sgz3b +.section sgz4a +.section sgz4b +.section sgz5a +.section sgz5b +.section sgz6a +.section sgz6b +.section sgz7a +.section sgz7b +.section sgz8a +.section sgz8b +.section sgz9a +.section sgz9b +.section sgz0a +.section sgz0b +.section sg1aa +.section sg1ab +.section sg1ba +.section sg1bb +.section sg1ca +.section sg1cb +.section sg1da +.section sg1db +.section sg1ea +.section sg1eb +.section sg1fa +.section sg1fb +.section sg1ga +.section sg1gb +.section sg1ha +.section sg1hb +.section sg1ia +.section sg1ib +.section sg1ja +.section sg1jb +.section sg1ka +.section sg1kb +.section sg1la +.section sg1lb +.section sg1ma +.section sg1mb +.section sg1na +.section sg1nb +.section sg1oa +.section sg1ob +.section sg1pa +.section sg1pb +.section sg1qa +.section sg1qb +.section sg1ra +.section sg1rb +.section sg1sa +.section sg1sb +.section sg1ta +.section sg1tb +.section sg1ua +.section sg1ub +.section sg1va +.section sg1vb +.section sg1wa +.section sg1wb +.section sg1xa +.section sg1xb +.section sg1ya +.section sg1yb +.section sg1za +.section sg1zb +.section sg11a +.section sg11b +.section sg12a +.section sg12b +.section sg13a +.section sg13b +.section sg14a +.section sg14b +.section sg15a +.section sg15b +.section sg16a +.section sg16b +.section sg17a +.section sg17b +.section sg18a +.section sg18b +.section sg19a +.section sg19b +.section sg10a +.section sg10b +.section sg2aa +.section sg2ab +.section sg2ba +.section sg2bb +.section sg2ca +.section sg2cb +.section sg2da +.section sg2db +.section sg2ea +.section sg2eb +.section sg2fa +.section sg2fb +.section sg2ga +.section sg2gb +.section sg2ha +.section sg2hb +.section sg2ia +.section sg2ib +.section sg2ja +.section sg2jb +.section sg2ka +.section sg2kb +.section sg2la +.section sg2lb +.section sg2ma +.section sg2mb +.section sg2na +.section sg2nb +.section sg2oa +.section sg2ob +.section sg2pa +.section sg2pb +.section sg2qa +.section sg2qb +.section sg2ra +.section sg2rb +.section sg2sa +.section sg2sb +.section sg2ta +.section sg2tb +.section sg2ua +.section sg2ub +.section sg2va +.section sg2vb +.section sg2wa +.section sg2wb +.section sg2xa +.section sg2xb +.section sg2ya +.section sg2yb +.section sg2za +.section sg2zb +.section sg21a +.section sg21b +.section sg22a +.section sg22b +.section sg23a +.section sg23b +.section sg24a +.section sg24b +.section sg25a +.section sg25b +.section sg26a +.section sg26b +.section sg27a +.section sg27b +.section sg28a +.section sg28b +.section sg29a +.section sg29b +.section sg20a +.section sg20b +.section sg3aa +.section sg3ab +.section sg3ba +.section sg3bb +.section sg3ca +.section sg3cb +.section sg3da +.section sg3db +.section sg3ea +.section sg3eb +.section sg3fa +.section sg3fb +.section sg3ga +.section sg3gb +.section sg3ha +.section sg3hb +.section sg3ia +.section sg3ib +.section sg3ja +.section sg3jb +.section sg3ka +.section sg3kb +.section sg3la +.section sg3lb +.section sg3ma +.section sg3mb +.section sg3na +.section sg3nb +.section sg3oa +.section sg3ob +.section sg3pa +.section sg3pb +.section sg3qa +.section sg3qb +.section sg3ra +.section sg3rb +.section sg3sa +.section sg3sb +.section sg3ta +.section sg3tb +.section sg3ua +.section sg3ub +.section sg3va +.section sg3vb +.section sg3wa +.section sg3wb +.section sg3xa +.section sg3xb +.section sg3ya +.section sg3yb +.section sg3za +.section sg3zb +.section sg31a +.section sg31b +.section sg32a +.section sg32b +.section sg33a +.section sg33b +.section sg34a +.section sg34b +.section sg35a +.section sg35b +.section sg36a +.section sg36b +.section sg37a +.section sg37b +.section sg38a +.section sg38b +.section sg39a +.section sg39b +.section sg30a +.section sg30b +.section sg4aa +.section sg4ab +.section sg4ba +.section sg4bb +.section sg4ca +.section sg4cb +.section sg4da +.section sg4db +.section sg4ea +.section sg4eb +.section sg4fa +.section sg4fb +.section sg4ga +.section sg4gb +.section sg4ha +.section sg4hb +.section sg4ia +.section sg4ib +.section sg4ja +.section sg4jb +.section sg4ka +.section sg4kb +.section sg4la +.section sg4lb +.section sg4ma +.section sg4mb +.section sg4na +.section sg4nb +.section sg4oa +.section sg4ob +.section sg4pa +.section sg4pb +.section sg4qa +.section sg4qb +.section sg4ra +.section sg4rb +.section sg4sa +.section sg4sb +.section sg4ta +.section sg4tb +.section sg4ua +.section sg4ub +.section sg4va +.section sg4vb +.section sg4wa +.section sg4wb +.section sg4xa +.section sg4xb +.section sg4ya +.section sg4yb +.section sg4za +.section sg4zb +.section sg41a +.section sg41b +.section sg42a +.section sg42b +.section sg43a +.section sg43b +.section sg44a +.section sg44b +.section sg45a +.section sg45b +.section sg46a +.section sg46b +.section sg47a +.section sg47b +.section sg48a +.section sg48b +.section sg49a +.section sg49b +.section sg40a +.section sg40b +.section sg5aa +.section sg5ab +.section sg5ba +.section sg5bb +.section sg5ca +.section sg5cb +.section sg5da +.section sg5db +.section sg5ea +.section sg5eb +.section sg5fa +.section sg5fb +.section sg5ga +.section sg5gb +.section sg5ha +.section sg5hb +.section sg5ia +.section sg5ib +.section sg5ja +.section sg5jb +.section sg5ka +.section sg5kb +.section sg5la +.section sg5lb +.section sg5ma +.section sg5mb +.section sg5na +.section sg5nb +.section sg5oa +.section sg5ob +.section sg5pa +.section sg5pb +.section sg5qa +.section sg5qb +.section sg5ra +.section sg5rb +.section sg5sa +.section sg5sb +.section sg5ta +.section sg5tb +.section sg5ua +.section sg5ub +.section sg5va +.section sg5vb +.section sg5wa +.section sg5wb +.section sg5xa +.section sg5xb +.section sg5ya +.section sg5yb +.section sg5za +.section sg5zb +.section sg51a +.section sg51b +.section sg52a +.section sg52b +.section sg53a +.section sg53b +.section sg54a +.section sg54b +.section sg55a +.section sg55b +.section sg56a +.section sg56b +.section sg57a +.section sg57b +.section sg58a +.section sg58b +.section sg59a +.section sg59b +.section sg50a +.section sg50b +.section sg6aa +.section sg6ab +.section sg6ba +.section sg6bb +.section sg6ca +.section sg6cb +.section sg6da +.section sg6db +.section sg6ea +.section sg6eb +.section sg6fa +.section sg6fb +.section sg6ga +.section sg6gb +.section sg6ha +.section sg6hb +.section sg6ia +.section sg6ib +.section sg6ja +.section sg6jb +.section sg6ka +.section sg6kb +.section sg6la +.section sg6lb +.section sg6ma +.section sg6mb +.section sg6na +.section sg6nb +.section sg6oa +.section sg6ob +.section sg6pa +.section sg6pb +.section sg6qa +.section sg6qb +.section sg6ra +.section sg6rb +.section sg6sa +.section sg6sb +.section sg6ta +.section sg6tb +.section sg6ua +.section sg6ub +.section sg6va +.section sg6vb +.section sg6wa +.section sg6wb +.section sg6xa +.section sg6xb +.section sg6ya +.section sg6yb +.section sg6za +.section sg6zb +.section sg61a +.section sg61b +.section sg62a +.section sg62b +.section sg63a +.section sg63b +.section sg64a +.section sg64b +.section sg65a +.section sg65b +.section sg66a +.section sg66b +.section sg67a +.section sg67b +.section sg68a +.section sg68b +.section sg69a +.section sg69b +.section sg60a +.section sg60b +.section sg7aa +.section sg7ab +.section sg7ba +.section sg7bb +.section sg7ca +.section sg7cb +.section sg7da +.section sg7db +.section sg7ea +.section sg7eb +.section sg7fa +.section sg7fb +.section sg7ga +.section sg7gb +.section sg7ha +.section sg7hb +.section sg7ia +.section sg7ib +.section sg7ja +.section sg7jb +.section sg7ka +.section sg7kb +.section sg7la +.section sg7lb +.section sg7ma +.section sg7mb +.section sg7na +.section sg7nb +.section sg7oa +.section sg7ob +.section sg7pa +.section sg7pb +.section sg7qa +.section sg7qb +.section sg7ra +.section sg7rb +.section sg7sa +.section sg7sb +.section sg7ta +.section sg7tb +.section sg7ua +.section sg7ub +.section sg7va +.section sg7vb +.section sg7wa +.section sg7wb +.section sg7xa +.section sg7xb +.section sg7ya +.section sg7yb +.section sg7za +.section sg7zb +.section sg71a +.section sg71b +.section sg72a +.section sg72b +.section sg73a +.section sg73b +.section sg74a +.section sg74b +.section sg75a +.section sg75b +.section sg76a +.section sg76b +.section sg77a +.section sg77b +.section sg78a +.section sg78b +.section sg79a +.section sg79b +.section sg70a +.section sg70b +.section sg8aa +.section sg8ab +.section sg8ba +.section sg8bb +.section sg8ca +.section sg8cb +.section sg8da +.section sg8db +.section sg8ea +.section sg8eb +.section sg8fa +.section sg8fb +.section sg8ga +.section sg8gb +.section sg8ha +.section sg8hb +.section sg8ia +.section sg8ib +.section sg8ja +.section sg8jb +.section sg8ka +.section sg8kb +.section sg8la +.section sg8lb +.section sg8ma +.section sg8mb +.section sg8na +.section sg8nb +.section sg8oa +.section sg8ob +.section sg8pa +.section sg8pb +.section sg8qa +.section sg8qb +.section sg8ra +.section sg8rb +.section sg8sa +.section sg8sb +.section sg8ta +.section sg8tb +.section sg8ua +.section sg8ub +.section sg8va +.section sg8vb +.section sg8wa +.section sg8wb +.section sg8xa +.section sg8xb +.section sg8ya +.section sg8yb +.section sg8za +.section sg8zb +.section sg81a +.section sg81b +.section sg82a +.section sg82b +.section sg83a +.section sg83b +.section sg84a +.section sg84b +.section sg85a +.section sg85b +.section sg86a +.section sg86b +.section sg87a +.section sg87b +.section sg88a +.section sg88b +.section sg89a +.section sg89b +.section sg80a +.section sg80b +.section sg9aa +.section sg9ab +.section sg9ba +.section sg9bb +.section sg9ca +.section sg9cb +.section sg9da +.section sg9db +.section sg9ea +.section sg9eb +.section sg9fa +.section sg9fb +.section sg9ga +.section sg9gb +.section sg9ha +.section sg9hb +.section sg9ia +.section sg9ib +.section sg9ja +.section sg9jb +.section sg9ka +.section sg9kb +.section sg9la +.section sg9lb +.section sg9ma +.section sg9mb +.section sg9na +.section sg9nb +.section sg9oa +.section sg9ob +.section sg9pa +.section sg9pb +.section sg9qa +.section sg9qb +.section sg9ra +.section sg9rb +.section sg9sa +.section sg9sb +.section sg9ta +.section sg9tb +.section sg9ua +.section sg9ub +.section sg9va +.section sg9vb +.section sg9wa +.section sg9wb +.section sg9xa +.section sg9xb +.section sg9ya +.section sg9yb +.section sg9za +.section sg9zb +.section sg91a +.section sg91b +.section sg92a +.section sg92b +.section sg93a +.section sg93b +.section sg94a +.section sg94b +.section sg95a +.section sg95b +.section sg96a +.section sg96b +.section sg97a +.section sg97b +.section sg98a +.section sg98b +.section sg99a +.section sg99b +.section sg90a +.section sg90b +.section sg0aa +.section sg0ab +.section sg0ba +.section sg0bb +.section sg0ca +.section sg0cb +.section sg0da +.section sg0db +.section sg0ea +.section sg0eb +.section sg0fa +.section sg0fb +.section sg0ga +.section sg0gb +.section sg0ha +.section sg0hb +.section sg0ia +.section sg0ib +.section sg0ja +.section sg0jb +.section sg0ka +.section sg0kb +.section sg0la +.section sg0lb +.section sg0ma +.section sg0mb +.section sg0na +.section sg0nb +.section sg0oa +.section sg0ob +.section sg0pa +.section sg0pb +.section sg0qa +.section sg0qb +.section sg0ra +.section sg0rb +.section sg0sa +.section sg0sb +.section sg0ta +.section sg0tb +.section sg0ua +.section sg0ub +.section sg0va +.section sg0vb +.section sg0wa +.section sg0wb +.section sg0xa +.section sg0xb +.section sg0ya +.section sg0yb +.section sg0za +.section sg0zb +.section sg01a +.section sg01b +.section sg02a +.section sg02b +.section sg03a +.section sg03b +.section sg04a +.section sg04b +.section sg05a +.section sg05b +.section sg06a +.section sg06b +.section sg07a +.section sg07b +.section sg08a +.section sg08b +.section sg09a +.section sg09b +.section sg00a +.section sg00b +.section shaaa +.section shaab +.section shaba +.section shabb +.section shaca +.section shacb +.section shada +.section shadb +.section shaea +.section shaeb +.section shafa +.section shafb +.section shaga +.section shagb +.section shaha +.section shahb +.section shaia +.section shaib +.section shaja +.section shajb +.section shaka +.section shakb +.section shala +.section shalb +.section shama +.section shamb +.section shana +.section shanb +.section shaoa +.section shaob +.section shapa +.section shapb +.section shaqa +.section shaqb +.section shara +.section sharb +.section shasa +.section shasb +.section shata +.section shatb +.section shaua +.section shaub +.section shava +.section shavb +.section shawa +.section shawb +.section shaxa +.section shaxb +.section shaya +.section shayb +.section shaza +.section shazb +.section sha1a +.section sha1b +.section sha2a +.section sha2b +.section sha3a +.section sha3b +.section sha4a +.section sha4b +.section sha5a +.section sha5b +.section sha6a +.section sha6b +.section sha7a +.section sha7b +.section sha8a +.section sha8b +.section sha9a +.section sha9b +.section sha0a +.section sha0b +.section shbaa +.section shbab +.section shbba +.section shbbb +.section shbca +.section shbcb +.section shbda +.section shbdb +.section shbea +.section shbeb +.section shbfa +.section shbfb +.section shbga +.section shbgb +.section shbha +.section shbhb +.section shbia +.section shbib +.section shbja +.section shbjb +.section shbka +.section shbkb +.section shbla +.section shblb +.section shbma +.section shbmb +.section shbna +.section shbnb +.section shboa +.section shbob +.section shbpa +.section shbpb +.section shbqa +.section shbqb +.section shbra +.section shbrb +.section shbsa +.section shbsb +.section shbta +.section shbtb +.section shbua +.section shbub +.section shbva +.section shbvb +.section shbwa +.section shbwb +.section shbxa +.section shbxb +.section shbya +.section shbyb +.section shbza +.section shbzb +.section shb1a +.section shb1b +.section shb2a +.section shb2b +.section shb3a +.section shb3b +.section shb4a +.section shb4b +.section shb5a +.section shb5b +.section shb6a +.section shb6b +.section shb7a +.section shb7b +.section shb8a +.section shb8b +.section shb9a +.section shb9b +.section shb0a +.section shb0b +.section shcaa +.section shcab +.section shcba +.section shcbb +.section shcca +.section shccb +.section shcda +.section shcdb +.section shcea +.section shceb +.section shcfa +.section shcfb +.section shcga +.section shcgb +.section shcha +.section shchb +.section shcia +.section shcib +.section shcja +.section shcjb +.section shcka +.section shckb +.section shcla +.section shclb +.section shcma +.section shcmb +.section shcna +.section shcnb +.section shcoa +.section shcob +.section shcpa +.section shcpb +.section shcqa +.section shcqb +.section shcra +.section shcrb +.section shcsa +.section shcsb +.section shcta +.section shctb +.section shcua +.section shcub +.section shcva +.section shcvb +.section shcwa +.section shcwb +.section shcxa +.section shcxb +.section shcya +.section shcyb +.section shcza +.section shczb +.section shc1a +.section shc1b +.section shc2a +.section shc2b +.section shc3a +.section shc3b +.section shc4a +.section shc4b +.section shc5a +.section shc5b +.section shc6a +.section shc6b +.section shc7a +.section shc7b +.section shc8a +.section shc8b +.section shc9a +.section shc9b +.section shc0a +.section shc0b +.section shdaa +.section shdab +.section shdba +.section shdbb +.section shdca +.section shdcb +.section shdda +.section shddb +.section shdea +.section shdeb +.section shdfa +.section shdfb +.section shdga +.section shdgb +.section shdha +.section shdhb +.section shdia +.section shdib +.section shdja +.section shdjb +.section shdka +.section shdkb +.section shdla +.section shdlb +.section shdma +.section shdmb +.section shdna +.section shdnb +.section shdoa +.section shdob +.section shdpa +.section shdpb +.section shdqa +.section shdqb +.section shdra +.section shdrb +.section shdsa +.section shdsb +.section shdta +.section shdtb +.section shdua +.section shdub +.section shdva +.section shdvb +.section shdwa +.section shdwb +.section shdxa +.section shdxb +.section shdya +.section shdyb +.section shdza +.section shdzb +.section shd1a +.section shd1b +.section shd2a +.section shd2b +.section shd3a +.section shd3b +.section shd4a +.section shd4b +.section shd5a +.section shd5b +.section shd6a +.section shd6b +.section shd7a +.section shd7b +.section shd8a +.section shd8b +.section shd9a +.section shd9b +.section shd0a +.section shd0b +.section sheaa +.section sheab +.section sheba +.section shebb +.section sheca +.section shecb +.section sheda +.section shedb +.section sheea +.section sheeb +.section shefa +.section shefb +.section shega +.section shegb +.section sheha +.section shehb +.section sheia +.section sheib +.section sheja +.section shejb +.section sheka +.section shekb +.section shela +.section shelb +.section shema +.section shemb +.section shena +.section shenb +.section sheoa +.section sheob +.section shepa +.section shepb +.section sheqa +.section sheqb +.section shera +.section sherb +.section shesa +.section shesb +.section sheta +.section shetb +.section sheua +.section sheub +.section sheva +.section shevb +.section shewa +.section shewb +.section shexa +.section shexb +.section sheya +.section sheyb +.section sheza +.section shezb +.section she1a +.section she1b +.section she2a +.section she2b +.section she3a +.section she3b +.section she4a +.section she4b +.section she5a +.section she5b +.section she6a +.section she6b +.section she7a +.section she7b +.section she8a +.section she8b +.section she9a +.section she9b +.section she0a +.section she0b +.section shfaa +.section shfab +.section shfba +.section shfbb +.section shfca +.section shfcb +.section shfda +.section shfdb +.section shfea +.section shfeb +.section shffa +.section shffb +.section shfga +.section shfgb +.section shfha +.section shfhb +.section shfia +.section shfib +.section shfja +.section shfjb +.section shfka +.section shfkb +.section shfla +.section shflb +.section shfma +.section shfmb +.section shfna +.section shfnb +.section shfoa +.section shfob +.section shfpa +.section shfpb +.section shfqa +.section shfqb +.section shfra +.section shfrb +.section shfsa +.section shfsb +.section shfta +.section shftb +.section shfua +.section shfub +.section shfva +.section shfvb +.section shfwa +.section shfwb +.section shfxa +.section shfxb +.section shfya +.section shfyb +.section shfza +.section shfzb +.section shf1a +.section shf1b +.section shf2a +.section shf2b +.section shf3a +.section shf3b +.section shf4a +.section shf4b +.section shf5a +.section shf5b +.section shf6a +.section shf6b +.section shf7a +.section shf7b +.section shf8a +.section shf8b +.section shf9a +.section shf9b +.section shf0a +.section shf0b +.section shgaa +.section shgab +.section shgba +.section shgbb +.section shgca +.section shgcb +.section shgda +.section shgdb +.section shgea +.section shgeb +.section shgfa +.section shgfb +.section shgga +.section shggb +.section shgha +.section shghb +.section shgia +.section shgib +.section shgja +.section shgjb +.section shgka +.section shgkb +.section shgla +.section shglb +.section shgma +.section shgmb +.section shgna +.section shgnb +.section shgoa +.section shgob +.section shgpa +.section shgpb +.section shgqa +.section shgqb +.section shgra +.section shgrb +.section shgsa +.section shgsb +.section shgta +.section shgtb +.section shgua +.section shgub +.section shgva +.section shgvb +.section shgwa +.section shgwb +.section shgxa +.section shgxb +.section shgya +.section shgyb +.section shgza +.section shgzb +.section shg1a +.section shg1b +.section shg2a +.section shg2b +.section shg3a +.section shg3b +.section shg4a +.section shg4b +.section shg5a +.section shg5b +.section shg6a +.section shg6b +.section shg7a +.section shg7b +.section shg8a +.section shg8b +.section shg9a +.section shg9b +.section shg0a +.section shg0b +.section shhaa +.section shhab +.section shhba +.section shhbb +.section shhca +.section shhcb +.section shhda +.section shhdb +.section shhea +.section shheb +.section shhfa +.section shhfb +.section shhga +.section shhgb +.section shhha +.section shhhb +.section shhia +.section shhib +.section shhja +.section shhjb +.section shhka +.section shhkb +.section shhla +.section shhlb +.section shhma +.section shhmb +.section shhna +.section shhnb +.section shhoa +.section shhob +.section shhpa +.section shhpb +.section shhqa +.section shhqb +.section shhra +.section shhrb +.section shhsa +.section shhsb +.section shhta +.section shhtb +.section shhua +.section shhub +.section shhva +.section shhvb +.section shhwa +.section shhwb +.section shhxa +.section shhxb +.section shhya +.section shhyb +.section shhza +.section shhzb +.section shh1a +.section shh1b +.section shh2a +.section shh2b +.section shh3a +.section shh3b +.section shh4a +.section shh4b +.section shh5a +.section shh5b +.section shh6a +.section shh6b +.section shh7a +.section shh7b +.section shh8a +.section shh8b +.section shh9a +.section shh9b +.section shh0a +.section shh0b +.section shiaa +.section shiab +.section shiba +.section shibb +.section shica +.section shicb +.section shida +.section shidb +.section shiea +.section shieb +.section shifa +.section shifb +.section shiga +.section shigb +.section shiha +.section shihb +.section shiia +.section shiib +.section shija +.section shijb +.section shika +.section shikb +.section shila +.section shilb +.section shima +.section shimb +.section shina +.section shinb +.section shioa +.section shiob +.section shipa +.section shipb +.section shiqa +.section shiqb +.section shira +.section shirb +.section shisa +.section shisb +.section shita +.section shitb +.section shiua +.section shiub +.section shiva +.section shivb +.section shiwa +.section shiwb +.section shixa +.section shixb +.section shiya +.section shiyb +.section shiza +.section shizb +.section shi1a +.section shi1b +.section shi2a +.section shi2b +.section shi3a +.section shi3b +.section shi4a +.section shi4b +.section shi5a +.section shi5b +.section shi6a +.section shi6b +.section shi7a +.section shi7b +.section shi8a +.section shi8b +.section shi9a +.section shi9b +.section shi0a +.section shi0b +.section shjaa +.section shjab +.section shjba +.section shjbb +.section shjca +.section shjcb +.section shjda +.section shjdb +.section shjea +.section shjeb +.section shjfa +.section shjfb +.section shjga +.section shjgb +.section shjha +.section shjhb +.section shjia +.section shjib +.section shjja +.section shjjb +.section shjka +.section shjkb +.section shjla +.section shjlb +.section shjma +.section shjmb +.section shjna +.section shjnb +.section shjoa +.section shjob +.section shjpa +.section shjpb +.section shjqa +.section shjqb +.section shjra +.section shjrb +.section shjsa +.section shjsb +.section shjta +.section shjtb +.section shjua +.section shjub +.section shjva +.section shjvb +.section shjwa +.section shjwb +.section shjxa +.section shjxb +.section shjya +.section shjyb +.section shjza +.section shjzb +.section shj1a +.section shj1b +.section shj2a +.section shj2b +.section shj3a +.section shj3b +.section shj4a +.section shj4b +.section shj5a +.section shj5b +.section shj6a +.section shj6b +.section shj7a +.section shj7b +.section shj8a +.section shj8b +.section shj9a +.section shj9b +.section shj0a +.section shj0b +.section shkaa +.section shkab +.section shkba +.section shkbb +.section shkca +.section shkcb +.section shkda +.section shkdb +.section shkea +.section shkeb +.section shkfa +.section shkfb +.section shkga +.section shkgb +.section shkha +.section shkhb +.section shkia +.section shkib +.section shkja +.section shkjb +.section shkka +.section shkkb +.section shkla +.section shklb +.section shkma +.section shkmb +.section shkna +.section shknb +.section shkoa +.section shkob +.section shkpa +.section shkpb +.section shkqa +.section shkqb +.section shkra +.section shkrb +.section shksa +.section shksb +.section shkta +.section shktb +.section shkua +.section shkub +.section shkva +.section shkvb +.section shkwa +.section shkwb +.section shkxa +.section shkxb +.section shkya +.section shkyb +.section shkza +.section shkzb +.section shk1a +.section shk1b +.section shk2a +.section shk2b +.section shk3a +.section shk3b +.section shk4a +.section shk4b +.section shk5a +.section shk5b +.section shk6a +.section shk6b +.section shk7a +.section shk7b +.section shk8a +.section shk8b +.section shk9a +.section shk9b +.section shk0a +.section shk0b +.section shlaa +.section shlab +.section shlba +.section shlbb +.section shlca +.section shlcb +.section shlda +.section shldb +.section shlea +.section shleb +.section shlfa +.section shlfb +.section shlga +.section shlgb +.section shlha +.section shlhb +.section shlia +.section shlib +.section shlja +.section shljb +.section shlka +.section shlkb +.section shlla +.section shllb +.section shlma +.section shlmb +.section shlna +.section shlnb +.section shloa +.section shlob +.section shlpa +.section shlpb +.section shlqa +.section shlqb +.section shlra +.section shlrb +.section shlsa +.section shlsb +.section shlta +.section shltb +.section shlua +.section shlub +.section shlva +.section shlvb +.section shlwa +.section shlwb +.section shlxa +.section shlxb +.section shlya +.section shlyb +.section shlza +.section shlzb +.section shl1a +.section shl1b +.section shl2a +.section shl2b +.section shl3a +.section shl3b +.section shl4a +.section shl4b +.section shl5a +.section shl5b +.section shl6a +.section shl6b +.section shl7a +.section shl7b +.section shl8a +.section shl8b +.section shl9a +.section shl9b +.section shl0a +.section shl0b +.section shmaa +.section shmab +.section shmba +.section shmbb +.section shmca +.section shmcb +.section shmda +.section shmdb +.section shmea +.section shmeb +.section shmfa +.section shmfb +.section shmga +.section shmgb +.section shmha +.section shmhb +.section shmia +.section shmib +.section shmja +.section shmjb +.section shmka +.section shmkb +.section shmla +.section shmlb +.section shmma +.section shmmb +.section shmna +.section shmnb +.section shmoa +.section shmob +.section shmpa +.section shmpb +.section shmqa +.section shmqb +.section shmra +.section shmrb +.section shmsa +.section shmsb +.section shmta +.section shmtb +.section shmua +.section shmub +.section shmva +.section shmvb +.section shmwa +.section shmwb +.section shmxa +.section shmxb +.section shmya +.section shmyb +.section shmza +.section shmzb +.section shm1a +.section shm1b +.section shm2a +.section shm2b +.section shm3a +.section shm3b +.section shm4a +.section shm4b +.section shm5a +.section shm5b +.section shm6a +.section shm6b +.section shm7a +.section shm7b +.section shm8a +.section shm8b +.section shm9a +.section shm9b +.section shm0a +.section shm0b +.section shnaa +.section shnab +.section shnba +.section shnbb +.section shnca +.section shncb +.section shnda +.section shndb +.section shnea +.section shneb +.section shnfa +.section shnfb +.section shnga +.section shngb +.section shnha +.section shnhb +.section shnia +.section shnib +.section shnja +.section shnjb +.section shnka +.section shnkb +.section shnla +.section shnlb +.section shnma +.section shnmb +.section shnna +.section shnnb +.section shnoa +.section shnob +.section shnpa +.section shnpb +.section shnqa +.section shnqb +.section shnra +.section shnrb +.section shnsa +.section shnsb +.section shnta +.section shntb +.section shnua +.section shnub +.section shnva +.section shnvb +.section shnwa +.section shnwb +.section shnxa +.section shnxb +.section shnya +.section shnyb +.section shnza +.section shnzb +.section shn1a +.section shn1b +.section shn2a +.section shn2b +.section shn3a +.section shn3b +.section shn4a +.section shn4b +.section shn5a +.section shn5b +.section shn6a +.section shn6b +.section shn7a +.section shn7b +.section shn8a +.section shn8b +.section shn9a +.section shn9b +.section shn0a +.section shn0b +.section shoaa +.section shoab +.section shoba +.section shobb +.section shoca +.section shocb +.section shoda +.section shodb +.section shoea +.section shoeb +.section shofa +.section shofb +.section shoga +.section shogb +.section shoha +.section shohb +.section shoia +.section shoib +.section shoja +.section shojb +.section shoka +.section shokb +.section shola +.section sholb +.section shoma +.section shomb +.section shona +.section shonb +.section shooa +.section shoob +.section shopa +.section shopb +.section shoqa +.section shoqb +.section shora +.section shorb +.section shosa +.section shosb +.section shota +.section shotb +.section shoua +.section shoub +.section shova +.section shovb +.section showa +.section showb +.section shoxa +.section shoxb +.section shoya +.section shoyb +.section shoza +.section shozb +.section sho1a +.section sho1b +.section sho2a +.section sho2b +.section sho3a +.section sho3b +.section sho4a +.section sho4b +.section sho5a +.section sho5b +.section sho6a +.section sho6b +.section sho7a +.section sho7b +.section sho8a +.section sho8b +.section sho9a +.section sho9b +.section sho0a +.section sho0b +.section shpaa +.section shpab +.section shpba +.section shpbb +.section shpca +.section shpcb +.section shpda +.section shpdb +.section shpea +.section shpeb +.section shpfa +.section shpfb +.section shpga +.section shpgb +.section shpha +.section shphb +.section shpia +.section shpib +.section shpja +.section shpjb +.section shpka +.section shpkb +.section shpla +.section shplb +.section shpma +.section shpmb +.section shpna +.section shpnb +.section shpoa +.section shpob +.section shppa +.section shppb +.section shpqa +.section shpqb +.section shpra +.section shprb +.section shpsa +.section shpsb +.section shpta +.section shptb +.section shpua +.section shpub +.section shpva +.section shpvb +.section shpwa +.section shpwb +.section shpxa +.section shpxb +.section shpya +.section shpyb +.section shpza +.section shpzb +.section shp1a +.section shp1b +.section shp2a +.section shp2b +.section shp3a +.section shp3b +.section shp4a +.section shp4b +.section shp5a +.section shp5b +.section shp6a +.section shp6b +.section shp7a +.section shp7b +.section shp8a +.section shp8b +.section shp9a +.section shp9b +.section shp0a +.section shp0b +.section shqaa +.section shqab +.section shqba +.section shqbb +.section shqca +.section shqcb +.section shqda +.section shqdb +.section shqea +.section shqeb +.section shqfa +.section shqfb +.section shqga +.section shqgb +.section shqha +.section shqhb +.section shqia +.section shqib +.section shqja +.section shqjb +.section shqka +.section shqkb +.section shqla +.section shqlb +.section shqma +.section shqmb +.section shqna +.section shqnb +.section shqoa +.section shqob +.section shqpa +.section shqpb +.section shqqa +.section shqqb +.section shqra +.section shqrb +.section shqsa +.section shqsb +.section shqta +.section shqtb +.section shqua +.section shqub +.section shqva +.section shqvb +.section shqwa +.section shqwb +.section shqxa +.section shqxb +.section shqya +.section shqyb +.section shqza +.section shqzb +.section shq1a +.section shq1b +.section shq2a +.section shq2b +.section shq3a +.section shq3b +.section shq4a +.section shq4b +.section shq5a +.section shq5b +.section shq6a +.section shq6b +.section shq7a +.section shq7b +.section shq8a +.section shq8b +.section shq9a +.section shq9b +.section shq0a +.section shq0b +.section shraa +.section shrab +.section shrba +.section shrbb +.section shrca +.section shrcb +.section shrda +.section shrdb +.section shrea +.section shreb +.section shrfa +.section shrfb +.section shrga +.section shrgb +.section shrha +.section shrhb +.section shria +.section shrib +.section shrja +.section shrjb +.section shrka +.section shrkb +.section shrla +.section shrlb +.section shrma +.section shrmb +.section shrna +.section shrnb +.section shroa +.section shrob +.section shrpa +.section shrpb +.section shrqa +.section shrqb +.section shrra +.section shrrb +.section shrsa +.section shrsb +.section shrta +.section shrtb +.section shrua +.section shrub +.section shrva +.section shrvb +.section shrwa +.section shrwb +.section shrxa +.section shrxb +.section shrya +.section shryb +.section shrza +.section shrzb +.section shr1a +.section shr1b +.section shr2a +.section shr2b +.section shr3a +.section shr3b +.section shr4a +.section shr4b +.section shr5a +.section shr5b +.section shr6a +.section shr6b +.section shr7a +.section shr7b +.section shr8a +.section shr8b +.section shr9a +.section shr9b +.section shr0a +.section shr0b +.section shsaa +.section shsab +.section shsba +.section shsbb +.section shsca +.section shscb +.section shsda +.section shsdb +.section shsea +.section shseb +.section shsfa +.section shsfb +.section shsga +.section shsgb +.section shsha +.section shshb +.section shsia +.section shsib +.section shsja +.section shsjb +.section shska +.section shskb +.section shsla +.section shslb +.section shsma +.section shsmb +.section shsna +.section shsnb +.section shsoa +.section shsob +.section shspa +.section shspb +.section shsqa +.section shsqb +.section shsra +.section shsrb +.section shssa +.section shssb +.section shsta +.section shstb +.section shsua +.section shsub +.section shsva +.section shsvb +.section shswa +.section shswb +.section shsxa +.section shsxb +.section shsya +.section shsyb +.section shsza +.section shszb +.section shs1a +.section shs1b +.section shs2a +.section shs2b +.section shs3a +.section shs3b +.section shs4a +.section shs4b +.section shs5a +.section shs5b +.section shs6a +.section shs6b +.section shs7a +.section shs7b +.section shs8a +.section shs8b +.section shs9a +.section shs9b +.section shs0a +.section shs0b +.section shtaa +.section shtab +.section shtba +.section shtbb +.section shtca +.section shtcb +.section shtda +.section shtdb +.section shtea +.section shteb +.section shtfa +.section shtfb +.section shtga +.section shtgb +.section shtha +.section shthb +.section shtia +.section shtib +.section shtja +.section shtjb +.section shtka +.section shtkb +.section shtla +.section shtlb +.section shtma +.section shtmb +.section shtna +.section shtnb +.section shtoa +.section shtob +.section shtpa +.section shtpb +.section shtqa +.section shtqb +.section shtra +.section shtrb +.section shtsa +.section shtsb +.section shtta +.section shttb +.section shtua +.section shtub +.section shtva +.section shtvb +.section shtwa +.section shtwb +.section shtxa +.section shtxb +.section shtya +.section shtyb +.section shtza +.section shtzb +.section sht1a +.section sht1b +.section sht2a +.section sht2b +.section sht3a +.section sht3b +.section sht4a +.section sht4b +.section sht5a +.section sht5b +.section sht6a +.section sht6b +.section sht7a +.section sht7b +.section sht8a +.section sht8b +.section sht9a +.section sht9b +.section sht0a +.section sht0b +.section shuaa +.section shuab +.section shuba +.section shubb +.section shuca +.section shucb +.section shuda +.section shudb +.section shuea +.section shueb +.section shufa +.section shufb +.section shuga +.section shugb +.section shuha +.section shuhb +.section shuia +.section shuib +.section shuja +.section shujb +.section shuka +.section shukb +.section shula +.section shulb +.section shuma +.section shumb +.section shuna +.section shunb +.section shuoa +.section shuob +.section shupa +.section shupb +.section shuqa +.section shuqb +.section shura +.section shurb +.section shusa +.section shusb +.section shuta +.section shutb +.section shuua +.section shuub +.section shuva +.section shuvb +.section shuwa +.section shuwb +.section shuxa +.section shuxb +.section shuya +.section shuyb +.section shuza +.section shuzb +.section shu1a +.section shu1b +.section shu2a +.section shu2b +.section shu3a +.section shu3b +.section shu4a +.section shu4b +.section shu5a +.section shu5b +.section shu6a +.section shu6b +.section shu7a +.section shu7b +.section shu8a +.section shu8b +.section shu9a +.section shu9b +.section shu0a +.section shu0b +.section shvaa +.section shvab +.section shvba +.section shvbb +.section shvca +.section shvcb +.section shvda +.section shvdb +.section shvea +.section shveb +.section shvfa +.section shvfb +.section shvga +.section shvgb +.section shvha +.section shvhb +.section shvia +.section shvib +.section shvja +.section shvjb +.section shvka +.section shvkb +.section shvla +.section shvlb +.section shvma +.section shvmb +.section shvna +.section shvnb +.section shvoa +.section shvob +.section shvpa +.section shvpb +.section shvqa +.section shvqb +.section shvra +.section shvrb +.section shvsa +.section shvsb +.section shvta +.section shvtb +.section shvua +.section shvub +.section shvva +.section shvvb +.section shvwa +.section shvwb +.section shvxa +.section shvxb +.section shvya +.section shvyb +.section shvza +.section shvzb +.section shv1a +.section shv1b +.section shv2a +.section shv2b +.section shv3a +.section shv3b +.section shv4a +.section shv4b +.section shv5a +.section shv5b +.section shv6a +.section shv6b +.section shv7a +.section shv7b +.section shv8a +.section shv8b +.section shv9a +.section shv9b +.section shv0a +.section shv0b +.section shwaa +.section shwab +.section shwba +.section shwbb +.section shwca +.section shwcb +.section shwda +.section shwdb +.section shwea +.section shweb +.section shwfa +.section shwfb +.section shwga +.section shwgb +.section shwha +.section shwhb +.section shwia +.section shwib +.section shwja +.section shwjb +.section shwka +.section shwkb +.section shwla +.section shwlb +.section shwma +.section shwmb +.section shwna +.section shwnb +.section shwoa +.section shwob +.section shwpa +.section shwpb +.section shwqa +.section shwqb +.section shwra +.section shwrb +.section shwsa +.section shwsb +.section shwta +.section shwtb +.section shwua +.section shwub +.section shwva +.section shwvb +.section shwwa +.section shwwb +.section shwxa +.section shwxb +.section shwya +.section shwyb +.section shwza +.section shwzb +.section shw1a +.section shw1b +.section shw2a +.section shw2b +.section shw3a +.section shw3b +.section shw4a +.section shw4b +.section shw5a +.section shw5b +.section shw6a +.section shw6b +.section shw7a +.section shw7b +.section shw8a +.section shw8b +.section shw9a +.section shw9b +.section shw0a +.section shw0b +.section shxaa +.section shxab +.section shxba +.section shxbb +.section shxca +.section shxcb +.section shxda +.section shxdb +.section shxea +.section shxeb +.section shxfa +.section shxfb +.section shxga +.section shxgb +.section shxha +.section shxhb +.section shxia +.section shxib +.section shxja +.section shxjb +.section shxka +.section shxkb +.section shxla +.section shxlb +.section shxma +.section shxmb +.section shxna +.section shxnb +.section shxoa +.section shxob +.section shxpa +.section shxpb +.section shxqa +.section shxqb +.section shxra +.section shxrb +.section shxsa +.section shxsb +.section shxta +.section shxtb +.section shxua +.section shxub +.section shxva +.section shxvb +.section shxwa +.section shxwb +.section shxxa +.section shxxb +.section shxya +.section shxyb +.section shxza +.section shxzb +.section shx1a +.section shx1b +.section shx2a +.section shx2b +.section shx3a +.section shx3b +.section shx4a +.section shx4b +.section shx5a +.section shx5b +.section shx6a +.section shx6b +.section shx7a +.section shx7b +.section shx8a +.section shx8b +.section shx9a +.section shx9b +.section shx0a +.section shx0b +.section shyaa +.section shyab +.section shyba +.section shybb +.section shyca +.section shycb +.section shyda +.section shydb +.section shyea +.section shyeb +.section shyfa +.section shyfb +.section shyga +.section shygb +.section shyha +.section shyhb +.section shyia +.section shyib +.section shyja +.section shyjb +.section shyka +.section shykb +.section shyla +.section shylb +.section shyma +.section shymb +.section shyna +.section shynb +.section shyoa +.section shyob +.section shypa +.section shypb +.section shyqa +.section shyqb +.section shyra +.section shyrb +.section shysa +.section shysb +.section shyta +.section shytb +.section shyua +.section shyub +.section shyva +.section shyvb +.section shywa +.section shywb +.section shyxa +.section shyxb +.section shyya +.section shyyb +.section shyza +.section shyzb +.section shy1a +.section shy1b +.section shy2a +.section shy2b +.section shy3a +.section shy3b +.section shy4a +.section shy4b +.section shy5a +.section shy5b +.section shy6a +.section shy6b +.section shy7a +.section shy7b +.section shy8a +.section shy8b +.section shy9a +.section shy9b +.section shy0a +.section shy0b +.section shzaa +.section shzab +.section shzba +.section shzbb +.section shzca +.section shzcb +.section shzda +.section shzdb +.section shzea +.section shzeb +.section shzfa +.section shzfb +.section shzga +.section shzgb +.section shzha +.section shzhb +.section shzia +.section shzib +.section shzja +.section shzjb +.section shzka +.section shzkb +.section shzla +.section shzlb +.section shzma +.section shzmb +.section shzna +.section shznb +.section shzoa +.section shzob +.section shzpa +.section shzpb +.section shzqa +.section shzqb +.section shzra +.section shzrb +.section shzsa +.section shzsb +.section shzta +.section shztb +.section shzua +.section shzub +.section shzva +.section shzvb +.section shzwa +.section shzwb +.section shzxa +.section shzxb +.section shzya +.section shzyb +.section shzza +.section shzzb +.section shz1a +.section shz1b +.section shz2a +.section shz2b +.section shz3a +.section shz3b +.section shz4a +.section shz4b +.section shz5a +.section shz5b +.section shz6a +.section shz6b +.section shz7a +.section shz7b +.section shz8a +.section shz8b +.section shz9a +.section shz9b +.section shz0a +.section shz0b +.section sh1aa +.section sh1ab +.section sh1ba +.section sh1bb +.section sh1ca +.section sh1cb +.section sh1da +.section sh1db +.section sh1ea +.section sh1eb +.section sh1fa +.section sh1fb +.section sh1ga +.section sh1gb +.section sh1ha +.section sh1hb +.section sh1ia +.section sh1ib +.section sh1ja +.section sh1jb +.section sh1ka +.section sh1kb +.section sh1la +.section sh1lb +.section sh1ma +.section sh1mb +.section sh1na +.section sh1nb +.section sh1oa +.section sh1ob +.section sh1pa +.section sh1pb +.section sh1qa +.section sh1qb +.section sh1ra +.section sh1rb +.section sh1sa +.section sh1sb +.section sh1ta +.section sh1tb +.section sh1ua +.section sh1ub +.section sh1va +.section sh1vb +.section sh1wa +.section sh1wb +.section sh1xa +.section sh1xb +.section sh1ya +.section sh1yb +.section sh1za +.section sh1zb +.section sh11a +.section sh11b +.section sh12a +.section sh12b +.section sh13a +.section sh13b +.section sh14a +.section sh14b +.section sh15a +.section sh15b +.section sh16a +.section sh16b +.section sh17a +.section sh17b +.section sh18a +.section sh18b +.section sh19a +.section sh19b +.section sh10a +.section sh10b +.section sh2aa +.section sh2ab +.section sh2ba +.section sh2bb +.section sh2ca +.section sh2cb +.section sh2da +.section sh2db +.section sh2ea +.section sh2eb +.section sh2fa +.section sh2fb +.section sh2ga +.section sh2gb +.section sh2ha +.section sh2hb +.section sh2ia +.section sh2ib +.section sh2ja +.section sh2jb +.section sh2ka +.section sh2kb +.section sh2la +.section sh2lb +.section sh2ma +.section sh2mb +.section sh2na +.section sh2nb +.section sh2oa +.section sh2ob +.section sh2pa +.section sh2pb +.section sh2qa +.section sh2qb +.section sh2ra +.section sh2rb +.section sh2sa +.section sh2sb +.section sh2ta +.section sh2tb +.section sh2ua +.section sh2ub +.section sh2va +.section sh2vb +.section sh2wa +.section sh2wb +.section sh2xa +.section sh2xb +.section sh2ya +.section sh2yb +.section sh2za +.section sh2zb +.section sh21a +.section sh21b +.section sh22a +.section sh22b +.section sh23a +.section sh23b +.section sh24a +.section sh24b +.section sh25a +.section sh25b +.section sh26a +.section sh26b +.section sh27a +.section sh27b +.section sh28a +.section sh28b +.section sh29a +.section sh29b +.section sh20a +.section sh20b +.section sh3aa +.section sh3ab +.section sh3ba +.section sh3bb +.section sh3ca +.section sh3cb +.section sh3da +.section sh3db +.section sh3ea +.section sh3eb +.section sh3fa +.section sh3fb +.section sh3ga +.section sh3gb +.section sh3ha +.section sh3hb +.section sh3ia +.section sh3ib +.section sh3ja +.section sh3jb +.section sh3ka +.section sh3kb +.section sh3la +.section sh3lb +.section sh3ma +.section sh3mb +.section sh3na +.section sh3nb +.section sh3oa +.section sh3ob +.section sh3pa +.section sh3pb +.section sh3qa +.section sh3qb +.section sh3ra +.section sh3rb +.section sh3sa +.section sh3sb +.section sh3ta +.section sh3tb +.section sh3ua +.section sh3ub +.section sh3va +.section sh3vb +.section sh3wa +.section sh3wb +.section sh3xa +.section sh3xb +.section sh3ya +.section sh3yb +.section sh3za +.section sh3zb +.section sh31a +.section sh31b +.section sh32a +.section sh32b +.section sh33a +.section sh33b +.section sh34a +.section sh34b +.section sh35a +.section sh35b +.section sh36a +.section sh36b +.section sh37a +.section sh37b +.section sh38a +.section sh38b +.section sh39a +.section sh39b +.section sh30a +.section sh30b +.section sh4aa +.section sh4ab +.section sh4ba +.section sh4bb +.section sh4ca +.section sh4cb +.section sh4da +.section sh4db +.section sh4ea +.section sh4eb +.section sh4fa +.section sh4fb +.section sh4ga +.section sh4gb +.section sh4ha +.section sh4hb +.section sh4ia +.section sh4ib +.section sh4ja +.section sh4jb +.section sh4ka +.section sh4kb +.section sh4la +.section sh4lb +.section sh4ma +.section sh4mb +.section sh4na +.section sh4nb +.section sh4oa +.section sh4ob +.section sh4pa +.section sh4pb +.section sh4qa +.section sh4qb +.section sh4ra +.section sh4rb +.section sh4sa +.section sh4sb +.section sh4ta +.section sh4tb +.section sh4ua +.section sh4ub +.section sh4va +.section sh4vb +.section sh4wa +.section sh4wb +.section sh4xa +.section sh4xb +.section sh4ya +.section sh4yb +.section sh4za +.section sh4zb +.section sh41a +.section sh41b +.section sh42a +.section sh42b +.section sh43a +.section sh43b +.section sh44a +.section sh44b +.section sh45a +.section sh45b +.section sh46a +.section sh46b +.section sh47a +.section sh47b +.section sh48a +.section sh48b +.section sh49a +.section sh49b +.section sh40a +.section sh40b +.section sh5aa +.section sh5ab +.section sh5ba +.section sh5bb +.section sh5ca +.section sh5cb +.section sh5da +.section sh5db +.section sh5ea +.section sh5eb +.section sh5fa +.section sh5fb +.section sh5ga +.section sh5gb +.section sh5ha +.section sh5hb +.section sh5ia +.section sh5ib +.section sh5ja +.section sh5jb +.section sh5ka +.section sh5kb +.section sh5la +.section sh5lb +.section sh5ma +.section sh5mb +.section sh5na +.section sh5nb +.section sh5oa +.section sh5ob +.section sh5pa +.section sh5pb +.section sh5qa +.section sh5qb +.section sh5ra +.section sh5rb +.section sh5sa +.section sh5sb +.section sh5ta +.section sh5tb +.section sh5ua +.section sh5ub +.section sh5va +.section sh5vb +.section sh5wa +.section sh5wb +.section sh5xa +.section sh5xb +.section sh5ya +.section sh5yb +.section sh5za +.section sh5zb +.section sh51a +.section sh51b +.section sh52a +.section sh52b +.section sh53a +.section sh53b +.section sh54a +.section sh54b +.section sh55a +.section sh55b +.section sh56a +.section sh56b +.section sh57a +.section sh57b +.section sh58a +.section sh58b +.section sh59a +.section sh59b +.section sh50a +.section sh50b +.section sh6aa +.section sh6ab +.section sh6ba +.section sh6bb +.section sh6ca +.section sh6cb +.section sh6da +.section sh6db +.section sh6ea +.section sh6eb +.section sh6fa +.section sh6fb +.section sh6ga +.section sh6gb +.section sh6ha +.section sh6hb +.section sh6ia +.section sh6ib +.section sh6ja +.section sh6jb +.section sh6ka +.section sh6kb +.section sh6la +.section sh6lb +.section sh6ma +.section sh6mb +.section sh6na +.section sh6nb +.section sh6oa +.section sh6ob +.section sh6pa +.section sh6pb +.section sh6qa +.section sh6qb +.section sh6ra +.section sh6rb +.section sh6sa +.section sh6sb +.section sh6ta +.section sh6tb +.section sh6ua +.section sh6ub +.section sh6va +.section sh6vb +.section sh6wa +.section sh6wb +.section sh6xa +.section sh6xb +.section sh6ya +.section sh6yb +.section sh6za +.section sh6zb +.section sh61a +.section sh61b +.section sh62a +.section sh62b +.section sh63a +.section sh63b +.section sh64a +.section sh64b +.section sh65a +.section sh65b +.section sh66a +.section sh66b +.section sh67a +.section sh67b +.section sh68a +.section sh68b +.section sh69a +.section sh69b +.section sh60a +.section sh60b +.section sh7aa +.section sh7ab +.section sh7ba +.section sh7bb +.section sh7ca +.section sh7cb +.section sh7da +.section sh7db +.section sh7ea +.section sh7eb +.section sh7fa +.section sh7fb +.section sh7ga +.section sh7gb +.section sh7ha +.section sh7hb +.section sh7ia +.section sh7ib +.section sh7ja +.section sh7jb +.section sh7ka +.section sh7kb +.section sh7la +.section sh7lb +.section sh7ma +.section sh7mb +.section sh7na +.section sh7nb +.section sh7oa +.section sh7ob +.section sh7pa +.section sh7pb +.section sh7qa +.section sh7qb +.section sh7ra +.section sh7rb +.section sh7sa +.section sh7sb +.section sh7ta +.section sh7tb +.section sh7ua +.section sh7ub +.section sh7va +.section sh7vb +.section sh7wa +.section sh7wb +.section sh7xa +.section sh7xb +.section sh7ya +.section sh7yb +.section sh7za +.section sh7zb +.section sh71a +.section sh71b +.section sh72a +.section sh72b +.section sh73a +.section sh73b +.section sh74a +.section sh74b +.section sh75a +.section sh75b +.section sh76a +.section sh76b +.section sh77a +.section sh77b +.section sh78a +.section sh78b +.section sh79a +.section sh79b +.section sh70a +.section sh70b +.section sh8aa +.section sh8ab +.section sh8ba +.section sh8bb +.section sh8ca +.section sh8cb +.section sh8da +.section sh8db +.section sh8ea +.section sh8eb +.section sh8fa +.section sh8fb +.section sh8ga +.section sh8gb +.section sh8ha +.section sh8hb +.section sh8ia +.section sh8ib +.section sh8ja +.section sh8jb +.section sh8ka +.section sh8kb +.section sh8la +.section sh8lb +.section sh8ma +.section sh8mb +.section sh8na +.section sh8nb +.section sh8oa +.section sh8ob +.section sh8pa +.section sh8pb +.section sh8qa +.section sh8qb +.section sh8ra +.section sh8rb +.section sh8sa +.section sh8sb +.section sh8ta +.section sh8tb +.section sh8ua +.section sh8ub +.section sh8va +.section sh8vb +.section sh8wa +.section sh8wb +.section sh8xa +.section sh8xb +.section sh8ya +.section sh8yb +.section sh8za +.section sh8zb +.section sh81a +.section sh81b +.section sh82a +.section sh82b +.section sh83a +.section sh83b +.section sh84a +.section sh84b +.section sh85a +.section sh85b +.section sh86a +.section sh86b +.section sh87a +.section sh87b +.section sh88a +.section sh88b +.section sh89a +.section sh89b +.section sh80a +.section sh80b +.section sh9aa +.section sh9ab +.section sh9ba +.section sh9bb +.section sh9ca +.section sh9cb +.section sh9da +.section sh9db +.section sh9ea +.section sh9eb +.section sh9fa +.section sh9fb +.section sh9ga +.section sh9gb +.section sh9ha +.section sh9hb +.section sh9ia +.section sh9ib +.section sh9ja +.section sh9jb +.section sh9ka +.section sh9kb +.section sh9la +.section sh9lb +.section sh9ma +.section sh9mb +.section sh9na +.section sh9nb +.section sh9oa +.section sh9ob +.section sh9pa +.section sh9pb +.section sh9qa +.section sh9qb +.section sh9ra +.section sh9rb +.section sh9sa +.section sh9sb +.section sh9ta +.section sh9tb +.section sh9ua +.section sh9ub +.section sh9va +.section sh9vb +.section sh9wa +.section sh9wb +.section sh9xa +.section sh9xb +.section sh9ya +.section sh9yb +.section sh9za +.section sh9zb +.section sh91a +.section sh91b +.section sh92a +.section sh92b +.section sh93a +.section sh93b +.section sh94a +.section sh94b +.section sh95a +.section sh95b +.section sh96a +.section sh96b +.section sh97a +.section sh97b +.section sh98a +.section sh98b +.section sh99a +.section sh99b +.section sh90a +.section sh90b +.section sh0aa +.section sh0ab +.section sh0ba +.section sh0bb +.section sh0ca +.section sh0cb +.section sh0da +.section sh0db +.section sh0ea +.section sh0eb +.section sh0fa +.section sh0fb +.section sh0ga +.section sh0gb +.section sh0ha +.section sh0hb +.section sh0ia +.section sh0ib +.section sh0ja +.section sh0jb +.section sh0ka +.section sh0kb +.section sh0la +.section sh0lb +.section sh0ma +.section sh0mb +.section sh0na +.section sh0nb +.section sh0oa +.section sh0ob +.section sh0pa +.section sh0pb +.section sh0qa +.section sh0qb +.section sh0ra +.section sh0rb +.section sh0sa +.section sh0sb +.section sh0ta +.section sh0tb +.section sh0ua +.section sh0ub +.section sh0va +.section sh0vb +.section sh0wa +.section sh0wb +.section sh0xa +.section sh0xb +.section sh0ya +.section sh0yb +.section sh0za +.section sh0zb +.section sh01a +.section sh01b +.section sh02a +.section sh02b +.section sh03a +.section sh03b +.section sh04a +.section sh04b +.section sh05a +.section sh05b +.section sh06a +.section sh06b +.section sh07a +.section sh07b +.section sh08a +.section sh08b +.section sh09a +.section sh09b +.section sh00a +.section sh00b +.section siaaa +.section siaab +.section siaba +.section siabb +.section siaca +.section siacb +.section siada +.section siadb +.section siaea +.section siaeb +.section siafa +.section siafb +.section siaga +.section siagb +.section siaha +.section siahb +.section siaia +.section siaib +.section siaja +.section siajb +.section siaka +.section siakb +.section siala +.section sialb +.section siama +.section siamb +.section siana +.section sianb +.section siaoa +.section siaob +.section siapa +.section siapb +.section siaqa +.section siaqb +.section siara +.section siarb +.section siasa +.section siasb +.section siata +.section siatb +.section siaua +.section siaub +.section siava +.section siavb +.section siawa +.section siawb +.section siaxa +.section siaxb +.section siaya +.section siayb +.section siaza +.section siazb +.section sia1a +.section sia1b +.section sia2a +.section sia2b +.section sia3a +.section sia3b +.section sia4a +.section sia4b +.section sia5a +.section sia5b +.section sia6a +.section sia6b +.section sia7a +.section sia7b +.section sia8a +.section sia8b +.section sia9a +.section sia9b +.section sia0a +.section sia0b +.section sibaa +.section sibab +.section sibba +.section sibbb +.section sibca +.section sibcb +.section sibda +.section sibdb +.section sibea +.section sibeb +.section sibfa +.section sibfb +.section sibga +.section sibgb +.section sibha +.section sibhb +.section sibia +.section sibib +.section sibja +.section sibjb +.section sibka +.section sibkb +.section sibla +.section siblb +.section sibma +.section sibmb +.section sibna +.section sibnb +.section siboa +.section sibob +.section sibpa +.section sibpb +.section sibqa +.section sibqb +.section sibra +.section sibrb +.section sibsa +.section sibsb +.section sibta +.section sibtb +.section sibua +.section sibub +.section sibva +.section sibvb +.section sibwa +.section sibwb +.section sibxa +.section sibxb +.section sibya +.section sibyb +.section sibza +.section sibzb +.section sib1a +.section sib1b +.section sib2a +.section sib2b +.section sib3a +.section sib3b +.section sib4a +.section sib4b +.section sib5a +.section sib5b +.section sib6a +.section sib6b +.section sib7a +.section sib7b +.section sib8a +.section sib8b +.section sib9a +.section sib9b +.section sib0a +.section sib0b +.section sicaa +.section sicab +.section sicba +.section sicbb +.section sicca +.section siccb +.section sicda +.section sicdb +.section sicea +.section siceb +.section sicfa +.section sicfb +.section sicga +.section sicgb +.section sicha +.section sichb +.section sicia +.section sicib +.section sicja +.section sicjb +.section sicka +.section sickb +.section sicla +.section siclb +.section sicma +.section sicmb +.section sicna +.section sicnb +.section sicoa +.section sicob +.section sicpa +.section sicpb +.section sicqa +.section sicqb +.section sicra +.section sicrb +.section sicsa +.section sicsb +.section sicta +.section sictb +.section sicua +.section sicub +.section sicva +.section sicvb +.section sicwa +.section sicwb +.section sicxa +.section sicxb +.section sicya +.section sicyb +.section sicza +.section siczb +.section sic1a +.section sic1b +.section sic2a +.section sic2b +.section sic3a +.section sic3b +.section sic4a +.section sic4b +.section sic5a +.section sic5b +.section sic6a +.section sic6b +.section sic7a +.section sic7b +.section sic8a +.section sic8b +.section sic9a +.section sic9b +.section sic0a +.section sic0b +.section sidaa +.section sidab +.section sidba +.section sidbb +.section sidca +.section sidcb +.section sidda +.section siddb +.section sidea +.section sideb +.section sidfa +.section sidfb +.section sidga +.section sidgb +.section sidha +.section sidhb +.section sidia +.section sidib +.section sidja +.section sidjb +.section sidka +.section sidkb +.section sidla +.section sidlb +.section sidma +.section sidmb +.section sidna +.section sidnb +.section sidoa +.section sidob +.section sidpa +.section sidpb +.section sidqa +.section sidqb +.section sidra +.section sidrb +.section sidsa +.section sidsb +.section sidta +.section sidtb +.section sidua +.section sidub +.section sidva +.section sidvb +.section sidwa +.section sidwb +.section sidxa +.section sidxb +.section sidya +.section sidyb +.section sidza +.section sidzb +.section sid1a +.section sid1b +.section sid2a +.section sid2b +.section sid3a +.section sid3b +.section sid4a +.section sid4b +.section sid5a +.section sid5b +.section sid6a +.section sid6b +.section sid7a +.section sid7b +.section sid8a +.section sid8b +.section sid9a +.section sid9b +.section sid0a +.section sid0b +.section sieaa +.section sieab +.section sieba +.section siebb +.section sieca +.section siecb +.section sieda +.section siedb +.section sieea +.section sieeb +.section siefa +.section siefb +.section siega +.section siegb +.section sieha +.section siehb +.section sieia +.section sieib +.section sieja +.section siejb +.section sieka +.section siekb +.section siela +.section sielb +.section siema +.section siemb +.section siena +.section sienb +.section sieoa +.section sieob +.section siepa +.section siepb +.section sieqa +.section sieqb +.section siera +.section sierb +.section siesa +.section siesb +.section sieta +.section sietb +.section sieua +.section sieub +.section sieva +.section sievb +.section siewa +.section siewb +.section siexa +.section siexb +.section sieya +.section sieyb +.section sieza +.section siezb +.section sie1a +.section sie1b +.section sie2a +.section sie2b +.section sie3a +.section sie3b +.section sie4a +.section sie4b +.section sie5a +.section sie5b +.section sie6a +.section sie6b +.section sie7a +.section sie7b +.section sie8a +.section sie8b +.section sie9a +.section sie9b +.section sie0a +.section sie0b +.section sifaa +.section sifab +.section sifba +.section sifbb +.section sifca +.section sifcb +.section sifda +.section sifdb +.section sifea +.section sifeb +.section siffa +.section siffb +.section sifga +.section sifgb +.section sifha +.section sifhb +.section sifia +.section sifib +.section sifja +.section sifjb +.section sifka +.section sifkb +.section sifla +.section siflb +.section sifma +.section sifmb +.section sifna +.section sifnb +.section sifoa +.section sifob +.section sifpa +.section sifpb +.section sifqa +.section sifqb +.section sifra +.section sifrb +.section sifsa +.section sifsb +.section sifta +.section siftb +.section sifua +.section sifub +.section sifva +.section sifvb +.section sifwa +.section sifwb +.section sifxa +.section sifxb +.section sifya +.section sifyb +.section sifza +.section sifzb +.section sif1a +.section sif1b +.section sif2a +.section sif2b +.section sif3a +.section sif3b +.section sif4a +.section sif4b +.section sif5a +.section sif5b +.section sif6a +.section sif6b +.section sif7a +.section sif7b +.section sif8a +.section sif8b +.section sif9a +.section sif9b +.section sif0a +.section sif0b +.section sigaa +.section sigab +.section sigba +.section sigbb +.section sigca +.section sigcb +.section sigda +.section sigdb +.section sigea +.section sigeb +.section sigfa +.section sigfb +.section sigga +.section siggb +.section sigha +.section sighb +.section sigia +.section sigib +.section sigja +.section sigjb +.section sigka +.section sigkb +.section sigla +.section siglb +.section sigma +.section sigmb +.section signa +.section signb +.section sigoa +.section sigob +.section sigpa +.section sigpb +.section sigqa +.section sigqb +.section sigra +.section sigrb +.section sigsa +.section sigsb +.section sigta +.section sigtb +.section sigua +.section sigub +.section sigva +.section sigvb +.section sigwa +.section sigwb +.section sigxa +.section sigxb +.section sigya +.section sigyb +.section sigza +.section sigzb +.section sig1a +.section sig1b +.section sig2a +.section sig2b +.section sig3a +.section sig3b +.section sig4a +.section sig4b +.section sig5a +.section sig5b +.section sig6a +.section sig6b +.section sig7a +.section sig7b +.section sig8a +.section sig8b +.section sig9a +.section sig9b +.section sig0a +.section sig0b +.section sihaa +.section sihab +.section sihba +.section sihbb +.section sihca +.section sihcb +.section sihda +.section sihdb +.section sihea +.section siheb +.section sihfa +.section sihfb +.section sihga +.section sihgb +.section sihha +.section sihhb +.section sihia +.section sihib +.section sihja +.section sihjb +.section sihka +.section sihkb +.section sihla +.section sihlb +.section sihma +.section sihmb +.section sihna +.section sihnb +.section sihoa +.section sihob +.section sihpa +.section sihpb +.section sihqa +.section sihqb +.section sihra +.section sihrb +.section sihsa +.section sihsb +.section sihta +.section sihtb +.section sihua +.section sihub +.section sihva +.section sihvb +.section sihwa +.section sihwb +.section sihxa +.section sihxb +.section sihya +.section sihyb +.section sihza +.section sihzb +.section sih1a +.section sih1b +.section sih2a +.section sih2b +.section sih3a +.section sih3b +.section sih4a +.section sih4b +.section sih5a +.section sih5b +.section sih6a +.section sih6b +.section sih7a +.section sih7b +.section sih8a +.section sih8b +.section sih9a +.section sih9b +.section sih0a +.section sih0b +.section siiaa +.section siiab +.section siiba +.section siibb +.section siica +.section siicb +.section siida +.section siidb +.section siiea +.section siieb +.section siifa +.section siifb +.section siiga +.section siigb +.section siiha +.section siihb +.section siiia +.section siiib +.section siija +.section siijb +.section siika +.section siikb +.section siila +.section siilb +.section siima +.section siimb +.section siina +.section siinb +.section siioa +.section siiob +.section siipa +.section siipb +.section siiqa +.section siiqb +.section siira +.section siirb +.section siisa +.section siisb +.section siita +.section siitb +.section siiua +.section siiub +.section siiva +.section siivb +.section siiwa +.section siiwb +.section siixa +.section siixb +.section siiya +.section siiyb +.section siiza +.section siizb +.section sii1a +.section sii1b +.section sii2a +.section sii2b +.section sii3a +.section sii3b +.section sii4a +.section sii4b +.section sii5a +.section sii5b +.section sii6a +.section sii6b +.section sii7a +.section sii7b +.section sii8a +.section sii8b +.section sii9a +.section sii9b +.section sii0a +.section sii0b +.section sijaa +.section sijab +.section sijba +.section sijbb +.section sijca +.section sijcb +.section sijda +.section sijdb +.section sijea +.section sijeb +.section sijfa +.section sijfb +.section sijga +.section sijgb +.section sijha +.section sijhb +.section sijia +.section sijib +.section sijja +.section sijjb +.section sijka +.section sijkb +.section sijla +.section sijlb +.section sijma +.section sijmb +.section sijna +.section sijnb +.section sijoa +.section sijob +.section sijpa +.section sijpb +.section sijqa +.section sijqb +.section sijra +.section sijrb +.section sijsa +.section sijsb +.section sijta +.section sijtb +.section sijua +.section sijub +.section sijva +.section sijvb +.section sijwa +.section sijwb +.section sijxa +.section sijxb +.section sijya +.section sijyb +.section sijza +.section sijzb +.section sij1a +.section sij1b +.section sij2a +.section sij2b +.section sij3a +.section sij3b +.section sij4a +.section sij4b +.section sij5a +.section sij5b +.section sij6a +.section sij6b +.section sij7a +.section sij7b +.section sij8a +.section sij8b +.section sij9a +.section sij9b +.section sij0a +.section sij0b +.section sikaa +.section sikab +.section sikba +.section sikbb +.section sikca +.section sikcb +.section sikda +.section sikdb +.section sikea +.section sikeb +.section sikfa +.section sikfb +.section sikga +.section sikgb +.section sikha +.section sikhb +.section sikia +.section sikib +.section sikja +.section sikjb +.section sikka +.section sikkb +.section sikla +.section siklb +.section sikma +.section sikmb +.section sikna +.section siknb +.section sikoa +.section sikob +.section sikpa +.section sikpb +.section sikqa +.section sikqb +.section sikra +.section sikrb +.section siksa +.section siksb +.section sikta +.section siktb +.section sikua +.section sikub +.section sikva +.section sikvb +.section sikwa +.section sikwb +.section sikxa +.section sikxb +.section sikya +.section sikyb +.section sikza +.section sikzb +.section sik1a +.section sik1b +.section sik2a +.section sik2b +.section sik3a +.section sik3b +.section sik4a +.section sik4b +.section sik5a +.section sik5b +.section sik6a +.section sik6b +.section sik7a +.section sik7b +.section sik8a +.section sik8b +.section sik9a +.section sik9b +.section sik0a +.section sik0b +.section silaa +.section silab +.section silba +.section silbb +.section silca +.section silcb +.section silda +.section sildb +.section silea +.section sileb +.section silfa +.section silfb +.section silga +.section silgb +.section silha +.section silhb +.section silia +.section silib +.section silja +.section siljb +.section silka +.section silkb +.section silla +.section sillb +.section silma +.section silmb +.section silna +.section silnb +.section siloa +.section silob +.section silpa +.section silpb +.section silqa +.section silqb +.section silra +.section silrb +.section silsa +.section silsb +.section silta +.section siltb +.section silua +.section silub +.section silva +.section silvb +.section silwa +.section silwb +.section silxa +.section silxb +.section silya +.section silyb +.section silza +.section silzb +.section sil1a +.section sil1b +.section sil2a +.section sil2b +.section sil3a +.section sil3b +.section sil4a +.section sil4b +.section sil5a +.section sil5b +.section sil6a +.section sil6b +.section sil7a +.section sil7b +.section sil8a +.section sil8b +.section sil9a +.section sil9b +.section sil0a +.section sil0b +.section simaa +.section simab +.section simba +.section simbb +.section simca +.section simcb +.section simda +.section simdb +.section simea +.section simeb +.section simfa +.section simfb +.section simga +.section simgb +.section simha +.section simhb +.section simia +.section simib +.section simja +.section simjb +.section simka +.section simkb +.section simla +.section simlb +.section simma +.section simmb +.section simna +.section simnb +.section simoa +.section simob +.section simpa +.section simpb +.section simqa +.section simqb +.section simra +.section simrb +.section simsa +.section simsb +.section simta +.section simtb +.section simua +.section simub +.section simva +.section simvb +.section simwa +.section simwb +.section simxa +.section simxb +.section simya +.section simyb +.section simza +.section simzb +.section sim1a +.section sim1b +.section sim2a +.section sim2b +.section sim3a +.section sim3b +.section sim4a +.section sim4b +.section sim5a +.section sim5b +.section sim6a +.section sim6b +.section sim7a +.section sim7b +.section sim8a +.section sim8b +.section sim9a +.section sim9b +.section sim0a +.section sim0b +.section sinaa +.section sinab +.section sinba +.section sinbb +.section sinca +.section sincb +.section sinda +.section sindb +.section sinea +.section sineb +.section sinfa +.section sinfb +.section singa +.section singb +.section sinha +.section sinhb +.section sinia +.section sinib +.section sinja +.section sinjb +.section sinka +.section sinkb +.section sinla +.section sinlb +.section sinma +.section sinmb +.section sinna +.section sinnb +.section sinoa +.section sinob +.section sinpa +.section sinpb +.section sinqa +.section sinqb +.section sinra +.section sinrb +.section sinsa +.section sinsb +.section sinta +.section sintb +.section sinua +.section sinub +.section sinva +.section sinvb +.section sinwa +.section sinwb +.section sinxa +.section sinxb +.section sinya +.section sinyb +.section sinza +.section sinzb +.section sin1a +.section sin1b +.section sin2a +.section sin2b +.section sin3a +.section sin3b +.section sin4a +.section sin4b +.section sin5a +.section sin5b +.section sin6a +.section sin6b +.section sin7a +.section sin7b +.section sin8a +.section sin8b +.section sin9a +.section sin9b +.section sin0a +.section sin0b +.section sioaa +.section sioab +.section sioba +.section siobb +.section sioca +.section siocb +.section sioda +.section siodb +.section sioea +.section sioeb +.section siofa +.section siofb +.section sioga +.section siogb +.section sioha +.section siohb +.section sioia +.section sioib +.section sioja +.section siojb +.section sioka +.section siokb +.section siola +.section siolb +.section sioma +.section siomb +.section siona +.section sionb +.section siooa +.section sioob +.section siopa +.section siopb +.section sioqa +.section sioqb +.section siora +.section siorb +.section siosa +.section siosb +.section siota +.section siotb +.section sioua +.section sioub +.section siova +.section siovb +.section siowa +.section siowb +.section sioxa +.section sioxb +.section sioya +.section sioyb +.section sioza +.section siozb +.section sio1a +.section sio1b +.section sio2a +.section sio2b +.section sio3a +.section sio3b +.section sio4a +.section sio4b +.section sio5a +.section sio5b +.section sio6a +.section sio6b +.section sio7a +.section sio7b +.section sio8a +.section sio8b +.section sio9a +.section sio9b +.section sio0a +.section sio0b +.section sipaa +.section sipab +.section sipba +.section sipbb +.section sipca +.section sipcb +.section sipda +.section sipdb +.section sipea +.section sipeb +.section sipfa +.section sipfb +.section sipga +.section sipgb +.section sipha +.section siphb +.section sipia +.section sipib +.section sipja +.section sipjb +.section sipka +.section sipkb +.section sipla +.section siplb +.section sipma +.section sipmb +.section sipna +.section sipnb +.section sipoa +.section sipob +.section sippa +.section sippb +.section sipqa +.section sipqb +.section sipra +.section siprb +.section sipsa +.section sipsb +.section sipta +.section siptb +.section sipua +.section sipub +.section sipva +.section sipvb +.section sipwa +.section sipwb +.section sipxa +.section sipxb +.section sipya +.section sipyb +.section sipza +.section sipzb +.section sip1a +.section sip1b +.section sip2a +.section sip2b +.section sip3a +.section sip3b +.section sip4a +.section sip4b +.section sip5a +.section sip5b +.section sip6a +.section sip6b +.section sip7a +.section sip7b +.section sip8a +.section sip8b +.section sip9a +.section sip9b +.section sip0a +.section sip0b +.section siqaa +.section siqab +.section siqba +.section siqbb +.section siqca +.section siqcb +.section siqda +.section siqdb +.section siqea +.section siqeb +.section siqfa +.section siqfb +.section siqga +.section siqgb +.section siqha +.section siqhb +.section siqia +.section siqib +.section siqja +.section siqjb +.section siqka +.section siqkb +.section siqla +.section siqlb +.section siqma +.section siqmb +.section siqna +.section siqnb +.section siqoa +.section siqob +.section siqpa +.section siqpb +.section siqqa +.section siqqb +.section siqra +.section siqrb +.section siqsa +.section siqsb +.section siqta +.section siqtb +.section siqua +.section siqub +.section siqva +.section siqvb +.section siqwa +.section siqwb +.section siqxa +.section siqxb +.section siqya +.section siqyb +.section siqza +.section siqzb +.section siq1a +.section siq1b +.section siq2a +.section siq2b +.section siq3a +.section siq3b +.section siq4a +.section siq4b +.section siq5a +.section siq5b +.section siq6a +.section siq6b +.section siq7a +.section siq7b +.section siq8a +.section siq8b +.section siq9a +.section siq9b +.section siq0a +.section siq0b +.section siraa +.section sirab +.section sirba +.section sirbb +.section sirca +.section sircb +.section sirda +.section sirdb +.section sirea +.section sireb +.section sirfa +.section sirfb +.section sirga +.section sirgb +.section sirha +.section sirhb +.section siria +.section sirib +.section sirja +.section sirjb +.section sirka +.section sirkb +.section sirla +.section sirlb +.section sirma +.section sirmb +.section sirna +.section sirnb +.section siroa +.section sirob +.section sirpa +.section sirpb +.section sirqa +.section sirqb +.section sirra +.section sirrb +.section sirsa +.section sirsb +.section sirta +.section sirtb +.section sirua +.section sirub +.section sirva +.section sirvb +.section sirwa +.section sirwb +.section sirxa +.section sirxb +.section sirya +.section siryb +.section sirza +.section sirzb +.section sir1a +.section sir1b +.section sir2a +.section sir2b +.section sir3a +.section sir3b +.section sir4a +.section sir4b +.section sir5a +.section sir5b +.section sir6a +.section sir6b +.section sir7a +.section sir7b +.section sir8a +.section sir8b +.section sir9a +.section sir9b +.section sir0a +.section sir0b +.section sisaa +.section sisab +.section sisba +.section sisbb +.section sisca +.section siscb +.section sisda +.section sisdb +.section sisea +.section siseb +.section sisfa +.section sisfb +.section sisga +.section sisgb +.section sisha +.section sishb +.section sisia +.section sisib +.section sisja +.section sisjb +.section siska +.section siskb +.section sisla +.section sislb +.section sisma +.section sismb +.section sisna +.section sisnb +.section sisoa +.section sisob +.section sispa +.section sispb +.section sisqa +.section sisqb +.section sisra +.section sisrb +.section sissa +.section sissb +.section sista +.section sistb +.section sisua +.section sisub +.section sisva +.section sisvb +.section siswa +.section siswb +.section sisxa +.section sisxb +.section sisya +.section sisyb +.section sisza +.section siszb +.section sis1a +.section sis1b +.section sis2a +.section sis2b +.section sis3a +.section sis3b +.section sis4a +.section sis4b +.section sis5a +.section sis5b +.section sis6a +.section sis6b +.section sis7a +.section sis7b +.section sis8a +.section sis8b +.section sis9a +.section sis9b +.section sis0a +.section sis0b +.section sitaa +.section sitab +.section sitba +.section sitbb +.section sitca +.section sitcb +.section sitda +.section sitdb +.section sitea +.section siteb +.section sitfa +.section sitfb +.section sitga +.section sitgb +.section sitha +.section sithb +.section sitia +.section sitib +.section sitja +.section sitjb +.section sitka +.section sitkb +.section sitla +.section sitlb +.section sitma +.section sitmb +.section sitna +.section sitnb +.section sitoa +.section sitob +.section sitpa +.section sitpb +.section sitqa +.section sitqb +.section sitra +.section sitrb +.section sitsa +.section sitsb +.section sitta +.section sittb +.section situa +.section situb +.section sitva +.section sitvb +.section sitwa +.section sitwb +.section sitxa +.section sitxb +.section sitya +.section sityb +.section sitza +.section sitzb +.section sit1a +.section sit1b +.section sit2a +.section sit2b +.section sit3a +.section sit3b +.section sit4a +.section sit4b +.section sit5a +.section sit5b +.section sit6a +.section sit6b +.section sit7a +.section sit7b +.section sit8a +.section sit8b +.section sit9a +.section sit9b +.section sit0a +.section sit0b +.section siuaa +.section siuab +.section siuba +.section siubb +.section siuca +.section siucb +.section siuda +.section siudb +.section siuea +.section siueb +.section siufa +.section siufb +.section siuga +.section siugb +.section siuha +.section siuhb +.section siuia +.section siuib +.section siuja +.section siujb +.section siuka +.section siukb +.section siula +.section siulb +.section siuma +.section siumb +.section siuna +.section siunb +.section siuoa +.section siuob +.section siupa +.section siupb +.section siuqa +.section siuqb +.section siura +.section siurb +.section siusa +.section siusb +.section siuta +.section siutb +.section siuua +.section siuub +.section siuva +.section siuvb +.section siuwa +.section siuwb +.section siuxa +.section siuxb +.section siuya +.section siuyb +.section siuza +.section siuzb +.section siu1a +.section siu1b +.section siu2a +.section siu2b +.section siu3a +.section siu3b +.section siu4a +.section siu4b +.section siu5a +.section siu5b +.section siu6a +.section siu6b +.section siu7a +.section siu7b +.section siu8a +.section siu8b +.section siu9a +.section siu9b +.section siu0a +.section siu0b +.section sivaa +.section sivab +.section sivba +.section sivbb +.section sivca +.section sivcb +.section sivda +.section sivdb +.section sivea +.section siveb +.section sivfa +.section sivfb +.section sivga +.section sivgb +.section sivha +.section sivhb +.section sivia +.section sivib +.section sivja +.section sivjb +.section sivka +.section sivkb +.section sivla +.section sivlb +.section sivma +.section sivmb +.section sivna +.section sivnb +.section sivoa +.section sivob +.section sivpa +.section sivpb +.section sivqa +.section sivqb +.section sivra +.section sivrb +.section sivsa +.section sivsb +.section sivta +.section sivtb +.section sivua +.section sivub +.section sivva +.section sivvb +.section sivwa +.section sivwb +.section sivxa +.section sivxb +.section sivya +.section sivyb +.section sivza +.section sivzb +.section siv1a +.section siv1b +.section siv2a +.section siv2b +.section siv3a +.section siv3b +.section siv4a +.section siv4b +.section siv5a +.section siv5b +.section siv6a +.section siv6b +.section siv7a +.section siv7b +.section siv8a +.section siv8b +.section siv9a +.section siv9b +.section siv0a +.section siv0b +.section siwaa +.section siwab +.section siwba +.section siwbb +.section siwca +.section siwcb +.section siwda +.section siwdb +.section siwea +.section siweb +.section siwfa +.section siwfb +.section siwga +.section siwgb +.section siwha +.section siwhb +.section siwia +.section siwib +.section siwja +.section siwjb +.section siwka +.section siwkb +.section siwla +.section siwlb +.section siwma +.section siwmb +.section siwna +.section siwnb +.section siwoa +.section siwob +.section siwpa +.section siwpb +.section siwqa +.section siwqb +.section siwra +.section siwrb +.section siwsa +.section siwsb +.section siwta +.section siwtb +.section siwua +.section siwub +.section siwva +.section siwvb +.section siwwa +.section siwwb +.section siwxa +.section siwxb +.section siwya +.section siwyb +.section siwza +.section siwzb +.section siw1a +.section siw1b +.section siw2a +.section siw2b +.section siw3a +.section siw3b +.section siw4a +.section siw4b +.section siw5a +.section siw5b +.section siw6a +.section siw6b +.section siw7a +.section siw7b +.section siw8a +.section siw8b +.section siw9a +.section siw9b +.section siw0a +.section siw0b +.section sixaa +.section sixab +.section sixba +.section sixbb +.section sixca +.section sixcb +.section sixda +.section sixdb +.section sixea +.section sixeb +.section sixfa +.section sixfb +.section sixga +.section sixgb +.section sixha +.section sixhb +.section sixia +.section sixib +.section sixja +.section sixjb +.section sixka +.section sixkb +.section sixla +.section sixlb +.section sixma +.section sixmb +.section sixna +.section sixnb +.section sixoa +.section sixob +.section sixpa +.section sixpb +.section sixqa +.section sixqb +.section sixra +.section sixrb +.section sixsa +.section sixsb +.section sixta +.section sixtb +.section sixua +.section sixub +.section sixva +.section sixvb +.section sixwa +.section sixwb +.section sixxa +.section sixxb +.section sixya +.section sixyb +.section sixza +.section sixzb +.section six1a +.section six1b +.section six2a +.section six2b +.section six3a +.section six3b +.section six4a +.section six4b +.section six5a +.section six5b +.section six6a +.section six6b +.section six7a +.section six7b +.section six8a +.section six8b +.section six9a +.section six9b +.section six0a +.section six0b +.section siyaa +.section siyab +.section siyba +.section siybb +.section siyca +.section siycb +.section siyda +.section siydb +.section siyea +.section siyeb +.section siyfa +.section siyfb +.section siyga +.section siygb +.section siyha +.section siyhb +.section siyia +.section siyib +.section siyja +.section siyjb +.section siyka +.section siykb +.section siyla +.section siylb +.section siyma +.section siymb +.section siyna +.section siynb +.section siyoa +.section siyob +.section siypa +.section siypb +.section siyqa +.section siyqb +.section siyra +.section siyrb +.section siysa +.section siysb +.section siyta +.section siytb +.section siyua +.section siyub +.section siyva +.section siyvb +.section siywa +.section siywb +.section siyxa +.section siyxb +.section siyya +.section siyyb +.section siyza +.section siyzb +.section siy1a +.section siy1b +.section siy2a +.section siy2b +.section siy3a +.section siy3b +.section siy4a +.section siy4b +.section siy5a +.section siy5b +.section siy6a +.section siy6b +.section siy7a +.section siy7b +.section siy8a +.section siy8b +.section siy9a +.section siy9b +.section siy0a +.section siy0b +.section sizaa +.section sizab +.section sizba +.section sizbb +.section sizca +.section sizcb +.section sizda +.section sizdb +.section sizea +.section sizeb +.section sizfa +.section sizfb +.section sizga +.section sizgb +.section sizha +.section sizhb +.section sizia +.section sizib +.section sizja +.section sizjb +.section sizka +.section sizkb +.section sizla +.section sizlb +.section sizma +.section sizmb +.section sizna +.section siznb +.section sizoa +.section sizob +.section sizpa +.section sizpb +.section sizqa +.section sizqb +.section sizra +.section sizrb +.section sizsa +.section sizsb +.section sizta +.section siztb +.section sizua +.section sizub +.section sizva +.section sizvb +.section sizwa +.section sizwb +.section sizxa +.section sizxb +.section sizya +.section sizyb +.section sizza +.section sizzb +.section siz1a +.section siz1b +.section siz2a +.section siz2b +.section siz3a +.section siz3b +.section siz4a +.section siz4b +.section siz5a +.section siz5b +.section siz6a +.section siz6b +.section siz7a +.section siz7b +.section siz8a +.section siz8b +.section siz9a +.section siz9b +.section siz0a +.section siz0b +.section si1aa +.section si1ab +.section si1ba +.section si1bb +.section si1ca +.section si1cb +.section si1da +.section si1db +.section si1ea +.section si1eb +.section si1fa +.section si1fb +.section si1ga +.section si1gb +.section si1ha +.section si1hb +.section si1ia +.section si1ib +.section si1ja +.section si1jb +.section si1ka +.section si1kb +.section si1la +.section si1lb +.section si1ma +.section si1mb +.section si1na +.section si1nb +.section si1oa +.section si1ob +.section si1pa +.section si1pb +.section si1qa +.section si1qb +.section si1ra +.section si1rb +.section si1sa +.section si1sb +.section si1ta +.section si1tb +.section si1ua +.section si1ub +.section si1va +.section si1vb +.section si1wa +.section si1wb +.section si1xa +.section si1xb +.section si1ya +.section si1yb +.section si1za +.section si1zb +.section si11a +.section si11b +.section si12a +.section si12b +.section si13a +.section si13b +.section si14a +.section si14b +.section si15a +.section si15b +.section si16a +.section si16b +.section si17a +.section si17b +.section si18a +.section si18b +.section si19a +.section si19b +.section si10a +.section si10b +.section si2aa +.section si2ab +.section si2ba +.section si2bb +.section si2ca +.section si2cb +.section si2da +.section si2db +.section si2ea +.section si2eb +.section si2fa +.section si2fb +.section si2ga +.section si2gb +.section si2ha +.section si2hb +.section si2ia +.section si2ib +.section si2ja +.section si2jb +.section si2ka +.section si2kb +.section si2la +.section si2lb +.section si2ma +.section si2mb +.section si2na +.section si2nb +.section si2oa +.section si2ob +.section si2pa +.section si2pb +.section si2qa +.section si2qb +.section si2ra +.section si2rb +.section si2sa +.section si2sb +.section si2ta +.section si2tb +.section si2ua +.section si2ub +.section si2va +.section si2vb +.section si2wa +.section si2wb +.section si2xa +.section si2xb +.section si2ya +.section si2yb +.section si2za +.section si2zb +.section si21a +.section si21b +.section si22a +.section si22b +.section si23a +.section si23b +.section si24a +.section si24b +.section si25a +.section si25b +.section si26a +.section si26b +.section si27a +.section si27b +.section si28a +.section si28b +.section si29a +.section si29b +.section si20a +.section si20b +.section si3aa +.section si3ab +.section si3ba +.section si3bb +.section si3ca +.section si3cb +.section si3da +.section si3db +.section si3ea +.section si3eb +.section si3fa +.section si3fb +.section si3ga +.section si3gb +.section si3ha +.section si3hb +.section si3ia +.section si3ib +.section si3ja +.section si3jb +.section si3ka +.section si3kb +.section si3la +.section si3lb +.section si3ma +.section si3mb +.section si3na +.section si3nb +.section si3oa +.section si3ob +.section si3pa +.section si3pb +.section si3qa +.section si3qb +.section si3ra +.section si3rb +.section si3sa +.section si3sb +.section si3ta +.section si3tb +.section si3ua +.section si3ub +.section si3va +.section si3vb +.section si3wa +.section si3wb +.section si3xa +.section si3xb +.section si3ya +.section si3yb +.section si3za +.section si3zb +.section si31a +.section si31b +.section si32a +.section si32b +.section si33a +.section si33b +.section si34a +.section si34b +.section si35a +.section si35b +.section si36a +.section si36b +.section si37a +.section si37b +.section si38a +.section si38b +.section si39a +.section si39b +.section si30a +.section si30b +.section si4aa +.section si4ab +.section si4ba +.section si4bb +.section si4ca +.section si4cb +.section si4da +.section si4db +.section si4ea +.section si4eb +.section si4fa +.section si4fb +.section si4ga +.section si4gb +.section si4ha +.section si4hb +.section si4ia +.section si4ib +.section si4ja +.section si4jb +.section si4ka +.section si4kb +.section si4la +.section si4lb +.section si4ma +.section si4mb +.section si4na +.section si4nb +.section si4oa +.section si4ob +.section si4pa +.section si4pb +.section si4qa +.section si4qb +.section si4ra +.section si4rb +.section si4sa +.section si4sb +.section si4ta +.section si4tb +.section si4ua +.section si4ub +.section si4va +.section si4vb +.section si4wa +.section si4wb +.section si4xa +.section si4xb +.section si4ya +.section si4yb +.section si4za +.section si4zb +.section si41a +.section si41b +.section si42a +.section si42b +.section si43a +.section si43b +.section si44a +.section si44b +.section si45a +.section si45b +.section si46a +.section si46b +.section si47a +.section si47b +.section si48a +.section si48b +.section si49a +.section si49b +.section si40a +.section si40b +.section si5aa +.section si5ab +.section si5ba +.section si5bb +.section si5ca +.section si5cb +.section si5da +.section si5db +.section si5ea +.section si5eb +.section si5fa +.section si5fb +.section si5ga +.section si5gb +.section si5ha +.section si5hb +.section si5ia +.section si5ib +.section si5ja +.section si5jb +.section si5ka +.section si5kb +.section si5la +.section si5lb +.section si5ma +.section si5mb +.section si5na +.section si5nb +.section si5oa +.section si5ob +.section si5pa +.section si5pb +.section si5qa +.section si5qb +.section si5ra +.section si5rb +.section si5sa +.section si5sb +.section si5ta +.section si5tb +.section si5ua +.section si5ub +.section si5va +.section si5vb +.section si5wa +.section si5wb +.section si5xa +.section si5xb +.section si5ya +.section si5yb +.section si5za +.section si5zb +.section si51a +.section si51b +.section si52a +.section si52b +.section si53a +.section si53b +.section si54a +.section si54b +.section si55a +.section si55b +.section si56a +.section si56b +.section si57a +.section si57b +.section si58a +.section si58b +.section si59a +.section si59b +.section si50a +.section si50b +.section si6aa +.section si6ab +.section si6ba +.section si6bb +.section si6ca +.section si6cb +.section si6da +.section si6db +.section si6ea +.section si6eb +.section si6fa +.section si6fb +.section si6ga +.section si6gb +.section si6ha +.section si6hb +.section si6ia +.section si6ib +.section si6ja +.section si6jb +.section si6ka +.section si6kb +.section si6la +.section si6lb +.section si6ma +.section si6mb +.section si6na +.section si6nb +.section si6oa +.section si6ob +.section si6pa +.section si6pb +.section si6qa +.section si6qb +.section si6ra +.section si6rb +.section si6sa +.section si6sb +.section si6ta +.section si6tb +.section si6ua +.section si6ub +.section si6va +.section si6vb +.section si6wa +.section si6wb +.section si6xa +.section si6xb +.section si6ya +.section si6yb +.section si6za +.section si6zb +.section si61a +.section si61b +.section si62a +.section si62b +.section si63a +.section si63b +.section si64a +.section si64b +.section si65a +.section si65b +.section si66a +.section si66b +.section si67a +.section si67b +.section si68a +.section si68b +.section si69a +.section si69b +.section si60a +.section si60b +.section si7aa +.section si7ab +.section si7ba +.section si7bb +.section si7ca +.section si7cb +.section si7da +.section si7db +.section si7ea +.section si7eb +.section si7fa +.section si7fb +.section si7ga +.section si7gb +.section si7ha +.section si7hb +.section si7ia +.section si7ib +.section si7ja +.section si7jb +.section si7ka +.section si7kb +.section si7la +.section si7lb +.section si7ma +.section si7mb +.section si7na +.section si7nb +.section si7oa +.section si7ob +.section si7pa +.section si7pb +.section si7qa +.section si7qb +.section si7ra +.section si7rb +.section si7sa +.section si7sb +.section si7ta +.section si7tb +.section si7ua +.section si7ub +.section si7va +.section si7vb +.section si7wa +.section si7wb +.section si7xa +.section si7xb +.section si7ya +.section si7yb +.section si7za +.section si7zb +.section si71a +.section si71b +.section si72a +.section si72b +.section si73a +.section si73b +.section si74a +.section si74b +.section si75a +.section si75b +.section si76a +.section si76b +.section si77a +.section si77b +.section si78a +.section si78b +.section si79a +.section si79b +.section si70a +.section si70b +.section si8aa +.section si8ab +.section si8ba +.section si8bb +.section si8ca +.section si8cb +.section si8da +.section si8db +.section si8ea +.section si8eb +.section si8fa +.section si8fb +.section si8ga +.section si8gb +.section si8ha +.section si8hb +.section si8ia +.section si8ib +.section si8ja +.section si8jb +.section si8ka +.section si8kb +.section si8la +.section si8lb +.section si8ma +.section si8mb +.section si8na +.section si8nb +.section si8oa +.section si8ob +.section si8pa +.section si8pb +.section si8qa +.section si8qb +.section si8ra +.section si8rb +.section si8sa +.section si8sb +.section si8ta +.section si8tb +.section si8ua +.section si8ub +.section si8va +.section si8vb +.section si8wa +.section si8wb +.section si8xa +.section si8xb +.section si8ya +.section si8yb +.section si8za +.section si8zb +.section si81a +.section si81b +.section si82a +.section si82b +.section si83a +.section si83b +.section si84a +.section si84b +.section si85a +.section si85b +.section si86a +.section si86b +.section si87a +.section si87b +.section si88a +.section si88b +.section si89a +.section si89b +.section si80a +.section si80b +.section si9aa +.section si9ab +.section si9ba +.section si9bb +.section si9ca +.section si9cb +.section si9da +.section si9db +.section si9ea +.section si9eb +.section si9fa +.section si9fb +.section si9ga +.section si9gb +.section si9ha +.section si9hb +.section si9ia +.section si9ib +.section si9ja +.section si9jb +.section si9ka +.section si9kb +.section si9la +.section si9lb +.section si9ma +.section si9mb +.section si9na +.section si9nb +.section si9oa +.section si9ob +.section si9pa +.section si9pb +.section si9qa +.section si9qb +.section si9ra +.section si9rb +.section si9sa +.section si9sb +.section si9ta +.section si9tb +.section si9ua +.section si9ub +.section si9va +.section si9vb +.section si9wa +.section si9wb +.section si9xa +.section si9xb +.section si9ya +.section si9yb +.section si9za +.section si9zb +.section si91a +.section si91b +.section si92a +.section si92b +.section si93a +.section si93b +.section si94a +.section si94b +.section si95a +.section si95b +.section si96a +.section si96b +.section si97a +.section si97b +.section si98a +.section si98b +.section si99a +.section si99b +.section si90a +.section si90b +.section si0aa +.section si0ab +.section si0ba +.section si0bb +.section si0ca +.section si0cb +.section si0da +.section si0db +.section si0ea +.section si0eb +.section si0fa +.section si0fb +.section si0ga +.section si0gb +.section si0ha +.section si0hb +.section si0ia +.section si0ib +.section si0ja +.section si0jb +.section si0ka +.section si0kb +.section si0la +.section si0lb +.section si0ma +.section si0mb +.section si0na +.section si0nb +.section si0oa +.section si0ob +.section si0pa +.section si0pb +.section si0qa +.section si0qb +.section si0ra +.section si0rb +.section si0sa +.section si0sb +.section si0ta +.section si0tb +.section si0ua +.section si0ub +.section si0va +.section si0vb +.section si0wa +.section si0wb +.section si0xa +.section si0xb +.section si0ya +.section si0yb +.section si0za +.section si0zb +.section si01a +.section si01b +.section si02a +.section si02b +.section si03a +.section si03b +.section si04a +.section si04b +.section si05a +.section si05b +.section si06a +.section si06b +.section si07a +.section si07b +.section si08a +.section si08b +.section si09a +.section si09b +.section si00a +.section si00b +.section sjaaa +.section sjaab +.section sjaba +.section sjabb +.section sjaca +.section sjacb +.section sjada +.section sjadb +.section sjaea +.section sjaeb +.section sjafa +.section sjafb +.section sjaga +.section sjagb +.section sjaha +.section sjahb +.section sjaia +.section sjaib +.section sjaja +.section sjajb +.section sjaka +.section sjakb +.section sjala +.section sjalb +.section sjama +.section sjamb +.section sjana +.section sjanb +.section sjaoa +.section sjaob +.section sjapa +.section sjapb +.section sjaqa +.section sjaqb +.section sjara +.section sjarb +.section sjasa +.section sjasb +.section sjata +.section sjatb +.section sjaua +.section sjaub +.section sjava +.section sjavb +.section sjawa +.section sjawb +.section sjaxa +.section sjaxb +.section sjaya +.section sjayb +.section sjaza +.section sjazb +.section sja1a +.section sja1b +.section sja2a +.section sja2b +.section sja3a +.section sja3b +.section sja4a +.section sja4b +.section sja5a +.section sja5b +.section sja6a +.section sja6b +.section sja7a +.section sja7b +.section sja8a +.section sja8b +.section sja9a +.section sja9b +.section sja0a +.section sja0b +.section sjbaa +.section sjbab +.section sjbba +.section sjbbb +.section sjbca +.section sjbcb +.section sjbda +.section sjbdb +.section sjbea +.section sjbeb +.section sjbfa +.section sjbfb +.section sjbga +.section sjbgb +.section sjbha +.section sjbhb +.section sjbia +.section sjbib +.section sjbja +.section sjbjb +.section sjbka +.section sjbkb +.section sjbla +.section sjblb +.section sjbma +.section sjbmb +.section sjbna +.section sjbnb +.section sjboa +.section sjbob +.section sjbpa +.section sjbpb +.section sjbqa +.section sjbqb +.section sjbra +.section sjbrb +.section sjbsa +.section sjbsb +.section sjbta +.section sjbtb +.section sjbua +.section sjbub +.section sjbva +.section sjbvb +.section sjbwa +.section sjbwb +.section sjbxa +.section sjbxb +.section sjbya +.section sjbyb +.section sjbza +.section sjbzb +.section sjb1a +.section sjb1b +.section sjb2a +.section sjb2b +.section sjb3a +.section sjb3b +.section sjb4a +.section sjb4b +.section sjb5a +.section sjb5b +.section sjb6a +.section sjb6b +.section sjb7a +.section sjb7b +.section sjb8a +.section sjb8b +.section sjb9a +.section sjb9b +.section sjb0a +.section sjb0b +.section sjcaa +.section sjcab +.section sjcba +.section sjcbb +.section sjcca +.section sjccb +.section sjcda +.section sjcdb +.section sjcea +.section sjceb +.section sjcfa +.section sjcfb +.section sjcga +.section sjcgb +.section sjcha +.section sjchb +.section sjcia +.section sjcib +.section sjcja +.section sjcjb +.section sjcka +.section sjckb +.section sjcla +.section sjclb +.section sjcma +.section sjcmb +.section sjcna +.section sjcnb +.section sjcoa +.section sjcob +.section sjcpa +.section sjcpb +.section sjcqa +.section sjcqb +.section sjcra +.section sjcrb +.section sjcsa +.section sjcsb +.section sjcta +.section sjctb +.section sjcua +.section sjcub +.section sjcva +.section sjcvb +.section sjcwa +.section sjcwb +.section sjcxa +.section sjcxb +.section sjcya +.section sjcyb +.section sjcza +.section sjczb +.section sjc1a +.section sjc1b +.section sjc2a +.section sjc2b +.section sjc3a +.section sjc3b +.section sjc4a +.section sjc4b +.section sjc5a +.section sjc5b +.section sjc6a +.section sjc6b +.section sjc7a +.section sjc7b +.section sjc8a +.section sjc8b +.section sjc9a +.section sjc9b +.section sjc0a +.section sjc0b +.section sjdaa +.section sjdab +.section sjdba +.section sjdbb +.section sjdca +.section sjdcb +.section sjdda +.section sjddb +.section sjdea +.section sjdeb +.section sjdfa +.section sjdfb +.section sjdga +.section sjdgb +.section sjdha +.section sjdhb +.section sjdia +.section sjdib +.section sjdja +.section sjdjb +.section sjdka +.section sjdkb +.section sjdla +.section sjdlb +.section sjdma +.section sjdmb +.section sjdna +.section sjdnb +.section sjdoa +.section sjdob +.section sjdpa +.section sjdpb +.section sjdqa +.section sjdqb +.section sjdra +.section sjdrb +.section sjdsa +.section sjdsb +.section sjdta +.section sjdtb +.section sjdua +.section sjdub +.section sjdva +.section sjdvb +.section sjdwa +.section sjdwb +.section sjdxa +.section sjdxb +.section sjdya +.section sjdyb +.section sjdza +.section sjdzb +.section sjd1a +.section sjd1b +.section sjd2a +.section sjd2b +.section sjd3a +.section sjd3b +.section sjd4a +.section sjd4b +.section sjd5a +.section sjd5b +.section sjd6a +.section sjd6b +.section sjd7a +.section sjd7b +.section sjd8a +.section sjd8b +.section sjd9a +.section sjd9b +.section sjd0a +.section sjd0b +.section sjeaa +.section sjeab +.section sjeba +.section sjebb +.section sjeca +.section sjecb +.section sjeda +.section sjedb +.section sjeea +.section sjeeb +.section sjefa +.section sjefb +.section sjega +.section sjegb +.section sjeha +.section sjehb +.section sjeia +.section sjeib +.section sjeja +.section sjejb +.section sjeka +.section sjekb +.section sjela +.section sjelb +.section sjema +.section sjemb +.section sjena +.section sjenb +.section sjeoa +.section sjeob +.section sjepa +.section sjepb +.section sjeqa +.section sjeqb +.section sjera +.section sjerb +.section sjesa +.section sjesb +.section sjeta +.section sjetb +.section sjeua +.section sjeub +.section sjeva +.section sjevb +.section sjewa +.section sjewb +.section sjexa +.section sjexb +.section sjeya +.section sjeyb +.section sjeza +.section sjezb +.section sje1a +.section sje1b +.section sje2a +.section sje2b +.section sje3a +.section sje3b +.section sje4a +.section sje4b +.section sje5a +.section sje5b +.section sje6a +.section sje6b +.section sje7a +.section sje7b +.section sje8a +.section sje8b +.section sje9a +.section sje9b +.section sje0a +.section sje0b +.section sjfaa +.section sjfab +.section sjfba +.section sjfbb +.section sjfca +.section sjfcb +.section sjfda +.section sjfdb +.section sjfea +.section sjfeb +.section sjffa +.section sjffb +.section sjfga +.section sjfgb +.section sjfha +.section sjfhb +.section sjfia +.section sjfib +.section sjfja +.section sjfjb +.section sjfka +.section sjfkb +.section sjfla +.section sjflb +.section sjfma +.section sjfmb +.section sjfna +.section sjfnb +.section sjfoa +.section sjfob +.section sjfpa +.section sjfpb +.section sjfqa +.section sjfqb +.section sjfra +.section sjfrb +.section sjfsa +.section sjfsb +.section sjfta +.section sjftb +.section sjfua +.section sjfub +.section sjfva +.section sjfvb +.section sjfwa +.section sjfwb +.section sjfxa +.section sjfxb +.section sjfya +.section sjfyb +.section sjfza +.section sjfzb +.section sjf1a +.section sjf1b +.section sjf2a +.section sjf2b +.section sjf3a +.section sjf3b +.section sjf4a +.section sjf4b +.section sjf5a +.section sjf5b +.section sjf6a +.section sjf6b +.section sjf7a +.section sjf7b +.section sjf8a +.section sjf8b +.section sjf9a +.section sjf9b +.section sjf0a +.section sjf0b +.section sjgaa +.section sjgab +.section sjgba +.section sjgbb +.section sjgca +.section sjgcb +.section sjgda +.section sjgdb +.section sjgea +.section sjgeb +.section sjgfa +.section sjgfb +.section sjgga +.section sjggb +.section sjgha +.section sjghb +.section sjgia +.section sjgib +.section sjgja +.section sjgjb +.section sjgka +.section sjgkb +.section sjgla +.section sjglb +.section sjgma +.section sjgmb +.section sjgna +.section sjgnb +.section sjgoa +.section sjgob +.section sjgpa +.section sjgpb +.section sjgqa +.section sjgqb +.section sjgra +.section sjgrb +.section sjgsa +.section sjgsb +.section sjgta +.section sjgtb +.section sjgua +.section sjgub +.section sjgva +.section sjgvb +.section sjgwa +.section sjgwb +.section sjgxa +.section sjgxb +.section sjgya +.section sjgyb +.section sjgza +.section sjgzb +.section sjg1a +.section sjg1b +.section sjg2a +.section sjg2b +.section sjg3a +.section sjg3b +.section sjg4a +.section sjg4b +.section sjg5a +.section sjg5b +.section sjg6a +.section sjg6b +.section sjg7a +.section sjg7b +.section sjg8a +.section sjg8b +.section sjg9a +.section sjg9b +.section sjg0a +.section sjg0b +.section sjhaa +.section sjhab +.section sjhba +.section sjhbb +.section sjhca +.section sjhcb +.section sjhda +.section sjhdb +.section sjhea +.section sjheb +.section sjhfa +.section sjhfb +.section sjhga +.section sjhgb +.section sjhha +.section sjhhb +.section sjhia +.section sjhib +.section sjhja +.section sjhjb +.section sjhka +.section sjhkb +.section sjhla +.section sjhlb +.section sjhma +.section sjhmb +.section sjhna +.section sjhnb +.section sjhoa +.section sjhob +.section sjhpa +.section sjhpb +.section sjhqa +.section sjhqb +.section sjhra +.section sjhrb +.section sjhsa +.section sjhsb +.section sjhta +.section sjhtb +.section sjhua +.section sjhub +.section sjhva +.section sjhvb +.section sjhwa +.section sjhwb +.section sjhxa +.section sjhxb +.section sjhya +.section sjhyb +.section sjhza +.section sjhzb +.section sjh1a +.section sjh1b +.section sjh2a +.section sjh2b +.section sjh3a +.section sjh3b +.section sjh4a +.section sjh4b +.section sjh5a +.section sjh5b +.section sjh6a +.section sjh6b +.section sjh7a +.section sjh7b +.section sjh8a +.section sjh8b +.section sjh9a +.section sjh9b +.section sjh0a +.section sjh0b +.section sjiaa +.section sjiab +.section sjiba +.section sjibb +.section sjica +.section sjicb +.section sjida +.section sjidb +.section sjiea +.section sjieb +.section sjifa +.section sjifb +.section sjiga +.section sjigb +.section sjiha +.section sjihb +.section sjiia +.section sjiib +.section sjija +.section sjijb +.section sjika +.section sjikb +.section sjila +.section sjilb +.section sjima +.section sjimb +.section sjina +.section sjinb +.section sjioa +.section sjiob +.section sjipa +.section sjipb +.section sjiqa +.section sjiqb +.section sjira +.section sjirb +.section sjisa +.section sjisb +.section sjita +.section sjitb +.section sjiua +.section sjiub +.section sjiva +.section sjivb +.section sjiwa +.section sjiwb +.section sjixa +.section sjixb +.section sjiya +.section sjiyb +.section sjiza +.section sjizb +.section sji1a +.section sji1b +.section sji2a +.section sji2b +.section sji3a +.section sji3b +.section sji4a +.section sji4b +.section sji5a +.section sji5b +.section sji6a +.section sji6b +.section sji7a +.section sji7b +.section sji8a +.section sji8b +.section sji9a +.section sji9b +.section sji0a +.section sji0b +.section sjjaa +.section sjjab +.section sjjba +.section sjjbb +.section sjjca +.section sjjcb +.section sjjda +.section sjjdb +.section sjjea +.section sjjeb +.section sjjfa +.section sjjfb +.section sjjga +.section sjjgb +.section sjjha +.section sjjhb +.section sjjia +.section sjjib +.section sjjja +.section sjjjb +.section sjjka +.section sjjkb +.section sjjla +.section sjjlb +.section sjjma +.section sjjmb +.section sjjna +.section sjjnb +.section sjjoa +.section sjjob +.section sjjpa +.section sjjpb +.section sjjqa +.section sjjqb +.section sjjra +.section sjjrb +.section sjjsa +.section sjjsb +.section sjjta +.section sjjtb +.section sjjua +.section sjjub +.section sjjva +.section sjjvb +.section sjjwa +.section sjjwb +.section sjjxa +.section sjjxb +.section sjjya +.section sjjyb +.section sjjza +.section sjjzb +.section sjj1a +.section sjj1b +.section sjj2a +.section sjj2b +.section sjj3a +.section sjj3b +.section sjj4a +.section sjj4b +.section sjj5a +.section sjj5b +.section sjj6a +.section sjj6b +.section sjj7a +.section sjj7b +.section sjj8a +.section sjj8b +.section sjj9a +.section sjj9b +.section sjj0a +.section sjj0b +.section sjkaa +.section sjkab +.section sjkba +.section sjkbb +.section sjkca +.section sjkcb +.section sjkda +.section sjkdb +.section sjkea +.section sjkeb +.section sjkfa +.section sjkfb +.section sjkga +.section sjkgb +.section sjkha +.section sjkhb +.section sjkia +.section sjkib +.section sjkja +.section sjkjb +.section sjkka +.section sjkkb +.section sjkla +.section sjklb +.section sjkma +.section sjkmb +.section sjkna +.section sjknb +.section sjkoa +.section sjkob +.section sjkpa +.section sjkpb +.section sjkqa +.section sjkqb +.section sjkra +.section sjkrb +.section sjksa +.section sjksb +.section sjkta +.section sjktb +.section sjkua +.section sjkub +.section sjkva +.section sjkvb +.section sjkwa +.section sjkwb +.section sjkxa +.section sjkxb +.section sjkya +.section sjkyb +.section sjkza +.section sjkzb +.section sjk1a +.section sjk1b +.section sjk2a +.section sjk2b +.section sjk3a +.section sjk3b +.section sjk4a +.section sjk4b +.section sjk5a +.section sjk5b +.section sjk6a +.section sjk6b +.section sjk7a +.section sjk7b +.section sjk8a +.section sjk8b +.section sjk9a +.section sjk9b +.section sjk0a +.section sjk0b +.section sjlaa +.section sjlab +.section sjlba +.section sjlbb +.section sjlca +.section sjlcb +.section sjlda +.section sjldb +.section sjlea +.section sjleb +.section sjlfa +.section sjlfb +.section sjlga +.section sjlgb +.section sjlha +.section sjlhb +.section sjlia +.section sjlib +.section sjlja +.section sjljb +.section sjlka +.section sjlkb +.section sjlla +.section sjllb +.section sjlma +.section sjlmb +.section sjlna +.section sjlnb +.section sjloa +.section sjlob +.section sjlpa +.section sjlpb +.section sjlqa +.section sjlqb +.section sjlra +.section sjlrb +.section sjlsa +.section sjlsb +.section sjlta +.section sjltb +.section sjlua +.section sjlub +.section sjlva +.section sjlvb +.section sjlwa +.section sjlwb +.section sjlxa +.section sjlxb +.section sjlya +.section sjlyb +.section sjlza +.section sjlzb +.section sjl1a +.section sjl1b +.section sjl2a +.section sjl2b +.section sjl3a +.section sjl3b +.section sjl4a +.section sjl4b +.section sjl5a +.section sjl5b +.section sjl6a +.section sjl6b +.section sjl7a +.section sjl7b +.section sjl8a +.section sjl8b +.section sjl9a +.section sjl9b +.section sjl0a +.section sjl0b +.section sjmaa +.section sjmab +.section sjmba +.section sjmbb +.section sjmca +.section sjmcb +.section sjmda +.section sjmdb +.section sjmea +.section sjmeb +.section sjmfa +.section sjmfb +.section sjmga +.section sjmgb +.section sjmha +.section sjmhb +.section sjmia +.section sjmib +.section sjmja +.section sjmjb +.section sjmka +.section sjmkb +.section sjmla +.section sjmlb +.section sjmma +.section sjmmb +.section sjmna +.section sjmnb +.section sjmoa +.section sjmob +.section sjmpa +.section sjmpb +.section sjmqa +.section sjmqb +.section sjmra +.section sjmrb +.section sjmsa +.section sjmsb +.section sjmta +.section sjmtb +.section sjmua +.section sjmub +.section sjmva +.section sjmvb +.section sjmwa +.section sjmwb +.section sjmxa +.section sjmxb +.section sjmya +.section sjmyb +.section sjmza +.section sjmzb +.section sjm1a +.section sjm1b +.section sjm2a +.section sjm2b +.section sjm3a +.section sjm3b +.section sjm4a +.section sjm4b +.section sjm5a +.section sjm5b +.section sjm6a +.section sjm6b +.section sjm7a +.section sjm7b +.section sjm8a +.section sjm8b +.section sjm9a +.section sjm9b +.section sjm0a +.section sjm0b +.section sjnaa +.section sjnab +.section sjnba +.section sjnbb +.section sjnca +.section sjncb +.section sjnda +.section sjndb +.section sjnea +.section sjneb +.section sjnfa +.section sjnfb +.section sjnga +.section sjngb +.section sjnha +.section sjnhb +.section sjnia +.section sjnib +.section sjnja +.section sjnjb +.section sjnka +.section sjnkb +.section sjnla +.section sjnlb +.section sjnma +.section sjnmb +.section sjnna +.section sjnnb +.section sjnoa +.section sjnob +.section sjnpa +.section sjnpb +.section sjnqa +.section sjnqb +.section sjnra +.section sjnrb +.section sjnsa +.section sjnsb +.section sjnta +.section sjntb +.section sjnua +.section sjnub +.section sjnva +.section sjnvb +.section sjnwa +.section sjnwb +.section sjnxa +.section sjnxb +.section sjnya +.section sjnyb +.section sjnza +.section sjnzb +.section sjn1a +.section sjn1b +.section sjn2a +.section sjn2b +.section sjn3a +.section sjn3b +.section sjn4a +.section sjn4b +.section sjn5a +.section sjn5b +.section sjn6a +.section sjn6b +.section sjn7a +.section sjn7b +.section sjn8a +.section sjn8b +.section sjn9a +.section sjn9b +.section sjn0a +.section sjn0b +.section sjoaa +.section sjoab +.section sjoba +.section sjobb +.section sjoca +.section sjocb +.section sjoda +.section sjodb +.section sjoea +.section sjoeb +.section sjofa +.section sjofb +.section sjoga +.section sjogb +.section sjoha +.section sjohb +.section sjoia +.section sjoib +.section sjoja +.section sjojb +.section sjoka +.section sjokb +.section sjola +.section sjolb +.section sjoma +.section sjomb +.section sjona +.section sjonb +.section sjooa +.section sjoob +.section sjopa +.section sjopb +.section sjoqa +.section sjoqb +.section sjora +.section sjorb +.section sjosa +.section sjosb +.section sjota +.section sjotb +.section sjoua +.section sjoub +.section sjova +.section sjovb +.section sjowa +.section sjowb +.section sjoxa +.section sjoxb +.section sjoya +.section sjoyb +.section sjoza +.section sjozb +.section sjo1a +.section sjo1b +.section sjo2a +.section sjo2b +.section sjo3a +.section sjo3b +.section sjo4a +.section sjo4b +.section sjo5a +.section sjo5b +.section sjo6a +.section sjo6b +.section sjo7a +.section sjo7b +.section sjo8a +.section sjo8b +.section sjo9a +.section sjo9b +.section sjo0a +.section sjo0b +.section sjpaa +.section sjpab +.section sjpba +.section sjpbb +.section sjpca +.section sjpcb +.section sjpda +.section sjpdb +.section sjpea +.section sjpeb +.section sjpfa +.section sjpfb +.section sjpga +.section sjpgb +.section sjpha +.section sjphb +.section sjpia +.section sjpib +.section sjpja +.section sjpjb +.section sjpka +.section sjpkb +.section sjpla +.section sjplb +.section sjpma +.section sjpmb +.section sjpna +.section sjpnb +.section sjpoa +.section sjpob +.section sjppa +.section sjppb +.section sjpqa +.section sjpqb +.section sjpra +.section sjprb +.section sjpsa +.section sjpsb +.section sjpta +.section sjptb +.section sjpua +.section sjpub +.section sjpva +.section sjpvb +.section sjpwa +.section sjpwb +.section sjpxa +.section sjpxb +.section sjpya +.section sjpyb +.section sjpza +.section sjpzb +.section sjp1a +.section sjp1b +.section sjp2a +.section sjp2b +.section sjp3a +.section sjp3b +.section sjp4a +.section sjp4b +.section sjp5a +.section sjp5b +.section sjp6a +.section sjp6b +.section sjp7a +.section sjp7b +.section sjp8a +.section sjp8b +.section sjp9a +.section sjp9b +.section sjp0a +.section sjp0b +.section sjqaa +.section sjqab +.section sjqba +.section sjqbb +.section sjqca +.section sjqcb +.section sjqda +.section sjqdb +.section sjqea +.section sjqeb +.section sjqfa +.section sjqfb +.section sjqga +.section sjqgb +.section sjqha +.section sjqhb +.section sjqia +.section sjqib +.section sjqja +.section sjqjb +.section sjqka +.section sjqkb +.section sjqla +.section sjqlb +.section sjqma +.section sjqmb +.section sjqna +.section sjqnb +.section sjqoa +.section sjqob +.section sjqpa +.section sjqpb +.section sjqqa +.section sjqqb +.section sjqra +.section sjqrb +.section sjqsa +.section sjqsb +.section sjqta +.section sjqtb +.section sjqua +.section sjqub +.section sjqva +.section sjqvb +.section sjqwa +.section sjqwb +.section sjqxa +.section sjqxb +.section sjqya +.section sjqyb +.section sjqza +.section sjqzb +.section sjq1a +.section sjq1b +.section sjq2a +.section sjq2b +.section sjq3a +.section sjq3b +.section sjq4a +.section sjq4b +.section sjq5a +.section sjq5b +.section sjq6a +.section sjq6b +.section sjq7a +.section sjq7b +.section sjq8a +.section sjq8b +.section sjq9a +.section sjq9b +.section sjq0a +.section sjq0b +.section sjraa +.section sjrab +.section sjrba +.section sjrbb +.section sjrca +.section sjrcb +.section sjrda +.section sjrdb +.section sjrea +.section sjreb +.section sjrfa +.section sjrfb +.section sjrga +.section sjrgb +.section sjrha +.section sjrhb +.section sjria +.section sjrib +.section sjrja +.section sjrjb +.section sjrka +.section sjrkb +.section sjrla +.section sjrlb +.section sjrma +.section sjrmb +.section sjrna +.section sjrnb +.section sjroa +.section sjrob +.section sjrpa +.section sjrpb +.section sjrqa +.section sjrqb +.section sjrra +.section sjrrb +.section sjrsa +.section sjrsb +.section sjrta +.section sjrtb +.section sjrua +.section sjrub +.section sjrva +.section sjrvb +.section sjrwa +.section sjrwb +.section sjrxa +.section sjrxb +.section sjrya +.section sjryb +.section sjrza +.section sjrzb +.section sjr1a +.section sjr1b +.section sjr2a +.section sjr2b +.section sjr3a +.section sjr3b +.section sjr4a +.section sjr4b +.section sjr5a +.section sjr5b +.section sjr6a +.section sjr6b +.section sjr7a +.section sjr7b +.section sjr8a +.section sjr8b +.section sjr9a +.section sjr9b +.section sjr0a +.section sjr0b +.section sjsaa +.section sjsab +.section sjsba +.section sjsbb +.section sjsca +.section sjscb +.section sjsda +.section sjsdb +.section sjsea +.section sjseb +.section sjsfa +.section sjsfb +.section sjsga +.section sjsgb +.section sjsha +.section sjshb +.section sjsia +.section sjsib +.section sjsja +.section sjsjb +.section sjska +.section sjskb +.section sjsla +.section sjslb +.section sjsma +.section sjsmb +.section sjsna +.section sjsnb +.section sjsoa +.section sjsob +.section sjspa +.section sjspb +.section sjsqa +.section sjsqb +.section sjsra +.section sjsrb +.section sjssa +.section sjssb +.section sjsta +.section sjstb +.section sjsua +.section sjsub +.section sjsva +.section sjsvb +.section sjswa +.section sjswb +.section sjsxa +.section sjsxb +.section sjsya +.section sjsyb +.section sjsza +.section sjszb +.section sjs1a +.section sjs1b +.section sjs2a +.section sjs2b +.section sjs3a +.section sjs3b +.section sjs4a +.section sjs4b +.section sjs5a +.section sjs5b +.section sjs6a +.section sjs6b +.section sjs7a +.section sjs7b +.section sjs8a +.section sjs8b +.section sjs9a +.section sjs9b +.section sjs0a +.section sjs0b +.section sjtaa +.section sjtab +.section sjtba +.section sjtbb +.section sjtca +.section sjtcb +.section sjtda +.section sjtdb +.section sjtea +.section sjteb +.section sjtfa +.section sjtfb +.section sjtga +.section sjtgb +.section sjtha +.section sjthb +.section sjtia +.section sjtib +.section sjtja +.section sjtjb +.section sjtka +.section sjtkb +.section sjtla +.section sjtlb +.section sjtma +.section sjtmb +.section sjtna +.section sjtnb +.section sjtoa +.section sjtob +.section sjtpa +.section sjtpb +.section sjtqa +.section sjtqb +.section sjtra +.section sjtrb +.section sjtsa +.section sjtsb +.section sjtta +.section sjttb +.section sjtua +.section sjtub +.section sjtva +.section sjtvb +.section sjtwa +.section sjtwb +.section sjtxa +.section sjtxb +.section sjtya +.section sjtyb +.section sjtza +.section sjtzb +.section sjt1a +.section sjt1b +.section sjt2a +.section sjt2b +.section sjt3a +.section sjt3b +.section sjt4a +.section sjt4b +.section sjt5a +.section sjt5b +.section sjt6a +.section sjt6b +.section sjt7a +.section sjt7b +.section sjt8a +.section sjt8b +.section sjt9a +.section sjt9b +.section sjt0a +.section sjt0b +.section sjuaa +.section sjuab +.section sjuba +.section sjubb +.section sjuca +.section sjucb +.section sjuda +.section sjudb +.section sjuea +.section sjueb +.section sjufa +.section sjufb +.section sjuga +.section sjugb +.section sjuha +.section sjuhb +.section sjuia +.section sjuib +.section sjuja +.section sjujb +.section sjuka +.section sjukb +.section sjula +.section sjulb +.section sjuma +.section sjumb +.section sjuna +.section sjunb +.section sjuoa +.section sjuob +.section sjupa +.section sjupb +.section sjuqa +.section sjuqb +.section sjura +.section sjurb +.section sjusa +.section sjusb +.section sjuta +.section sjutb +.section sjuua +.section sjuub +.section sjuva +.section sjuvb +.section sjuwa +.section sjuwb +.section sjuxa +.section sjuxb +.section sjuya +.section sjuyb +.section sjuza +.section sjuzb +.section sju1a +.section sju1b +.section sju2a +.section sju2b +.section sju3a +.section sju3b +.section sju4a +.section sju4b +.section sju5a +.section sju5b +.section sju6a +.section sju6b +.section sju7a +.section sju7b +.section sju8a +.section sju8b +.section sju9a +.section sju9b +.section sju0a +.section sju0b +.section sjvaa +.section sjvab +.section sjvba +.section sjvbb +.section sjvca +.section sjvcb +.section sjvda +.section sjvdb +.section sjvea +.section sjveb +.section sjvfa +.section sjvfb +.section sjvga +.section sjvgb +.section sjvha +.section sjvhb +.section sjvia +.section sjvib +.section sjvja +.section sjvjb +.section sjvka +.section sjvkb +.section sjvla +.section sjvlb +.section sjvma +.section sjvmb +.section sjvna +.section sjvnb +.section sjvoa +.section sjvob +.section sjvpa +.section sjvpb +.section sjvqa +.section sjvqb +.section sjvra +.section sjvrb +.section sjvsa +.section sjvsb +.section sjvta +.section sjvtb +.section sjvua +.section sjvub +.section sjvva +.section sjvvb +.section sjvwa +.section sjvwb +.section sjvxa +.section sjvxb +.section sjvya +.section sjvyb +.section sjvza +.section sjvzb +.section sjv1a +.section sjv1b +.section sjv2a +.section sjv2b +.section sjv3a +.section sjv3b +.section sjv4a +.section sjv4b +.section sjv5a +.section sjv5b +.section sjv6a +.section sjv6b +.section sjv7a +.section sjv7b +.section sjv8a +.section sjv8b +.section sjv9a +.section sjv9b +.section sjv0a +.section sjv0b +.section sjwaa +.section sjwab +.section sjwba +.section sjwbb +.section sjwca +.section sjwcb +.section sjwda +.section sjwdb +.section sjwea +.section sjweb +.section sjwfa +.section sjwfb +.section sjwga +.section sjwgb +.section sjwha +.section sjwhb +.section sjwia +.section sjwib +.section sjwja +.section sjwjb +.section sjwka +.section sjwkb +.section sjwla +.section sjwlb +.section sjwma +.section sjwmb +.section sjwna +.section sjwnb +.section sjwoa +.section sjwob +.section sjwpa +.section sjwpb +.section sjwqa +.section sjwqb +.section sjwra +.section sjwrb +.section sjwsa +.section sjwsb +.section sjwta +.section sjwtb +.section sjwua +.section sjwub +.section sjwva +.section sjwvb +.section sjwwa +.section sjwwb +.section sjwxa +.section sjwxb +.section sjwya +.section sjwyb +.section sjwza +.section sjwzb +.section sjw1a +.section sjw1b +.section sjw2a +.section sjw2b +.section sjw3a +.section sjw3b +.section sjw4a +.section sjw4b +.section sjw5a +.section sjw5b +.section sjw6a +.section sjw6b +.section sjw7a +.section sjw7b +.section sjw8a +.section sjw8b +.section sjw9a +.section sjw9b +.section sjw0a +.section sjw0b +.section sjxaa +.section sjxab +.section sjxba +.section sjxbb +.section sjxca +.section sjxcb +.section sjxda +.section sjxdb +.section sjxea +.section sjxeb +.section sjxfa +.section sjxfb +.section sjxga +.section sjxgb +.section sjxha +.section sjxhb +.section sjxia +.section sjxib +.section sjxja +.section sjxjb +.section sjxka +.section sjxkb +.section sjxla +.section sjxlb +.section sjxma +.section sjxmb +.section sjxna +.section sjxnb +.section sjxoa +.section sjxob +.section sjxpa +.section sjxpb +.section sjxqa +.section sjxqb +.section sjxra +.section sjxrb +.section sjxsa +.section sjxsb +.section sjxta +.section sjxtb +.section sjxua +.section sjxub +.section sjxva +.section sjxvb +.section sjxwa +.section sjxwb +.section sjxxa +.section sjxxb +.section sjxya +.section sjxyb +.section sjxza +.section sjxzb +.section sjx1a +.section sjx1b +.section sjx2a +.section sjx2b +.section sjx3a +.section sjx3b +.section sjx4a +.section sjx4b +.section sjx5a +.section sjx5b +.section sjx6a +.section sjx6b +.section sjx7a +.section sjx7b +.section sjx8a +.section sjx8b +.section sjx9a +.section sjx9b +.section sjx0a +.section sjx0b +.section sjyaa +.section sjyab +.section sjyba +.section sjybb +.section sjyca +.section sjycb +.section sjyda +.section sjydb +.section sjyea +.section sjyeb +.section sjyfa +.section sjyfb +.section sjyga +.section sjygb +.section sjyha +.section sjyhb +.section sjyia +.section sjyib +.section sjyja +.section sjyjb +.section sjyka +.section sjykb +.section sjyla +.section sjylb +.section sjyma +.section sjymb +.section sjyna +.section sjynb +.section sjyoa +.section sjyob +.section sjypa +.section sjypb +.section sjyqa +.section sjyqb +.section sjyra +.section sjyrb +.section sjysa +.section sjysb +.section sjyta +.section sjytb +.section sjyua +.section sjyub +.section sjyva +.section sjyvb +.section sjywa +.section sjywb +.section sjyxa +.section sjyxb +.section sjyya +.section sjyyb +.section sjyza +.section sjyzb +.section sjy1a +.section sjy1b +.section sjy2a +.section sjy2b +.section sjy3a +.section sjy3b +.section sjy4a +.section sjy4b +.section sjy5a +.section sjy5b +.section sjy6a +.section sjy6b +.section sjy7a +.section sjy7b +.section sjy8a +.section sjy8b +.section sjy9a +.section sjy9b +.section sjy0a +.section sjy0b +.section sjzaa +.section sjzab +.section sjzba +.section sjzbb +.section sjzca +.section sjzcb +.section sjzda +.section sjzdb +.section sjzea +.section sjzeb +.section sjzfa +.section sjzfb +.section sjzga +.section sjzgb +.section sjzha +.section sjzhb +.section sjzia +.section sjzib +.section sjzja +.section sjzjb +.section sjzka +.section sjzkb +.section sjzla +.section sjzlb +.section sjzma +.section sjzmb +.section sjzna +.section sjznb +.section sjzoa +.section sjzob +.section sjzpa +.section sjzpb +.section sjzqa +.section sjzqb +.section sjzra +.section sjzrb +.section sjzsa +.section sjzsb +.section sjzta +.section sjztb +.section sjzua +.section sjzub +.section sjzva +.section sjzvb +.section sjzwa +.section sjzwb +.section sjzxa +.section sjzxb +.section sjzya +.section sjzyb +.section sjzza +.section sjzzb +.section sjz1a +.section sjz1b +.section sjz2a +.section sjz2b +.section sjz3a +.section sjz3b +.section sjz4a +.section sjz4b +.section sjz5a +.section sjz5b +.section sjz6a +.section sjz6b +.section sjz7a +.section sjz7b +.section sjz8a +.section sjz8b +.section sjz9a +.section sjz9b +.section sjz0a +.section sjz0b +.section sj1aa +.section sj1ab +.section sj1ba +.section sj1bb +.section sj1ca +.section sj1cb +.section sj1da +.section sj1db +.section sj1ea +.section sj1eb +.section sj1fa +.section sj1fb +.section sj1ga +.section sj1gb +.section sj1ha +.section sj1hb +.section sj1ia +.section sj1ib +.section sj1ja +.section sj1jb +.section sj1ka +.section sj1kb +.section sj1la +.section sj1lb +.section sj1ma +.section sj1mb +.section sj1na +.section sj1nb +.section sj1oa +.section sj1ob +.section sj1pa +.section sj1pb +.section sj1qa +.section sj1qb +.section sj1ra +.section sj1rb +.section sj1sa +.section sj1sb +.section sj1ta +.section sj1tb +.section sj1ua +.section sj1ub +.section sj1va +.section sj1vb +.section sj1wa +.section sj1wb +.section sj1xa +.section sj1xb +.section sj1ya +.section sj1yb +.section sj1za +.section sj1zb +.section sj11a +.section sj11b +.section sj12a +.section sj12b +.section sj13a +.section sj13b +.section sj14a +.section sj14b +.section sj15a +.section sj15b +.section sj16a +.section sj16b +.section sj17a +.section sj17b +.section sj18a +.section sj18b +.section sj19a +.section sj19b +.section sj10a +.section sj10b +.section sj2aa +.section sj2ab +.section sj2ba +.section sj2bb +.section sj2ca +.section sj2cb +.section sj2da +.section sj2db +.section sj2ea +.section sj2eb +.section sj2fa +.section sj2fb +.section sj2ga +.section sj2gb +.section sj2ha +.section sj2hb +.section sj2ia +.section sj2ib +.section sj2ja +.section sj2jb +.section sj2ka +.section sj2kb +.section sj2la +.section sj2lb +.section sj2ma +.section sj2mb +.section sj2na +.section sj2nb +.section sj2oa +.section sj2ob +.section sj2pa +.section sj2pb +.section sj2qa +.section sj2qb +.section sj2ra +.section sj2rb +.section sj2sa +.section sj2sb +.section sj2ta +.section sj2tb +.section sj2ua +.section sj2ub +.section sj2va +.section sj2vb +.section sj2wa +.section sj2wb +.section sj2xa +.section sj2xb +.section sj2ya +.section sj2yb +.section sj2za +.section sj2zb +.section sj21a +.section sj21b +.section sj22a +.section sj22b +.section sj23a +.section sj23b +.section sj24a +.section sj24b +.section sj25a +.section sj25b +.section sj26a +.section sj26b +.section sj27a +.section sj27b +.section sj28a +.section sj28b +.section sj29a +.section sj29b +.section sj20a +.section sj20b +.section sj3aa +.section sj3ab +.section sj3ba +.section sj3bb +.section sj3ca +.section sj3cb +.section sj3da +.section sj3db +.section sj3ea +.section sj3eb +.section sj3fa +.section sj3fb +.section sj3ga +.section sj3gb +.section sj3ha +.section sj3hb +.section sj3ia +.section sj3ib +.section sj3ja +.section sj3jb +.section sj3ka +.section sj3kb +.section sj3la +.section sj3lb +.section sj3ma +.section sj3mb +.section sj3na +.section sj3nb +.section sj3oa +.section sj3ob +.section sj3pa +.section sj3pb +.section sj3qa +.section sj3qb +.section sj3ra +.section sj3rb +.section sj3sa +.section sj3sb +.section sj3ta +.section sj3tb +.section sj3ua +.section sj3ub +.section sj3va +.section sj3vb +.section sj3wa +.section sj3wb +.section sj3xa +.section sj3xb +.section sj3ya +.section sj3yb +.section sj3za +.section sj3zb +.section sj31a +.section sj31b +.section sj32a +.section sj32b +.section sj33a +.section sj33b +.section sj34a +.section sj34b +.section sj35a +.section sj35b +.section sj36a +.section sj36b +.section sj37a +.section sj37b +.section sj38a +.section sj38b +.section sj39a +.section sj39b +.section sj30a +.section sj30b +.section sj4aa +.section sj4ab +.section sj4ba +.section sj4bb +.section sj4ca +.section sj4cb +.section sj4da +.section sj4db +.section sj4ea +.section sj4eb +.section sj4fa +.section sj4fb +.section sj4ga +.section sj4gb +.section sj4ha +.section sj4hb +.section sj4ia +.section sj4ib +.section sj4ja +.section sj4jb +.section sj4ka +.section sj4kb +.section sj4la +.section sj4lb +.section sj4ma +.section sj4mb +.section sj4na +.section sj4nb +.section sj4oa +.section sj4ob +.section sj4pa +.section sj4pb +.section sj4qa +.section sj4qb +.section sj4ra +.section sj4rb +.section sj4sa +.section sj4sb +.section sj4ta +.section sj4tb +.section sj4ua +.section sj4ub +.section sj4va +.section sj4vb +.section sj4wa +.section sj4wb +.section sj4xa +.section sj4xb +.section sj4ya +.section sj4yb +.section sj4za +.section sj4zb +.section sj41a +.section sj41b +.section sj42a +.section sj42b +.section sj43a +.section sj43b +.section sj44a +.section sj44b +.section sj45a +.section sj45b +.section sj46a +.section sj46b +.section sj47a +.section sj47b +.section sj48a +.section sj48b +.section sj49a +.section sj49b +.section sj40a +.section sj40b +.section sj5aa +.section sj5ab +.section sj5ba +.section sj5bb +.section sj5ca +.section sj5cb +.section sj5da +.section sj5db +.section sj5ea +.section sj5eb +.section sj5fa +.section sj5fb +.section sj5ga +.section sj5gb +.section sj5ha +.section sj5hb +.section sj5ia +.section sj5ib +.section sj5ja +.section sj5jb +.section sj5ka +.section sj5kb +.section sj5la +.section sj5lb +.section sj5ma +.section sj5mb +.section sj5na +.section sj5nb +.section sj5oa +.section sj5ob +.section sj5pa +.section sj5pb +.section sj5qa +.section sj5qb +.section sj5ra +.section sj5rb +.section sj5sa +.section sj5sb +.section sj5ta +.section sj5tb +.section sj5ua +.section sj5ub +.section sj5va +.section sj5vb +.section sj5wa +.section sj5wb +.section sj5xa +.section sj5xb +.section sj5ya +.section sj5yb +.section sj5za +.section sj5zb +.section sj51a +.section sj51b +.section sj52a +.section sj52b +.section sj53a +.section sj53b +.section sj54a +.section sj54b +.section sj55a +.section sj55b +.section sj56a +.section sj56b +.section sj57a +.section sj57b +.section sj58a +.section sj58b +.section sj59a +.section sj59b +.section sj50a +.section sj50b +.section sj6aa +.section sj6ab +.section sj6ba +.section sj6bb +.section sj6ca +.section sj6cb +.section sj6da +.section sj6db +.section sj6ea +.section sj6eb +.section sj6fa +.section sj6fb +.section sj6ga +.section sj6gb +.section sj6ha +.section sj6hb +.section sj6ia +.section sj6ib +.section sj6ja +.section sj6jb +.section sj6ka +.section sj6kb +.section sj6la +.section sj6lb +.section sj6ma +.section sj6mb +.section sj6na +.section sj6nb +.section sj6oa +.section sj6ob +.section sj6pa +.section sj6pb +.section sj6qa +.section sj6qb +.section sj6ra +.section sj6rb +.section sj6sa +.section sj6sb +.section sj6ta +.section sj6tb +.section sj6ua +.section sj6ub +.section sj6va +.section sj6vb +.section sj6wa +.section sj6wb +.section sj6xa +.section sj6xb +.section sj6ya +.section sj6yb +.section sj6za +.section sj6zb +.section sj61a +.section sj61b +.section sj62a +.section sj62b +.section sj63a +.section sj63b +.section sj64a +.section sj64b +.section sj65a +.section sj65b +.section sj66a +.section sj66b +.section sj67a +.section sj67b +.section sj68a +.section sj68b +.section sj69a +.section sj69b +.section sj60a +.section sj60b +.section sj7aa +.section sj7ab +.section sj7ba +.section sj7bb +.section sj7ca +.section sj7cb +.section sj7da +.section sj7db +.section sj7ea +.section sj7eb +.section sj7fa +.section sj7fb +.section sj7ga +.section sj7gb +.section sj7ha +.section sj7hb +.section sj7ia +.section sj7ib +.section sj7ja +.section sj7jb +.section sj7ka +.section sj7kb +.section sj7la +.section sj7lb +.section sj7ma +.section sj7mb +.section sj7na +.section sj7nb +.section sj7oa +.section sj7ob +.section sj7pa +.section sj7pb +.section sj7qa +.section sj7qb +.section sj7ra +.section sj7rb +.section sj7sa +.section sj7sb +.section sj7ta +.section sj7tb +.section sj7ua +.section sj7ub +.section sj7va +.section sj7vb +.section sj7wa +.section sj7wb +.section sj7xa +.section sj7xb +.section sj7ya +.section sj7yb +.section sj7za +.section sj7zb +.section sj71a +.section sj71b +.section sj72a +.section sj72b +.section sj73a +.section sj73b +.section sj74a +.section sj74b +.section sj75a +.section sj75b +.section sj76a +.section sj76b +.section sj77a +.section sj77b +.section sj78a +.section sj78b +.section sj79a +.section sj79b +.section sj70a +.section sj70b +.section sj8aa +.section sj8ab +.section sj8ba +.section sj8bb +.section sj8ca +.section sj8cb +.section sj8da +.section sj8db +.section sj8ea +.section sj8eb +.section sj8fa +.section sj8fb +.section sj8ga +.section sj8gb +.section sj8ha +.section sj8hb +.section sj8ia +.section sj8ib +.section sj8ja +.section sj8jb +.section sj8ka +.section sj8kb +.section sj8la +.section sj8lb +.section sj8ma +.section sj8mb +.section sj8na +.section sj8nb +.section sj8oa +.section sj8ob +.section sj8pa +.section sj8pb +.section sj8qa +.section sj8qb +.section sj8ra +.section sj8rb +.section sj8sa +.section sj8sb +.section sj8ta +.section sj8tb +.section sj8ua +.section sj8ub +.section sj8va +.section sj8vb +.section sj8wa +.section sj8wb +.section sj8xa +.section sj8xb +.section sj8ya +.section sj8yb +.section sj8za +.section sj8zb +.section sj81a +.section sj81b +.section sj82a +.section sj82b +.section sj83a +.section sj83b +.section sj84a +.section sj84b +.section sj85a +.section sj85b +.section sj86a +.section sj86b +.section sj87a +.section sj87b +.section sj88a +.section sj88b +.section sj89a +.section sj89b +.section sj80a +.section sj80b +.section sj9aa +.section sj9ab +.section sj9ba +.section sj9bb +.section sj9ca +.section sj9cb +.section sj9da +.section sj9db +.section sj9ea +.section sj9eb +.section sj9fa +.section sj9fb +.section sj9ga +.section sj9gb +.section sj9ha +.section sj9hb +.section sj9ia +.section sj9ib +.section sj9ja +.section sj9jb +.section sj9ka +.section sj9kb +.section sj9la +.section sj9lb +.section sj9ma +.section sj9mb +.section sj9na +.section sj9nb +.section sj9oa +.section sj9ob +.section sj9pa +.section sj9pb +.section sj9qa +.section sj9qb +.section sj9ra +.section sj9rb +.section sj9sa +.section sj9sb +.section sj9ta +.section sj9tb +.section sj9ua +.section sj9ub +.section sj9va +.section sj9vb +.section sj9wa +.section sj9wb +.section sj9xa +.section sj9xb +.section sj9ya +.section sj9yb +.section sj9za +.section sj9zb +.section sj91a +.section sj91b +.section sj92a +.section sj92b +.section sj93a +.section sj93b +.section sj94a +.section sj94b +.section sj95a +.section sj95b +.section sj96a +.section sj96b +.section sj97a +.section sj97b +.section sj98a +.section sj98b +.section sj99a +.section sj99b +.section sj90a +.section sj90b +.section sj0aa +.section sj0ab +.section sj0ba +.section sj0bb +.section sj0ca +.section sj0cb +.section sj0da +.section sj0db +.section sj0ea +.section sj0eb +.section sj0fa +.section sj0fb +.section sj0ga +.section sj0gb +.section sj0ha +.section sj0hb +.section sj0ia +.section sj0ib +.section sj0ja +.section sj0jb +.section sj0ka +.section sj0kb +.section sj0la +.section sj0lb +.section sj0ma +.section sj0mb +.section sj0na +.section sj0nb +.section sj0oa +.section sj0ob +.section sj0pa +.section sj0pb +.section sj0qa +.section sj0qb +.section sj0ra +.section sj0rb +.section sj0sa +.section sj0sb +.section sj0ta +.section sj0tb +.section sj0ua +.section sj0ub +.section sj0va +.section sj0vb +.section sj0wa +.section sj0wb +.section sj0xa +.section sj0xb +.section sj0ya +.section sj0yb +.section sj0za +.section sj0zb +.section sj01a +.section sj01b +.section sj02a +.section sj02b +.section sj03a +.section sj03b +.section sj04a +.section sj04b +.section sj05a +.section sj05b +.section sj06a +.section sj06b +.section sj07a +.section sj07b +.section sj08a +.section sj08b +.section sj09a +.section sj09b +.section sj00a +.section sj00b +.section skaaa +.section skaab +.section skaba +.section skabb +.section skaca +.section skacb +.section skada +.section skadb +.section skaea +.section skaeb +.section skafa +.section skafb +.section skaga +.section skagb +.section skaha +.section skahb +.section skaia +.section skaib +.section skaja +.section skajb +.section skaka +.section skakb +.section skala +.section skalb +.section skama +.section skamb +.section skana +.section skanb +.section skaoa +.section skaob +.section skapa +.section skapb +.section skaqa +.section skaqb +.section skara +.section skarb +.section skasa +.section skasb +.section skata +.section skatb +.section skaua +.section skaub +.section skava +.section skavb +.section skawa +.section skawb +.section skaxa +.section skaxb +.section skaya +.section skayb +.section skaza +.section skazb +.section ska1a +.section ska1b +.section ska2a +.section ska2b +.section ska3a +.section ska3b +.section ska4a +.section ska4b +.section ska5a +.section ska5b +.section ska6a +.section ska6b +.section ska7a +.section ska7b +.section ska8a +.section ska8b +.section ska9a +.section ska9b +.section ska0a +.section ska0b +.section skbaa +.section skbab +.section skbba +.section skbbb +.section skbca +.section skbcb +.section skbda +.section skbdb +.section skbea +.section skbeb +.section skbfa +.section skbfb +.section skbga +.section skbgb +.section skbha +.section skbhb +.section skbia +.section skbib +.section skbja +.section skbjb +.section skbka +.section skbkb +.section skbla +.section skblb +.section skbma +.section skbmb +.section skbna +.section skbnb +.section skboa +.section skbob +.section skbpa +.section skbpb +.section skbqa +.section skbqb +.section skbra +.section skbrb +.section skbsa +.section skbsb +.section skbta +.section skbtb +.section skbua +.section skbub +.section skbva +.section skbvb +.section skbwa +.section skbwb +.section skbxa +.section skbxb +.section skbya +.section skbyb +.section skbza +.section skbzb +.section skb1a +.section skb1b +.section skb2a +.section skb2b +.section skb3a +.section skb3b +.section skb4a +.section skb4b +.section skb5a +.section skb5b +.section skb6a +.section skb6b +.section skb7a +.section skb7b +.section skb8a +.section skb8b +.section skb9a +.section skb9b +.section skb0a +.section skb0b +.section skcaa +.section skcab +.section skcba +.section skcbb +.section skcca +.section skccb +.section skcda +.section skcdb +.section skcea +.section skceb +.section skcfa +.section skcfb +.section skcga +.section skcgb +.section skcha +.section skchb +.section skcia +.section skcib +.section skcja +.section skcjb +.section skcka +.section skckb +.section skcla +.section skclb +.section skcma +.section skcmb +.section skcna +.section skcnb +.section skcoa +.section skcob +.section skcpa +.section skcpb +.section skcqa +.section skcqb +.section skcra +.section skcrb +.section skcsa +.section skcsb +.section skcta +.section skctb +.section skcua +.section skcub +.section skcva +.section skcvb +.section skcwa +.section skcwb +.section skcxa +.section skcxb +.section skcya +.section skcyb +.section skcza +.section skczb +.section skc1a +.section skc1b +.section skc2a +.section skc2b +.section skc3a +.section skc3b +.section skc4a +.section skc4b +.section skc5a +.section skc5b +.section skc6a +.section skc6b +.section skc7a +.section skc7b +.section skc8a +.section skc8b +.section skc9a +.section skc9b +.section skc0a +.section skc0b +.section skdaa +.section skdab +.section skdba +.section skdbb +.section skdca +.section skdcb +.section skdda +.section skddb +.section skdea +.section skdeb +.section skdfa +.section skdfb +.section skdga +.section skdgb +.section skdha +.section skdhb +.section skdia +.section skdib +.section skdja +.section skdjb +.section skdka +.section skdkb +.section skdla +.section skdlb +.section skdma +.section skdmb +.section skdna +.section skdnb +.section skdoa +.section skdob +.section skdpa +.section skdpb +.section skdqa +.section skdqb +.section skdra +.section skdrb +.section skdsa +.section skdsb +.section skdta +.section skdtb +.section skdua +.section skdub +.section skdva +.section skdvb +.section skdwa +.section skdwb +.section skdxa +.section skdxb +.section skdya +.section skdyb +.section skdza +.section skdzb +.section skd1a +.section skd1b +.section skd2a +.section skd2b +.section skd3a +.section skd3b +.section skd4a +.section skd4b +.section skd5a +.section skd5b +.section skd6a +.section skd6b +.section skd7a +.section skd7b +.section skd8a +.section skd8b +.section skd9a +.section skd9b +.section skd0a +.section skd0b +.section skeaa +.section skeab +.section skeba +.section skebb +.section skeca +.section skecb +.section skeda +.section skedb +.section skeea +.section skeeb +.section skefa +.section skefb +.section skega +.section skegb +.section skeha +.section skehb +.section skeia +.section skeib +.section skeja +.section skejb +.section skeka +.section skekb +.section skela +.section skelb +.section skema +.section skemb +.section skena +.section skenb +.section skeoa +.section skeob +.section skepa +.section skepb +.section skeqa +.section skeqb +.section skera +.section skerb +.section skesa +.section skesb +.section sketa +.section sketb +.section skeua +.section skeub +.section skeva +.section skevb +.section skewa +.section skewb +.section skexa +.section skexb +.section skeya +.section skeyb +.section skeza +.section skezb +.section ske1a +.section ske1b +.section ske2a +.section ske2b +.section ske3a +.section ske3b +.section ske4a +.section ske4b +.section ske5a +.section ske5b +.section ske6a +.section ske6b +.section ske7a +.section ske7b +.section ske8a +.section ske8b +.section ske9a +.section ske9b +.section ske0a +.section ske0b +.section skfaa +.section skfab +.section skfba +.section skfbb +.section skfca +.section skfcb +.section skfda +.section skfdb +.section skfea +.section skfeb +.section skffa +.section skffb +.section skfga +.section skfgb +.section skfha +.section skfhb +.section skfia +.section skfib +.section skfja +.section skfjb +.section skfka +.section skfkb +.section skfla +.section skflb +.section skfma +.section skfmb +.section skfna +.section skfnb +.section skfoa +.section skfob +.section skfpa +.section skfpb +.section skfqa +.section skfqb +.section skfra +.section skfrb +.section skfsa +.section skfsb +.section skfta +.section skftb +.section skfua +.section skfub +.section skfva +.section skfvb +.section skfwa +.section skfwb +.section skfxa +.section skfxb +.section skfya +.section skfyb +.section skfza +.section skfzb +.section skf1a +.section skf1b +.section skf2a +.section skf2b +.section skf3a +.section skf3b +.section skf4a +.section skf4b +.section skf5a +.section skf5b +.section skf6a +.section skf6b +.section skf7a +.section skf7b +.section skf8a +.section skf8b +.section skf9a +.section skf9b +.section skf0a +.section skf0b +.section skgaa +.section skgab +.section skgba +.section skgbb +.section skgca +.section skgcb +.section skgda +.section skgdb +.section skgea +.section skgeb +.section skgfa +.section skgfb +.section skgga +.section skggb +.section skgha +.section skghb +.section skgia +.section skgib +.section skgja +.section skgjb +.section skgka +.section skgkb +.section skgla +.section skglb +.section skgma +.section skgmb +.section skgna +.section skgnb +.section skgoa +.section skgob +.section skgpa +.section skgpb +.section skgqa +.section skgqb +.section skgra +.section skgrb +.section skgsa +.section skgsb +.section skgta +.section skgtb +.section skgua +.section skgub +.section skgva +.section skgvb +.section skgwa +.section skgwb +.section skgxa +.section skgxb +.section skgya +.section skgyb +.section skgza +.section skgzb +.section skg1a +.section skg1b +.section skg2a +.section skg2b +.section skg3a +.section skg3b +.section skg4a +.section skg4b +.section skg5a +.section skg5b +.section skg6a +.section skg6b +.section skg7a +.section skg7b +.section skg8a +.section skg8b +.section skg9a +.section skg9b +.section skg0a +.section skg0b +.section skhaa +.section skhab +.section skhba +.section skhbb +.section skhca +.section skhcb +.section skhda +.section skhdb +.section skhea +.section skheb +.section skhfa +.section skhfb +.section skhga +.section skhgb +.section skhha +.section skhhb +.section skhia +.section skhib +.section skhja +.section skhjb +.section skhka +.section skhkb +.section skhla +.section skhlb +.section skhma +.section skhmb +.section skhna +.section skhnb +.section skhoa +.section skhob +.section skhpa +.section skhpb +.section skhqa +.section skhqb +.section skhra +.section skhrb +.section skhsa +.section skhsb +.section skhta +.section skhtb +.section skhua +.section skhub +.section skhva +.section skhvb +.section skhwa +.section skhwb +.section skhxa +.section skhxb +.section skhya +.section skhyb +.section skhza +.section skhzb +.section skh1a +.section skh1b +.section skh2a +.section skh2b +.section skh3a +.section skh3b +.section skh4a +.section skh4b +.section skh5a +.section skh5b +.section skh6a +.section skh6b +.section skh7a +.section skh7b +.section skh8a +.section skh8b +.section skh9a +.section skh9b +.section skh0a +.section skh0b +.section skiaa +.section skiab +.section skiba +.section skibb +.section skica +.section skicb +.section skida +.section skidb +.section skiea +.section skieb +.section skifa +.section skifb +.section skiga +.section skigb +.section skiha +.section skihb +.section skiia +.section skiib +.section skija +.section skijb +.section skika +.section skikb +.section skila +.section skilb +.section skima +.section skimb +.section skina +.section skinb +.section skioa +.section skiob +.section skipa +.section skipb +.section skiqa +.section skiqb +.section skira +.section skirb +.section skisa +.section skisb +.section skita +.section skitb +.section skiua +.section skiub +.section skiva +.section skivb +.section skiwa +.section skiwb +.section skixa +.section skixb +.section skiya +.section skiyb +.section skiza +.section skizb +.section ski1a +.section ski1b +.section ski2a +.section ski2b +.section ski3a +.section ski3b +.section ski4a +.section ski4b +.section ski5a +.section ski5b +.section ski6a +.section ski6b +.section ski7a +.section ski7b +.section ski8a +.section ski8b +.section ski9a +.section ski9b +.section ski0a +.section ski0b +.section skjaa +.section skjab +.section skjba +.section skjbb +.section skjca +.section skjcb +.section skjda +.section skjdb +.section skjea +.section skjeb +.section skjfa +.section skjfb +.section skjga +.section skjgb +.section skjha +.section skjhb +.section skjia +.section skjib +.section skjja +.section skjjb +.section skjka +.section skjkb +.section skjla +.section skjlb +.section skjma +.section skjmb +.section skjna +.section skjnb +.section skjoa +.section skjob +.section skjpa +.section skjpb +.section skjqa +.section skjqb +.section skjra +.section skjrb +.section skjsa +.section skjsb +.section skjta +.section skjtb +.section skjua +.section skjub +.section skjva +.section skjvb +.section skjwa +.section skjwb +.section skjxa +.section skjxb +.section skjya +.section skjyb +.section skjza +.section skjzb +.section skj1a +.section skj1b +.section skj2a +.section skj2b +.section skj3a +.section skj3b +.section skj4a +.section skj4b +.section skj5a +.section skj5b +.section skj6a +.section skj6b +.section skj7a +.section skj7b +.section skj8a +.section skj8b +.section skj9a +.section skj9b +.section skj0a +.section skj0b +.section skkaa +.section skkab +.section skkba +.section skkbb +.section skkca +.section skkcb +.section skkda +.section skkdb +.section skkea +.section skkeb +.section skkfa +.section skkfb +.section skkga +.section skkgb +.section skkha +.section skkhb +.section skkia +.section skkib +.section skkja +.section skkjb +.section skkka +.section skkkb +.section skkla +.section skklb +.section skkma +.section skkmb +.section skkna +.section skknb +.section skkoa +.section skkob +.section skkpa +.section skkpb +.section skkqa +.section skkqb +.section skkra +.section skkrb +.section skksa +.section skksb +.section skkta +.section skktb +.section skkua +.section skkub +.section skkva +.section skkvb +.section skkwa +.section skkwb +.section skkxa +.section skkxb +.section skkya +.section skkyb +.section skkza +.section skkzb +.section skk1a +.section skk1b +.section skk2a +.section skk2b +.section skk3a +.section skk3b +.section skk4a +.section skk4b +.section skk5a +.section skk5b +.section skk6a +.section skk6b +.section skk7a +.section skk7b +.section skk8a +.section skk8b +.section skk9a +.section skk9b +.section skk0a +.section skk0b +.section sklaa +.section sklab +.section sklba +.section sklbb +.section sklca +.section sklcb +.section sklda +.section skldb +.section sklea +.section skleb +.section sklfa +.section sklfb +.section sklga +.section sklgb +.section sklha +.section sklhb +.section sklia +.section sklib +.section sklja +.section skljb +.section sklka +.section sklkb +.section sklla +.section skllb +.section sklma +.section sklmb +.section sklna +.section sklnb +.section skloa +.section sklob +.section sklpa +.section sklpb +.section sklqa +.section sklqb +.section sklra +.section sklrb +.section sklsa +.section sklsb +.section sklta +.section skltb +.section sklua +.section sklub +.section sklva +.section sklvb +.section sklwa +.section sklwb +.section sklxa +.section sklxb +.section sklya +.section sklyb +.section sklza +.section sklzb +.section skl1a +.section skl1b +.section skl2a +.section skl2b +.section skl3a +.section skl3b +.section skl4a +.section skl4b +.section skl5a +.section skl5b +.section skl6a +.section skl6b +.section skl7a +.section skl7b +.section skl8a +.section skl8b +.section skl9a +.section skl9b +.section skl0a +.section skl0b +.section skmaa +.section skmab +.section skmba +.section skmbb +.section skmca +.section skmcb +.section skmda +.section skmdb +.section skmea +.section skmeb +.section skmfa +.section skmfb +.section skmga +.section skmgb +.section skmha +.section skmhb +.section skmia +.section skmib +.section skmja +.section skmjb +.section skmka +.section skmkb +.section skmla +.section skmlb +.section skmma +.section skmmb +.section skmna +.section skmnb +.section skmoa +.section skmob +.section skmpa +.section skmpb +.section skmqa +.section skmqb +.section skmra +.section skmrb +.section skmsa +.section skmsb +.section skmta +.section skmtb +.section skmua +.section skmub +.section skmva +.section skmvb +.section skmwa +.section skmwb +.section skmxa +.section skmxb +.section skmya +.section skmyb +.section skmza +.section skmzb +.section skm1a +.section skm1b +.section skm2a +.section skm2b +.section skm3a +.section skm3b +.section skm4a +.section skm4b +.section skm5a +.section skm5b +.section skm6a +.section skm6b +.section skm7a +.section skm7b +.section skm8a +.section skm8b +.section skm9a +.section skm9b +.section skm0a +.section skm0b +.section sknaa +.section sknab +.section sknba +.section sknbb +.section sknca +.section skncb +.section sknda +.section skndb +.section sknea +.section skneb +.section sknfa +.section sknfb +.section sknga +.section skngb +.section sknha +.section sknhb +.section sknia +.section sknib +.section sknja +.section sknjb +.section sknka +.section sknkb +.section sknla +.section sknlb +.section sknma +.section sknmb +.section sknna +.section sknnb +.section sknoa +.section sknob +.section sknpa +.section sknpb +.section sknqa +.section sknqb +.section sknra +.section sknrb +.section sknsa +.section sknsb +.section sknta +.section skntb +.section sknua +.section sknub +.section sknva +.section sknvb +.section sknwa +.section sknwb +.section sknxa +.section sknxb +.section sknya +.section sknyb +.section sknza +.section sknzb +.section skn1a +.section skn1b +.section skn2a +.section skn2b +.section skn3a +.section skn3b +.section skn4a +.section skn4b +.section skn5a +.section skn5b +.section skn6a +.section skn6b +.section skn7a +.section skn7b +.section skn8a +.section skn8b +.section skn9a +.section skn9b +.section skn0a +.section skn0b +.section skoaa +.section skoab +.section skoba +.section skobb +.section skoca +.section skocb +.section skoda +.section skodb +.section skoea +.section skoeb +.section skofa +.section skofb +.section skoga +.section skogb +.section skoha +.section skohb +.section skoia +.section skoib +.section skoja +.section skojb +.section skoka +.section skokb +.section skola +.section skolb +.section skoma +.section skomb +.section skona +.section skonb +.section skooa +.section skoob +.section skopa +.section skopb +.section skoqa +.section skoqb +.section skora +.section skorb +.section skosa +.section skosb +.section skota +.section skotb +.section skoua +.section skoub +.section skova +.section skovb +.section skowa +.section skowb +.section skoxa +.section skoxb +.section skoya +.section skoyb +.section skoza +.section skozb +.section sko1a +.section sko1b +.section sko2a +.section sko2b +.section sko3a +.section sko3b +.section sko4a +.section sko4b +.section sko5a +.section sko5b +.section sko6a +.section sko6b +.section sko7a +.section sko7b +.section sko8a +.section sko8b +.section sko9a +.section sko9b +.section sko0a +.section sko0b +.section skpaa +.section skpab +.section skpba +.section skpbb +.section skpca +.section skpcb +.section skpda +.section skpdb +.section skpea +.section skpeb +.section skpfa +.section skpfb +.section skpga +.section skpgb +.section skpha +.section skphb +.section skpia +.section skpib +.section skpja +.section skpjb +.section skpka +.section skpkb +.section skpla +.section skplb +.section skpma +.section skpmb +.section skpna +.section skpnb +.section skpoa +.section skpob +.section skppa +.section skppb +.section skpqa +.section skpqb +.section skpra +.section skprb +.section skpsa +.section skpsb +.section skpta +.section skptb +.section skpua +.section skpub +.section skpva +.section skpvb +.section skpwa +.section skpwb +.section skpxa +.section skpxb +.section skpya +.section skpyb +.section skpza +.section skpzb +.section skp1a +.section skp1b +.section skp2a +.section skp2b +.section skp3a +.section skp3b +.section skp4a +.section skp4b +.section skp5a +.section skp5b +.section skp6a +.section skp6b +.section skp7a +.section skp7b +.section skp8a +.section skp8b +.section skp9a +.section skp9b +.section skp0a +.section skp0b +.section skqaa +.section skqab +.section skqba +.section skqbb +.section skqca +.section skqcb +.section skqda +.section skqdb +.section skqea +.section skqeb +.section skqfa +.section skqfb +.section skqga +.section skqgb +.section skqha +.section skqhb +.section skqia +.section skqib +.section skqja +.section skqjb +.section skqka +.section skqkb +.section skqla +.section skqlb +.section skqma +.section skqmb +.section skqna +.section skqnb +.section skqoa +.section skqob +.section skqpa +.section skqpb +.section skqqa +.section skqqb +.section skqra +.section skqrb +.section skqsa +.section skqsb +.section skqta +.section skqtb +.section skqua +.section skqub +.section skqva +.section skqvb +.section skqwa +.section skqwb +.section skqxa +.section skqxb +.section skqya +.section skqyb +.section skqza +.section skqzb +.section skq1a +.section skq1b +.section skq2a +.section skq2b +.section skq3a +.section skq3b +.section skq4a +.section skq4b +.section skq5a +.section skq5b +.section skq6a +.section skq6b +.section skq7a +.section skq7b +.section skq8a +.section skq8b +.section skq9a +.section skq9b +.section skq0a +.section skq0b +.section skraa +.section skrab +.section skrba +.section skrbb +.section skrca +.section skrcb +.section skrda +.section skrdb +.section skrea +.section skreb +.section skrfa +.section skrfb +.section skrga +.section skrgb +.section skrha +.section skrhb +.section skria +.section skrib +.section skrja +.section skrjb +.section skrka +.section skrkb +.section skrla +.section skrlb +.section skrma +.section skrmb +.section skrna +.section skrnb +.section skroa +.section skrob +.section skrpa +.section skrpb +.section skrqa +.section skrqb +.section skrra +.section skrrb +.section skrsa +.section skrsb +.section skrta +.section skrtb +.section skrua +.section skrub +.section skrva +.section skrvb +.section skrwa +.section skrwb +.section skrxa +.section skrxb +.section skrya +.section skryb +.section skrza +.section skrzb +.section skr1a +.section skr1b +.section skr2a +.section skr2b +.section skr3a +.section skr3b +.section skr4a +.section skr4b +.section skr5a +.section skr5b +.section skr6a +.section skr6b +.section skr7a +.section skr7b +.section skr8a +.section skr8b +.section skr9a +.section skr9b +.section skr0a +.section skr0b +.section sksaa +.section sksab +.section sksba +.section sksbb +.section sksca +.section skscb +.section sksda +.section sksdb +.section sksea +.section skseb +.section sksfa +.section sksfb +.section sksga +.section sksgb +.section sksha +.section skshb +.section sksia +.section sksib +.section sksja +.section sksjb +.section skska +.section skskb +.section sksla +.section skslb +.section sksma +.section sksmb +.section sksna +.section sksnb +.section sksoa +.section sksob +.section skspa +.section skspb +.section sksqa +.section sksqb +.section sksra +.section sksrb +.section skssa +.section skssb +.section sksta +.section skstb +.section sksua +.section sksub +.section sksva +.section sksvb +.section skswa +.section skswb +.section sksxa +.section sksxb +.section sksya +.section sksyb +.section sksza +.section skszb +.section sks1a +.section sks1b +.section sks2a +.section sks2b +.section sks3a +.section sks3b +.section sks4a +.section sks4b +.section sks5a +.section sks5b +.section sks6a +.section sks6b +.section sks7a +.section sks7b +.section sks8a +.section sks8b +.section sks9a +.section sks9b +.section sks0a +.section sks0b +.section sktaa +.section sktab +.section sktba +.section sktbb +.section sktca +.section sktcb +.section sktda +.section sktdb +.section sktea +.section skteb +.section sktfa +.section sktfb +.section sktga +.section sktgb +.section sktha +.section skthb +.section sktia +.section sktib +.section sktja +.section sktjb +.section sktka +.section sktkb +.section sktla +.section sktlb +.section sktma +.section sktmb +.section sktna +.section sktnb +.section sktoa +.section sktob +.section sktpa +.section sktpb +.section sktqa +.section sktqb +.section sktra +.section sktrb +.section sktsa +.section sktsb +.section sktta +.section skttb +.section sktua +.section sktub +.section sktva +.section sktvb +.section sktwa +.section sktwb +.section sktxa +.section sktxb +.section sktya +.section sktyb +.section sktza +.section sktzb +.section skt1a +.section skt1b +.section skt2a +.section skt2b +.section skt3a +.section skt3b +.section skt4a +.section skt4b +.section skt5a +.section skt5b +.section skt6a +.section skt6b +.section skt7a +.section skt7b +.section skt8a +.section skt8b +.section skt9a +.section skt9b +.section skt0a +.section skt0b +.section skuaa +.section skuab +.section skuba +.section skubb +.section skuca +.section skucb +.section skuda +.section skudb +.section skuea +.section skueb +.section skufa +.section skufb +.section skuga +.section skugb +.section skuha +.section skuhb +.section skuia +.section skuib +.section skuja +.section skujb +.section skuka +.section skukb +.section skula +.section skulb +.section skuma +.section skumb +.section skuna +.section skunb +.section skuoa +.section skuob +.section skupa +.section skupb +.section skuqa +.section skuqb +.section skura +.section skurb +.section skusa +.section skusb +.section skuta +.section skutb +.section skuua +.section skuub +.section skuva +.section skuvb +.section skuwa +.section skuwb +.section skuxa +.section skuxb +.section skuya +.section skuyb +.section skuza +.section skuzb +.section sku1a +.section sku1b +.section sku2a +.section sku2b +.section sku3a +.section sku3b +.section sku4a +.section sku4b +.section sku5a +.section sku5b +.section sku6a +.section sku6b +.section sku7a +.section sku7b +.section sku8a +.section sku8b +.section sku9a +.section sku9b +.section sku0a +.section sku0b +.section skvaa +.section skvab +.section skvba +.section skvbb +.section skvca +.section skvcb +.section skvda +.section skvdb +.section skvea +.section skveb +.section skvfa +.section skvfb +.section skvga +.section skvgb +.section skvha +.section skvhb +.section skvia +.section skvib +.section skvja +.section skvjb +.section skvka +.section skvkb +.section skvla +.section skvlb +.section skvma +.section skvmb +.section skvna +.section skvnb +.section skvoa +.section skvob +.section skvpa +.section skvpb +.section skvqa +.section skvqb +.section skvra +.section skvrb +.section skvsa +.section skvsb +.section skvta +.section skvtb +.section skvua +.section skvub +.section skvva +.section skvvb +.section skvwa +.section skvwb +.section skvxa +.section skvxb +.section skvya +.section skvyb +.section skvza +.section skvzb +.section skv1a +.section skv1b +.section skv2a +.section skv2b +.section skv3a +.section skv3b +.section skv4a +.section skv4b +.section skv5a +.section skv5b +.section skv6a +.section skv6b +.section skv7a +.section skv7b +.section skv8a +.section skv8b +.section skv9a +.section skv9b +.section skv0a +.section skv0b +.section skwaa +.section skwab +.section skwba +.section skwbb +.section skwca +.section skwcb +.section skwda +.section skwdb +.section skwea +.section skweb +.section skwfa +.section skwfb +.section skwga +.section skwgb +.section skwha +.section skwhb +.section skwia +.section skwib +.section skwja +.section skwjb +.section skwka +.section skwkb +.section skwla +.section skwlb +.section skwma +.section skwmb +.section skwna +.section skwnb +.section skwoa +.section skwob +.section skwpa +.section skwpb +.section skwqa +.section skwqb +.section skwra +.section skwrb +.section skwsa +.section skwsb +.section skwta +.section skwtb +.section skwua +.section skwub +.section skwva +.section skwvb +.section skwwa +.section skwwb +.section skwxa +.section skwxb +.section skwya +.section skwyb +.section skwza +.section skwzb +.section skw1a +.section skw1b +.section skw2a +.section skw2b +.section skw3a +.section skw3b +.section skw4a +.section skw4b +.section skw5a +.section skw5b +.section skw6a +.section skw6b +.section skw7a +.section skw7b +.section skw8a +.section skw8b +.section skw9a +.section skw9b +.section skw0a +.section skw0b +.section skxaa +.section skxab +.section skxba +.section skxbb +.section skxca +.section skxcb +.section skxda +.section skxdb +.section skxea +.section skxeb +.section skxfa +.section skxfb +.section skxga +.section skxgb +.section skxha +.section skxhb +.section skxia +.section skxib +.section skxja +.section skxjb +.section skxka +.section skxkb +.section skxla +.section skxlb +.section skxma +.section skxmb +.section skxna +.section skxnb +.section skxoa +.section skxob +.section skxpa +.section skxpb +.section skxqa +.section skxqb +.section skxra +.section skxrb +.section skxsa +.section skxsb +.section skxta +.section skxtb +.section skxua +.section skxub +.section skxva +.section skxvb +.section skxwa +.section skxwb +.section skxxa +.section skxxb +.section skxya +.section skxyb +.section skxza +.section skxzb +.section skx1a +.section skx1b +.section skx2a +.section skx2b +.section skx3a +.section skx3b +.section skx4a +.section skx4b +.section skx5a +.section skx5b +.section skx6a +.section skx6b +.section skx7a +.section skx7b +.section skx8a +.section skx8b +.section skx9a +.section skx9b +.section skx0a +.section skx0b +.section skyaa +.section skyab +.section skyba +.section skybb +.section skyca +.section skycb +.section skyda +.section skydb +.section skyea +.section skyeb +.section skyfa +.section skyfb +.section skyga +.section skygb +.section skyha +.section skyhb +.section skyia +.section skyib +.section skyja +.section skyjb +.section skyka +.section skykb +.section skyla +.section skylb +.section skyma +.section skymb +.section skyna +.section skynb +.section skyoa +.section skyob +.section skypa +.section skypb +.section skyqa +.section skyqb +.section skyra +.section skyrb +.section skysa +.section skysb +.section skyta +.section skytb +.section skyua +.section skyub +.section skyva +.section skyvb +.section skywa +.section skywb +.section skyxa +.section skyxb +.section skyya +.section skyyb +.section skyza +.section skyzb +.section sky1a +.section sky1b +.section sky2a +.section sky2b +.section sky3a +.section sky3b +.section sky4a +.section sky4b +.section sky5a +.section sky5b +.section sky6a +.section sky6b +.section sky7a +.section sky7b +.section sky8a +.section sky8b +.section sky9a +.section sky9b +.section sky0a +.section sky0b +.section skzaa +.section skzab +.section skzba +.section skzbb +.section skzca +.section skzcb +.section skzda +.section skzdb +.section skzea +.section skzeb +.section skzfa +.section skzfb +.section skzga +.section skzgb +.section skzha +.section skzhb +.section skzia +.section skzib +.section skzja +.section skzjb +.section skzka +.section skzkb +.section skzla +.section skzlb +.section skzma +.section skzmb +.section skzna +.section skznb +.section skzoa +.section skzob +.section skzpa +.section skzpb +.section skzqa +.section skzqb +.section skzra +.section skzrb +.section skzsa +.section skzsb +.section skzta +.section skztb +.section skzua +.section skzub +.section skzva +.section skzvb +.section skzwa +.section skzwb +.section skzxa +.section skzxb +.section skzya +.section skzyb +.section skzza +.section skzzb +.section skz1a +.section skz1b +.section skz2a +.section skz2b +.section skz3a +.section skz3b +.section skz4a +.section skz4b +.section skz5a +.section skz5b +.section skz6a +.section skz6b +.section skz7a +.section skz7b +.section skz8a +.section skz8b +.section skz9a +.section skz9b +.section skz0a +.section skz0b +.section sk1aa +.section sk1ab +.section sk1ba +.section sk1bb +.section sk1ca +.section sk1cb +.section sk1da +.section sk1db +.section sk1ea +.section sk1eb +.section sk1fa +.section sk1fb +.section sk1ga +.section sk1gb +.section sk1ha +.section sk1hb +.section sk1ia +.section sk1ib +.section sk1ja +.section sk1jb +.section sk1ka +.section sk1kb +.section sk1la +.section sk1lb +.section sk1ma +.section sk1mb +.section sk1na +.section sk1nb +.section sk1oa +.section sk1ob +.section sk1pa +.section sk1pb +.section sk1qa +.section sk1qb +.section sk1ra +.section sk1rb +.section sk1sa +.section sk1sb +.section sk1ta +.section sk1tb +.section sk1ua +.section sk1ub +.section sk1va +.section sk1vb +.section sk1wa +.section sk1wb +.section sk1xa +.section sk1xb +.section sk1ya +.section sk1yb +.section sk1za +.section sk1zb +.section sk11a +.section sk11b +.section sk12a +.section sk12b +.section sk13a +.section sk13b +.section sk14a +.section sk14b +.section sk15a +.section sk15b +.section sk16a +.section sk16b +.section sk17a +.section sk17b +.section sk18a +.section sk18b +.section sk19a +.section sk19b +.section sk10a +.section sk10b +.section sk2aa +.section sk2ab +.section sk2ba +.section sk2bb +.section sk2ca +.section sk2cb +.section sk2da +.section sk2db +.section sk2ea +.section sk2eb +.section sk2fa +.section sk2fb +.section sk2ga +.section sk2gb +.section sk2ha +.section sk2hb +.section sk2ia +.section sk2ib +.section sk2ja +.section sk2jb +.section sk2ka +.section sk2kb +.section sk2la +.section sk2lb +.section sk2ma +.section sk2mb +.section sk2na +.section sk2nb +.section sk2oa +.section sk2ob +.section sk2pa +.section sk2pb +.section sk2qa +.section sk2qb +.section sk2ra +.section sk2rb +.section sk2sa +.section sk2sb +.section sk2ta +.section sk2tb +.section sk2ua +.section sk2ub +.section sk2va +.section sk2vb +.section sk2wa +.section sk2wb +.section sk2xa +.section sk2xb +.section sk2ya +.section sk2yb +.section sk2za +.section sk2zb +.section sk21a +.section sk21b +.section sk22a +.section sk22b +.section sk23a +.section sk23b +.section sk24a +.section sk24b +.section sk25a +.section sk25b +.section sk26a +.section sk26b +.section sk27a +.section sk27b +.section sk28a +.section sk28b +.section sk29a +.section sk29b +.section sk20a +.section sk20b +.section sk3aa +.section sk3ab +.section sk3ba +.section sk3bb +.section sk3ca +.section sk3cb +.section sk3da +.section sk3db +.section sk3ea +.section sk3eb +.section sk3fa +.section sk3fb +.section sk3ga +.section sk3gb +.section sk3ha +.section sk3hb +.section sk3ia +.section sk3ib +.section sk3ja +.section sk3jb +.section sk3ka +.section sk3kb +.section sk3la +.section sk3lb +.section sk3ma +.section sk3mb +.section sk3na +.section sk3nb +.section sk3oa +.section sk3ob +.section sk3pa +.section sk3pb +.section sk3qa +.section sk3qb +.section sk3ra +.section sk3rb +.section sk3sa +.section sk3sb +.section sk3ta +.section sk3tb +.section sk3ua +.section sk3ub +.section sk3va +.section sk3vb +.section sk3wa +.section sk3wb +.section sk3xa +.section sk3xb +.section sk3ya +.section sk3yb +.section sk3za +.section sk3zb +.section sk31a +.section sk31b +.section sk32a +.section sk32b +.section sk33a +.section sk33b +.section sk34a +.section sk34b +.section sk35a +.section sk35b +.section sk36a +.section sk36b +.section sk37a +.section sk37b +.section sk38a +.section sk38b +.section sk39a +.section sk39b +.section sk30a +.section sk30b +.section sk4aa +.section sk4ab +.section sk4ba +.section sk4bb +.section sk4ca +.section sk4cb +.section sk4da +.section sk4db +.section sk4ea +.section sk4eb +.section sk4fa +.section sk4fb +.section sk4ga +.section sk4gb +.section sk4ha +.section sk4hb +.section sk4ia +.section sk4ib +.section sk4ja +.section sk4jb +.section sk4ka +.section sk4kb +.section sk4la +.section sk4lb +.section sk4ma +.section sk4mb +.section sk4na +.section sk4nb +.section sk4oa +.section sk4ob +.section sk4pa +.section sk4pb +.section sk4qa +.section sk4qb +.section sk4ra +.section sk4rb +.section sk4sa +.section sk4sb +.section sk4ta +.section sk4tb +.section sk4ua +.section sk4ub +.section sk4va +.section sk4vb +.section sk4wa +.section sk4wb +.section sk4xa +.section sk4xb +.section sk4ya +.section sk4yb +.section sk4za +.section sk4zb +.section sk41a +.section sk41b +.section sk42a +.section sk42b +.section sk43a +.section sk43b +.section sk44a +.section sk44b +.section sk45a +.section sk45b +.section sk46a +.section sk46b +.section sk47a +.section sk47b +.section sk48a +.section sk48b +.section sk49a +.section sk49b +.section sk40a +.section sk40b +.section sk5aa +.section sk5ab +.section sk5ba +.section sk5bb +.section sk5ca +.section sk5cb +.section sk5da +.section sk5db +.section sk5ea +.section sk5eb +.section sk5fa +.section sk5fb +.section sk5ga +.section sk5gb +.section sk5ha +.section sk5hb +.section sk5ia +.section sk5ib +.section sk5ja +.section sk5jb +.section sk5ka +.section sk5kb +.section sk5la +.section sk5lb +.section sk5ma +.section sk5mb +.section sk5na +.section sk5nb +.section sk5oa +.section sk5ob +.section sk5pa +.section sk5pb +.section sk5qa +.section sk5qb +.section sk5ra +.section sk5rb +.section sk5sa +.section sk5sb +.section sk5ta +.section sk5tb +.section sk5ua +.section sk5ub +.section sk5va +.section sk5vb +.section sk5wa +.section sk5wb +.section sk5xa +.section sk5xb +.section sk5ya +.section sk5yb +.section sk5za +.section sk5zb +.section sk51a +.section sk51b +.section sk52a +.section sk52b +.section sk53a +.section sk53b +.section sk54a +.section sk54b +.section sk55a +.section sk55b +.section sk56a +.section sk56b +.section sk57a +.section sk57b +.section sk58a +.section sk58b +.section sk59a +.section sk59b +.section sk50a +.section sk50b +.section sk6aa +.section sk6ab +.section sk6ba +.section sk6bb +.section sk6ca +.section sk6cb +.section sk6da +.section sk6db +.section sk6ea +.section sk6eb +.section sk6fa +.section sk6fb +.section sk6ga +.section sk6gb +.section sk6ha +.section sk6hb +.section sk6ia +.section sk6ib +.section sk6ja +.section sk6jb +.section sk6ka +.section sk6kb +.section sk6la +.section sk6lb +.section sk6ma +.section sk6mb +.section sk6na +.section sk6nb +.section sk6oa +.section sk6ob +.section sk6pa +.section sk6pb +.section sk6qa +.section sk6qb +.section sk6ra +.section sk6rb +.section sk6sa +.section sk6sb +.section sk6ta +.section sk6tb +.section sk6ua +.section sk6ub +.section sk6va +.section sk6vb +.section sk6wa +.section sk6wb +.section sk6xa +.section sk6xb +.section sk6ya +.section sk6yb +.section sk6za +.section sk6zb +.section sk61a +.section sk61b +.section sk62a +.section sk62b +.section sk63a +.section sk63b +.section sk64a +.section sk64b +.section sk65a +.section sk65b +.section sk66a +.section sk66b +.section sk67a +.section sk67b +.section sk68a +.section sk68b +.section sk69a +.section sk69b +.section sk60a +.section sk60b +.section sk7aa +.section sk7ab +.section sk7ba +.section sk7bb +.section sk7ca +.section sk7cb +.section sk7da +.section sk7db +.section sk7ea +.section sk7eb +.section sk7fa +.section sk7fb +.section sk7ga +.section sk7gb +.section sk7ha +.section sk7hb +.section sk7ia +.section sk7ib +.section sk7ja +.section sk7jb +.section sk7ka +.section sk7kb +.section sk7la +.section sk7lb +.section sk7ma +.section sk7mb +.section sk7na +.section sk7nb +.section sk7oa +.section sk7ob +.section sk7pa +.section sk7pb +.section sk7qa +.section sk7qb +.section sk7ra +.section sk7rb +.section sk7sa +.section sk7sb +.section sk7ta +.section sk7tb +.section sk7ua +.section sk7ub +.section sk7va +.section sk7vb +.section sk7wa +.section sk7wb +.section sk7xa +.section sk7xb +.section sk7ya +.section sk7yb +.section sk7za +.section sk7zb +.section sk71a +.section sk71b +.section sk72a +.section sk72b +.section sk73a +.section sk73b +.section sk74a +.section sk74b +.section sk75a +.section sk75b +.section sk76a +.section sk76b +.section sk77a +.section sk77b +.section sk78a +.section sk78b +.section sk79a +.section sk79b +.section sk70a +.section sk70b +.section sk8aa +.section sk8ab +.section sk8ba +.section sk8bb +.section sk8ca +.section sk8cb +.section sk8da +.section sk8db +.section sk8ea +.section sk8eb +.section sk8fa +.section sk8fb +.section sk8ga +.section sk8gb +.section sk8ha +.section sk8hb +.section sk8ia +.section sk8ib +.section sk8ja +.section sk8jb +.section sk8ka +.section sk8kb +.section sk8la +.section sk8lb +.section sk8ma +.section sk8mb +.section sk8na +.section sk8nb +.section sk8oa +.section sk8ob +.section sk8pa +.section sk8pb +.section sk8qa +.section sk8qb +.section sk8ra +.section sk8rb +.section sk8sa +.section sk8sb +.section sk8ta +.section sk8tb +.section sk8ua +.section sk8ub +.section sk8va +.section sk8vb +.section sk8wa +.section sk8wb +.section sk8xa +.section sk8xb +.section sk8ya +.section sk8yb +.section sk8za +.section sk8zb +.section sk81a +.section sk81b +.section sk82a +.section sk82b +.section sk83a +.section sk83b +.section sk84a +.section sk84b +.section sk85a +.section sk85b +.section sk86a +.section sk86b +.section sk87a +.section sk87b +.section sk88a +.section sk88b +.section sk89a +.section sk89b +.section sk80a +.section sk80b +.section sk9aa +.section sk9ab +.section sk9ba +.section sk9bb +.section sk9ca +.section sk9cb +.section sk9da +.section sk9db +.section sk9ea +.section sk9eb +.section sk9fa +.section sk9fb +.section sk9ga +.section sk9gb +.section sk9ha +.section sk9hb +.section sk9ia +.section sk9ib +.section sk9ja +.section sk9jb +.section sk9ka +.section sk9kb +.section sk9la +.section sk9lb +.section sk9ma +.section sk9mb +.section sk9na +.section sk9nb +.section sk9oa +.section sk9ob +.section sk9pa +.section sk9pb +.section sk9qa +.section sk9qb +.section sk9ra +.section sk9rb +.section sk9sa +.section sk9sb +.section sk9ta +.section sk9tb +.section sk9ua +.section sk9ub +.section sk9va +.section sk9vb +.section sk9wa +.section sk9wb +.section sk9xa +.section sk9xb +.section sk9ya +.section sk9yb +.section sk9za +.section sk9zb +.section sk91a +.section sk91b +.section sk92a +.section sk92b +.section sk93a +.section sk93b +.section sk94a +.section sk94b +.section sk95a +.section sk95b +.section sk96a +.section sk96b +.section sk97a +.section sk97b +.section sk98a +.section sk98b +.section sk99a +.section sk99b +.section sk90a +.section sk90b +.section sk0aa +.section sk0ab +.section sk0ba +.section sk0bb +.section sk0ca +.section sk0cb +.section sk0da +.section sk0db +.section sk0ea +.section sk0eb +.section sk0fa +.section sk0fb +.section sk0ga +.section sk0gb +.section sk0ha +.section sk0hb +.section sk0ia +.section sk0ib +.section sk0ja +.section sk0jb +.section sk0ka +.section sk0kb +.section sk0la +.section sk0lb +.section sk0ma +.section sk0mb +.section sk0na +.section sk0nb +.section sk0oa +.section sk0ob +.section sk0pa +.section sk0pb +.section sk0qa +.section sk0qb +.section sk0ra +.section sk0rb +.section sk0sa +.section sk0sb +.section sk0ta +.section sk0tb +.section sk0ua +.section sk0ub +.section sk0va +.section sk0vb +.section sk0wa +.section sk0wb +.section sk0xa +.section sk0xb +.section sk0ya +.section sk0yb +.section sk0za +.section sk0zb +.section sk01a +.section sk01b +.section sk02a +.section sk02b +.section sk03a +.section sk03b +.section sk04a +.section sk04b +.section sk05a +.section sk05b +.section sk06a +.section sk06b +.section sk07a +.section sk07b +.section sk08a +.section sk08b +.section sk09a +.section sk09b +.section sk00a +.section sk00b +.section slaaa +.section slaab +.section slaba +.section slabb +.section slaca +.section slacb +.section slada +.section sladb +.section slaea +.section slaeb +.section slafa +.section slafb +.section slaga +.section slagb +.section slaha +.section slahb +.section slaia +.section slaib +.section slaja +.section slajb +.section slaka +.section slakb +.section slala +.section slalb +.section slama +.section slamb +.section slana +.section slanb +.section slaoa +.section slaob +.section slapa +.section slapb +.section slaqa +.section slaqb +.section slara +.section slarb +.section slasa +.section slasb +.section slata +.section slatb +.section slaua +.section slaub +.section slava +.section slavb +.section slawa +.section slawb +.section slaxa +.section slaxb +.section slaya +.section slayb +.section slaza +.section slazb +.section sla1a +.section sla1b +.section sla2a +.section sla2b +.section sla3a +.section sla3b +.section sla4a +.section sla4b +.section sla5a +.section sla5b +.section sla6a +.section sla6b +.section sla7a +.section sla7b +.section sla8a +.section sla8b +.section sla9a +.section sla9b +.section sla0a +.section sla0b +.section slbaa +.section slbab +.section slbba +.section slbbb +.section slbca +.section slbcb +.section slbda +.section slbdb +.section slbea +.section slbeb +.section slbfa +.section slbfb +.section slbga +.section slbgb +.section slbha +.section slbhb +.section slbia +.section slbib +.section slbja +.section slbjb +.section slbka +.section slbkb +.section slbla +.section slblb +.section slbma +.section slbmb +.section slbna +.section slbnb +.section slboa +.section slbob +.section slbpa +.section slbpb +.section slbqa +.section slbqb +.section slbra +.section slbrb +.section slbsa +.section slbsb +.section slbta +.section slbtb +.section slbua +.section slbub +.section slbva +.section slbvb +.section slbwa +.section slbwb +.section slbxa +.section slbxb +.section slbya +.section slbyb +.section slbza +.section slbzb +.section slb1a +.section slb1b +.section slb2a +.section slb2b +.section slb3a +.section slb3b +.section slb4a +.section slb4b +.section slb5a +.section slb5b +.section slb6a +.section slb6b +.section slb7a +.section slb7b +.section slb8a +.section slb8b +.section slb9a +.section slb9b +.section slb0a +.section slb0b +.section slcaa +.section slcab +.section slcba +.section slcbb +.section slcca +.section slccb +.section slcda +.section slcdb +.section slcea +.section slceb +.section slcfa +.section slcfb +.section slcga +.section slcgb +.section slcha +.section slchb +.section slcia +.section slcib +.section slcja +.section slcjb +.section slcka +.section slckb +.section slcla +.section slclb +.section slcma +.section slcmb +.section slcna +.section slcnb +.section slcoa +.section slcob +.section slcpa +.section slcpb +.section slcqa +.section slcqb +.section slcra +.section slcrb +.section slcsa +.section slcsb +.section slcta +.section slctb +.section slcua +.section slcub +.section slcva +.section slcvb +.section slcwa +.section slcwb +.section slcxa +.section slcxb +.section slcya +.section slcyb +.section slcza +.section slczb +.section slc1a +.section slc1b +.section slc2a +.section slc2b +.section slc3a +.section slc3b +.section slc4a +.section slc4b +.section slc5a +.section slc5b +.section slc6a +.section slc6b +.section slc7a +.section slc7b +.section slc8a +.section slc8b +.section slc9a +.section slc9b +.section slc0a +.section slc0b +.section sldaa +.section sldab +.section sldba +.section sldbb +.section sldca +.section sldcb +.section sldda +.section slddb +.section sldea +.section sldeb +.section sldfa +.section sldfb +.section sldga +.section sldgb +.section sldha +.section sldhb +.section sldia +.section sldib +.section sldja +.section sldjb +.section sldka +.section sldkb +.section sldla +.section sldlb +.section sldma +.section sldmb +.section sldna +.section sldnb +.section sldoa +.section sldob +.section sldpa +.section sldpb +.section sldqa +.section sldqb +.section sldra +.section sldrb +.section sldsa +.section sldsb +.section sldta +.section sldtb +.section sldua +.section sldub +.section sldva +.section sldvb +.section sldwa +.section sldwb +.section sldxa +.section sldxb +.section sldya +.section sldyb +.section sldza +.section sldzb +.section sld1a +.section sld1b +.section sld2a +.section sld2b +.section sld3a +.section sld3b +.section sld4a +.section sld4b +.section sld5a +.section sld5b +.section sld6a +.section sld6b +.section sld7a +.section sld7b +.section sld8a +.section sld8b +.section sld9a +.section sld9b +.section sld0a +.section sld0b +.section sleaa +.section sleab +.section sleba +.section slebb +.section sleca +.section slecb +.section sleda +.section sledb +.section sleea +.section sleeb +.section slefa +.section slefb +.section slega +.section slegb +.section sleha +.section slehb +.section sleia +.section sleib +.section sleja +.section slejb +.section sleka +.section slekb +.section slela +.section slelb +.section slema +.section slemb +.section slena +.section slenb +.section sleoa +.section sleob +.section slepa +.section slepb +.section sleqa +.section sleqb +.section slera +.section slerb +.section slesa +.section slesb +.section sleta +.section sletb +.section sleua +.section sleub +.section sleva +.section slevb +.section slewa +.section slewb +.section slexa +.section slexb +.section sleya +.section sleyb +.section sleza +.section slezb +.section sle1a +.section sle1b +.section sle2a +.section sle2b +.section sle3a +.section sle3b +.section sle4a +.section sle4b +.section sle5a +.section sle5b +.section sle6a +.section sle6b +.section sle7a +.section sle7b +.section sle8a +.section sle8b +.section sle9a +.section sle9b +.section sle0a +.section sle0b +.section slfaa +.section slfab +.section slfba +.section slfbb +.section slfca +.section slfcb +.section slfda +.section slfdb +.section slfea +.section slfeb +.section slffa +.section slffb +.section slfga +.section slfgb +.section slfha +.section slfhb +.section slfia +.section slfib +.section slfja +.section slfjb +.section slfka +.section slfkb +.section slfla +.section slflb +.section slfma +.section slfmb +.section slfna +.section slfnb +.section slfoa +.section slfob +.section slfpa +.section slfpb +.section slfqa +.section slfqb +.section slfra +.section slfrb +.section slfsa +.section slfsb +.section slfta +.section slftb +.section slfua +.section slfub +.section slfva +.section slfvb +.section slfwa +.section slfwb +.section slfxa +.section slfxb +.section slfya +.section slfyb +.section slfza +.section slfzb +.section slf1a +.section slf1b +.section slf2a +.section slf2b +.section slf3a +.section slf3b +.section slf4a +.section slf4b +.section slf5a +.section slf5b +.section slf6a +.section slf6b +.section slf7a +.section slf7b +.section slf8a +.section slf8b +.section slf9a +.section slf9b +.section slf0a +.section slf0b +.section slgaa +.section slgab +.section slgba +.section slgbb +.section slgca +.section slgcb +.section slgda +.section slgdb +.section slgea +.section slgeb +.section slgfa +.section slgfb +.section slgga +.section slggb +.section slgha +.section slghb +.section slgia +.section slgib +.section slgja +.section slgjb +.section slgka +.section slgkb +.section slgla +.section slglb +.section slgma +.section slgmb +.section slgna +.section slgnb +.section slgoa +.section slgob +.section slgpa +.section slgpb +.section slgqa +.section slgqb +.section slgra +.section slgrb +.section slgsa +.section slgsb +.section slgta +.section slgtb +.section slgua +.section slgub +.section slgva +.section slgvb +.section slgwa +.section slgwb +.section slgxa +.section slgxb +.section slgya +.section slgyb +.section slgza +.section slgzb +.section slg1a +.section slg1b +.section slg2a +.section slg2b +.section slg3a +.section slg3b +.section slg4a +.section slg4b +.section slg5a +.section slg5b +.section slg6a +.section slg6b +.section slg7a +.section slg7b +.section slg8a +.section slg8b +.section slg9a +.section slg9b +.section slg0a +.section slg0b +.section slhaa +.section slhab +.section slhba +.section slhbb +.section slhca +.section slhcb +.section slhda +.section slhdb +.section slhea +.section slheb +.section slhfa +.section slhfb +.section slhga +.section slhgb +.section slhha +.section slhhb +.section slhia +.section slhib +.section slhja +.section slhjb +.section slhka +.section slhkb +.section slhla +.section slhlb +.section slhma +.section slhmb +.section slhna +.section slhnb +.section slhoa +.section slhob +.section slhpa +.section slhpb +.section slhqa +.section slhqb +.section slhra +.section slhrb +.section slhsa +.section slhsb +.section slhta +.section slhtb +.section slhua +.section slhub +.section slhva +.section slhvb +.section slhwa +.section slhwb +.section slhxa +.section slhxb +.section slhya +.section slhyb +.section slhza +.section slhzb +.section slh1a +.section slh1b +.section slh2a +.section slh2b +.section slh3a +.section slh3b +.section slh4a +.section slh4b +.section slh5a +.section slh5b +.section slh6a +.section slh6b +.section slh7a +.section slh7b +.section slh8a +.section slh8b +.section slh9a +.section slh9b +.section slh0a +.section slh0b +.section sliaa +.section sliab +.section sliba +.section slibb +.section slica +.section slicb +.section slida +.section slidb +.section sliea +.section slieb +.section slifa +.section slifb +.section sliga +.section sligb +.section sliha +.section slihb +.section sliia +.section sliib +.section slija +.section slijb +.section slika +.section slikb +.section slila +.section slilb +.section slima +.section slimb +.section slina +.section slinb +.section slioa +.section sliob +.section slipa +.section slipb +.section sliqa +.section sliqb +.section slira +.section slirb +.section slisa +.section slisb +.section slita +.section slitb +.section sliua +.section sliub +.section sliva +.section slivb +.section sliwa +.section sliwb +.section slixa +.section slixb +.section sliya +.section sliyb +.section sliza +.section slizb +.section sli1a +.section sli1b +.section sli2a +.section sli2b +.section sli3a +.section sli3b +.section sli4a +.section sli4b +.section sli5a +.section sli5b +.section sli6a +.section sli6b +.section sli7a +.section sli7b +.section sli8a +.section sli8b +.section sli9a +.section sli9b +.section sli0a +.section sli0b +.section sljaa +.section sljab +.section sljba +.section sljbb +.section sljca +.section sljcb +.section sljda +.section sljdb +.section sljea +.section sljeb +.section sljfa +.section sljfb +.section sljga +.section sljgb +.section sljha +.section sljhb +.section sljia +.section sljib +.section sljja +.section sljjb +.section sljka +.section sljkb +.section sljla +.section sljlb +.section sljma +.section sljmb +.section sljna +.section sljnb +.section sljoa +.section sljob +.section sljpa +.section sljpb +.section sljqa +.section sljqb +.section sljra +.section sljrb +.section sljsa +.section sljsb +.section sljta +.section sljtb +.section sljua +.section sljub +.section sljva +.section sljvb +.section sljwa +.section sljwb +.section sljxa +.section sljxb +.section sljya +.section sljyb +.section sljza +.section sljzb +.section slj1a +.section slj1b +.section slj2a +.section slj2b +.section slj3a +.section slj3b +.section slj4a +.section slj4b +.section slj5a +.section slj5b +.section slj6a +.section slj6b +.section slj7a +.section slj7b +.section slj8a +.section slj8b +.section slj9a +.section slj9b +.section slj0a +.section slj0b +.section slkaa +.section slkab +.section slkba +.section slkbb +.section slkca +.section slkcb +.section slkda +.section slkdb +.section slkea +.section slkeb +.section slkfa +.section slkfb +.section slkga +.section slkgb +.section slkha +.section slkhb +.section slkia +.section slkib +.section slkja +.section slkjb +.section slkka +.section slkkb +.section slkla +.section slklb +.section slkma +.section slkmb +.section slkna +.section slknb +.section slkoa +.section slkob +.section slkpa +.section slkpb +.section slkqa +.section slkqb +.section slkra +.section slkrb +.section slksa +.section slksb +.section slkta +.section slktb +.section slkua +.section slkub +.section slkva +.section slkvb +.section slkwa +.section slkwb +.section slkxa +.section slkxb +.section slkya +.section slkyb +.section slkza +.section slkzb +.section slk1a +.section slk1b +.section slk2a +.section slk2b +.section slk3a +.section slk3b +.section slk4a +.section slk4b +.section slk5a +.section slk5b +.section slk6a +.section slk6b +.section slk7a +.section slk7b +.section slk8a +.section slk8b +.section slk9a +.section slk9b +.section slk0a +.section slk0b +.section sllaa +.section sllab +.section sllba +.section sllbb +.section sllca +.section sllcb +.section sllda +.section slldb +.section sllea +.section slleb +.section sllfa +.section sllfb +.section sllga +.section sllgb +.section sllha +.section sllhb +.section sllia +.section sllib +.section sllja +.section slljb +.section sllka +.section sllkb +.section sllla +.section slllb +.section sllma +.section sllmb +.section sllna +.section sllnb +.section slloa +.section sllob +.section sllpa +.section sllpb +.section sllqa +.section sllqb +.section sllra +.section sllrb +.section sllsa +.section sllsb +.section sllta +.section slltb +.section sllua +.section sllub +.section sllva +.section sllvb +.section sllwa +.section sllwb +.section sllxa +.section sllxb +.section sllya +.section sllyb +.section sllza +.section sllzb +.section sll1a +.section sll1b +.section sll2a +.section sll2b +.section sll3a +.section sll3b +.section sll4a +.section sll4b +.section sll5a +.section sll5b +.section sll6a +.section sll6b +.section sll7a +.section sll7b +.section sll8a +.section sll8b +.section sll9a +.section sll9b +.section sll0a +.section sll0b +.section slmaa +.section slmab +.section slmba +.section slmbb +.section slmca +.section slmcb +.section slmda +.section slmdb +.section slmea +.section slmeb +.section slmfa +.section slmfb +.section slmga +.section slmgb +.section slmha +.section slmhb +.section slmia +.section slmib +.section slmja +.section slmjb +.section slmka +.section slmkb +.section slmla +.section slmlb +.section slmma +.section slmmb +.section slmna +.section slmnb +.section slmoa +.section slmob +.section slmpa +.section slmpb +.section slmqa +.section slmqb +.section slmra +.section slmrb +.section slmsa +.section slmsb +.section slmta +.section slmtb +.section slmua +.section slmub +.section slmva +.section slmvb +.section slmwa +.section slmwb +.section slmxa +.section slmxb +.section slmya +.section slmyb +.section slmza +.section slmzb +.section slm1a +.section slm1b +.section slm2a +.section slm2b +.section slm3a +.section slm3b +.section slm4a +.section slm4b +.section slm5a +.section slm5b +.section slm6a +.section slm6b +.section slm7a +.section slm7b +.section slm8a +.section slm8b +.section slm9a +.section slm9b +.section slm0a +.section slm0b +.section slnaa +.section slnab +.section slnba +.section slnbb +.section slnca +.section slncb +.section slnda +.section slndb +.section slnea +.section slneb +.section slnfa +.section slnfb +.section slnga +.section slngb +.section slnha +.section slnhb +.section slnia +.section slnib +.section slnja +.section slnjb +.section slnka +.section slnkb +.section slnla +.section slnlb +.section slnma +.section slnmb +.section slnna +.section slnnb +.section slnoa +.section slnob +.section slnpa +.section slnpb +.section slnqa +.section slnqb +.section slnra +.section slnrb +.section slnsa +.section slnsb +.section slnta +.section slntb +.section slnua +.section slnub +.section slnva +.section slnvb +.section slnwa +.section slnwb +.section slnxa +.section slnxb +.section slnya +.section slnyb +.section slnza +.section slnzb +.section sln1a +.section sln1b +.section sln2a +.section sln2b +.section sln3a +.section sln3b +.section sln4a +.section sln4b +.section sln5a +.section sln5b +.section sln6a +.section sln6b +.section sln7a +.section sln7b +.section sln8a +.section sln8b +.section sln9a +.section sln9b +.section sln0a +.section sln0b +.section sloaa +.section sloab +.section sloba +.section slobb +.section sloca +.section slocb +.section sloda +.section slodb +.section sloea +.section sloeb +.section slofa +.section slofb +.section sloga +.section slogb +.section sloha +.section slohb +.section sloia +.section sloib +.section sloja +.section slojb +.section sloka +.section slokb +.section slola +.section slolb +.section sloma +.section slomb +.section slona +.section slonb +.section slooa +.section sloob +.section slopa +.section slopb +.section sloqa +.section sloqb +.section slora +.section slorb +.section slosa +.section slosb +.section slota +.section slotb +.section sloua +.section sloub +.section slova +.section slovb +.section slowa +.section slowb +.section sloxa +.section sloxb +.section sloya +.section sloyb +.section sloza +.section slozb +.section slo1a +.section slo1b +.section slo2a +.section slo2b +.section slo3a +.section slo3b +.section slo4a +.section slo4b +.section slo5a +.section slo5b +.section slo6a +.section slo6b +.section slo7a +.section slo7b +.section slo8a +.section slo8b +.section slo9a +.section slo9b +.section slo0a +.section slo0b +.section slpaa +.section slpab +.section slpba +.section slpbb +.section slpca +.section slpcb +.section slpda +.section slpdb +.section slpea +.section slpeb +.section slpfa +.section slpfb +.section slpga +.section slpgb +.section slpha +.section slphb +.section slpia +.section slpib +.section slpja +.section slpjb +.section slpka +.section slpkb +.section slpla +.section slplb +.section slpma +.section slpmb +.section slpna +.section slpnb +.section slpoa +.section slpob +.section slppa +.section slppb +.section slpqa +.section slpqb +.section slpra +.section slprb +.section slpsa +.section slpsb +.section slpta +.section slptb +.section slpua +.section slpub +.section slpva +.section slpvb +.section slpwa +.section slpwb +.section slpxa +.section slpxb +.section slpya +.section slpyb +.section slpza +.section slpzb +.section slp1a +.section slp1b +.section slp2a +.section slp2b +.section slp3a +.section slp3b +.section slp4a +.section slp4b +.section slp5a +.section slp5b +.section slp6a +.section slp6b +.section slp7a +.section slp7b +.section slp8a +.section slp8b +.section slp9a +.section slp9b +.section slp0a +.section slp0b +.section slqaa +.section slqab +.section slqba +.section slqbb +.section slqca +.section slqcb +.section slqda +.section slqdb +.section slqea +.section slqeb +.section slqfa +.section slqfb +.section slqga +.section slqgb +.section slqha +.section slqhb +.section slqia +.section slqib +.section slqja +.section slqjb +.section slqka +.section slqkb +.section slqla +.section slqlb +.section slqma +.section slqmb +.section slqna +.section slqnb +.section slqoa +.section slqob +.section slqpa +.section slqpb +.section slqqa +.section slqqb +.section slqra +.section slqrb +.section slqsa +.section slqsb +.section slqta +.section slqtb +.section slqua +.section slqub +.section slqva +.section slqvb +.section slqwa +.section slqwb +.section slqxa +.section slqxb +.section slqya +.section slqyb +.section slqza +.section slqzb +.section slq1a +.section slq1b +.section slq2a +.section slq2b +.section slq3a +.section slq3b +.section slq4a +.section slq4b +.section slq5a +.section slq5b +.section slq6a +.section slq6b +.section slq7a +.section slq7b +.section slq8a +.section slq8b +.section slq9a +.section slq9b +.section slq0a +.section slq0b +.section slraa +.section slrab +.section slrba +.section slrbb +.section slrca +.section slrcb +.section slrda +.section slrdb +.section slrea +.section slreb +.section slrfa +.section slrfb +.section slrga +.section slrgb +.section slrha +.section slrhb +.section slria +.section slrib +.section slrja +.section slrjb +.section slrka +.section slrkb +.section slrla +.section slrlb +.section slrma +.section slrmb +.section slrna +.section slrnb +.section slroa +.section slrob +.section slrpa +.section slrpb +.section slrqa +.section slrqb +.section slrra +.section slrrb +.section slrsa +.section slrsb +.section slrta +.section slrtb +.section slrua +.section slrub +.section slrva +.section slrvb +.section slrwa +.section slrwb +.section slrxa +.section slrxb +.section slrya +.section slryb +.section slrza +.section slrzb +.section slr1a +.section slr1b +.section slr2a +.section slr2b +.section slr3a +.section slr3b +.section slr4a +.section slr4b +.section slr5a +.section slr5b +.section slr6a +.section slr6b +.section slr7a +.section slr7b +.section slr8a +.section slr8b +.section slr9a +.section slr9b +.section slr0a +.section slr0b +.section slsaa +.section slsab +.section slsba +.section slsbb +.section slsca +.section slscb +.section slsda +.section slsdb +.section slsea +.section slseb +.section slsfa +.section slsfb +.section slsga +.section slsgb +.section slsha +.section slshb +.section slsia +.section slsib +.section slsja +.section slsjb +.section slska +.section slskb +.section slsla +.section slslb +.section slsma +.section slsmb +.section slsna +.section slsnb +.section slsoa +.section slsob +.section slspa +.section slspb +.section slsqa +.section slsqb +.section slsra +.section slsrb +.section slssa +.section slssb +.section slsta +.section slstb +.section slsua +.section slsub +.section slsva +.section slsvb +.section slswa +.section slswb +.section slsxa +.section slsxb +.section slsya +.section slsyb +.section slsza +.section slszb +.section sls1a +.section sls1b +.section sls2a +.section sls2b +.section sls3a +.section sls3b +.section sls4a +.section sls4b +.section sls5a +.section sls5b +.section sls6a +.section sls6b +.section sls7a +.section sls7b +.section sls8a +.section sls8b +.section sls9a +.section sls9b +.section sls0a +.section sls0b +.section sltaa +.section sltab +.section sltba +.section sltbb +.section sltca +.section sltcb +.section sltda +.section sltdb +.section sltea +.section slteb +.section sltfa +.section sltfb +.section sltga +.section sltgb +.section sltha +.section slthb +.section sltia +.section sltib +.section sltja +.section sltjb +.section sltka +.section sltkb +.section sltla +.section sltlb +.section sltma +.section sltmb +.section sltna +.section sltnb +.section sltoa +.section sltob +.section sltpa +.section sltpb +.section sltqa +.section sltqb +.section sltra +.section sltrb +.section sltsa +.section sltsb +.section sltta +.section slttb +.section sltua +.section sltub +.section sltva +.section sltvb +.section sltwa +.section sltwb +.section sltxa +.section sltxb +.section sltya +.section sltyb +.section sltza +.section sltzb +.section slt1a +.section slt1b +.section slt2a +.section slt2b +.section slt3a +.section slt3b +.section slt4a +.section slt4b +.section slt5a +.section slt5b +.section slt6a +.section slt6b +.section slt7a +.section slt7b +.section slt8a +.section slt8b +.section slt9a +.section slt9b +.section slt0a +.section slt0b +.section sluaa +.section sluab +.section sluba +.section slubb +.section sluca +.section slucb +.section sluda +.section sludb +.section sluea +.section slueb +.section slufa +.section slufb +.section sluga +.section slugb +.section sluha +.section sluhb +.section sluia +.section sluib +.section sluja +.section slujb +.section sluka +.section slukb +.section slula +.section slulb +.section sluma +.section slumb +.section sluna +.section slunb +.section sluoa +.section sluob +.section slupa +.section slupb +.section sluqa +.section sluqb +.section slura +.section slurb +.section slusa +.section slusb +.section sluta +.section slutb +.section sluua +.section sluub +.section sluva +.section sluvb +.section sluwa +.section sluwb +.section sluxa +.section sluxb +.section sluya +.section sluyb +.section sluza +.section sluzb +.section slu1a +.section slu1b +.section slu2a +.section slu2b +.section slu3a +.section slu3b +.section slu4a +.section slu4b +.section slu5a +.section slu5b +.section slu6a +.section slu6b +.section slu7a +.section slu7b +.section slu8a +.section slu8b +.section slu9a +.section slu9b +.section slu0a +.section slu0b +.section slvaa +.section slvab +.section slvba +.section slvbb +.section slvca +.section slvcb +.section slvda +.section slvdb +.section slvea +.section slveb +.section slvfa +.section slvfb +.section slvga +.section slvgb +.section slvha +.section slvhb +.section slvia +.section slvib +.section slvja +.section slvjb +.section slvka +.section slvkb +.section slvla +.section slvlb +.section slvma +.section slvmb +.section slvna +.section slvnb +.section slvoa +.section slvob +.section slvpa +.section slvpb +.section slvqa +.section slvqb +.section slvra +.section slvrb +.section slvsa +.section slvsb +.section slvta +.section slvtb +.section slvua +.section slvub +.section slvva +.section slvvb +.section slvwa +.section slvwb +.section slvxa +.section slvxb +.section slvya +.section slvyb +.section slvza +.section slvzb +.section slv1a +.section slv1b +.section slv2a +.section slv2b +.section slv3a +.section slv3b +.section slv4a +.section slv4b +.section slv5a +.section slv5b +.section slv6a +.section slv6b +.section slv7a +.section slv7b +.section slv8a +.section slv8b +.section slv9a +.section slv9b +.section slv0a +.section slv0b +.section slwaa +.section slwab +.section slwba +.section slwbb +.section slwca +.section slwcb +.section slwda +.section slwdb +.section slwea +.section slweb +.section slwfa +.section slwfb +.section slwga +.section slwgb +.section slwha +.section slwhb +.section slwia +.section slwib +.section slwja +.section slwjb +.section slwka +.section slwkb +.section slwla +.section slwlb +.section slwma +.section slwmb +.section slwna +.section slwnb +.section slwoa +.section slwob +.section slwpa +.section slwpb +.section slwqa +.section slwqb +.section slwra +.section slwrb +.section slwsa +.section slwsb +.section slwta +.section slwtb +.section slwua +.section slwub +.section slwva +.section slwvb +.section slwwa +.section slwwb +.section slwxa +.section slwxb +.section slwya +.section slwyb +.section slwza +.section slwzb +.section slw1a +.section slw1b +.section slw2a +.section slw2b +.section slw3a +.section slw3b +.section slw4a +.section slw4b +.section slw5a +.section slw5b +.section slw6a +.section slw6b +.section slw7a +.section slw7b +.section slw8a +.section slw8b +.section slw9a +.section slw9b +.section slw0a +.section slw0b +.section slxaa +.section slxab +.section slxba +.section slxbb +.section slxca +.section slxcb +.section slxda +.section slxdb +.section slxea +.section slxeb +.section slxfa +.section slxfb +.section slxga +.section slxgb +.section slxha +.section slxhb +.section slxia +.section slxib +.section slxja +.section slxjb +.section slxka +.section slxkb +.section slxla +.section slxlb +.section slxma +.section slxmb +.section slxna +.section slxnb +.section slxoa +.section slxob +.section slxpa +.section slxpb +.section slxqa +.section slxqb +.section slxra +.section slxrb +.section slxsa +.section slxsb +.section slxta +.section slxtb +.section slxua +.section slxub +.section slxva +.section slxvb +.section slxwa +.section slxwb +.section slxxa +.section slxxb +.section slxya +.section slxyb +.section slxza +.section slxzb +.section slx1a +.section slx1b +.section slx2a +.section slx2b +.section slx3a +.section slx3b +.section slx4a +.section slx4b +.section slx5a +.section slx5b +.section slx6a +.section slx6b +.section slx7a +.section slx7b +.section slx8a +.section slx8b +.section slx9a +.section slx9b +.section slx0a +.section slx0b +.section slyaa +.section slyab +.section slyba +.section slybb +.section slyca +.section slycb +.section slyda +.section slydb +.section slyea +.section slyeb +.section slyfa +.section slyfb +.section slyga +.section slygb +.section slyha +.section slyhb +.section slyia +.section slyib +.section slyja +.section slyjb +.section slyka +.section slykb +.section slyla +.section slylb +.section slyma +.section slymb +.section slyna +.section slynb +.section slyoa +.section slyob +.section slypa +.section slypb +.section slyqa +.section slyqb +.section slyra +.section slyrb +.section slysa +.section slysb +.section slyta +.section slytb +.section slyua +.section slyub +.section slyva +.section slyvb +.section slywa +.section slywb +.section slyxa +.section slyxb +.section slyya +.section slyyb +.section slyza +.section slyzb +.section sly1a +.section sly1b +.section sly2a +.section sly2b +.section sly3a +.section sly3b +.section sly4a +.section sly4b +.section sly5a +.section sly5b +.section sly6a +.section sly6b +.section sly7a +.section sly7b +.section sly8a +.section sly8b +.section sly9a +.section sly9b +.section sly0a +.section sly0b +.section slzaa +.section slzab +.section slzba +.section slzbb +.section slzca +.section slzcb +.section slzda +.section slzdb +.section slzea +.section slzeb +.section slzfa +.section slzfb +.section slzga +.section slzgb +.section slzha +.section slzhb +.section slzia +.section slzib +.section slzja +.section slzjb +.section slzka +.section slzkb +.section slzla +.section slzlb +.section slzma +.section slzmb +.section slzna +.section slznb +.section slzoa +.section slzob +.section slzpa +.section slzpb +.section slzqa +.section slzqb +.section slzra +.section slzrb +.section slzsa +.section slzsb +.section slzta +.section slztb +.section slzua +.section slzub +.section slzva +.section slzvb +.section slzwa +.section slzwb +.section slzxa +.section slzxb +.section slzya +.section slzyb +.section slzza +.section slzzb +.section slz1a +.section slz1b +.section slz2a +.section slz2b +.section slz3a +.section slz3b +.section slz4a +.section slz4b +.section slz5a +.section slz5b +.section slz6a +.section slz6b +.section slz7a +.section slz7b +.section slz8a +.section slz8b +.section slz9a +.section slz9b +.section slz0a +.section slz0b +.section sl1aa +.section sl1ab +.section sl1ba +.section sl1bb +.section sl1ca +.section sl1cb +.section sl1da +.section sl1db +.section sl1ea +.section sl1eb +.section sl1fa +.section sl1fb +.section sl1ga +.section sl1gb +.section sl1ha +.section sl1hb +.section sl1ia +.section sl1ib +.section sl1ja +.section sl1jb +.section sl1ka +.section sl1kb +.section sl1la +.section sl1lb +.section sl1ma +.section sl1mb +.section sl1na +.section sl1nb +.section sl1oa +.section sl1ob +.section sl1pa +.section sl1pb +.section sl1qa +.section sl1qb +.section sl1ra +.section sl1rb +.section sl1sa +.section sl1sb +.section sl1ta +.section sl1tb +.section sl1ua +.section sl1ub +.section sl1va +.section sl1vb +.section sl1wa +.section sl1wb +.section sl1xa +.section sl1xb +.section sl1ya +.section sl1yb +.section sl1za +.section sl1zb +.section sl11a +.section sl11b +.section sl12a +.section sl12b +.section sl13a +.section sl13b +.section sl14a +.section sl14b +.section sl15a +.section sl15b +.section sl16a +.section sl16b +.section sl17a +.section sl17b +.section sl18a +.section sl18b +.section sl19a +.section sl19b +.section sl10a +.section sl10b +.section sl2aa +.section sl2ab +.section sl2ba +.section sl2bb +.section sl2ca +.section sl2cb +.section sl2da +.section sl2db +.section sl2ea +.section sl2eb +.section sl2fa +.section sl2fb +.section sl2ga +.section sl2gb +.section sl2ha +.section sl2hb +.section sl2ia +.section sl2ib +.section sl2ja +.section sl2jb +.section sl2ka +.section sl2kb +.section sl2la +.section sl2lb +.section sl2ma +.section sl2mb +.section sl2na +.section sl2nb +.section sl2oa +.section sl2ob +.section sl2pa +.section sl2pb +.section sl2qa +.section sl2qb +.section sl2ra +.section sl2rb +.section sl2sa +.section sl2sb +.section sl2ta +.section sl2tb +.section sl2ua +.section sl2ub +.section sl2va +.section sl2vb +.section sl2wa +.section sl2wb +.section sl2xa +.section sl2xb +.section sl2ya +.section sl2yb +.section sl2za +.section sl2zb +.section sl21a +.section sl21b +.section sl22a +.section sl22b +.section sl23a +.section sl23b +.section sl24a +.section sl24b +.section sl25a +.section sl25b +.section sl26a +.section sl26b +.section sl27a +.section sl27b +.section sl28a +.section sl28b +.section sl29a +.section sl29b +.section sl20a +.section sl20b +.section sl3aa +.section sl3ab +.section sl3ba +.section sl3bb +.section sl3ca +.section sl3cb +.section sl3da +.section sl3db +.section sl3ea +.section sl3eb +.section sl3fa +.section sl3fb +.section sl3ga +.section sl3gb +.section sl3ha +.section sl3hb +.section sl3ia +.section sl3ib +.section sl3ja +.section sl3jb +.section sl3ka +.section sl3kb +.section sl3la +.section sl3lb +.section sl3ma +.section sl3mb +.section sl3na +.section sl3nb +.section sl3oa +.section sl3ob +.section sl3pa +.section sl3pb +.section sl3qa +.section sl3qb +.section sl3ra +.section sl3rb +.section sl3sa +.section sl3sb +.section sl3ta +.section sl3tb +.section sl3ua +.section sl3ub +.section sl3va +.section sl3vb +.section sl3wa +.section sl3wb +.section sl3xa +.section sl3xb +.section sl3ya +.section sl3yb +.section sl3za +.section sl3zb +.section sl31a +.section sl31b +.section sl32a +.section sl32b +.section sl33a +.section sl33b +.section sl34a +.section sl34b +.section sl35a +.section sl35b +.section sl36a +.section sl36b +.section sl37a +.section sl37b +.section sl38a +.section sl38b +.section sl39a +.section sl39b +.section sl30a +.section sl30b +.section sl4aa +.section sl4ab +.section sl4ba +.section sl4bb +.section sl4ca +.section sl4cb +.section sl4da +.section sl4db +.section sl4ea +.section sl4eb +.section sl4fa +.section sl4fb +.section sl4ga +.section sl4gb +.section sl4ha +.section sl4hb +.section sl4ia +.section sl4ib +.section sl4ja +.section sl4jb +.section sl4ka +.section sl4kb +.section sl4la +.section sl4lb +.section sl4ma +.section sl4mb +.section sl4na +.section sl4nb +.section sl4oa +.section sl4ob +.section sl4pa +.section sl4pb +.section sl4qa +.section sl4qb +.section sl4ra +.section sl4rb +.section sl4sa +.section sl4sb +.section sl4ta +.section sl4tb +.section sl4ua +.section sl4ub +.section sl4va +.section sl4vb +.section sl4wa +.section sl4wb +.section sl4xa +.section sl4xb +.section sl4ya +.section sl4yb +.section sl4za +.section sl4zb +.section sl41a +.section sl41b +.section sl42a +.section sl42b +.section sl43a +.section sl43b +.section sl44a +.section sl44b +.section sl45a +.section sl45b +.section sl46a +.section sl46b +.section sl47a +.section sl47b +.section sl48a +.section sl48b +.section sl49a +.section sl49b +.section sl40a +.section sl40b +.section sl5aa +.section sl5ab +.section sl5ba +.section sl5bb +.section sl5ca +.section sl5cb +.section sl5da +.section sl5db +.section sl5ea +.section sl5eb +.section sl5fa +.section sl5fb +.section sl5ga +.section sl5gb +.section sl5ha +.section sl5hb +.section sl5ia +.section sl5ib +.section sl5ja +.section sl5jb +.section sl5ka +.section sl5kb +.section sl5la +.section sl5lb +.section sl5ma +.section sl5mb +.section sl5na +.section sl5nb +.section sl5oa +.section sl5ob +.section sl5pa +.section sl5pb +.section sl5qa +.section sl5qb +.section sl5ra +.section sl5rb +.section sl5sa +.section sl5sb +.section sl5ta +.section sl5tb +.section sl5ua +.section sl5ub +.section sl5va +.section sl5vb +.section sl5wa +.section sl5wb +.section sl5xa +.section sl5xb +.section sl5ya +.section sl5yb +.section sl5za +.section sl5zb +.section sl51a +.section sl51b +.section sl52a +.section sl52b +.section sl53a +.section sl53b +.section sl54a +.section sl54b +.section sl55a +.section sl55b +.section sl56a +.section sl56b +.section sl57a +.section sl57b +.section sl58a +.section sl58b +.section sl59a +.section sl59b +.section sl50a +.section sl50b +.section sl6aa +.section sl6ab +.section sl6ba +.section sl6bb +.section sl6ca +.section sl6cb +.section sl6da +.section sl6db +.section sl6ea +.section sl6eb +.section sl6fa +.section sl6fb +.section sl6ga +.section sl6gb +.section sl6ha +.section sl6hb +.section sl6ia +.section sl6ib +.section sl6ja +.section sl6jb +.section sl6ka +.section sl6kb +.section sl6la +.section sl6lb +.section sl6ma +.section sl6mb +.section sl6na +.section sl6nb +.section sl6oa +.section sl6ob +.section sl6pa +.section sl6pb +.section sl6qa +.section sl6qb +.section sl6ra +.section sl6rb +.section sl6sa +.section sl6sb +.section sl6ta +.section sl6tb +.section sl6ua +.section sl6ub +.section sl6va +.section sl6vb +.section sl6wa +.section sl6wb +.section sl6xa +.section sl6xb +.section sl6ya +.section sl6yb +.section sl6za +.section sl6zb +.section sl61a +.section sl61b +.section sl62a +.section sl62b +.section sl63a +.section sl63b +.section sl64a +.section sl64b +.section sl65a +.section sl65b +.section sl66a +.section sl66b +.section sl67a +.section sl67b +.section sl68a +.section sl68b +.section sl69a +.section sl69b +.section sl60a +.section sl60b +.section sl7aa +.section sl7ab +.section sl7ba +.section sl7bb +.section sl7ca +.section sl7cb +.section sl7da +.section sl7db +.section sl7ea +.section sl7eb +.section sl7fa +.section sl7fb +.section sl7ga +.section sl7gb +.section sl7ha +.section sl7hb +.section sl7ia +.section sl7ib +.section sl7ja +.section sl7jb +.section sl7ka +.section sl7kb +.section sl7la +.section sl7lb +.section sl7ma +.section sl7mb +.section sl7na +.section sl7nb +.section sl7oa +.section sl7ob +.section sl7pa +.section sl7pb +.section sl7qa +.section sl7qb +.section sl7ra +.section sl7rb +.section sl7sa +.section sl7sb +.section sl7ta +.section sl7tb +.section sl7ua +.section sl7ub +.section sl7va +.section sl7vb +.section sl7wa +.section sl7wb +.section sl7xa +.section sl7xb +.section sl7ya +.section sl7yb +.section sl7za +.section sl7zb +.section sl71a +.section sl71b +.section sl72a +.section sl72b +.section sl73a +.section sl73b +.section sl74a +.section sl74b +.section sl75a +.section sl75b +.section sl76a +.section sl76b +.section sl77a +.section sl77b +.section sl78a +.section sl78b +.section sl79a +.section sl79b +.section sl70a +.section sl70b +.section sl8aa +.section sl8ab +.section sl8ba +.section sl8bb +.section sl8ca +.section sl8cb +.section sl8da +.section sl8db +.section sl8ea +.section sl8eb +.section sl8fa +.section sl8fb +.section sl8ga +.section sl8gb +.section sl8ha +.section sl8hb +.section sl8ia +.section sl8ib +.section sl8ja +.section sl8jb +.section sl8ka +.section sl8kb +.section sl8la +.section sl8lb +.section sl8ma +.section sl8mb +.section sl8na +.section sl8nb +.section sl8oa +.section sl8ob +.section sl8pa +.section sl8pb +.section sl8qa +.section sl8qb +.section sl8ra +.section sl8rb +.section sl8sa +.section sl8sb +.section sl8ta +.section sl8tb +.section sl8ua +.section sl8ub +.section sl8va +.section sl8vb +.section sl8wa +.section sl8wb +.section sl8xa +.section sl8xb +.section sl8ya +.section sl8yb +.section sl8za +.section sl8zb +.section sl81a +.section sl81b +.section sl82a +.section sl82b +.section sl83a +.section sl83b +.section sl84a +.section sl84b +.section sl85a +.section sl85b +.section sl86a +.section sl86b +.section sl87a +.section sl87b +.section sl88a +.section sl88b +.section sl89a +.section sl89b +.section sl80a +.section sl80b +.section sl9aa +.section sl9ab +.section sl9ba +.section sl9bb +.section sl9ca +.section sl9cb +.section sl9da +.section sl9db +.section sl9ea +.section sl9eb +.section sl9fa +.section sl9fb +.section sl9ga +.section sl9gb +.section sl9ha +.section sl9hb +.section sl9ia +.section sl9ib +.section sl9ja +.section sl9jb +.section sl9ka +.section sl9kb +.section sl9la +.section sl9lb +.section sl9ma +.section sl9mb +.section sl9na +.section sl9nb +.section sl9oa +.section sl9ob +.section sl9pa +.section sl9pb +.section sl9qa +.section sl9qb +.section sl9ra +.section sl9rb +.section sl9sa +.section sl9sb +.section sl9ta +.section sl9tb +.section sl9ua +.section sl9ub +.section sl9va +.section sl9vb +.section sl9wa +.section sl9wb +.section sl9xa +.section sl9xb +.section sl9ya +.section sl9yb +.section sl9za +.section sl9zb +.section sl91a +.section sl91b +.section sl92a +.section sl92b +.section sl93a +.section sl93b +.section sl94a +.section sl94b +.section sl95a +.section sl95b +.section sl96a +.section sl96b +.section sl97a +.section sl97b +.section sl98a +.section sl98b +.section sl99a +.section sl99b +.section sl90a +.section sl90b +.section sl0aa +.section sl0ab +.section sl0ba +.section sl0bb +.section sl0ca +.section sl0cb +.section sl0da +.section sl0db +.section sl0ea +.section sl0eb +.section sl0fa +.section sl0fb +.section sl0ga +.section sl0gb +.section sl0ha +.section sl0hb +.section sl0ia +.section sl0ib +.section sl0ja +.section sl0jb +.section sl0ka +.section sl0kb +.section sl0la +.section sl0lb +.section sl0ma +.section sl0mb +.section sl0na +.section sl0nb +.section sl0oa +.section sl0ob +.section sl0pa +.section sl0pb +.section sl0qa +.section sl0qb +.section sl0ra +.section sl0rb +.section sl0sa +.section sl0sb +.section sl0ta +.section sl0tb +.section sl0ua +.section sl0ub +.section sl0va +.section sl0vb +.section sl0wa +.section sl0wb +.section sl0xa +.section sl0xb +.section sl0ya +.section sl0yb +.section sl0za +.section sl0zb +.section sl01a +.section sl01b +.section sl02a +.section sl02b +.section sl03a +.section sl03b +.section sl04a +.section sl04b +.section sl05a +.section sl05b +.section sl06a +.section sl06b +.section sl07a +.section sl07b +.section sl08a +.section sl08b +.section sl09a +.section sl09b +.section sl00a +.section sl00b +.section smaaa +.section smaab +.section smaba +.section smabb +.section smaca +.section smacb +.section smada +.section smadb +.section smaea +.section smaeb +.section smafa +.section smafb +.section smaga +.section smagb +.section smaha +.section smahb +.section smaia +.section smaib +.section smaja +.section smajb +.section smaka +.section smakb +.section smala +.section smalb +.section smama +.section smamb +.section smana +.section smanb +.section smaoa +.section smaob +.section smapa +.section smapb +.section smaqa +.section smaqb +.section smara +.section smarb +.section smasa +.section smasb +.section smata +.section smatb +.section smaua +.section smaub +.section smava +.section smavb +.section smawa +.section smawb +.section smaxa +.section smaxb +.section smaya +.section smayb +.section smaza +.section smazb +.section sma1a +.section sma1b +.section sma2a +.section sma2b +.section sma3a +.section sma3b +.section sma4a +.section sma4b +.section sma5a +.section sma5b +.section sma6a +.section sma6b +.section sma7a +.section sma7b +.section sma8a +.section sma8b +.section sma9a +.section sma9b +.section sma0a +.section sma0b +.section smbaa +.section smbab +.section smbba +.section smbbb +.section smbca +.section smbcb +.section smbda +.section smbdb +.section smbea +.section smbeb +.section smbfa +.section smbfb +.section smbga +.section smbgb +.section smbha +.section smbhb +.section smbia +.section smbib +.section smbja +.section smbjb +.section smbka +.section smbkb +.section smbla +.section smblb +.section smbma +.section smbmb +.section smbna +.section smbnb +.section smboa +.section smbob +.section smbpa +.section smbpb +.section smbqa +.section smbqb +.section smbra +.section smbrb +.section smbsa +.section smbsb +.section smbta +.section smbtb +.section smbua +.section smbub +.section smbva +.section smbvb +.section smbwa +.section smbwb +.section smbxa +.section smbxb +.section smbya +.section smbyb +.section smbza +.section smbzb +.section smb1a +.section smb1b +.section smb2a +.section smb2b +.section smb3a +.section smb3b +.section smb4a +.section smb4b +.section smb5a +.section smb5b +.section smb6a +.section smb6b +.section smb7a +.section smb7b +.section smb8a +.section smb8b +.section smb9a +.section smb9b +.section smb0a +.section smb0b +.section smcaa +.section smcab +.section smcba +.section smcbb +.section smcca +.section smccb +.section smcda +.section smcdb +.section smcea +.section smceb +.section smcfa +.section smcfb +.section smcga +.section smcgb +.section smcha +.section smchb +.section smcia +.section smcib +.section smcja +.section smcjb +.section smcka +.section smckb +.section smcla +.section smclb +.section smcma +.section smcmb +.section smcna +.section smcnb +.section smcoa +.section smcob +.section smcpa +.section smcpb +.section smcqa +.section smcqb +.section smcra +.section smcrb +.section smcsa +.section smcsb +.section smcta +.section smctb +.section smcua +.section smcub +.section smcva +.section smcvb +.section smcwa +.section smcwb +.section smcxa +.section smcxb +.section smcya +.section smcyb +.section smcza +.section smczb +.section smc1a +.section smc1b +.section smc2a +.section smc2b +.section smc3a +.section smc3b +.section smc4a +.section smc4b +.section smc5a +.section smc5b +.section smc6a +.section smc6b +.section smc7a +.section smc7b +.section smc8a +.section smc8b +.section smc9a +.section smc9b +.section smc0a +.section smc0b +.section smdaa +.section smdab +.section smdba +.section smdbb +.section smdca +.section smdcb +.section smdda +.section smddb +.section smdea +.section smdeb +.section smdfa +.section smdfb +.section smdga +.section smdgb +.section smdha +.section smdhb +.section smdia +.section smdib +.section smdja +.section smdjb +.section smdka +.section smdkb +.section smdla +.section smdlb +.section smdma +.section smdmb +.section smdna +.section smdnb +.section smdoa +.section smdob +.section smdpa +.section smdpb +.section smdqa +.section smdqb +.section smdra +.section smdrb +.section smdsa +.section smdsb +.section smdta +.section smdtb +.section smdua +.section smdub +.section smdva +.section smdvb +.section smdwa +.section smdwb +.section smdxa +.section smdxb +.section smdya +.section smdyb +.section smdza +.section smdzb +.section smd1a +.section smd1b +.section smd2a +.section smd2b +.section smd3a +.section smd3b +.section smd4a +.section smd4b +.section smd5a +.section smd5b +.section smd6a +.section smd6b +.section smd7a +.section smd7b +.section smd8a +.section smd8b +.section smd9a +.section smd9b +.section smd0a +.section smd0b +.section smeaa +.section smeab +.section smeba +.section smebb +.section smeca +.section smecb +.section smeda +.section smedb +.section smeea +.section smeeb +.section smefa +.section smefb +.section smega +.section smegb +.section smeha +.section smehb +.section smeia +.section smeib +.section smeja +.section smejb +.section smeka +.section smekb +.section smela +.section smelb +.section smema +.section smemb +.section smena +.section smenb +.section smeoa +.section smeob +.section smepa +.section smepb +.section smeqa +.section smeqb +.section smera +.section smerb +.section smesa +.section smesb +.section smeta +.section smetb +.section smeua +.section smeub +.section smeva +.section smevb +.section smewa +.section smewb +.section smexa +.section smexb +.section smeya +.section smeyb +.section smeza +.section smezb +.section sme1a +.section sme1b +.section sme2a +.section sme2b +.section sme3a +.section sme3b +.section sme4a +.section sme4b +.section sme5a +.section sme5b +.section sme6a +.section sme6b +.section sme7a +.section sme7b +.section sme8a +.section sme8b +.section sme9a +.section sme9b +.section sme0a +.section sme0b +.section smfaa +.section smfab +.section smfba +.section smfbb +.section smfca +.section smfcb +.section smfda +.section smfdb +.section smfea +.section smfeb +.section smffa +.section smffb +.section smfga +.section smfgb +.section smfha +.section smfhb +.section smfia +.section smfib +.section smfja +.section smfjb +.section smfka +.section smfkb +.section smfla +.section smflb +.section smfma +.section smfmb +.section smfna +.section smfnb +.section smfoa +.section smfob +.section smfpa +.section smfpb +.section smfqa +.section smfqb +.section smfra +.section smfrb +.section smfsa +.section smfsb +.section smfta +.section smftb +.section smfua +.section smfub +.section smfva +.section smfvb +.section smfwa +.section smfwb +.section smfxa +.section smfxb +.section smfya +.section smfyb +.section smfza +.section smfzb +.section smf1a +.section smf1b +.section smf2a +.section smf2b +.section smf3a +.section smf3b +.section smf4a +.section smf4b +.section smf5a +.section smf5b +.section smf6a +.section smf6b +.section smf7a +.section smf7b +.section smf8a +.section smf8b +.section smf9a +.section smf9b +.section smf0a +.section smf0b +.section smgaa +.section smgab +.section smgba +.section smgbb +.section smgca +.section smgcb +.section smgda +.section smgdb +.section smgea +.section smgeb +.section smgfa +.section smgfb +.section smgga +.section smggb +.section smgha +.section smghb +.section smgia +.section smgib +.section smgja +.section smgjb +.section smgka +.section smgkb +.section smgla +.section smglb +.section smgma +.section smgmb +.section smgna +.section smgnb +.section smgoa +.section smgob +.section smgpa +.section smgpb +.section smgqa +.section smgqb +.section smgra +.section smgrb +.section smgsa +.section smgsb +.section smgta +.section smgtb +.section smgua +.section smgub +.section smgva +.section smgvb +.section smgwa +.section smgwb +.section smgxa +.section smgxb +.section smgya +.section smgyb +.section smgza +.section smgzb +.section smg1a +.section smg1b +.section smg2a +.section smg2b +.section smg3a +.section smg3b +.section smg4a +.section smg4b +.section smg5a +.section smg5b +.section smg6a +.section smg6b +.section smg7a +.section smg7b +.section smg8a +.section smg8b +.section smg9a +.section smg9b +.section smg0a +.section smg0b +.section smhaa +.section smhab +.section smhba +.section smhbb +.section smhca +.section smhcb +.section smhda +.section smhdb +.section smhea +.section smheb +.section smhfa +.section smhfb +.section smhga +.section smhgb +.section smhha +.section smhhb +.section smhia +.section smhib +.section smhja +.section smhjb +.section smhka +.section smhkb +.section smhla +.section smhlb +.section smhma +.section smhmb +.section smhna +.section smhnb +.section smhoa +.section smhob +.section smhpa +.section smhpb +.section smhqa +.section smhqb +.section smhra +.section smhrb +.section smhsa +.section smhsb +.section smhta +.section smhtb +.section smhua +.section smhub +.section smhva +.section smhvb +.section smhwa +.section smhwb +.section smhxa +.section smhxb +.section smhya +.section smhyb +.section smhza +.section smhzb +.section smh1a +.section smh1b +.section smh2a +.section smh2b +.section smh3a +.section smh3b +.section smh4a +.section smh4b +.section smh5a +.section smh5b +.section smh6a +.section smh6b +.section smh7a +.section smh7b +.section smh8a +.section smh8b +.section smh9a +.section smh9b +.section smh0a +.section smh0b +.section smiaa +.section smiab +.section smiba +.section smibb +.section smica +.section smicb +.section smida +.section smidb +.section smiea +.section smieb +.section smifa +.section smifb +.section smiga +.section smigb +.section smiha +.section smihb +.section smiia +.section smiib +.section smija +.section smijb +.section smika +.section smikb +.section smila +.section smilb +.section smima +.section smimb +.section smina +.section sminb +.section smioa +.section smiob +.section smipa +.section smipb +.section smiqa +.section smiqb +.section smira +.section smirb +.section smisa +.section smisb +.section smita +.section smitb +.section smiua +.section smiub +.section smiva +.section smivb +.section smiwa +.section smiwb +.section smixa +.section smixb +.section smiya +.section smiyb +.section smiza +.section smizb +.section smi1a +.section smi1b +.section smi2a +.section smi2b +.section smi3a +.section smi3b +.section smi4a +.section smi4b +.section smi5a +.section smi5b +.section smi6a +.section smi6b +.section smi7a +.section smi7b +.section smi8a +.section smi8b +.section smi9a +.section smi9b +.section smi0a +.section smi0b +.section smjaa +.section smjab +.section smjba +.section smjbb +.section smjca +.section smjcb +.section smjda +.section smjdb +.section smjea +.section smjeb +.section smjfa +.section smjfb +.section smjga +.section smjgb +.section smjha +.section smjhb +.section smjia +.section smjib +.section smjja +.section smjjb +.section smjka +.section smjkb +.section smjla +.section smjlb +.section smjma +.section smjmb +.section smjna +.section smjnb +.section smjoa +.section smjob +.section smjpa +.section smjpb +.section smjqa +.section smjqb +.section smjra +.section smjrb +.section smjsa +.section smjsb +.section smjta +.section smjtb +.section smjua +.section smjub +.section smjva +.section smjvb +.section smjwa +.section smjwb +.section smjxa +.section smjxb +.section smjya +.section smjyb +.section smjza +.section smjzb +.section smj1a +.section smj1b +.section smj2a +.section smj2b +.section smj3a +.section smj3b +.section smj4a +.section smj4b +.section smj5a +.section smj5b +.section smj6a +.section smj6b +.section smj7a +.section smj7b +.section smj8a +.section smj8b +.section smj9a +.section smj9b +.section smj0a +.section smj0b +.section smkaa +.section smkab +.section smkba +.section smkbb +.section smkca +.section smkcb +.section smkda +.section smkdb +.section smkea +.section smkeb +.section smkfa +.section smkfb +.section smkga +.section smkgb +.section smkha +.section smkhb +.section smkia +.section smkib +.section smkja +.section smkjb +.section smkka +.section smkkb +.section smkla +.section smklb +.section smkma +.section smkmb +.section smkna +.section smknb +.section smkoa +.section smkob +.section smkpa +.section smkpb +.section smkqa +.section smkqb +.section smkra +.section smkrb +.section smksa +.section smksb +.section smkta +.section smktb +.section smkua +.section smkub +.section smkva +.section smkvb +.section smkwa +.section smkwb +.section smkxa +.section smkxb +.section smkya +.section smkyb +.section smkza +.section smkzb +.section smk1a +.section smk1b +.section smk2a +.section smk2b +.section smk3a +.section smk3b +.section smk4a +.section smk4b +.section smk5a +.section smk5b +.section smk6a +.section smk6b +.section smk7a +.section smk7b +.section smk8a +.section smk8b +.section smk9a +.section smk9b +.section smk0a +.section smk0b +.section smlaa +.section smlab +.section smlba +.section smlbb +.section smlca +.section smlcb +.section smlda +.section smldb +.section smlea +.section smleb +.section smlfa +.section smlfb +.section smlga +.section smlgb +.section smlha +.section smlhb +.section smlia +.section smlib +.section smlja +.section smljb +.section smlka +.section smlkb +.section smlla +.section smllb +.section smlma +.section smlmb +.section smlna +.section smlnb +.section smloa +.section smlob +.section smlpa +.section smlpb +.section smlqa +.section smlqb +.section smlra +.section smlrb +.section smlsa +.section smlsb +.section smlta +.section smltb +.section smlua +.section smlub +.section smlva +.section smlvb +.section smlwa +.section smlwb +.section smlxa +.section smlxb +.section smlya +.section smlyb +.section smlza +.section smlzb +.section sml1a +.section sml1b +.section sml2a +.section sml2b +.section sml3a +.section sml3b +.section sml4a +.section sml4b +.section sml5a +.section sml5b +.section sml6a +.section sml6b +.section sml7a +.section sml7b +.section sml8a +.section sml8b +.section sml9a +.section sml9b +.section sml0a +.section sml0b +.section smmaa +.section smmab +.section smmba +.section smmbb +.section smmca +.section smmcb +.section smmda +.section smmdb +.section smmea +.section smmeb +.section smmfa +.section smmfb +.section smmga +.section smmgb +.section smmha +.section smmhb +.section smmia +.section smmib +.section smmja +.section smmjb +.section smmka +.section smmkb +.section smmla +.section smmlb +.section smmma +.section smmmb +.section smmna +.section smmnb +.section smmoa +.section smmob +.section smmpa +.section smmpb +.section smmqa +.section smmqb +.section smmra +.section smmrb +.section smmsa +.section smmsb +.section smmta +.section smmtb +.section smmua +.section smmub +.section smmva +.section smmvb +.section smmwa +.section smmwb +.section smmxa +.section smmxb +.section smmya +.section smmyb +.section smmza +.section smmzb +.section smm1a +.section smm1b +.section smm2a +.section smm2b +.section smm3a +.section smm3b +.section smm4a +.section smm4b +.section smm5a +.section smm5b +.section smm6a +.section smm6b +.section smm7a +.section smm7b +.section smm8a +.section smm8b +.section smm9a +.section smm9b +.section smm0a +.section smm0b +.section smnaa +.section smnab +.section smnba +.section smnbb +.section smnca +.section smncb +.section smnda +.section smndb +.section smnea +.section smneb +.section smnfa +.section smnfb +.section smnga +.section smngb +.section smnha +.section smnhb +.section smnia +.section smnib +.section smnja +.section smnjb +.section smnka +.section smnkb +.section smnla +.section smnlb +.section smnma +.section smnmb +.section smnna +.section smnnb +.section smnoa +.section smnob +.section smnpa +.section smnpb +.section smnqa +.section smnqb +.section smnra +.section smnrb +.section smnsa +.section smnsb +.section smnta +.section smntb +.section smnua +.section smnub +.section smnva +.section smnvb +.section smnwa +.section smnwb +.section smnxa +.section smnxb +.section smnya +.section smnyb +.section smnza +.section smnzb +.section smn1a +.section smn1b +.section smn2a +.section smn2b +.section smn3a +.section smn3b +.section smn4a +.section smn4b +.section smn5a +.section smn5b +.section smn6a +.section smn6b +.section smn7a +.section smn7b +.section smn8a +.section smn8b +.section smn9a +.section smn9b +.section smn0a +.section smn0b +.section smoaa +.section smoab +.section smoba +.section smobb +.section smoca +.section smocb +.section smoda +.section smodb +.section smoea +.section smoeb +.section smofa +.section smofb +.section smoga +.section smogb +.section smoha +.section smohb +.section smoia +.section smoib +.section smoja +.section smojb +.section smoka +.section smokb +.section smola +.section smolb +.section smoma +.section smomb +.section smona +.section smonb +.section smooa +.section smoob +.section smopa +.section smopb +.section smoqa +.section smoqb +.section smora +.section smorb +.section smosa +.section smosb +.section smota +.section smotb +.section smoua +.section smoub +.section smova +.section smovb +.section smowa +.section smowb +.section smoxa +.section smoxb +.section smoya +.section smoyb +.section smoza +.section smozb +.section smo1a +.section smo1b +.section smo2a +.section smo2b +.section smo3a +.section smo3b +.section smo4a +.section smo4b +.section smo5a +.section smo5b +.section smo6a +.section smo6b +.section smo7a +.section smo7b +.section smo8a +.section smo8b +.section smo9a +.section smo9b +.section smo0a +.section smo0b +.section smpaa +.section smpab +.section smpba +.section smpbb +.section smpca +.section smpcb +.section smpda +.section smpdb +.section smpea +.section smpeb +.section smpfa +.section smpfb +.section smpga +.section smpgb +.section smpha +.section smphb +.section smpia +.section smpib +.section smpja +.section smpjb +.section smpka +.section smpkb +.section smpla +.section smplb +.section smpma +.section smpmb +.section smpna +.section smpnb +.section smpoa +.section smpob +.section smppa +.section smppb +.section smpqa +.section smpqb +.section smpra +.section smprb +.section smpsa +.section smpsb +.section smpta +.section smptb +.section smpua +.section smpub +.section smpva +.section smpvb +.section smpwa +.section smpwb +.section smpxa +.section smpxb +.section smpya +.section smpyb +.section smpza +.section smpzb +.section smp1a +.section smp1b +.section smp2a +.section smp2b +.section smp3a +.section smp3b +.section smp4a +.section smp4b +.section smp5a +.section smp5b +.section smp6a +.section smp6b +.section smp7a +.section smp7b +.section smp8a +.section smp8b +.section smp9a +.section smp9b +.section smp0a +.section smp0b +.section smqaa +.section smqab +.section smqba +.section smqbb +.section smqca +.section smqcb +.section smqda +.section smqdb +.section smqea +.section smqeb +.section smqfa +.section smqfb +.section smqga +.section smqgb +.section smqha +.section smqhb +.section smqia +.section smqib +.section smqja +.section smqjb +.section smqka +.section smqkb +.section smqla +.section smqlb +.section smqma +.section smqmb +.section smqna +.section smqnb +.section smqoa +.section smqob +.section smqpa +.section smqpb +.section smqqa +.section smqqb +.section smqra +.section smqrb +.section smqsa +.section smqsb +.section smqta +.section smqtb +.section smqua +.section smqub +.section smqva +.section smqvb +.section smqwa +.section smqwb +.section smqxa +.section smqxb +.section smqya +.section smqyb +.section smqza +.section smqzb +.section smq1a +.section smq1b +.section smq2a +.section smq2b +.section smq3a +.section smq3b +.section smq4a +.section smq4b +.section smq5a +.section smq5b +.section smq6a +.section smq6b +.section smq7a +.section smq7b +.section smq8a +.section smq8b +.section smq9a +.section smq9b +.section smq0a +.section smq0b +.section smraa +.section smrab +.section smrba +.section smrbb +.section smrca +.section smrcb +.section smrda +.section smrdb +.section smrea +.section smreb +.section smrfa +.section smrfb +.section smrga +.section smrgb +.section smrha +.section smrhb +.section smria +.section smrib +.section smrja +.section smrjb +.section smrka +.section smrkb +.section smrla +.section smrlb +.section smrma +.section smrmb +.section smrna +.section smrnb +.section smroa +.section smrob +.section smrpa +.section smrpb +.section smrqa +.section smrqb +.section smrra +.section smrrb +.section smrsa +.section smrsb +.section smrta +.section smrtb +.section smrua +.section smrub +.section smrva +.section smrvb +.section smrwa +.section smrwb +.section smrxa +.section smrxb +.section smrya +.section smryb +.section smrza +.section smrzb +.section smr1a +.section smr1b +.section smr2a +.section smr2b +.section smr3a +.section smr3b +.section smr4a +.section smr4b +.section smr5a +.section smr5b +.section smr6a +.section smr6b +.section smr7a +.section smr7b +.section smr8a +.section smr8b +.section smr9a +.section smr9b +.section smr0a +.section smr0b +.section smsaa +.section smsab +.section smsba +.section smsbb +.section smsca +.section smscb +.section smsda +.section smsdb +.section smsea +.section smseb +.section smsfa +.section smsfb +.section smsga +.section smsgb +.section smsha +.section smshb +.section smsia +.section smsib +.section smsja +.section smsjb +.section smska +.section smskb +.section smsla +.section smslb +.section smsma +.section smsmb +.section smsna +.section smsnb +.section smsoa +.section smsob +.section smspa +.section smspb +.section smsqa +.section smsqb +.section smsra +.section smsrb +.section smssa +.section smssb +.section smsta +.section smstb +.section smsua +.section smsub +.section smsva +.section smsvb +.section smswa +.section smswb +.section smsxa +.section smsxb +.section smsya +.section smsyb +.section smsza +.section smszb +.section sms1a +.section sms1b +.section sms2a +.section sms2b +.section sms3a +.section sms3b +.section sms4a +.section sms4b +.section sms5a +.section sms5b +.section sms6a +.section sms6b +.section sms7a +.section sms7b +.section sms8a +.section sms8b +.section sms9a +.section sms9b +.section sms0a +.section sms0b +.section smtaa +.section smtab +.section smtba +.section smtbb +.section smtca +.section smtcb +.section smtda +.section smtdb +.section smtea +.section smteb +.section smtfa +.section smtfb +.section smtga +.section smtgb +.section smtha +.section smthb +.section smtia +.section smtib +.section smtja +.section smtjb +.section smtka +.section smtkb +.section smtla +.section smtlb +.section smtma +.section smtmb +.section smtna +.section smtnb +.section smtoa +.section smtob +.section smtpa +.section smtpb +.section smtqa +.section smtqb +.section smtra +.section smtrb +.section smtsa +.section smtsb +.section smtta +.section smttb +.section smtua +.section smtub +.section smtva +.section smtvb +.section smtwa +.section smtwb +.section smtxa +.section smtxb +.section smtya +.section smtyb +.section smtza +.section smtzb +.section smt1a +.section smt1b +.section smt2a +.section smt2b +.section smt3a +.section smt3b +.section smt4a +.section smt4b +.section smt5a +.section smt5b +.section smt6a +.section smt6b +.section smt7a +.section smt7b +.section smt8a +.section smt8b +.section smt9a +.section smt9b +.section smt0a +.section smt0b +.section smuaa +.section smuab +.section smuba +.section smubb +.section smuca +.section smucb +.section smuda +.section smudb +.section smuea +.section smueb +.section smufa +.section smufb +.section smuga +.section smugb +.section smuha +.section smuhb +.section smuia +.section smuib +.section smuja +.section smujb +.section smuka +.section smukb +.section smula +.section smulb +.section smuma +.section smumb +.section smuna +.section smunb +.section smuoa +.section smuob +.section smupa +.section smupb +.section smuqa +.section smuqb +.section smura +.section smurb +.section smusa +.section smusb +.section smuta +.section smutb +.section smuua +.section smuub +.section smuva +.section smuvb +.section smuwa +.section smuwb +.section smuxa +.section smuxb +.section smuya +.section smuyb +.section smuza +.section smuzb +.section smu1a +.section smu1b +.section smu2a +.section smu2b +.section smu3a +.section smu3b +.section smu4a +.section smu4b +.section smu5a +.section smu5b +.section smu6a +.section smu6b +.section smu7a +.section smu7b +.section smu8a +.section smu8b +.section smu9a +.section smu9b +.section smu0a +.section smu0b +.section smvaa +.section smvab +.section smvba +.section smvbb +.section smvca +.section smvcb +.section smvda +.section smvdb +.section smvea +.section smveb +.section smvfa +.section smvfb +.section smvga +.section smvgb +.section smvha +.section smvhb +.section smvia +.section smvib +.section smvja +.section smvjb +.section smvka +.section smvkb +.section smvla +.section smvlb +.section smvma +.section smvmb +.section smvna +.section smvnb +.section smvoa +.section smvob +.section smvpa +.section smvpb +.section smvqa +.section smvqb +.section smvra +.section smvrb +.section smvsa +.section smvsb +.section smvta +.section smvtb +.section smvua +.section smvub +.section smvva +.section smvvb +.section smvwa +.section smvwb +.section smvxa +.section smvxb +.section smvya +.section smvyb +.section smvza +.section smvzb +.section smv1a +.section smv1b +.section smv2a +.section smv2b +.section smv3a +.section smv3b +.section smv4a +.section smv4b +.section smv5a +.section smv5b +.section smv6a +.section smv6b +.section smv7a +.section smv7b +.section smv8a +.section smv8b +.section smv9a +.section smv9b +.section smv0a +.section smv0b +.section smwaa +.section smwab +.section smwba +.section smwbb +.section smwca +.section smwcb +.section smwda +.section smwdb +.section smwea +.section smweb +.section smwfa +.section smwfb +.section smwga +.section smwgb +.section smwha +.section smwhb +.section smwia +.section smwib +.section smwja +.section smwjb +.section smwka +.section smwkb +.section smwla +.section smwlb +.section smwma +.section smwmb +.section smwna +.section smwnb +.section smwoa +.section smwob +.section smwpa +.section smwpb +.section smwqa +.section smwqb +.section smwra +.section smwrb +.section smwsa +.section smwsb +.section smwta +.section smwtb +.section smwua +.section smwub +.section smwva +.section smwvb +.section smwwa +.section smwwb +.section smwxa +.section smwxb +.section smwya +.section smwyb +.section smwza +.section smwzb +.section smw1a +.section smw1b +.section smw2a +.section smw2b +.section smw3a +.section smw3b +.section smw4a +.section smw4b +.section smw5a +.section smw5b +.section smw6a +.section smw6b +.section smw7a +.section smw7b +.section smw8a +.section smw8b +.section smw9a +.section smw9b +.section smw0a +.section smw0b +.section smxaa +.section smxab +.section smxba +.section smxbb +.section smxca +.section smxcb +.section smxda +.section smxdb +.section smxea +.section smxeb +.section smxfa +.section smxfb +.section smxga +.section smxgb +.section smxha +.section smxhb +.section smxia +.section smxib +.section smxja +.section smxjb +.section smxka +.section smxkb +.section smxla +.section smxlb +.section smxma +.section smxmb +.section smxna +.section smxnb +.section smxoa +.section smxob +.section smxpa +.section smxpb +.section smxqa +.section smxqb +.section smxra +.section smxrb +.section smxsa +.section smxsb +.section smxta +.section smxtb +.section smxua +.section smxub +.section smxva +.section smxvb +.section smxwa +.section smxwb +.section smxxa +.section smxxb +.section smxya +.section smxyb +.section smxza +.section smxzb +.section smx1a +.section smx1b +.section smx2a +.section smx2b +.section smx3a +.section smx3b +.section smx4a +.section smx4b +.section smx5a +.section smx5b +.section smx6a +.section smx6b +.section smx7a +.section smx7b +.section smx8a +.section smx8b +.section smx9a +.section smx9b +.section smx0a +.section smx0b +.section smyaa +.section smyab +.section smyba +.section smybb +.section smyca +.section smycb +.section smyda +.section smydb +.section smyea +.section smyeb +.section smyfa +.section smyfb +.section smyga +.section smygb +.section smyha +.section smyhb +.section smyia +.section smyib +.section smyja +.section smyjb +.section smyka +.section smykb +.section smyla +.section smylb +.section smyma +.section smymb +.section smyna +.section smynb +.section smyoa +.section smyob +.section smypa +.section smypb +.section smyqa +.section smyqb +.section smyra +.section smyrb +.section smysa +.section smysb +.section smyta +.section smytb +.section smyua +.section smyub +.section smyva +.section smyvb +.section smywa +.section smywb +.section smyxa +.section smyxb +.section smyya +.section smyyb +.section smyza +.section smyzb +.section smy1a +.section smy1b +.section smy2a +.section smy2b +.section smy3a +.section smy3b +.section smy4a +.section smy4b +.section smy5a +.section smy5b +.section smy6a +.section smy6b +.section smy7a +.section smy7b +.section smy8a +.section smy8b +.section smy9a +.section smy9b +.section smy0a +.section smy0b +.section smzaa +.section smzab +.section smzba +.section smzbb +.section smzca +.section smzcb +.section smzda +.section smzdb +.section smzea +.section smzeb +.section smzfa +.section smzfb +.section smzga +.section smzgb +.section smzha +.section smzhb +.section smzia +.section smzib +.section smzja +.section smzjb +.section smzka +.section smzkb +.section smzla +.section smzlb +.section smzma +.section smzmb +.section smzna +.section smznb +.section smzoa +.section smzob +.section smzpa +.section smzpb +.section smzqa +.section smzqb +.section smzra +.section smzrb +.section smzsa +.section smzsb +.section smzta +.section smztb +.section smzua +.section smzub +.section smzva +.section smzvb +.section smzwa +.section smzwb +.section smzxa +.section smzxb +.section smzya +.section smzyb +.section smzza +.section smzzb +.section smz1a +.section smz1b +.section smz2a +.section smz2b +.section smz3a +.section smz3b +.section smz4a +.section smz4b +.section smz5a +.section smz5b +.section smz6a +.section smz6b +.section smz7a +.section smz7b +.section smz8a +.section smz8b +.section smz9a +.section smz9b +.section smz0a +.section smz0b +.section sm1aa +.section sm1ab +.section sm1ba +.section sm1bb +.section sm1ca +.section sm1cb +.section sm1da +.section sm1db +.section sm1ea +.section sm1eb +.section sm1fa +.section sm1fb +.section sm1ga +.section sm1gb +.section sm1ha +.section sm1hb +.section sm1ia +.section sm1ib +.section sm1ja +.section sm1jb +.section sm1ka +.section sm1kb +.section sm1la +.section sm1lb +.section sm1ma +.section sm1mb +.section sm1na +.section sm1nb +.section sm1oa +.section sm1ob +.section sm1pa +.section sm1pb +.section sm1qa +.section sm1qb +.section sm1ra +.section sm1rb +.section sm1sa +.section sm1sb +.section sm1ta +.section sm1tb +.section sm1ua +.section sm1ub +.section sm1va +.section sm1vb +.section sm1wa +.section sm1wb +.section sm1xa +.section sm1xb +.section sm1ya +.section sm1yb +.section sm1za +.section sm1zb +.section sm11a +.section sm11b +.section sm12a +.section sm12b +.section sm13a +.section sm13b +.section sm14a +.section sm14b +.section sm15a +.section sm15b +.section sm16a +.section sm16b +.section sm17a +.section sm17b +.section sm18a +.section sm18b +.section sm19a +.section sm19b +.section sm10a +.section sm10b +.section sm2aa +.section sm2ab +.section sm2ba +.section sm2bb +.section sm2ca +.section sm2cb +.section sm2da +.section sm2db +.section sm2ea +.section sm2eb +.section sm2fa +.section sm2fb +.section sm2ga +.section sm2gb +.section sm2ha +.section sm2hb +.section sm2ia +.section sm2ib +.section sm2ja +.section sm2jb +.section sm2ka +.section sm2kb +.section sm2la +.section sm2lb +.section sm2ma +.section sm2mb +.section sm2na +.section sm2nb +.section sm2oa +.section sm2ob +.section sm2pa +.section sm2pb +.section sm2qa +.section sm2qb +.section sm2ra +.section sm2rb +.section sm2sa +.section sm2sb +.section sm2ta +.section sm2tb +.section sm2ua +.section sm2ub +.section sm2va +.section sm2vb +.section sm2wa +.section sm2wb +.section sm2xa +.section sm2xb +.section sm2ya +.section sm2yb +.section sm2za +.section sm2zb +.section sm21a +.section sm21b +.section sm22a +.section sm22b +.section sm23a +.section sm23b +.section sm24a +.section sm24b +.section sm25a +.section sm25b +.section sm26a +.section sm26b +.section sm27a +.section sm27b +.section sm28a +.section sm28b +.section sm29a +.section sm29b +.section sm20a +.section sm20b +.section sm3aa +.section sm3ab +.section sm3ba +.section sm3bb +.section sm3ca +.section sm3cb +.section sm3da +.section sm3db +.section sm3ea +.section sm3eb +.section sm3fa +.section sm3fb +.section sm3ga +.section sm3gb +.section sm3ha +.section sm3hb +.section sm3ia +.section sm3ib +.section sm3ja +.section sm3jb +.section sm3ka +.section sm3kb +.section sm3la +.section sm3lb +.section sm3ma +.section sm3mb +.section sm3na +.section sm3nb +.section sm3oa +.section sm3ob +.section sm3pa +.section sm3pb +.section sm3qa +.section sm3qb +.section sm3ra +.section sm3rb +.section sm3sa +.section sm3sb +.section sm3ta +.section sm3tb +.section sm3ua +.section sm3ub +.section sm3va +.section sm3vb +.section sm3wa +.section sm3wb +.section sm3xa +.section sm3xb +.section sm3ya +.section sm3yb +.section sm3za +.section sm3zb +.section sm31a +.section sm31b +.section sm32a +.section sm32b +.section sm33a +.section sm33b +.section sm34a +.section sm34b +.section sm35a +.section sm35b +.section sm36a +.section sm36b +.section sm37a +.section sm37b +.section sm38a +.section sm38b +.section sm39a +.section sm39b +.section sm30a +.section sm30b +.section sm4aa +.section sm4ab +.section sm4ba +.section sm4bb +.section sm4ca +.section sm4cb +.section sm4da +.section sm4db +.section sm4ea +.section sm4eb +.section sm4fa +.section sm4fb +.section sm4ga +.section sm4gb +.section sm4ha +.section sm4hb +.section sm4ia +.section sm4ib +.section sm4ja +.section sm4jb +.section sm4ka +.section sm4kb +.section sm4la +.section sm4lb +.section sm4ma +.section sm4mb +.section sm4na +.section sm4nb +.section sm4oa +.section sm4ob +.section sm4pa +.section sm4pb +.section sm4qa +.section sm4qb +.section sm4ra +.section sm4rb +.section sm4sa +.section sm4sb +.section sm4ta +.section sm4tb +.section sm4ua +.section sm4ub +.section sm4va +.section sm4vb +.section sm4wa +.section sm4wb +.section sm4xa +.section sm4xb +.section sm4ya +.section sm4yb +.section sm4za +.section sm4zb +.section sm41a +.section sm41b +.section sm42a +.section sm42b +.section sm43a +.section sm43b +.section sm44a +.section sm44b +.section sm45a +.section sm45b +.section sm46a +.section sm46b +.section sm47a +.section sm47b +.section sm48a +.section sm48b +.section sm49a +.section sm49b +.section sm40a +.section sm40b +.section sm5aa +.section sm5ab +.section sm5ba +.section sm5bb +.section sm5ca +.section sm5cb +.section sm5da +.section sm5db +.section sm5ea +.section sm5eb +.section sm5fa +.section sm5fb +.section sm5ga +.section sm5gb +.section sm5ha +.section sm5hb +.section sm5ia +.section sm5ib +.section sm5ja +.section sm5jb +.section sm5ka +.section sm5kb +.section sm5la +.section sm5lb +.section sm5ma +.section sm5mb +.section sm5na +.section sm5nb +.section sm5oa +.section sm5ob +.section sm5pa +.section sm5pb +.section sm5qa +.section sm5qb +.section sm5ra +.section sm5rb +.section sm5sa +.section sm5sb +.section sm5ta +.section sm5tb +.section sm5ua +.section sm5ub +.section sm5va +.section sm5vb +.section sm5wa +.section sm5wb +.section sm5xa +.section sm5xb +.section sm5ya +.section sm5yb +.section sm5za +.section sm5zb +.section sm51a +.section sm51b +.section sm52a +.section sm52b +.section sm53a +.section sm53b +.section sm54a +.section sm54b +.section sm55a +.section sm55b +.section sm56a +.section sm56b +.section sm57a +.section sm57b +.section sm58a +.section sm58b +.section sm59a +.section sm59b +.section sm50a +.section sm50b +.section sm6aa +.section sm6ab +.section sm6ba +.section sm6bb +.section sm6ca +.section sm6cb +.section sm6da +.section sm6db +.section sm6ea +.section sm6eb +.section sm6fa +.section sm6fb +.section sm6ga +.section sm6gb +.section sm6ha +.section sm6hb +.section sm6ia +.section sm6ib +.section sm6ja +.section sm6jb +.section sm6ka +.section sm6kb +.section sm6la +.section sm6lb +.section sm6ma +.section sm6mb +.section sm6na +.section sm6nb +.section sm6oa +.section sm6ob +.section sm6pa +.section sm6pb +.section sm6qa +.section sm6qb +.section sm6ra +.section sm6rb +.section sm6sa +.section sm6sb +.section sm6ta +.section sm6tb +.section sm6ua +.section sm6ub +.section sm6va +.section sm6vb +.section sm6wa +.section sm6wb +.section sm6xa +.section sm6xb +.section sm6ya +.section sm6yb +.section sm6za +.section sm6zb +.section sm61a +.section sm61b +.section sm62a +.section sm62b +.section sm63a +.section sm63b +.section sm64a +.section sm64b +.section sm65a +.section sm65b +.section sm66a +.section sm66b +.section sm67a +.section sm67b +.section sm68a +.section sm68b +.section sm69a +.section sm69b +.section sm60a +.section sm60b +.section sm7aa +.section sm7ab +.section sm7ba +.section sm7bb +.section sm7ca +.section sm7cb +.section sm7da +.section sm7db +.section sm7ea +.section sm7eb +.section sm7fa +.section sm7fb +.section sm7ga +.section sm7gb +.section sm7ha +.section sm7hb +.section sm7ia +.section sm7ib +.section sm7ja +.section sm7jb +.section sm7ka +.section sm7kb +.section sm7la +.section sm7lb +.section sm7ma +.section sm7mb +.section sm7na +.section sm7nb +.section sm7oa +.section sm7ob +.section sm7pa +.section sm7pb +.section sm7qa +.section sm7qb +.section sm7ra +.section sm7rb +.section sm7sa +.section sm7sb +.section sm7ta +.section sm7tb +.section sm7ua +.section sm7ub +.section sm7va +.section sm7vb +.section sm7wa +.section sm7wb +.section sm7xa +.section sm7xb +.section sm7ya +.section sm7yb +.section sm7za +.section sm7zb +.section sm71a +.section sm71b +.section sm72a +.section sm72b +.section sm73a +.section sm73b +.section sm74a +.section sm74b +.section sm75a +.section sm75b +.section sm76a +.section sm76b +.section sm77a +.section sm77b +.section sm78a +.section sm78b +.section sm79a +.section sm79b +.section sm70a +.section sm70b +.section sm8aa +.section sm8ab +.section sm8ba +.section sm8bb +.section sm8ca +.section sm8cb +.section sm8da +.section sm8db +.section sm8ea +.section sm8eb +.section sm8fa +.section sm8fb +.section sm8ga +.section sm8gb +.section sm8ha +.section sm8hb +.section sm8ia +.section sm8ib +.section sm8ja +.section sm8jb +.section sm8ka +.section sm8kb +.section sm8la +.section sm8lb +.section sm8ma +.section sm8mb +.section sm8na +.section sm8nb +.section sm8oa +.section sm8ob +.section sm8pa +.section sm8pb +.section sm8qa +.section sm8qb +.section sm8ra +.section sm8rb +.section sm8sa +.section sm8sb +.section sm8ta +.section sm8tb +.section sm8ua +.section sm8ub +.section sm8va +.section sm8vb +.section sm8wa +.section sm8wb +.section sm8xa +.section sm8xb +.section sm8ya +.section sm8yb +.section sm8za +.section sm8zb +.section sm81a +.section sm81b +.section sm82a +.section sm82b +.section sm83a +.section sm83b +.section sm84a +.section sm84b +.section sm85a +.section sm85b +.section sm86a +.section sm86b +.section sm87a +.section sm87b +.section sm88a +.section sm88b +.section sm89a +.section sm89b +.section sm80a +.section sm80b +.section sm9aa +.section sm9ab +.section sm9ba +.section sm9bb +.section sm9ca +.section sm9cb +.section sm9da +.section sm9db +.section sm9ea +.section sm9eb +.section sm9fa +.section sm9fb +.section sm9ga +.section sm9gb +.section sm9ha +.section sm9hb +.section sm9ia +.section sm9ib +.section sm9ja +.section sm9jb +.section sm9ka +.section sm9kb +.section sm9la +.section sm9lb +.section sm9ma +.section sm9mb +.section sm9na +.section sm9nb +.section sm9oa +.section sm9ob +.section sm9pa +.section sm9pb +.section sm9qa +.section sm9qb +.section sm9ra +.section sm9rb +.section sm9sa +.section sm9sb +.section sm9ta +.section sm9tb +.section sm9ua +.section sm9ub +.section sm9va +.section sm9vb +.section sm9wa +.section sm9wb +.section sm9xa +.section sm9xb +.section sm9ya +.section sm9yb +.section sm9za +.section sm9zb +.section sm91a +.section sm91b +.section sm92a +.section sm92b +.section sm93a +.section sm93b +.section sm94a +.section sm94b +.section sm95a +.section sm95b +.section sm96a +.section sm96b +.section sm97a +.section sm97b +.section sm98a +.section sm98b +.section sm99a +.section sm99b +.section sm90a +.section sm90b +.section sm0aa +.section sm0ab +.section sm0ba +.section sm0bb +.section sm0ca +.section sm0cb +.section sm0da +.section sm0db +.section sm0ea +.section sm0eb +.section sm0fa +.section sm0fb +.section sm0ga +.section sm0gb +.section sm0ha +.section sm0hb +.section sm0ia +.section sm0ib +.section sm0ja +.section sm0jb +.section sm0ka +.section sm0kb +.section sm0la +.section sm0lb +.section sm0ma +.section sm0mb +.section sm0na +.section sm0nb +.section sm0oa +.section sm0ob +.section sm0pa +.section sm0pb +.section sm0qa +.section sm0qb +.section sm0ra +.section sm0rb +.section sm0sa +.section sm0sb +.section sm0ta +.section sm0tb +.section sm0ua +.section sm0ub +.section sm0va +.section sm0vb +.section sm0wa +.section sm0wb +.section sm0xa +.section sm0xb +.section sm0ya +.section sm0yb +.section sm0za +.section sm0zb +.section sm01a +.section sm01b +.section sm02a +.section sm02b +.section sm03a +.section sm03b +.section sm04a +.section sm04b +.section sm05a +.section sm05b +.section sm06a +.section sm06b +.section sm07a +.section sm07b +.section sm08a +.section sm08b +.section sm09a +.section sm09b +.section sm00a +.section sm00b +.section snaaa +.section snaab +.section snaba +.section snabb +.section snaca +.section snacb +.section snada +.section snadb +.section snaea +.section snaeb +.section snafa +.section snafb +.section snaga +.section snagb +.section snaha +.section snahb +.section snaia +.section snaib +.section snaja +.section snajb +.section snaka +.section snakb +.section snala +.section snalb +.section snama +.section snamb +.section snana +.section snanb +.section snaoa +.section snaob +.section snapa +.section snapb +.section snaqa +.section snaqb +.section snara +.section snarb +.section snasa +.section snasb +.section snata +.section snatb +.section snaua +.section snaub +.section snava +.section snavb +.section snawa +.section snawb +.section snaxa +.section snaxb +.section snaya +.section snayb +.section snaza +.section snazb +.section sna1a +.section sna1b +.section sna2a +.section sna2b +.section sna3a +.section sna3b +.section sna4a +.section sna4b +.section sna5a +.section sna5b +.section sna6a +.section sna6b +.section sna7a +.section sna7b +.section sna8a +.section sna8b +.section sna9a +.section sna9b +.section sna0a +.section sna0b +.section snbaa +.section snbab +.section snbba +.section snbbb +.section snbca +.section snbcb +.section snbda +.section snbdb +.section snbea +.section snbeb +.section snbfa +.section snbfb +.section snbga +.section snbgb +.section snbha +.section snbhb +.section snbia +.section snbib +.section snbja +.section snbjb +.section snbka +.section snbkb +.section snbla +.section snblb +.section snbma +.section snbmb +.section snbna +.section snbnb +.section snboa +.section snbob +.section snbpa +.section snbpb +.section snbqa +.section snbqb +.section snbra +.section snbrb +.section snbsa +.section snbsb +.section snbta +.section snbtb +.section snbua +.section snbub +.section snbva +.section snbvb +.section snbwa +.section snbwb +.section snbxa +.section snbxb +.section snbya +.section snbyb +.section snbza +.section snbzb +.section snb1a +.section snb1b +.section snb2a +.section snb2b +.section snb3a +.section snb3b +.section snb4a +.section snb4b +.section snb5a +.section snb5b +.section snb6a +.section snb6b +.section snb7a +.section snb7b +.section snb8a +.section snb8b +.section snb9a +.section snb9b +.section snb0a +.section snb0b +.section sncaa +.section sncab +.section sncba +.section sncbb +.section sncca +.section snccb +.section sncda +.section sncdb +.section sncea +.section snceb +.section sncfa +.section sncfb +.section sncga +.section sncgb +.section sncha +.section snchb +.section sncia +.section sncib +.section sncja +.section sncjb +.section sncka +.section snckb +.section sncla +.section snclb +.section sncma +.section sncmb +.section sncna +.section sncnb +.section sncoa +.section sncob +.section sncpa +.section sncpb +.section sncqa +.section sncqb +.section sncra +.section sncrb +.section sncsa +.section sncsb +.section sncta +.section snctb +.section sncua +.section sncub +.section sncva +.section sncvb +.section sncwa +.section sncwb +.section sncxa +.section sncxb +.section sncya +.section sncyb +.section sncza +.section snczb +.section snc1a +.section snc1b +.section snc2a +.section snc2b +.section snc3a +.section snc3b +.section snc4a +.section snc4b +.section snc5a +.section snc5b +.section snc6a +.section snc6b +.section snc7a +.section snc7b +.section snc8a +.section snc8b +.section snc9a +.section snc9b +.section snc0a +.section snc0b +.section sndaa +.section sndab +.section sndba +.section sndbb +.section sndca +.section sndcb +.section sndda +.section snddb +.section sndea +.section sndeb +.section sndfa +.section sndfb +.section sndga +.section sndgb +.section sndha +.section sndhb +.section sndia +.section sndib +.section sndja +.section sndjb +.section sndka +.section sndkb +.section sndla +.section sndlb +.section sndma +.section sndmb +.section sndna +.section sndnb +.section sndoa +.section sndob +.section sndpa +.section sndpb +.section sndqa +.section sndqb +.section sndra +.section sndrb +.section sndsa +.section sndsb +.section sndta +.section sndtb +.section sndua +.section sndub +.section sndva +.section sndvb +.section sndwa +.section sndwb +.section sndxa +.section sndxb +.section sndya +.section sndyb +.section sndza +.section sndzb +.section snd1a +.section snd1b +.section snd2a +.section snd2b +.section snd3a +.section snd3b +.section snd4a +.section snd4b +.section snd5a +.section snd5b +.section snd6a +.section snd6b +.section snd7a +.section snd7b +.section snd8a +.section snd8b +.section snd9a +.section snd9b +.section snd0a +.section snd0b +.section sneaa +.section sneab +.section sneba +.section snebb +.section sneca +.section snecb +.section sneda +.section snedb +.section sneea +.section sneeb +.section snefa +.section snefb +.section snega +.section snegb +.section sneha +.section snehb +.section sneia +.section sneib +.section sneja +.section snejb +.section sneka +.section snekb +.section snela +.section snelb +.section snema +.section snemb +.section snena +.section snenb +.section sneoa +.section sneob +.section snepa +.section snepb +.section sneqa +.section sneqb +.section snera +.section snerb +.section snesa +.section snesb +.section sneta +.section snetb +.section sneua +.section sneub +.section sneva +.section snevb +.section snewa +.section snewb +.section snexa +.section snexb +.section sneya +.section sneyb +.section sneza +.section snezb +.section sne1a +.section sne1b +.section sne2a +.section sne2b +.section sne3a +.section sne3b +.section sne4a +.section sne4b +.section sne5a +.section sne5b +.section sne6a +.section sne6b +.section sne7a +.section sne7b +.section sne8a +.section sne8b +.section sne9a +.section sne9b +.section sne0a +.section sne0b +.section snfaa +.section snfab +.section snfba +.section snfbb +.section snfca +.section snfcb +.section snfda +.section snfdb +.section snfea +.section snfeb +.section snffa +.section snffb +.section snfga +.section snfgb +.section snfha +.section snfhb +.section snfia +.section snfib +.section snfja +.section snfjb +.section snfka +.section snfkb +.section snfla +.section snflb +.section snfma +.section snfmb +.section snfna +.section snfnb +.section snfoa +.section snfob +.section snfpa +.section snfpb +.section snfqa +.section snfqb +.section snfra +.section snfrb +.section snfsa +.section snfsb +.section snfta +.section snftb +.section snfua +.section snfub +.section snfva +.section snfvb +.section snfwa +.section snfwb +.section snfxa +.section snfxb +.section snfya +.section snfyb +.section snfza +.section snfzb +.section snf1a +.section snf1b +.section snf2a +.section snf2b +.section snf3a +.section snf3b +.section snf4a +.section snf4b +.section snf5a +.section snf5b +.section snf6a +.section snf6b +.section snf7a +.section snf7b +.section snf8a +.section snf8b +.section snf9a +.section snf9b +.section snf0a +.section snf0b +.section sngaa +.section sngab +.section sngba +.section sngbb +.section sngca +.section sngcb +.section sngda +.section sngdb +.section sngea +.section sngeb +.section sngfa +.section sngfb +.section sngga +.section snggb +.section sngha +.section snghb +.section sngia +.section sngib +.section sngja +.section sngjb +.section sngka +.section sngkb +.section sngla +.section snglb +.section sngma +.section sngmb +.section sngna +.section sngnb +.section sngoa +.section sngob +.section sngpa +.section sngpb +.section sngqa +.section sngqb +.section sngra +.section sngrb +.section sngsa +.section sngsb +.section sngta +.section sngtb +.section sngua +.section sngub +.section sngva +.section sngvb +.section sngwa +.section sngwb +.section sngxa +.section sngxb +.section sngya +.section sngyb +.section sngza +.section sngzb +.section sng1a +.section sng1b +.section sng2a +.section sng2b +.section sng3a +.section sng3b +.section sng4a +.section sng4b +.section sng5a +.section sng5b +.section sng6a +.section sng6b +.section sng7a +.section sng7b +.section sng8a +.section sng8b +.section sng9a +.section sng9b +.section sng0a +.section sng0b +.section snhaa +.section snhab +.section snhba +.section snhbb +.section snhca +.section snhcb +.section snhda +.section snhdb +.section snhea +.section snheb +.section snhfa +.section snhfb +.section snhga +.section snhgb +.section snhha +.section snhhb +.section snhia +.section snhib +.section snhja +.section snhjb +.section snhka +.section snhkb +.section snhla +.section snhlb +.section snhma +.section snhmb +.section snhna +.section snhnb +.section snhoa +.section snhob +.section snhpa +.section snhpb +.section snhqa +.section snhqb +.section snhra +.section snhrb +.section snhsa +.section snhsb +.section snhta +.section snhtb +.section snhua +.section snhub +.section snhva +.section snhvb +.section snhwa +.section snhwb +.section snhxa +.section snhxb +.section snhya +.section snhyb +.section snhza +.section snhzb +.section snh1a +.section snh1b +.section snh2a +.section snh2b +.section snh3a +.section snh3b +.section snh4a +.section snh4b +.section snh5a +.section snh5b +.section snh6a +.section snh6b +.section snh7a +.section snh7b +.section snh8a +.section snh8b +.section snh9a +.section snh9b +.section snh0a +.section snh0b +.section sniaa +.section sniab +.section sniba +.section snibb +.section snica +.section snicb +.section snida +.section snidb +.section sniea +.section snieb +.section snifa +.section snifb +.section sniga +.section snigb +.section sniha +.section snihb +.section sniia +.section sniib +.section snija +.section snijb +.section snika +.section snikb +.section snila +.section snilb +.section snima +.section snimb +.section snina +.section sninb +.section snioa +.section sniob +.section snipa +.section snipb +.section sniqa +.section sniqb +.section snira +.section snirb +.section snisa +.section snisb +.section snita +.section snitb +.section sniua +.section sniub +.section sniva +.section snivb +.section sniwa +.section sniwb +.section snixa +.section snixb +.section sniya +.section sniyb +.section sniza +.section snizb +.section sni1a +.section sni1b +.section sni2a +.section sni2b +.section sni3a +.section sni3b +.section sni4a +.section sni4b +.section sni5a +.section sni5b +.section sni6a +.section sni6b +.section sni7a +.section sni7b +.section sni8a +.section sni8b +.section sni9a +.section sni9b +.section sni0a +.section sni0b +.section snjaa +.section snjab +.section snjba +.section snjbb +.section snjca +.section snjcb +.section snjda +.section snjdb +.section snjea +.section snjeb +.section snjfa +.section snjfb +.section snjga +.section snjgb +.section snjha +.section snjhb +.section snjia +.section snjib +.section snjja +.section snjjb +.section snjka +.section snjkb +.section snjla +.section snjlb +.section snjma +.section snjmb +.section snjna +.section snjnb +.section snjoa +.section snjob +.section snjpa +.section snjpb +.section snjqa +.section snjqb +.section snjra +.section snjrb +.section snjsa +.section snjsb +.section snjta +.section snjtb +.section snjua +.section snjub +.section snjva +.section snjvb +.section snjwa +.section snjwb +.section snjxa +.section snjxb +.section snjya +.section snjyb +.section snjza +.section snjzb +.section snj1a +.section snj1b +.section snj2a +.section snj2b +.section snj3a +.section snj3b +.section snj4a +.section snj4b +.section snj5a +.section snj5b +.section snj6a +.section snj6b +.section snj7a +.section snj7b +.section snj8a +.section snj8b +.section snj9a +.section snj9b +.section snj0a +.section snj0b +.section snkaa +.section snkab +.section snkba +.section snkbb +.section snkca +.section snkcb +.section snkda +.section snkdb +.section snkea +.section snkeb +.section snkfa +.section snkfb +.section snkga +.section snkgb +.section snkha +.section snkhb +.section snkia +.section snkib +.section snkja +.section snkjb +.section snkka +.section snkkb +.section snkla +.section snklb +.section snkma +.section snkmb +.section snkna +.section snknb +.section snkoa +.section snkob +.section snkpa +.section snkpb +.section snkqa +.section snkqb +.section snkra +.section snkrb +.section snksa +.section snksb +.section snkta +.section snktb +.section snkua +.section snkub +.section snkva +.section snkvb +.section snkwa +.section snkwb +.section snkxa +.section snkxb +.section snkya +.section snkyb +.section snkza +.section snkzb +.section snk1a +.section snk1b +.section snk2a +.section snk2b +.section snk3a +.section snk3b +.section snk4a +.section snk4b +.section snk5a +.section snk5b +.section snk6a +.section snk6b +.section snk7a +.section snk7b +.section snk8a +.section snk8b +.section snk9a +.section snk9b +.section snk0a +.section snk0b +.section snlaa +.section snlab +.section snlba +.section snlbb +.section snlca +.section snlcb +.section snlda +.section snldb +.section snlea +.section snleb +.section snlfa +.section snlfb +.section snlga +.section snlgb +.section snlha +.section snlhb +.section snlia +.section snlib +.section snlja +.section snljb +.section snlka +.section snlkb +.section snlla +.section snllb +.section snlma +.section snlmb +.section snlna +.section snlnb +.section snloa +.section snlob +.section snlpa +.section snlpb +.section snlqa +.section snlqb +.section snlra +.section snlrb +.section snlsa +.section snlsb +.section snlta +.section snltb +.section snlua +.section snlub +.section snlva +.section snlvb +.section snlwa +.section snlwb +.section snlxa +.section snlxb +.section snlya +.section snlyb +.section snlza +.section snlzb +.section snl1a +.section snl1b +.section snl2a +.section snl2b +.section snl3a +.section snl3b +.section snl4a +.section snl4b +.section snl5a +.section snl5b +.section snl6a +.section snl6b +.section snl7a +.section snl7b +.section snl8a +.section snl8b +.section snl9a +.section snl9b +.section snl0a +.section snl0b +.section snmaa +.section snmab +.section snmba +.section snmbb +.section snmca +.section snmcb +.section snmda +.section snmdb +.section snmea +.section snmeb +.section snmfa +.section snmfb +.section snmga +.section snmgb +.section snmha +.section snmhb +.section snmia +.section snmib +.section snmja +.section snmjb +.section snmka +.section snmkb +.section snmla +.section snmlb +.section snmma +.section snmmb +.section snmna +.section snmnb +.section snmoa +.section snmob +.section snmpa +.section snmpb +.section snmqa +.section snmqb +.section snmra +.section snmrb +.section snmsa +.section snmsb +.section snmta +.section snmtb +.section snmua +.section snmub +.section snmva +.section snmvb +.section snmwa +.section snmwb +.section snmxa +.section snmxb +.section snmya +.section snmyb +.section snmza +.section snmzb +.section snm1a +.section snm1b +.section snm2a +.section snm2b +.section snm3a +.section snm3b +.section snm4a +.section snm4b +.section snm5a +.section snm5b +.section snm6a +.section snm6b +.section snm7a +.section snm7b +.section snm8a +.section snm8b +.section snm9a +.section snm9b +.section snm0a +.section snm0b +.section snnaa +.section snnab +.section snnba +.section snnbb +.section snnca +.section snncb +.section snnda +.section snndb +.section snnea +.section snneb +.section snnfa +.section snnfb +.section snnga +.section snngb +.section snnha +.section snnhb +.section snnia +.section snnib +.section snnja +.section snnjb +.section snnka +.section snnkb +.section snnla +.section snnlb +.section snnma +.section snnmb +.section snnna +.section snnnb +.section snnoa +.section snnob +.section snnpa +.section snnpb +.section snnqa +.section snnqb +.section snnra +.section snnrb +.section snnsa +.section snnsb +.section snnta +.section snntb +.section snnua +.section snnub +.section snnva +.section snnvb +.section snnwa +.section snnwb +.section snnxa +.section snnxb +.section snnya +.section snnyb +.section snnza +.section snnzb +.section snn1a +.section snn1b +.section snn2a +.section snn2b +.section snn3a +.section snn3b +.section snn4a +.section snn4b +.section snn5a +.section snn5b +.section snn6a +.section snn6b +.section snn7a +.section snn7b +.section snn8a +.section snn8b +.section snn9a +.section snn9b +.section snn0a +.section snn0b +.section snoaa +.section snoab +.section snoba +.section snobb +.section snoca +.section snocb +.section snoda +.section snodb +.section snoea +.section snoeb +.section snofa +.section snofb +.section snoga +.section snogb +.section snoha +.section snohb +.section snoia +.section snoib +.section snoja +.section snojb +.section snoka +.section snokb +.section snola +.section snolb +.section snoma +.section snomb +.section snona +.section snonb +.section snooa +.section snoob +.section snopa +.section snopb +.section snoqa +.section snoqb +.section snora +.section snorb +.section snosa +.section snosb +.section snota +.section snotb +.section snoua +.section snoub +.section snova +.section snovb +.section snowa +.section snowb +.section snoxa +.section snoxb +.section snoya +.section snoyb +.section snoza +.section snozb +.section sno1a +.section sno1b +.section sno2a +.section sno2b +.section sno3a +.section sno3b +.section sno4a +.section sno4b +.section sno5a +.section sno5b +.section sno6a +.section sno6b +.section sno7a +.section sno7b +.section sno8a +.section sno8b +.section sno9a +.section sno9b +.section sno0a +.section sno0b +.section snpaa +.section snpab +.section snpba +.section snpbb +.section snpca +.section snpcb +.section snpda +.section snpdb +.section snpea +.section snpeb +.section snpfa +.section snpfb +.section snpga +.section snpgb +.section snpha +.section snphb +.section snpia +.section snpib +.section snpja +.section snpjb +.section snpka +.section snpkb +.section snpla +.section snplb +.section snpma +.section snpmb +.section snpna +.section snpnb +.section snpoa +.section snpob +.section snppa +.section snppb +.section snpqa +.section snpqb +.section snpra +.section snprb +.section snpsa +.section snpsb +.section snpta +.section snptb +.section snpua +.section snpub +.section snpva +.section snpvb +.section snpwa +.section snpwb +.section snpxa +.section snpxb +.section snpya +.section snpyb +.section snpza +.section snpzb +.section snp1a +.section snp1b +.section snp2a +.section snp2b +.section snp3a +.section snp3b +.section snp4a +.section snp4b +.section snp5a +.section snp5b +.section snp6a +.section snp6b +.section snp7a +.section snp7b +.section snp8a +.section snp8b +.section snp9a +.section snp9b +.section snp0a +.section snp0b +.section snqaa +.section snqab +.section snqba +.section snqbb +.section snqca +.section snqcb +.section snqda +.section snqdb +.section snqea +.section snqeb +.section snqfa +.section snqfb +.section snqga +.section snqgb +.section snqha +.section snqhb +.section snqia +.section snqib +.section snqja +.section snqjb +.section snqka +.section snqkb +.section snqla +.section snqlb +.section snqma +.section snqmb +.section snqna +.section snqnb +.section snqoa +.section snqob +.section snqpa +.section snqpb +.section snqqa +.section snqqb +.section snqra +.section snqrb +.section snqsa +.section snqsb +.section snqta +.section snqtb +.section snqua +.section snqub +.section snqva +.section snqvb +.section snqwa +.section snqwb +.section snqxa +.section snqxb +.section snqya +.section snqyb +.section snqza +.section snqzb +.section snq1a +.section snq1b +.section snq2a +.section snq2b +.section snq3a +.section snq3b +.section snq4a +.section snq4b +.section snq5a +.section snq5b +.section snq6a +.section snq6b +.section snq7a +.section snq7b +.section snq8a +.section snq8b +.section snq9a +.section snq9b +.section snq0a +.section snq0b +.section snraa +.section snrab +.section snrba +.section snrbb +.section snrca +.section snrcb +.section snrda +.section snrdb +.section snrea +.section snreb +.section snrfa +.section snrfb +.section snrga +.section snrgb +.section snrha +.section snrhb +.section snria +.section snrib +.section snrja +.section snrjb +.section snrka +.section snrkb +.section snrla +.section snrlb +.section snrma +.section snrmb +.section snrna +.section snrnb +.section snroa +.section snrob +.section snrpa +.section snrpb +.section snrqa +.section snrqb +.section snrra +.section snrrb +.section snrsa +.section snrsb +.section snrta +.section snrtb +.section snrua +.section snrub +.section snrva +.section snrvb +.section snrwa +.section snrwb +.section snrxa +.section snrxb +.section snrya +.section snryb +.section snrza +.section snrzb +.section snr1a +.section snr1b +.section snr2a +.section snr2b +.section snr3a +.section snr3b +.section snr4a +.section snr4b +.section snr5a +.section snr5b +.section snr6a +.section snr6b +.section snr7a +.section snr7b +.section snr8a +.section snr8b +.section snr9a +.section snr9b +.section snr0a +.section snr0b +.section snsaa +.section snsab +.section snsba +.section snsbb +.section snsca +.section snscb +.section snsda +.section snsdb +.section snsea +.section snseb +.section snsfa +.section snsfb +.section snsga +.section snsgb +.section snsha +.section snshb +.section snsia +.section snsib +.section snsja +.section snsjb +.section snska +.section snskb +.section snsla +.section snslb +.section snsma +.section snsmb +.section snsna +.section snsnb +.section snsoa +.section snsob +.section snspa +.section snspb +.section snsqa +.section snsqb +.section snsra +.section snsrb +.section snssa +.section snssb +.section snsta +.section snstb +.section snsua +.section snsub +.section snsva +.section snsvb +.section snswa +.section snswb +.section snsxa +.section snsxb +.section snsya +.section snsyb +.section snsza +.section snszb +.section sns1a +.section sns1b +.section sns2a +.section sns2b +.section sns3a +.section sns3b +.section sns4a +.section sns4b +.section sns5a +.section sns5b +.section sns6a +.section sns6b +.section sns7a +.section sns7b +.section sns8a +.section sns8b +.section sns9a +.section sns9b +.section sns0a +.section sns0b +.section sntaa +.section sntab +.section sntba +.section sntbb +.section sntca +.section sntcb +.section sntda +.section sntdb +.section sntea +.section snteb +.section sntfa +.section sntfb +.section sntga +.section sntgb +.section sntha +.section snthb +.section sntia +.section sntib +.section sntja +.section sntjb +.section sntka +.section sntkb +.section sntla +.section sntlb +.section sntma +.section sntmb +.section sntna +.section sntnb +.section sntoa +.section sntob +.section sntpa +.section sntpb +.section sntqa +.section sntqb +.section sntra +.section sntrb +.section sntsa +.section sntsb +.section sntta +.section snttb +.section sntua +.section sntub +.section sntva +.section sntvb +.section sntwa +.section sntwb +.section sntxa +.section sntxb +.section sntya +.section sntyb +.section sntza +.section sntzb +.section snt1a +.section snt1b +.section snt2a +.section snt2b +.section snt3a +.section snt3b +.section snt4a +.section snt4b +.section snt5a +.section snt5b +.section snt6a +.section snt6b +.section snt7a +.section snt7b +.section snt8a +.section snt8b +.section snt9a +.section snt9b +.section snt0a +.section snt0b +.section snuaa +.section snuab +.section snuba +.section snubb +.section snuca +.section snucb +.section snuda +.section snudb +.section snuea +.section snueb +.section snufa +.section snufb +.section snuga +.section snugb +.section snuha +.section snuhb +.section snuia +.section snuib +.section snuja +.section snujb +.section snuka +.section snukb +.section snula +.section snulb +.section snuma +.section snumb +.section snuna +.section snunb +.section snuoa +.section snuob +.section snupa +.section snupb +.section snuqa +.section snuqb +.section snura +.section snurb +.section snusa +.section snusb +.section snuta +.section snutb +.section snuua +.section snuub +.section snuva +.section snuvb +.section snuwa +.section snuwb +.section snuxa +.section snuxb +.section snuya +.section snuyb +.section snuza +.section snuzb +.section snu1a +.section snu1b +.section snu2a +.section snu2b +.section snu3a +.section snu3b +.section snu4a +.section snu4b +.section snu5a +.section snu5b +.section snu6a +.section snu6b +.section snu7a +.section snu7b +.section snu8a +.section snu8b +.section snu9a +.section snu9b +.section snu0a +.section snu0b +.section snvaa +.section snvab +.section snvba +.section snvbb +.section snvca +.section snvcb +.section snvda +.section snvdb +.section snvea +.section snveb +.section snvfa +.section snvfb +.section snvga +.section snvgb +.section snvha +.section snvhb +.section snvia +.section snvib +.section snvja +.section snvjb +.section snvka +.section snvkb +.section snvla +.section snvlb +.section snvma +.section snvmb +.section snvna +.section snvnb +.section snvoa +.section snvob +.section snvpa +.section snvpb +.section snvqa +.section snvqb +.section snvra +.section snvrb +.section snvsa +.section snvsb +.section snvta +.section snvtb +.section snvua +.section snvub +.section snvva +.section snvvb +.section snvwa +.section snvwb +.section snvxa +.section snvxb +.section snvya +.section snvyb +.section snvza +.section snvzb +.section snv1a +.section snv1b +.section snv2a +.section snv2b +.section snv3a +.section snv3b +.section snv4a +.section snv4b +.section snv5a +.section snv5b +.section snv6a +.section snv6b +.section snv7a +.section snv7b +.section snv8a +.section snv8b +.section snv9a +.section snv9b +.section snv0a +.section snv0b +.section snwaa +.section snwab +.section snwba +.section snwbb +.section snwca +.section snwcb +.section snwda +.section snwdb +.section snwea +.section snweb +.section snwfa +.section snwfb +.section snwga +.section snwgb +.section snwha +.section snwhb +.section snwia +.section snwib +.section snwja +.section snwjb +.section snwka +.section snwkb +.section snwla +.section snwlb +.section snwma +.section snwmb +.section snwna +.section snwnb +.section snwoa +.section snwob +.section snwpa +.section snwpb +.section snwqa +.section snwqb +.section snwra +.section snwrb +.section snwsa +.section snwsb +.section snwta +.section snwtb +.section snwua +.section snwub +.section snwva +.section snwvb +.section snwwa +.section snwwb +.section snwxa +.section snwxb +.section snwya +.section snwyb +.section snwza +.section snwzb +.section snw1a +.section snw1b +.section snw2a +.section snw2b +.section snw3a +.section snw3b +.section snw4a +.section snw4b +.section snw5a +.section snw5b +.section snw6a +.section snw6b +.section snw7a +.section snw7b +.section snw8a +.section snw8b +.section snw9a +.section snw9b +.section snw0a +.section snw0b +.section snxaa +.section snxab +.section snxba +.section snxbb +.section snxca +.section snxcb +.section snxda +.section snxdb +.section snxea +.section snxeb +.section snxfa +.section snxfb +.section snxga +.section snxgb +.section snxha +.section snxhb +.section snxia +.section snxib +.section snxja +.section snxjb +.section snxka +.section snxkb +.section snxla +.section snxlb +.section snxma +.section snxmb +.section snxna +.section snxnb +.section snxoa +.section snxob +.section snxpa +.section snxpb +.section snxqa +.section snxqb +.section snxra +.section snxrb +.section snxsa +.section snxsb +.section snxta +.section snxtb +.section snxua +.section snxub +.section snxva +.section snxvb +.section snxwa +.section snxwb +.section snxxa +.section snxxb +.section snxya +.section snxyb +.section snxza +.section snxzb +.section snx1a +.section snx1b +.section snx2a +.section snx2b +.section snx3a +.section snx3b +.section snx4a +.section snx4b +.section snx5a +.section snx5b +.section snx6a +.section snx6b +.section snx7a +.section snx7b +.section snx8a +.section snx8b +.section snx9a +.section snx9b +.section snx0a +.section snx0b +.section snyaa +.section snyab +.section snyba +.section snybb +.section snyca +.section snycb +.section snyda +.section snydb +.section snyea +.section snyeb +.section snyfa +.section snyfb +.section snyga +.section snygb +.section snyha +.section snyhb +.section snyia +.section snyib +.section snyja +.section snyjb +.section snyka +.section snykb +.section snyla +.section snylb +.section snyma +.section snymb +.section snyna +.section snynb +.section snyoa +.section snyob +.section snypa +.section snypb +.section snyqa +.section snyqb +.section snyra +.section snyrb +.section snysa +.section snysb +.section snyta +.section snytb +.section snyua +.section snyub +.section snyva +.section snyvb +.section snywa +.section snywb +.section snyxa +.section snyxb +.section snyya +.section snyyb +.section snyza +.section snyzb +.section sny1a +.section sny1b +.section sny2a +.section sny2b +.section sny3a +.section sny3b +.section sny4a +.section sny4b +.section sny5a +.section sny5b +.section sny6a +.section sny6b +.section sny7a +.section sny7b +.section sny8a +.section sny8b +.section sny9a +.section sny9b +.section sny0a +.section sny0b +.section snzaa +.section snzab +.section snzba +.section snzbb +.section snzca +.section snzcb +.section snzda +.section snzdb +.section snzea +.section snzeb +.section snzfa +.section snzfb +.section snzga +.section snzgb +.section snzha +.section snzhb +.section snzia +.section snzib +.section snzja +.section snzjb +.section snzka +.section snzkb +.section snzla +.section snzlb +.section snzma +.section snzmb +.section snzna +.section snznb +.section snzoa +.section snzob +.section snzpa +.section snzpb +.section snzqa +.section snzqb +.section snzra +.section snzrb +.section snzsa +.section snzsb +.section snzta +.section snztb +.section snzua +.section snzub +.section snzva +.section snzvb +.section snzwa +.section snzwb +.section snzxa +.section snzxb +.section snzya +.section snzyb +.section snzza +.section snzzb +.section snz1a +.section snz1b +.section snz2a +.section snz2b +.section snz3a +.section snz3b +.section snz4a +.section snz4b +.section snz5a +.section snz5b +.section snz6a +.section snz6b +.section snz7a +.section snz7b +.section snz8a +.section snz8b +.section snz9a +.section snz9b +.section snz0a +.section snz0b +.section sn1aa +.section sn1ab +.section sn1ba +.section sn1bb +.section sn1ca +.section sn1cb +.section sn1da +.section sn1db +.section sn1ea +.section sn1eb +.section sn1fa +.section sn1fb +.section sn1ga +.section sn1gb +.section sn1ha +.section sn1hb +.section sn1ia +.section sn1ib +.section sn1ja +.section sn1jb +.section sn1ka +.section sn1kb +.section sn1la +.section sn1lb +.section sn1ma +.section sn1mb +.section sn1na +.section sn1nb +.section sn1oa +.section sn1ob +.section sn1pa +.section sn1pb +.section sn1qa +.section sn1qb +.section sn1ra +.section sn1rb +.section sn1sa +.section sn1sb +.section sn1ta +.section sn1tb +.section sn1ua +.section sn1ub +.section sn1va +.section sn1vb +.section sn1wa +.section sn1wb +.section sn1xa +.section sn1xb +.section sn1ya +.section sn1yb +.section sn1za +.section sn1zb +.section sn11a +.section sn11b +.section sn12a +.section sn12b +.section sn13a +.section sn13b +.section sn14a +.section sn14b +.section sn15a +.section sn15b +.section sn16a +.section sn16b +.section sn17a +.section sn17b +.section sn18a +.section sn18b +.section sn19a +.section sn19b +.section sn10a +.section sn10b +.section sn2aa +.section sn2ab +.section sn2ba +.section sn2bb +.section sn2ca +.section sn2cb +.section sn2da +.section sn2db +.section sn2ea +.section sn2eb +.section sn2fa +.section sn2fb +.section sn2ga +.section sn2gb +.section sn2ha +.section sn2hb +.section sn2ia +.section sn2ib +.section sn2ja +.section sn2jb +.section sn2ka +.section sn2kb +.section sn2la +.section sn2lb +.section sn2ma +.section sn2mb +.section sn2na +.section sn2nb +.section sn2oa +.section sn2ob +.section sn2pa +.section sn2pb +.section sn2qa +.section sn2qb +.section sn2ra +.section sn2rb +.section sn2sa +.section sn2sb +.section sn2ta +.section sn2tb +.section sn2ua +.section sn2ub +.section sn2va +.section sn2vb +.section sn2wa +.section sn2wb +.section sn2xa +.section sn2xb +.section sn2ya +.section sn2yb +.section sn2za +.section sn2zb +.section sn21a +.section sn21b +.section sn22a +.section sn22b +.section sn23a +.section sn23b +.section sn24a +.section sn24b +.section sn25a +.section sn25b +.section sn26a +.section sn26b +.section sn27a +.section sn27b +.section sn28a +.section sn28b +.section sn29a +.section sn29b +.section sn20a +.section sn20b +.section sn3aa +.section sn3ab +.section sn3ba +.section sn3bb +.section sn3ca +.section sn3cb +.section sn3da +.section sn3db +.section sn3ea +.section sn3eb +.section sn3fa +.section sn3fb +.section sn3ga +.section sn3gb +.section sn3ha +.section sn3hb +.section sn3ia +.section sn3ib +.section sn3ja +.section sn3jb +.section sn3ka +.section sn3kb +.section sn3la +.section sn3lb +.section sn3ma +.section sn3mb +.section sn3na +.section sn3nb +.section sn3oa +.section sn3ob +.section sn3pa +.section sn3pb +.section sn3qa +.section sn3qb +.section sn3ra +.section sn3rb +.section sn3sa +.section sn3sb +.section sn3ta +.section sn3tb +.section sn3ua +.section sn3ub +.section sn3va +.section sn3vb +.section sn3wa +.section sn3wb +.section sn3xa +.section sn3xb +.section sn3ya +.section sn3yb +.section sn3za +.section sn3zb +.section sn31a +.section sn31b +.section sn32a +.section sn32b +.section sn33a +.section sn33b +.section sn34a +.section sn34b +.section sn35a +.section sn35b +.section sn36a +.section sn36b +.section sn37a +.section sn37b +.section sn38a +.section sn38b +.section sn39a +.section sn39b +.section sn30a +.section sn30b +.section sn4aa +.section sn4ab +.section sn4ba +.section sn4bb +.section sn4ca +.section sn4cb +.section sn4da +.section sn4db +.section sn4ea +.section sn4eb +.section sn4fa +.section sn4fb +.section sn4ga +.section sn4gb +.section sn4ha +.section sn4hb +.section sn4ia +.section sn4ib +.section sn4ja +.section sn4jb +.section sn4ka +.section sn4kb +.section sn4la +.section sn4lb +.section sn4ma +.section sn4mb +.section sn4na +.section sn4nb +.section sn4oa +.section sn4ob +.section sn4pa +.section sn4pb +.section sn4qa +.section sn4qb +.section sn4ra +.section sn4rb +.section sn4sa +.section sn4sb +.section sn4ta +.section sn4tb +.section sn4ua +.section sn4ub +.section sn4va +.section sn4vb +.section sn4wa +.section sn4wb +.section sn4xa +.section sn4xb +.section sn4ya +.section sn4yb +.section sn4za +.section sn4zb +.section sn41a +.section sn41b +.section sn42a +.section sn42b +.section sn43a +.section sn43b +.section sn44a +.section sn44b +.section sn45a +.section sn45b +.section sn46a +.section sn46b +.section sn47a +.section sn47b +.section sn48a +.section sn48b +.section sn49a +.section sn49b +.section sn40a +.section sn40b +.section sn5aa +.section sn5ab +.section sn5ba +.section sn5bb +.section sn5ca +.section sn5cb +.section sn5da +.section sn5db +.section sn5ea +.section sn5eb +.section sn5fa +.section sn5fb +.section sn5ga +.section sn5gb +.section sn5ha +.section sn5hb +.section sn5ia +.section sn5ib +.section sn5ja +.section sn5jb +.section sn5ka +.section sn5kb +.section sn5la +.section sn5lb +.section sn5ma +.section sn5mb +.section sn5na +.section sn5nb +.section sn5oa +.section sn5ob +.section sn5pa +.section sn5pb +.section sn5qa +.section sn5qb +.section sn5ra +.section sn5rb +.section sn5sa +.section sn5sb +.section sn5ta +.section sn5tb +.section sn5ua +.section sn5ub +.section sn5va +.section sn5vb +.section sn5wa +.section sn5wb +.section sn5xa +.section sn5xb +.section sn5ya +.section sn5yb +.section sn5za +.section sn5zb +.section sn51a +.section sn51b +.section sn52a +.section sn52b +.section sn53a +.section sn53b +.section sn54a +.section sn54b +.section sn55a +.section sn55b +.section sn56a +.section sn56b +.section sn57a +.section sn57b +.section sn58a +.section sn58b +.section sn59a +.section sn59b +.section sn50a +.section sn50b +.section sn6aa +.section sn6ab +.section sn6ba +.section sn6bb +.section sn6ca +.section sn6cb +.section sn6da +.section sn6db +.section sn6ea +.section sn6eb +.section sn6fa +.section sn6fb +.section sn6ga +.section sn6gb +.section sn6ha +.section sn6hb +.section sn6ia +.section sn6ib +.section sn6ja +.section sn6jb +.section sn6ka +.section sn6kb +.section sn6la +.section sn6lb +.section sn6ma +.section sn6mb +.section sn6na +.section sn6nb +.section sn6oa +.section sn6ob +.section sn6pa +.section sn6pb +.section sn6qa +.section sn6qb +.section sn6ra +.section sn6rb +.section sn6sa +.section sn6sb +.section sn6ta +.section sn6tb +.section sn6ua +.section sn6ub +.section sn6va +.section sn6vb +.section sn6wa +.section sn6wb +.section sn6xa +.section sn6xb +.section sn6ya +.section sn6yb +.section sn6za +.section sn6zb +.section sn61a +.section sn61b +.section sn62a +.section sn62b +.section sn63a +.section sn63b +.section sn64a +.section sn64b +.section sn65a +.section sn65b +.section sn66a +.section sn66b +.section sn67a +.section sn67b +.section sn68a +.section sn68b +.section sn69a +.section sn69b +.section sn60a +.section sn60b +.section sn7aa +.section sn7ab +.section sn7ba +.section sn7bb +.section sn7ca +.section sn7cb +.section sn7da +.section sn7db +.section sn7ea +.section sn7eb +.section sn7fa +.section sn7fb +.section sn7ga +.section sn7gb +.section sn7ha +.section sn7hb +.section sn7ia +.section sn7ib +.section sn7ja +.section sn7jb +.section sn7ka +.section sn7kb +.section sn7la +.section sn7lb +.section sn7ma +.section sn7mb +.section sn7na +.section sn7nb +.section sn7oa +.section sn7ob +.section sn7pa +.section sn7pb +.section sn7qa +.section sn7qb +.section sn7ra +.section sn7rb +.section sn7sa +.section sn7sb +.section sn7ta +.section sn7tb +.section sn7ua +.section sn7ub +.section sn7va +.section sn7vb +.section sn7wa +.section sn7wb +.section sn7xa +.section sn7xb +.section sn7ya +.section sn7yb +.section sn7za +.section sn7zb +.section sn71a +.section sn71b +.section sn72a +.section sn72b +.section sn73a +.section sn73b +.section sn74a +.section sn74b +.section sn75a +.section sn75b +.section sn76a +.section sn76b +.section sn77a +.section sn77b +.section sn78a +.section sn78b +.section sn79a +.section sn79b +.section sn70a +.section sn70b +.section sn8aa +.section sn8ab +.section sn8ba +.section sn8bb +.section sn8ca +.section sn8cb +.section sn8da +.section sn8db +.section sn8ea +.section sn8eb +.section sn8fa +.section sn8fb +.section sn8ga +.section sn8gb +.section sn8ha +.section sn8hb +.section sn8ia +.section sn8ib +.section sn8ja +.section sn8jb +.section sn8ka +.section sn8kb +.section sn8la +.section sn8lb +.section sn8ma +.section sn8mb +.section sn8na +.section sn8nb +.section sn8oa +.section sn8ob +.section sn8pa +.section sn8pb +.section sn8qa +.section sn8qb +.section sn8ra +.section sn8rb +.section sn8sa +.section sn8sb +.section sn8ta +.section sn8tb +.section sn8ua +.section sn8ub +.section sn8va +.section sn8vb +.section sn8wa +.section sn8wb +.section sn8xa +.section sn8xb +.section sn8ya +.section sn8yb +.section sn8za +.section sn8zb +.section sn81a +.section sn81b +.section sn82a +.section sn82b +.section sn83a +.section sn83b +.section sn84a +.section sn84b +.section sn85a +.section sn85b +.section sn86a +.section sn86b +.section sn87a +.section sn87b +.section sn88a +.section sn88b +.section sn89a +.section sn89b +.section sn80a +.section sn80b +.section sn9aa +.section sn9ab +.section sn9ba +.section sn9bb +.section sn9ca +.section sn9cb +.section sn9da +.section sn9db +.section sn9ea +.section sn9eb +.section sn9fa +.section sn9fb +.section sn9ga +.section sn9gb +.section sn9ha +.section sn9hb +.section sn9ia +.section sn9ib +.section sn9ja +.section sn9jb +.section sn9ka +.section sn9kb +.section sn9la +.section sn9lb +.section sn9ma +.section sn9mb +.section sn9na +.section sn9nb +.section sn9oa +.section sn9ob +.section sn9pa +.section sn9pb +.section sn9qa +.section sn9qb +.section sn9ra +.section sn9rb +.section sn9sa +.section sn9sb +.section sn9ta +.section sn9tb +.section sn9ua +.section sn9ub +.section sn9va +.section sn9vb +.section sn9wa +.section sn9wb +.section sn9xa +.section sn9xb +.section sn9ya +.section sn9yb +.section sn9za +.section sn9zb +.section sn91a +.section sn91b +.section sn92a +.section sn92b +.section sn93a +.section sn93b +.section sn94a +.section sn94b +.section sn95a +.section sn95b +.section sn96a +.section sn96b +.section sn97a +.section sn97b +.section sn98a +.section sn98b +.section sn99a +.section sn99b +.section sn90a +.section sn90b +.section sn0aa +.section sn0ab +.section sn0ba +.section sn0bb +.section sn0ca +.section sn0cb +.section sn0da +.section sn0db +.section sn0ea +.section sn0eb +.section sn0fa +.section sn0fb +.section sn0ga +.section sn0gb +.section sn0ha +.section sn0hb +.section sn0ia +.section sn0ib +.section sn0ja +.section sn0jb +.section sn0ka +.section sn0kb +.section sn0la +.section sn0lb +.section sn0ma +.section sn0mb +.section sn0na +.section sn0nb +.section sn0oa +.section sn0ob +.section sn0pa +.section sn0pb +.section sn0qa +.section sn0qb +.section sn0ra +.section sn0rb +.section sn0sa +.section sn0sb +.section sn0ta +.section sn0tb +.section sn0ua +.section sn0ub +.section sn0va +.section sn0vb +.section sn0wa +.section sn0wb +.section sn0xa +.section sn0xb +.section sn0ya +.section sn0yb +.section sn0za +.section sn0zb +.section sn01a +.section sn01b +.section sn02a +.section sn02b +.section sn03a +.section sn03b +.section sn04a +.section sn04b +.section sn05a +.section sn05b +.section sn06a +.section sn06b +.section sn07a +.section sn07b +.section sn08a +.section sn08b +.section sn09a +.section sn09b +.section sn00a +.section sn00b +.section soaaa +.section soaab +.section soaba +.section soabb +.section soaca +.section soacb +.section soada +.section soadb +.section soaea +.section soaeb +.section soafa +.section soafb +.section soaga +.section soagb +.section soaha +.section soahb +.section soaia +.section soaib +.section soaja +.section soajb +.section soaka +.section soakb +.section soala +.section soalb +.section soama +.section soamb +.section soana +.section soanb +.section soaoa +.section soaob +.section soapa +.section soapb +.section soaqa +.section soaqb +.section soara +.section soarb +.section soasa +.section soasb +.section soata +.section soatb +.section soaua +.section soaub +.section soava +.section soavb +.section soawa +.section soawb +.section soaxa +.section soaxb +.section soaya +.section soayb +.section soaza +.section soazb +.section soa1a +.section soa1b +.section soa2a +.section soa2b +.section soa3a +.section soa3b +.section soa4a +.section soa4b +.section soa5a +.section soa5b +.section soa6a +.section soa6b +.section soa7a +.section soa7b +.section soa8a +.section soa8b +.section soa9a +.section soa9b +.section soa0a +.section soa0b +.section sobaa +.section sobab +.section sobba +.section sobbb +.section sobca +.section sobcb +.section sobda +.section sobdb +.section sobea +.section sobeb +.section sobfa +.section sobfb +.section sobga +.section sobgb +.section sobha +.section sobhb +.section sobia +.section sobib +.section sobja +.section sobjb +.section sobka +.section sobkb +.section sobla +.section soblb +.section sobma +.section sobmb +.section sobna +.section sobnb +.section soboa +.section sobob +.section sobpa +.section sobpb +.section sobqa +.section sobqb +.section sobra +.section sobrb +.section sobsa +.section sobsb +.section sobta +.section sobtb +.section sobua +.section sobub +.section sobva +.section sobvb +.section sobwa +.section sobwb +.section sobxa +.section sobxb +.section sobya +.section sobyb +.section sobza +.section sobzb +.section sob1a +.section sob1b +.section sob2a +.section sob2b +.section sob3a +.section sob3b +.section sob4a +.section sob4b +.section sob5a +.section sob5b +.section sob6a +.section sob6b +.section sob7a +.section sob7b +.section sob8a +.section sob8b +.section sob9a +.section sob9b +.section sob0a +.section sob0b +.section socaa +.section socab +.section socba +.section socbb +.section socca +.section soccb +.section socda +.section socdb +.section socea +.section soceb +.section socfa +.section socfb +.section socga +.section socgb +.section socha +.section sochb +.section socia +.section socib +.section socja +.section socjb +.section socka +.section sockb +.section socla +.section soclb +.section socma +.section socmb +.section socna +.section socnb +.section socoa +.section socob +.section socpa +.section socpb +.section socqa +.section socqb +.section socra +.section socrb +.section socsa +.section socsb +.section socta +.section soctb +.section socua +.section socub +.section socva +.section socvb +.section socwa +.section socwb +.section socxa +.section socxb +.section socya +.section socyb +.section socza +.section soczb +.section soc1a +.section soc1b +.section soc2a +.section soc2b +.section soc3a +.section soc3b +.section soc4a +.section soc4b +.section soc5a +.section soc5b +.section soc6a +.section soc6b +.section soc7a +.section soc7b +.section soc8a +.section soc8b +.section soc9a +.section soc9b +.section soc0a +.section soc0b +.section sodaa +.section sodab +.section sodba +.section sodbb +.section sodca +.section sodcb +.section sodda +.section soddb +.section sodea +.section sodeb +.section sodfa +.section sodfb +.section sodga +.section sodgb +.section sodha +.section sodhb +.section sodia +.section sodib +.section sodja +.section sodjb +.section sodka +.section sodkb +.section sodla +.section sodlb +.section sodma +.section sodmb +.section sodna +.section sodnb +.section sodoa +.section sodob +.section sodpa +.section sodpb +.section sodqa +.section sodqb +.section sodra +.section sodrb +.section sodsa +.section sodsb +.section sodta +.section sodtb +.section sodua +.section sodub +.section sodva +.section sodvb +.section sodwa +.section sodwb +.section sodxa +.section sodxb +.section sodya +.section sodyb +.section sodza +.section sodzb +.section sod1a +.section sod1b +.section sod2a +.section sod2b +.section sod3a +.section sod3b +.section sod4a +.section sod4b +.section sod5a +.section sod5b +.section sod6a +.section sod6b +.section sod7a +.section sod7b +.section sod8a +.section sod8b +.section sod9a +.section sod9b +.section sod0a +.section sod0b +.section soeaa +.section soeab +.section soeba +.section soebb +.section soeca +.section soecb +.section soeda +.section soedb +.section soeea +.section soeeb +.section soefa +.section soefb +.section soega +.section soegb +.section soeha +.section soehb +.section soeia +.section soeib +.section soeja +.section soejb +.section soeka +.section soekb +.section soela +.section soelb +.section soema +.section soemb +.section soena +.section soenb +.section soeoa +.section soeob +.section soepa +.section soepb +.section soeqa +.section soeqb +.section soera +.section soerb +.section soesa +.section soesb +.section soeta +.section soetb +.section soeua +.section soeub +.section soeva +.section soevb +.section soewa +.section soewb +.section soexa +.section soexb +.section soeya +.section soeyb +.section soeza +.section soezb +.section soe1a +.section soe1b +.section soe2a +.section soe2b +.section soe3a +.section soe3b +.section soe4a +.section soe4b +.section soe5a +.section soe5b +.section soe6a +.section soe6b +.section soe7a +.section soe7b +.section soe8a +.section soe8b +.section soe9a +.section soe9b +.section soe0a +.section soe0b +.section sofaa +.section sofab +.section sofba +.section sofbb +.section sofca +.section sofcb +.section sofda +.section sofdb +.section sofea +.section sofeb +.section soffa +.section soffb +.section sofga +.section sofgb +.section sofha +.section sofhb +.section sofia +.section sofib +.section sofja +.section sofjb +.section sofka +.section sofkb +.section sofla +.section soflb +.section sofma +.section sofmb +.section sofna +.section sofnb +.section sofoa +.section sofob +.section sofpa +.section sofpb +.section sofqa +.section sofqb +.section sofra +.section sofrb +.section sofsa +.section sofsb +.section softa +.section softb +.section sofua +.section sofub +.section sofva +.section sofvb +.section sofwa +.section sofwb +.section sofxa +.section sofxb +.section sofya +.section sofyb +.section sofza +.section sofzb +.section sof1a +.section sof1b +.section sof2a +.section sof2b +.section sof3a +.section sof3b +.section sof4a +.section sof4b +.section sof5a +.section sof5b +.section sof6a +.section sof6b +.section sof7a +.section sof7b +.section sof8a +.section sof8b +.section sof9a +.section sof9b +.section sof0a +.section sof0b +.section sogaa +.section sogab +.section sogba +.section sogbb +.section sogca +.section sogcb +.section sogda +.section sogdb +.section sogea +.section sogeb +.section sogfa +.section sogfb +.section sogga +.section soggb +.section sogha +.section soghb +.section sogia +.section sogib +.section sogja +.section sogjb +.section sogka +.section sogkb +.section sogla +.section soglb +.section sogma +.section sogmb +.section sogna +.section sognb +.section sogoa +.section sogob +.section sogpa +.section sogpb +.section sogqa +.section sogqb +.section sogra +.section sogrb +.section sogsa +.section sogsb +.section sogta +.section sogtb +.section sogua +.section sogub +.section sogva +.section sogvb +.section sogwa +.section sogwb +.section sogxa +.section sogxb +.section sogya +.section sogyb +.section sogza +.section sogzb +.section sog1a +.section sog1b +.section sog2a +.section sog2b +.section sog3a +.section sog3b +.section sog4a +.section sog4b +.section sog5a +.section sog5b +.section sog6a +.section sog6b +.section sog7a +.section sog7b +.section sog8a +.section sog8b +.section sog9a +.section sog9b +.section sog0a +.section sog0b +.section sohaa +.section sohab +.section sohba +.section sohbb +.section sohca +.section sohcb +.section sohda +.section sohdb +.section sohea +.section soheb +.section sohfa +.section sohfb +.section sohga +.section sohgb +.section sohha +.section sohhb +.section sohia +.section sohib +.section sohja +.section sohjb +.section sohka +.section sohkb +.section sohla +.section sohlb +.section sohma +.section sohmb +.section sohna +.section sohnb +.section sohoa +.section sohob +.section sohpa +.section sohpb +.section sohqa +.section sohqb +.section sohra +.section sohrb +.section sohsa +.section sohsb +.section sohta +.section sohtb +.section sohua +.section sohub +.section sohva +.section sohvb +.section sohwa +.section sohwb +.section sohxa +.section sohxb +.section sohya +.section sohyb +.section sohza +.section sohzb +.section soh1a +.section soh1b +.section soh2a +.section soh2b +.section soh3a +.section soh3b +.section soh4a +.section soh4b +.section soh5a +.section soh5b +.section soh6a +.section soh6b +.section soh7a +.section soh7b +.section soh8a +.section soh8b +.section soh9a +.section soh9b +.section soh0a +.section soh0b +.section soiaa +.section soiab +.section soiba +.section soibb +.section soica +.section soicb +.section soida +.section soidb +.section soiea +.section soieb +.section soifa +.section soifb +.section soiga +.section soigb +.section soiha +.section soihb +.section soiia +.section soiib +.section soija +.section soijb +.section soika +.section soikb +.section soila +.section soilb +.section soima +.section soimb +.section soina +.section soinb +.section soioa +.section soiob +.section soipa +.section soipb +.section soiqa +.section soiqb +.section soira +.section soirb +.section soisa +.section soisb +.section soita +.section soitb +.section soiua +.section soiub +.section soiva +.section soivb +.section soiwa +.section soiwb +.section soixa +.section soixb +.section soiya +.section soiyb +.section soiza +.section soizb +.section soi1a +.section soi1b +.section soi2a +.section soi2b +.section soi3a +.section soi3b +.section soi4a +.section soi4b +.section soi5a +.section soi5b +.section soi6a +.section soi6b +.section soi7a +.section soi7b +.section soi8a +.section soi8b +.section soi9a +.section soi9b +.section soi0a +.section soi0b +.section sojaa +.section sojab +.section sojba +.section sojbb +.section sojca +.section sojcb +.section sojda +.section sojdb +.section sojea +.section sojeb +.section sojfa +.section sojfb +.section sojga +.section sojgb +.section sojha +.section sojhb +.section sojia +.section sojib +.section sojja +.section sojjb +.section sojka +.section sojkb +.section sojla +.section sojlb +.section sojma +.section sojmb +.section sojna +.section sojnb +.section sojoa +.section sojob +.section sojpa +.section sojpb +.section sojqa +.section sojqb +.section sojra +.section sojrb +.section sojsa +.section sojsb +.section sojta +.section sojtb +.section sojua +.section sojub +.section sojva +.section sojvb +.section sojwa +.section sojwb +.section sojxa +.section sojxb +.section sojya +.section sojyb +.section sojza +.section sojzb +.section soj1a +.section soj1b +.section soj2a +.section soj2b +.section soj3a +.section soj3b +.section soj4a +.section soj4b +.section soj5a +.section soj5b +.section soj6a +.section soj6b +.section soj7a +.section soj7b +.section soj8a +.section soj8b +.section soj9a +.section soj9b +.section soj0a +.section soj0b +.section sokaa +.section sokab +.section sokba +.section sokbb +.section sokca +.section sokcb +.section sokda +.section sokdb +.section sokea +.section sokeb +.section sokfa +.section sokfb +.section sokga +.section sokgb +.section sokha +.section sokhb +.section sokia +.section sokib +.section sokja +.section sokjb +.section sokka +.section sokkb +.section sokla +.section soklb +.section sokma +.section sokmb +.section sokna +.section soknb +.section sokoa +.section sokob +.section sokpa +.section sokpb +.section sokqa +.section sokqb +.section sokra +.section sokrb +.section soksa +.section soksb +.section sokta +.section soktb +.section sokua +.section sokub +.section sokva +.section sokvb +.section sokwa +.section sokwb +.section sokxa +.section sokxb +.section sokya +.section sokyb +.section sokza +.section sokzb +.section sok1a +.section sok1b +.section sok2a +.section sok2b +.section sok3a +.section sok3b +.section sok4a +.section sok4b +.section sok5a +.section sok5b +.section sok6a +.section sok6b +.section sok7a +.section sok7b +.section sok8a +.section sok8b +.section sok9a +.section sok9b +.section sok0a +.section sok0b +.section solaa +.section solab +.section solba +.section solbb +.section solca +.section solcb +.section solda +.section soldb +.section solea +.section soleb +.section solfa +.section solfb +.section solga +.section solgb +.section solha +.section solhb +.section solia +.section solib +.section solja +.section soljb +.section solka +.section solkb +.section solla +.section sollb +.section solma +.section solmb +.section solna +.section solnb +.section soloa +.section solob +.section solpa +.section solpb +.section solqa +.section solqb +.section solra +.section solrb +.section solsa +.section solsb +.section solta +.section soltb +.section solua +.section solub +.section solva +.section solvb +.section solwa +.section solwb +.section solxa +.section solxb +.section solya +.section solyb +.section solza +.section solzb +.section sol1a +.section sol1b +.section sol2a +.section sol2b +.section sol3a +.section sol3b +.section sol4a +.section sol4b +.section sol5a +.section sol5b +.section sol6a +.section sol6b +.section sol7a +.section sol7b +.section sol8a +.section sol8b +.section sol9a +.section sol9b +.section sol0a +.section sol0b +.section somaa +.section somab +.section somba +.section sombb +.section somca +.section somcb +.section somda +.section somdb +.section somea +.section someb +.section somfa +.section somfb +.section somga +.section somgb +.section somha +.section somhb +.section somia +.section somib +.section somja +.section somjb +.section somka +.section somkb +.section somla +.section somlb +.section somma +.section sommb +.section somna +.section somnb +.section somoa +.section somob +.section sompa +.section sompb +.section somqa +.section somqb +.section somra +.section somrb +.section somsa +.section somsb +.section somta +.section somtb +.section somua +.section somub +.section somva +.section somvb +.section somwa +.section somwb +.section somxa +.section somxb +.section somya +.section somyb +.section somza +.section somzb +.section som1a +.section som1b +.section som2a +.section som2b +.section som3a +.section som3b +.section som4a +.section som4b +.section som5a +.section som5b +.section som6a +.section som6b +.section som7a +.section som7b +.section som8a +.section som8b +.section som9a +.section som9b +.section som0a +.section som0b +.section sonaa +.section sonab +.section sonba +.section sonbb +.section sonca +.section soncb +.section sonda +.section sondb +.section sonea +.section soneb +.section sonfa +.section sonfb +.section songa +.section songb +.section sonha +.section sonhb +.section sonia +.section sonib +.section sonja +.section sonjb +.section sonka +.section sonkb +.section sonla +.section sonlb +.section sonma +.section sonmb +.section sonna +.section sonnb +.section sonoa +.section sonob +.section sonpa +.section sonpb +.section sonqa +.section sonqb +.section sonra +.section sonrb +.section sonsa +.section sonsb +.section sonta +.section sontb +.section sonua +.section sonub +.section sonva +.section sonvb +.section sonwa +.section sonwb +.section sonxa +.section sonxb +.section sonya +.section sonyb +.section sonza +.section sonzb +.section son1a +.section son1b +.section son2a +.section son2b +.section son3a +.section son3b +.section son4a +.section son4b +.section son5a +.section son5b +.section son6a +.section son6b +.section son7a +.section son7b +.section son8a +.section son8b +.section son9a +.section son9b +.section son0a +.section son0b +.section sooaa +.section sooab +.section sooba +.section soobb +.section sooca +.section soocb +.section sooda +.section soodb +.section sooea +.section sooeb +.section soofa +.section soofb +.section sooga +.section soogb +.section sooha +.section soohb +.section sooia +.section sooib +.section sooja +.section soojb +.section sooka +.section sookb +.section soola +.section soolb +.section sooma +.section soomb +.section soona +.section soonb +.section soooa +.section sooob +.section soopa +.section soopb +.section sooqa +.section sooqb +.section soora +.section soorb +.section soosa +.section soosb +.section soota +.section sootb +.section sooua +.section sooub +.section soova +.section soovb +.section soowa +.section soowb +.section sooxa +.section sooxb +.section sooya +.section sooyb +.section sooza +.section soozb +.section soo1a +.section soo1b +.section soo2a +.section soo2b +.section soo3a +.section soo3b +.section soo4a +.section soo4b +.section soo5a +.section soo5b +.section soo6a +.section soo6b +.section soo7a +.section soo7b +.section soo8a +.section soo8b +.section soo9a +.section soo9b +.section soo0a +.section soo0b +.section sopaa +.section sopab +.section sopba +.section sopbb +.section sopca +.section sopcb +.section sopda +.section sopdb +.section sopea +.section sopeb +.section sopfa +.section sopfb +.section sopga +.section sopgb +.section sopha +.section sophb +.section sopia +.section sopib +.section sopja +.section sopjb +.section sopka +.section sopkb +.section sopla +.section soplb +.section sopma +.section sopmb +.section sopna +.section sopnb +.section sopoa +.section sopob +.section soppa +.section soppb +.section sopqa +.section sopqb +.section sopra +.section soprb +.section sopsa +.section sopsb +.section sopta +.section soptb +.section sopua +.section sopub +.section sopva +.section sopvb +.section sopwa +.section sopwb +.section sopxa +.section sopxb +.section sopya +.section sopyb +.section sopza +.section sopzb +.section sop1a +.section sop1b +.section sop2a +.section sop2b +.section sop3a +.section sop3b +.section sop4a +.section sop4b +.section sop5a +.section sop5b +.section sop6a +.section sop6b +.section sop7a +.section sop7b +.section sop8a +.section sop8b +.section sop9a +.section sop9b +.section sop0a +.section sop0b +.section soqaa +.section soqab +.section soqba +.section soqbb +.section soqca +.section soqcb +.section soqda +.section soqdb +.section soqea +.section soqeb +.section soqfa +.section soqfb +.section soqga +.section soqgb +.section soqha +.section soqhb +.section soqia +.section soqib +.section soqja +.section soqjb +.section soqka +.section soqkb +.section soqla +.section soqlb +.section soqma +.section soqmb +.section soqna +.section soqnb +.section soqoa +.section soqob +.section soqpa +.section soqpb +.section soqqa +.section soqqb +.section soqra +.section soqrb +.section soqsa +.section soqsb +.section soqta +.section soqtb +.section soqua +.section soqub +.section soqva +.section soqvb +.section soqwa +.section soqwb +.section soqxa +.section soqxb +.section soqya +.section soqyb +.section soqza +.section soqzb +.section soq1a +.section soq1b +.section soq2a +.section soq2b +.section soq3a +.section soq3b +.section soq4a +.section soq4b +.section soq5a +.section soq5b +.section soq6a +.section soq6b +.section soq7a +.section soq7b +.section soq8a +.section soq8b +.section soq9a +.section soq9b +.section soq0a +.section soq0b +.section soraa +.section sorab +.section sorba +.section sorbb +.section sorca +.section sorcb +.section sorda +.section sordb +.section sorea +.section soreb +.section sorfa +.section sorfb +.section sorga +.section sorgb +.section sorha +.section sorhb +.section soria +.section sorib +.section sorja +.section sorjb +.section sorka +.section sorkb +.section sorla +.section sorlb +.section sorma +.section sormb +.section sorna +.section sornb +.section soroa +.section sorob +.section sorpa +.section sorpb +.section sorqa +.section sorqb +.section sorra +.section sorrb +.section sorsa +.section sorsb +.section sorta +.section sortb +.section sorua +.section sorub +.section sorva +.section sorvb +.section sorwa +.section sorwb +.section sorxa +.section sorxb +.section sorya +.section soryb +.section sorza +.section sorzb +.section sor1a +.section sor1b +.section sor2a +.section sor2b +.section sor3a +.section sor3b +.section sor4a +.section sor4b +.section sor5a +.section sor5b +.section sor6a +.section sor6b +.section sor7a +.section sor7b +.section sor8a +.section sor8b +.section sor9a +.section sor9b +.section sor0a +.section sor0b +.section sosaa +.section sosab +.section sosba +.section sosbb +.section sosca +.section soscb +.section sosda +.section sosdb +.section sosea +.section soseb +.section sosfa +.section sosfb +.section sosga +.section sosgb +.section sosha +.section soshb +.section sosia +.section sosib +.section sosja +.section sosjb +.section soska +.section soskb +.section sosla +.section soslb +.section sosma +.section sosmb +.section sosna +.section sosnb +.section sosoa +.section sosob +.section sospa +.section sospb +.section sosqa +.section sosqb +.section sosra +.section sosrb +.section sossa +.section sossb +.section sosta +.section sostb +.section sosua +.section sosub +.section sosva +.section sosvb +.section soswa +.section soswb +.section sosxa +.section sosxb +.section sosya +.section sosyb +.section sosza +.section soszb +.section sos1a +.section sos1b +.section sos2a +.section sos2b +.section sos3a +.section sos3b +.section sos4a +.section sos4b +.section sos5a +.section sos5b +.section sos6a +.section sos6b +.section sos7a +.section sos7b +.section sos8a +.section sos8b +.section sos9a +.section sos9b +.section sos0a +.section sos0b +.section sotaa +.section sotab +.section sotba +.section sotbb +.section sotca +.section sotcb +.section sotda +.section sotdb +.section sotea +.section soteb +.section sotfa +.section sotfb +.section sotga +.section sotgb +.section sotha +.section sothb +.section sotia +.section sotib +.section sotja +.section sotjb +.section sotka +.section sotkb +.section sotla +.section sotlb +.section sotma +.section sotmb +.section sotna +.section sotnb +.section sotoa +.section sotob +.section sotpa +.section sotpb +.section sotqa +.section sotqb +.section sotra +.section sotrb +.section sotsa +.section sotsb +.section sotta +.section sottb +.section sotua +.section sotub +.section sotva +.section sotvb +.section sotwa +.section sotwb +.section sotxa +.section sotxb +.section sotya +.section sotyb +.section sotza +.section sotzb +.section sot1a +.section sot1b +.section sot2a +.section sot2b +.section sot3a +.section sot3b +.section sot4a +.section sot4b +.section sot5a +.section sot5b +.section sot6a +.section sot6b +.section sot7a +.section sot7b +.section sot8a +.section sot8b +.section sot9a +.section sot9b +.section sot0a +.section sot0b +.section souaa +.section souab +.section souba +.section soubb +.section souca +.section soucb +.section souda +.section soudb +.section souea +.section soueb +.section soufa +.section soufb +.section souga +.section sougb +.section souha +.section souhb +.section souia +.section souib +.section souja +.section soujb +.section souka +.section soukb +.section soula +.section soulb +.section souma +.section soumb +.section souna +.section sounb +.section souoa +.section souob +.section soupa +.section soupb +.section souqa +.section souqb +.section soura +.section sourb +.section sousa +.section sousb +.section souta +.section soutb +.section souua +.section souub +.section souva +.section souvb +.section souwa +.section souwb +.section souxa +.section souxb +.section souya +.section souyb +.section souza +.section souzb +.section sou1a +.section sou1b +.section sou2a +.section sou2b +.section sou3a +.section sou3b +.section sou4a +.section sou4b +.section sou5a +.section sou5b +.section sou6a +.section sou6b +.section sou7a +.section sou7b +.section sou8a +.section sou8b +.section sou9a +.section sou9b +.section sou0a +.section sou0b +.section sovaa +.section sovab +.section sovba +.section sovbb +.section sovca +.section sovcb +.section sovda +.section sovdb +.section sovea +.section soveb +.section sovfa +.section sovfb +.section sovga +.section sovgb +.section sovha +.section sovhb +.section sovia +.section sovib +.section sovja +.section sovjb +.section sovka +.section sovkb +.section sovla +.section sovlb +.section sovma +.section sovmb +.section sovna +.section sovnb +.section sovoa +.section sovob +.section sovpa +.section sovpb +.section sovqa +.section sovqb +.section sovra +.section sovrb +.section sovsa +.section sovsb +.section sovta +.section sovtb +.section sovua +.section sovub +.section sovva +.section sovvb +.section sovwa +.section sovwb +.section sovxa +.section sovxb +.section sovya +.section sovyb +.section sovza +.section sovzb +.section sov1a +.section sov1b +.section sov2a +.section sov2b +.section sov3a +.section sov3b +.section sov4a +.section sov4b +.section sov5a +.section sov5b +.section sov6a +.section sov6b +.section sov7a +.section sov7b +.section sov8a +.section sov8b +.section sov9a +.section sov9b +.section sov0a +.section sov0b +.section sowaa +.section sowab +.section sowba +.section sowbb +.section sowca +.section sowcb +.section sowda +.section sowdb +.section sowea +.section soweb +.section sowfa +.section sowfb +.section sowga +.section sowgb +.section sowha +.section sowhb +.section sowia +.section sowib +.section sowja +.section sowjb +.section sowka +.section sowkb +.section sowla +.section sowlb +.section sowma +.section sowmb +.section sowna +.section sownb +.section sowoa +.section sowob +.section sowpa +.section sowpb +.section sowqa +.section sowqb +.section sowra +.section sowrb +.section sowsa +.section sowsb +.section sowta +.section sowtb +.section sowua +.section sowub +.section sowva +.section sowvb +.section sowwa +.section sowwb +.section sowxa +.section sowxb +.section sowya +.section sowyb +.section sowza +.section sowzb +.section sow1a +.section sow1b +.section sow2a +.section sow2b +.section sow3a +.section sow3b +.section sow4a +.section sow4b +.section sow5a +.section sow5b +.section sow6a +.section sow6b +.section sow7a +.section sow7b +.section sow8a +.section sow8b +.section sow9a +.section sow9b +.section sow0a +.section sow0b +.section soxaa +.section soxab +.section soxba +.section soxbb +.section soxca +.section soxcb +.section soxda +.section soxdb +.section soxea +.section soxeb +.section soxfa +.section soxfb +.section soxga +.section soxgb +.section soxha +.section soxhb +.section soxia +.section soxib +.section soxja +.section soxjb +.section soxka +.section soxkb +.section soxla +.section soxlb +.section soxma +.section soxmb +.section soxna +.section soxnb +.section soxoa +.section soxob +.section soxpa +.section soxpb +.section soxqa +.section soxqb +.section soxra +.section soxrb +.section soxsa +.section soxsb +.section soxta +.section soxtb +.section soxua +.section soxub +.section soxva +.section soxvb +.section soxwa +.section soxwb +.section soxxa +.section soxxb +.section soxya +.section soxyb +.section soxza +.section soxzb +.section sox1a +.section sox1b +.section sox2a +.section sox2b +.section sox3a +.section sox3b +.section sox4a +.section sox4b +.section sox5a +.section sox5b +.section sox6a +.section sox6b +.section sox7a +.section sox7b +.section sox8a +.section sox8b +.section sox9a +.section sox9b +.section sox0a +.section sox0b +.section soyaa +.section soyab +.section soyba +.section soybb +.section soyca +.section soycb +.section soyda +.section soydb +.section soyea +.section soyeb +.section soyfa +.section soyfb +.section soyga +.section soygb +.section soyha +.section soyhb +.section soyia +.section soyib +.section soyja +.section soyjb +.section soyka +.section soykb +.section soyla +.section soylb +.section soyma +.section soymb +.section soyna +.section soynb +.section soyoa +.section soyob +.section soypa +.section soypb +.section soyqa +.section soyqb +.section soyra +.section soyrb +.section soysa +.section soysb +.section soyta +.section soytb +.section soyua +.section soyub +.section soyva +.section soyvb +.section soywa +.section soywb +.section soyxa +.section soyxb +.section soyya +.section soyyb +.section soyza +.section soyzb +.section soy1a +.section soy1b +.section soy2a +.section soy2b +.section soy3a +.section soy3b +.section soy4a +.section soy4b +.section soy5a +.section soy5b +.section soy6a +.section soy6b +.section soy7a +.section soy7b +.section soy8a +.section soy8b +.section soy9a +.section soy9b +.section soy0a +.section soy0b +.section sozaa +.section sozab +.section sozba +.section sozbb +.section sozca +.section sozcb +.section sozda +.section sozdb +.section sozea +.section sozeb +.section sozfa +.section sozfb +.section sozga +.section sozgb +.section sozha +.section sozhb +.section sozia +.section sozib +.section sozja +.section sozjb +.section sozka +.section sozkb +.section sozla +.section sozlb +.section sozma +.section sozmb +.section sozna +.section soznb +.section sozoa +.section sozob +.section sozpa +.section sozpb +.section sozqa +.section sozqb +.section sozra +.section sozrb +.section sozsa +.section sozsb +.section sozta +.section soztb +.section sozua +.section sozub +.section sozva +.section sozvb +.section sozwa +.section sozwb +.section sozxa +.section sozxb +.section sozya +.section sozyb +.section sozza +.section sozzb +.section soz1a +.section soz1b +.section soz2a +.section soz2b +.section soz3a +.section soz3b +.section soz4a +.section soz4b +.section soz5a +.section soz5b +.section soz6a +.section soz6b +.section soz7a +.section soz7b +.section soz8a +.section soz8b +.section soz9a +.section soz9b +.section soz0a +.section soz0b +.section so1aa +.section so1ab +.section so1ba +.section so1bb +.section so1ca +.section so1cb +.section so1da +.section so1db +.section so1ea +.section so1eb +.section so1fa +.section so1fb +.section so1ga +.section so1gb +.section so1ha +.section so1hb +.section so1ia +.section so1ib +.section so1ja +.section so1jb +.section so1ka +.section so1kb +.section so1la +.section so1lb +.section so1ma +.section so1mb +.section so1na +.section so1nb +.section so1oa +.section so1ob +.section so1pa +.section so1pb +.section so1qa +.section so1qb +.section so1ra +.section so1rb +.section so1sa +.section so1sb +.section so1ta +.section so1tb +.section so1ua +.section so1ub +.section so1va +.section so1vb +.section so1wa +.section so1wb +.section so1xa +.section so1xb +.section so1ya +.section so1yb +.section so1za +.section so1zb +.section so11a +.section so11b +.section so12a +.section so12b +.section so13a +.section so13b +.section so14a +.section so14b +.section so15a +.section so15b +.section so16a +.section so16b +.section so17a +.section so17b +.section so18a +.section so18b +.section so19a +.section so19b +.section so10a +.section so10b +.section so2aa +.section so2ab +.section so2ba +.section so2bb +.section so2ca +.section so2cb +.section so2da +.section so2db +.section so2ea +.section so2eb +.section so2fa +.section so2fb +.section so2ga +.section so2gb +.section so2ha +.section so2hb +.section so2ia +.section so2ib +.section so2ja +.section so2jb +.section so2ka +.section so2kb +.section so2la +.section so2lb +.section so2ma +.section so2mb +.section so2na +.section so2nb +.section so2oa +.section so2ob +.section so2pa +.section so2pb +.section so2qa +.section so2qb +.section so2ra +.section so2rb +.section so2sa +.section so2sb +.section so2ta +.section so2tb +.section so2ua +.section so2ub +.section so2va +.section so2vb +.section so2wa +.section so2wb +.section so2xa +.section so2xb +.section so2ya +.section so2yb +.section so2za +.section so2zb +.section so21a +.section so21b +.section so22a +.section so22b +.section so23a +.section so23b +.section so24a +.section so24b +.section so25a +.section so25b +.section so26a +.section so26b +.section so27a +.section so27b +.section so28a +.section so28b +.section so29a +.section so29b +.section so20a +.section so20b +.section so3aa +.section so3ab +.section so3ba +.section so3bb +.section so3ca +.section so3cb +.section so3da +.section so3db +.section so3ea +.section so3eb +.section so3fa +.section so3fb +.section so3ga +.section so3gb +.section so3ha +.section so3hb +.section so3ia +.section so3ib +.section so3ja +.section so3jb +.section so3ka +.section so3kb +.section so3la +.section so3lb +.section so3ma +.section so3mb +.section so3na +.section so3nb +.section so3oa +.section so3ob +.section so3pa +.section so3pb +.section so3qa +.section so3qb +.section so3ra +.section so3rb +.section so3sa +.section so3sb +.section so3ta +.section so3tb +.section so3ua +.section so3ub +.section so3va +.section so3vb +.section so3wa +.section so3wb +.section so3xa +.section so3xb +.section so3ya +.section so3yb +.section so3za +.section so3zb +.section so31a +.section so31b +.section so32a +.section so32b +.section so33a +.section so33b +.section so34a +.section so34b +.section so35a +.section so35b +.section so36a +.section so36b +.section so37a +.section so37b +.section so38a +.section so38b +.section so39a +.section so39b +.section so30a +.section so30b +.section so4aa +.section so4ab +.section so4ba +.section so4bb +.section so4ca +.section so4cb +.section so4da +.section so4db +.section so4ea +.section so4eb +.section so4fa +.section so4fb +.section so4ga +.section so4gb +.section so4ha +.section so4hb +.section so4ia +.section so4ib +.section so4ja +.section so4jb +.section so4ka +.section so4kb +.section so4la +.section so4lb +.section so4ma +.section so4mb +.section so4na +.section so4nb +.section so4oa +.section so4ob +.section so4pa +.section so4pb +.section so4qa +.section so4qb +.section so4ra +.section so4rb +.section so4sa +.section so4sb +.section so4ta +.section so4tb +.section so4ua +.section so4ub +.section so4va +.section so4vb +.section so4wa +.section so4wb +.section so4xa +.section so4xb +.section so4ya +.section so4yb +.section so4za +.section so4zb +.section so41a +.section so41b +.section so42a +.section so42b +.section so43a +.section so43b +.section so44a +.section so44b +.section so45a +.section so45b +.section so46a +.section so46b +.section so47a +.section so47b +.section so48a +.section so48b +.section so49a +.section so49b +.section so40a +.section so40b +.section so5aa +.section so5ab +.section so5ba +.section so5bb +.section so5ca +.section so5cb +.section so5da +.section so5db +.section so5ea +.section so5eb +.section so5fa +.section so5fb +.section so5ga +.section so5gb +.section so5ha +.section so5hb +.section so5ia +.section so5ib +.section so5ja +.section so5jb +.section so5ka +.section so5kb +.section so5la +.section so5lb +.section so5ma +.section so5mb +.section so5na +.section so5nb +.section so5oa +.section so5ob +.section so5pa +.section so5pb +.section so5qa +.section so5qb +.section so5ra +.section so5rb +.section so5sa +.section so5sb +.section so5ta +.section so5tb +.section so5ua +.section so5ub +.section so5va +.section so5vb +.section so5wa +.section so5wb +.section so5xa +.section so5xb +.section so5ya +.section so5yb +.section so5za +.section so5zb +.section so51a +.section so51b +.section so52a +.section so52b +.section so53a +.section so53b +.section so54a +.section so54b +.section so55a +.section so55b +.section so56a +.section so56b +.section so57a +.section so57b +.section so58a +.section so58b +.section so59a +.section so59b +.section so50a +.section so50b +.section so6aa +.section so6ab +.section so6ba +.section so6bb +.section so6ca +.section so6cb +.section so6da +.section so6db +.section so6ea +.section so6eb +.section so6fa +.section so6fb +.section so6ga +.section so6gb +.section so6ha +.section so6hb +.section so6ia +.section so6ib +.section so6ja +.section so6jb +.section so6ka +.section so6kb +.section so6la +.section so6lb +.section so6ma +.section so6mb +.section so6na +.section so6nb +.section so6oa +.section so6ob +.section so6pa +.section so6pb +.section so6qa +.section so6qb +.section so6ra +.section so6rb +.section so6sa +.section so6sb +.section so6ta +.section so6tb +.section so6ua +.section so6ub +.section so6va +.section so6vb +.section so6wa +.section so6wb +.section so6xa +.section so6xb +.section so6ya +.section so6yb +.section so6za +.section so6zb +.section so61a +.section so61b +.section so62a +.section so62b +.section so63a +.section so63b +.section so64a +.section so64b +.section so65a +.section so65b +.section so66a +.section so66b +.section so67a +.section so67b +.section so68a +.section so68b +.section so69a +.section so69b +.section so60a +.section so60b +.section so7aa +.section so7ab +.section so7ba +.section so7bb +.section so7ca +.section so7cb +.section so7da +.section so7db +.section so7ea +.section so7eb +.section so7fa +.section so7fb +.section so7ga +.section so7gb +.section so7ha +.section so7hb +.section so7ia +.section so7ib +.section so7ja +.section so7jb +.section so7ka +.section so7kb +.section so7la +.section so7lb +.section so7ma +.section so7mb +.section so7na +.section so7nb +.section so7oa +.section so7ob +.section so7pa +.section so7pb +.section so7qa +.section so7qb +.section so7ra +.section so7rb +.section so7sa +.section so7sb +.section so7ta +.section so7tb +.section so7ua +.section so7ub +.section so7va +.section so7vb +.section so7wa +.section so7wb +.section so7xa +.section so7xb +.section so7ya +.section so7yb +.section so7za +.section so7zb +.section so71a +.section so71b +.section so72a +.section so72b +.section so73a +.section so73b +.section so74a +.section so74b +.section so75a +.section so75b +.section so76a +.section so76b +.section so77a +.section so77b +.section so78a +.section so78b +.section so79a +.section so79b +.section so70a +.section so70b +.section so8aa +.section so8ab +.section so8ba +.section so8bb +.section so8ca +.section so8cb +.section so8da +.section so8db +.section so8ea +.section so8eb +.section so8fa +.section so8fb +.section so8ga +.section so8gb +.section so8ha +.section so8hb +.section so8ia +.section so8ib +.section so8ja +.section so8jb +.section so8ka +.section so8kb +.section so8la +.section so8lb +.section so8ma +.section so8mb +.section so8na +.section so8nb +.section so8oa +.section so8ob +.section so8pa +.section so8pb +.section so8qa +.section so8qb +.section so8ra +.section so8rb +.section so8sa +.section so8sb +.section so8ta +.section so8tb +.section so8ua +.section so8ub +.section so8va +.section so8vb +.section so8wa +.section so8wb +.section so8xa +.section so8xb +.section so8ya +.section so8yb +.section so8za +.section so8zb +.section so81a +.section so81b +.section so82a +.section so82b +.section so83a +.section so83b +.section so84a +.section so84b +.section so85a +.section so85b +.section so86a +.section so86b +.section so87a +.section so87b +.section so88a +.section so88b +.section so89a +.section so89b +.section so80a +.section so80b +.section so9aa +.section so9ab +.section so9ba +.section so9bb +.section so9ca +.section so9cb +.section so9da +.section so9db +.section so9ea +.section so9eb +.section so9fa +.section so9fb +.section so9ga +.section so9gb +.section so9ha +.section so9hb +.section so9ia +.section so9ib +.section so9ja +.section so9jb +.section so9ka +.section so9kb +.section so9la +.section so9lb +.section so9ma +.section so9mb +.section so9na +.section so9nb +.section so9oa +.section so9ob +.section so9pa +.section so9pb +.section so9qa +.section so9qb +.section so9ra +.section so9rb +.section so9sa +.section so9sb +.section so9ta +.section so9tb +.section so9ua +.section so9ub +.section so9va +.section so9vb +.section so9wa +.section so9wb +.section so9xa +.section so9xb +.section so9ya +.section so9yb +.section so9za +.section so9zb +.section so91a +.section so91b +.section so92a +.section so92b +.section so93a +.section so93b +.section so94a +.section so94b +.section so95a +.section so95b +.section so96a +.section so96b +.section so97a +.section so97b +.section so98a +.section so98b +.section so99a +.section so99b +.section so90a +.section so90b +.section so0aa +.section so0ab +.section so0ba +.section so0bb +.section so0ca +.section so0cb +.section so0da +.section so0db +.section so0ea +.section so0eb +.section so0fa +.section so0fb +.section so0ga +.section so0gb +.section so0ha +.section so0hb +.section so0ia +.section so0ib +.section so0ja +.section so0jb +.section so0ka +.section so0kb +.section so0la +.section so0lb +.section so0ma +.section so0mb +.section so0na +.section so0nb +.section so0oa +.section so0ob +.section so0pa +.section so0pb +.section so0qa +.section so0qb +.section so0ra +.section so0rb +.section so0sa +.section so0sb +.section so0ta +.section so0tb +.section so0ua +.section so0ub +.section so0va +.section so0vb +.section so0wa +.section so0wb +.section so0xa +.section so0xb +.section so0ya +.section so0yb +.section so0za +.section so0zb +.section so01a +.section so01b +.section so02a +.section so02b +.section so03a +.section so03b +.section so04a +.section so04b +.section so05a +.section so05b +.section so06a +.section so06b +.section so07a +.section so07b +.section so08a +.section so08b +.section so09a +.section so09b +.section so00a +.section so00b +.section spaaa +.section spaab +.section spaba +.section spabb +.section spaca +.section spacb +.section spada +.section spadb +.section spaea +.section spaeb +.section spafa +.section spafb +.section spaga +.section spagb +.section spaha +.section spahb +.section spaia +.section spaib +.section spaja +.section spajb +.section spaka +.section spakb +.section spala +.section spalb +.section spama +.section spamb +.section spana +.section spanb +.section spaoa +.section spaob +.section spapa +.section spapb +.section spaqa +.section spaqb +.section spara +.section sparb +.section spasa +.section spasb +.section spata +.section spatb +.section spaua +.section spaub +.section spava +.section spavb +.section spawa +.section spawb +.section spaxa +.section spaxb +.section spaya +.section spayb +.section spaza +.section spazb +.section spa1a +.section spa1b +.section spa2a +.section spa2b +.section spa3a +.section spa3b +.section spa4a +.section spa4b +.section spa5a +.section spa5b +.section spa6a +.section spa6b +.section spa7a +.section spa7b +.section spa8a +.section spa8b +.section spa9a +.section spa9b +.section spa0a +.section spa0b +.section spbaa +.section spbab +.section spbba +.section spbbb +.section spbca +.section spbcb +.section spbda +.section spbdb +.section spbea +.section spbeb +.section spbfa +.section spbfb +.section spbga +.section spbgb +.section spbha +.section spbhb +.section spbia +.section spbib +.section spbja +.section spbjb +.section spbka +.section spbkb +.section spbla +.section spblb +.section spbma +.section spbmb +.section spbna +.section spbnb +.section spboa +.section spbob +.section spbpa +.section spbpb +.section spbqa +.section spbqb +.section spbra +.section spbrb +.section spbsa +.section spbsb +.section spbta +.section spbtb +.section spbua +.section spbub +.section spbva +.section spbvb +.section spbwa +.section spbwb +.section spbxa +.section spbxb +.section spbya +.section spbyb +.section spbza +.section spbzb +.section spb1a +.section spb1b +.section spb2a +.section spb2b +.section spb3a +.section spb3b +.section spb4a +.section spb4b +.section spb5a +.section spb5b +.section spb6a +.section spb6b +.section spb7a +.section spb7b +.section spb8a +.section spb8b +.section spb9a +.section spb9b +.section spb0a +.section spb0b +.section spcaa +.section spcab +.section spcba +.section spcbb +.section spcca +.section spccb +.section spcda +.section spcdb +.section spcea +.section spceb +.section spcfa +.section spcfb +.section spcga +.section spcgb +.section spcha +.section spchb +.section spcia +.section spcib +.section spcja +.section spcjb +.section spcka +.section spckb +.section spcla +.section spclb +.section spcma +.section spcmb +.section spcna +.section spcnb +.section spcoa +.section spcob +.section spcpa +.section spcpb +.section spcqa +.section spcqb +.section spcra +.section spcrb +.section spcsa +.section spcsb +.section spcta +.section spctb +.section spcua +.section spcub +.section spcva +.section spcvb +.section spcwa +.section spcwb +.section spcxa +.section spcxb +.section spcya +.section spcyb +.section spcza +.section spczb +.section spc1a +.section spc1b +.section spc2a +.section spc2b +.section spc3a +.section spc3b +.section spc4a +.section spc4b +.section spc5a +.section spc5b +.section spc6a +.section spc6b +.section spc7a +.section spc7b +.section spc8a +.section spc8b +.section spc9a +.section spc9b +.section spc0a +.section spc0b +.section spdaa +.section spdab +.section spdba +.section spdbb +.section spdca +.section spdcb +.section spdda +.section spddb +.section spdea +.section spdeb +.section spdfa +.section spdfb +.section spdga +.section spdgb +.section spdha +.section spdhb +.section spdia +.section spdib +.section spdja +.section spdjb +.section spdka +.section spdkb +.section spdla +.section spdlb +.section spdma +.section spdmb +.section spdna +.section spdnb +.section spdoa +.section spdob +.section spdpa +.section spdpb +.section spdqa +.section spdqb +.section spdra +.section spdrb +.section spdsa +.section spdsb +.section spdta +.section spdtb +.section spdua +.section spdub +.section spdva +.section spdvb +.section spdwa +.section spdwb +.section spdxa +.section spdxb +.section spdya +.section spdyb +.section spdza +.section spdzb +.section spd1a +.section spd1b +.section spd2a +.section spd2b +.section spd3a +.section spd3b +.section spd4a +.section spd4b +.section spd5a +.section spd5b +.section spd6a +.section spd6b +.section spd7a +.section spd7b +.section spd8a +.section spd8b +.section spd9a +.section spd9b +.section spd0a +.section spd0b +.section speaa +.section speab +.section speba +.section spebb +.section speca +.section specb +.section speda +.section spedb +.section speea +.section speeb +.section spefa +.section spefb +.section spega +.section spegb +.section speha +.section spehb +.section speia +.section speib +.section speja +.section spejb +.section speka +.section spekb +.section spela +.section spelb +.section spema +.section spemb +.section spena +.section spenb +.section speoa +.section speob +.section spepa +.section spepb +.section speqa +.section speqb +.section spera +.section sperb +.section spesa +.section spesb +.section speta +.section spetb +.section speua +.section speub +.section speva +.section spevb +.section spewa +.section spewb +.section spexa +.section spexb +.section speya +.section speyb +.section speza +.section spezb +.section spe1a +.section spe1b +.section spe2a +.section spe2b +.section spe3a +.section spe3b +.section spe4a +.section spe4b +.section spe5a +.section spe5b +.section spe6a +.section spe6b +.section spe7a +.section spe7b +.section spe8a +.section spe8b +.section spe9a +.section spe9b +.section spe0a +.section spe0b +.section spfaa +.section spfab +.section spfba +.section spfbb +.section spfca +.section spfcb +.section spfda +.section spfdb +.section spfea +.section spfeb +.section spffa +.section spffb +.section spfga +.section spfgb +.section spfha +.section spfhb +.section spfia +.section spfib +.section spfja +.section spfjb +.section spfka +.section spfkb +.section spfla +.section spflb +.section spfma +.section spfmb +.section spfna +.section spfnb +.section spfoa +.section spfob +.section spfpa +.section spfpb +.section spfqa +.section spfqb +.section spfra +.section spfrb +.section spfsa +.section spfsb +.section spfta +.section spftb +.section spfua +.section spfub +.section spfva +.section spfvb +.section spfwa +.section spfwb +.section spfxa +.section spfxb +.section spfya +.section spfyb +.section spfza +.section spfzb +.section spf1a +.section spf1b +.section spf2a +.section spf2b +.section spf3a +.section spf3b +.section spf4a +.section spf4b +.section spf5a +.section spf5b +.section spf6a +.section spf6b +.section spf7a +.section spf7b +.section spf8a +.section spf8b +.section spf9a +.section spf9b +.section spf0a +.section spf0b +.section spgaa +.section spgab +.section spgba +.section spgbb +.section spgca +.section spgcb +.section spgda +.section spgdb +.section spgea +.section spgeb +.section spgfa +.section spgfb +.section spgga +.section spggb +.section spgha +.section spghb +.section spgia +.section spgib +.section spgja +.section spgjb +.section spgka +.section spgkb +.section spgla +.section spglb +.section spgma +.section spgmb +.section spgna +.section spgnb +.section spgoa +.section spgob +.section spgpa +.section spgpb +.section spgqa +.section spgqb +.section spgra +.section spgrb +.section spgsa +.section spgsb +.section spgta +.section spgtb +.section spgua +.section spgub +.section spgva +.section spgvb +.section spgwa +.section spgwb +.section spgxa +.section spgxb +.section spgya +.section spgyb +.section spgza +.section spgzb +.section spg1a +.section spg1b +.section spg2a +.section spg2b +.section spg3a +.section spg3b +.section spg4a +.section spg4b +.section spg5a +.section spg5b +.section spg6a +.section spg6b +.section spg7a +.section spg7b +.section spg8a +.section spg8b +.section spg9a +.section spg9b +.section spg0a +.section spg0b +.section sphaa +.section sphab +.section sphba +.section sphbb +.section sphca +.section sphcb +.section sphda +.section sphdb +.section sphea +.section spheb +.section sphfa +.section sphfb +.section sphga +.section sphgb +.section sphha +.section sphhb +.section sphia +.section sphib +.section sphja +.section sphjb +.section sphka +.section sphkb +.section sphla +.section sphlb +.section sphma +.section sphmb +.section sphna +.section sphnb +.section sphoa +.section sphob +.section sphpa +.section sphpb +.section sphqa +.section sphqb +.section sphra +.section sphrb +.section sphsa +.section sphsb +.section sphta +.section sphtb +.section sphua +.section sphub +.section sphva +.section sphvb +.section sphwa +.section sphwb +.section sphxa +.section sphxb +.section sphya +.section sphyb +.section sphza +.section sphzb +.section sph1a +.section sph1b +.section sph2a +.section sph2b +.section sph3a +.section sph3b +.section sph4a +.section sph4b +.section sph5a +.section sph5b +.section sph6a +.section sph6b +.section sph7a +.section sph7b +.section sph8a +.section sph8b +.section sph9a +.section sph9b +.section sph0a +.section sph0b +.section spiaa +.section spiab +.section spiba +.section spibb +.section spica +.section spicb +.section spida +.section spidb +.section spiea +.section spieb +.section spifa +.section spifb +.section spiga +.section spigb +.section spiha +.section spihb +.section spiia +.section spiib +.section spija +.section spijb +.section spika +.section spikb +.section spila +.section spilb +.section spima +.section spimb +.section spina +.section spinb +.section spioa +.section spiob +.section spipa +.section spipb +.section spiqa +.section spiqb +.section spira +.section spirb +.section spisa +.section spisb +.section spita +.section spitb +.section spiua +.section spiub +.section spiva +.section spivb +.section spiwa +.section spiwb +.section spixa +.section spixb +.section spiya +.section spiyb +.section spiza +.section spizb +.section spi1a +.section spi1b +.section spi2a +.section spi2b +.section spi3a +.section spi3b +.section spi4a +.section spi4b +.section spi5a +.section spi5b +.section spi6a +.section spi6b +.section spi7a +.section spi7b +.section spi8a +.section spi8b +.section spi9a +.section spi9b +.section spi0a +.section spi0b +.section spjaa +.section spjab +.section spjba +.section spjbb +.section spjca +.section spjcb +.section spjda +.section spjdb +.section spjea +.section spjeb +.section spjfa +.section spjfb +.section spjga +.section spjgb +.section spjha +.section spjhb +.section spjia +.section spjib +.section spjja +.section spjjb +.section spjka +.section spjkb +.section spjla +.section spjlb +.section spjma +.section spjmb +.section spjna +.section spjnb +.section spjoa +.section spjob +.section spjpa +.section spjpb +.section spjqa +.section spjqb +.section spjra +.section spjrb +.section spjsa +.section spjsb +.section spjta +.section spjtb +.section spjua +.section spjub +.section spjva +.section spjvb +.section spjwa +.section spjwb +.section spjxa +.section spjxb +.section spjya +.section spjyb +.section spjza +.section spjzb +.section spj1a +.section spj1b +.section spj2a +.section spj2b +.section spj3a +.section spj3b +.section spj4a +.section spj4b +.section spj5a +.section spj5b +.section spj6a +.section spj6b +.section spj7a +.section spj7b +.section spj8a +.section spj8b +.section spj9a +.section spj9b +.section spj0a +.section spj0b +.section spkaa +.section spkab +.section spkba +.section spkbb +.section spkca +.section spkcb +.section spkda +.section spkdb +.section spkea +.section spkeb +.section spkfa +.section spkfb +.section spkga +.section spkgb +.section spkha +.section spkhb +.section spkia +.section spkib +.section spkja +.section spkjb +.section spkka +.section spkkb +.section spkla +.section spklb +.section spkma +.section spkmb +.section spkna +.section spknb +.section spkoa +.section spkob +.section spkpa +.section spkpb +.section spkqa +.section spkqb +.section spkra +.section spkrb +.section spksa +.section spksb +.section spkta +.section spktb +.section spkua +.section spkub +.section spkva +.section spkvb +.section spkwa +.section spkwb +.section spkxa +.section spkxb +.section spkya +.section spkyb +.section spkza +.section spkzb +.section spk1a +.section spk1b +.section spk2a +.section spk2b +.section spk3a +.section spk3b +.section spk4a +.section spk4b +.section spk5a +.section spk5b +.section spk6a +.section spk6b +.section spk7a +.section spk7b +.section spk8a +.section spk8b +.section spk9a +.section spk9b +.section spk0a +.section spk0b +.section splaa +.section splab +.section splba +.section splbb +.section splca +.section splcb +.section splda +.section spldb +.section splea +.section spleb +.section splfa +.section splfb +.section splga +.section splgb +.section splha +.section splhb +.section splia +.section splib +.section splja +.section spljb +.section splka +.section splkb +.section splla +.section spllb +.section splma +.section splmb +.section splna +.section splnb +.section sploa +.section splob +.section splpa +.section splpb +.section splqa +.section splqb +.section splra +.section splrb +.section splsa +.section splsb +.section splta +.section spltb +.section splua +.section splub +.section splva +.section splvb +.section splwa +.section splwb +.section splxa +.section splxb +.section splya +.section splyb +.section splza +.section splzb +.section spl1a +.section spl1b +.section spl2a +.section spl2b +.section spl3a +.section spl3b +.section spl4a +.section spl4b +.section spl5a +.section spl5b +.section spl6a +.section spl6b +.section spl7a +.section spl7b +.section spl8a +.section spl8b +.section spl9a +.section spl9b +.section spl0a +.section spl0b +.section spmaa +.section spmab +.section spmba +.section spmbb +.section spmca +.section spmcb +.section spmda +.section spmdb +.section spmea +.section spmeb +.section spmfa +.section spmfb +.section spmga +.section spmgb +.section spmha +.section spmhb +.section spmia +.section spmib +.section spmja +.section spmjb +.section spmka +.section spmkb +.section spmla +.section spmlb +.section spmma +.section spmmb +.section spmna +.section spmnb +.section spmoa +.section spmob +.section spmpa +.section spmpb +.section spmqa +.section spmqb +.section spmra +.section spmrb +.section spmsa +.section spmsb +.section spmta +.section spmtb +.section spmua +.section spmub +.section spmva +.section spmvb +.section spmwa +.section spmwb +.section spmxa +.section spmxb +.section spmya +.section spmyb +.section spmza +.section spmzb +.section spm1a +.section spm1b +.section spm2a +.section spm2b +.section spm3a +.section spm3b +.section spm4a +.section spm4b +.section spm5a +.section spm5b +.section spm6a +.section spm6b +.section spm7a +.section spm7b +.section spm8a +.section spm8b +.section spm9a +.section spm9b +.section spm0a +.section spm0b +.section spnaa +.section spnab +.section spnba +.section spnbb +.section spnca +.section spncb +.section spnda +.section spndb +.section spnea +.section spneb +.section spnfa +.section spnfb +.section spnga +.section spngb +.section spnha +.section spnhb +.section spnia +.section spnib +.section spnja +.section spnjb +.section spnka +.section spnkb +.section spnla +.section spnlb +.section spnma +.section spnmb +.section spnna +.section spnnb +.section spnoa +.section spnob +.section spnpa +.section spnpb +.section spnqa +.section spnqb +.section spnra +.section spnrb +.section spnsa +.section spnsb +.section spnta +.section spntb +.section spnua +.section spnub +.section spnva +.section spnvb +.section spnwa +.section spnwb +.section spnxa +.section spnxb +.section spnya +.section spnyb +.section spnza +.section spnzb +.section spn1a +.section spn1b +.section spn2a +.section spn2b +.section spn3a +.section spn3b +.section spn4a +.section spn4b +.section spn5a +.section spn5b +.section spn6a +.section spn6b +.section spn7a +.section spn7b +.section spn8a +.section spn8b +.section spn9a +.section spn9b +.section spn0a +.section spn0b +.section spoaa +.section spoab +.section spoba +.section spobb +.section spoca +.section spocb +.section spoda +.section spodb +.section spoea +.section spoeb +.section spofa +.section spofb +.section spoga +.section spogb +.section spoha +.section spohb +.section spoia +.section spoib +.section spoja +.section spojb +.section spoka +.section spokb +.section spola +.section spolb +.section spoma +.section spomb +.section spona +.section sponb +.section spooa +.section spoob +.section spopa +.section spopb +.section spoqa +.section spoqb +.section spora +.section sporb +.section sposa +.section sposb +.section spota +.section spotb +.section spoua +.section spoub +.section spova +.section spovb +.section spowa +.section spowb +.section spoxa +.section spoxb +.section spoya +.section spoyb +.section spoza +.section spozb +.section spo1a +.section spo1b +.section spo2a +.section spo2b +.section spo3a +.section spo3b +.section spo4a +.section spo4b +.section spo5a +.section spo5b +.section spo6a +.section spo6b +.section spo7a +.section spo7b +.section spo8a +.section spo8b +.section spo9a +.section spo9b +.section spo0a +.section spo0b +.section sppaa +.section sppab +.section sppba +.section sppbb +.section sppca +.section sppcb +.section sppda +.section sppdb +.section sppea +.section sppeb +.section sppfa +.section sppfb +.section sppga +.section sppgb +.section sppha +.section spphb +.section sppia +.section sppib +.section sppja +.section sppjb +.section sppka +.section sppkb +.section sppla +.section spplb +.section sppma +.section sppmb +.section sppna +.section sppnb +.section sppoa +.section sppob +.section spppa +.section spppb +.section sppqa +.section sppqb +.section sppra +.section spprb +.section sppsa +.section sppsb +.section sppta +.section spptb +.section sppua +.section sppub +.section sppva +.section sppvb +.section sppwa +.section sppwb +.section sppxa +.section sppxb +.section sppya +.section sppyb +.section sppza +.section sppzb +.section spp1a +.section spp1b +.section spp2a +.section spp2b +.section spp3a +.section spp3b +.section spp4a +.section spp4b +.section spp5a +.section spp5b +.section spp6a +.section spp6b +.section spp7a +.section spp7b +.section spp8a +.section spp8b +.section spp9a +.section spp9b +.section spp0a +.section spp0b +.section spqaa +.section spqab +.section spqba +.section spqbb +.section spqca +.section spqcb +.section spqda +.section spqdb +.section spqea +.section spqeb +.section spqfa +.section spqfb +.section spqga +.section spqgb +.section spqha +.section spqhb +.section spqia +.section spqib +.section spqja +.section spqjb +.section spqka +.section spqkb +.section spqla +.section spqlb +.section spqma +.section spqmb +.section spqna +.section spqnb +.section spqoa +.section spqob +.section spqpa +.section spqpb +.section spqqa +.section spqqb +.section spqra +.section spqrb +.section spqsa +.section spqsb +.section spqta +.section spqtb +.section spqua +.section spqub +.section spqva +.section spqvb +.section spqwa +.section spqwb +.section spqxa +.section spqxb +.section spqya +.section spqyb +.section spqza +.section spqzb +.section spq1a +.section spq1b +.section spq2a +.section spq2b +.section spq3a +.section spq3b +.section spq4a +.section spq4b +.section spq5a +.section spq5b +.section spq6a +.section spq6b +.section spq7a +.section spq7b +.section spq8a +.section spq8b +.section spq9a +.section spq9b +.section spq0a +.section spq0b +.section spraa +.section sprab +.section sprba +.section sprbb +.section sprca +.section sprcb +.section sprda +.section sprdb +.section sprea +.section spreb +.section sprfa +.section sprfb +.section sprga +.section sprgb +.section sprha +.section sprhb +.section spria +.section sprib +.section sprja +.section sprjb +.section sprka +.section sprkb +.section sprla +.section sprlb +.section sprma +.section sprmb +.section sprna +.section sprnb +.section sproa +.section sprob +.section sprpa +.section sprpb +.section sprqa +.section sprqb +.section sprra +.section sprrb +.section sprsa +.section sprsb +.section sprta +.section sprtb +.section sprua +.section sprub +.section sprva +.section sprvb +.section sprwa +.section sprwb +.section sprxa +.section sprxb +.section sprya +.section spryb +.section sprza +.section sprzb +.section spr1a +.section spr1b +.section spr2a +.section spr2b +.section spr3a +.section spr3b +.section spr4a +.section spr4b +.section spr5a +.section spr5b +.section spr6a +.section spr6b +.section spr7a +.section spr7b +.section spr8a +.section spr8b +.section spr9a +.section spr9b +.section spr0a +.section spr0b +.section spsaa +.section spsab +.section spsba +.section spsbb +.section spsca +.section spscb +.section spsda +.section spsdb +.section spsea +.section spseb +.section spsfa +.section spsfb +.section spsga +.section spsgb +.section spsha +.section spshb +.section spsia +.section spsib +.section spsja +.section spsjb +.section spska +.section spskb +.section spsla +.section spslb +.section spsma +.section spsmb +.section spsna +.section spsnb +.section spsoa +.section spsob +.section spspa +.section spspb +.section spsqa +.section spsqb +.section spsra +.section spsrb +.section spssa +.section spssb +.section spsta +.section spstb +.section spsua +.section spsub +.section spsva +.section spsvb +.section spswa +.section spswb +.section spsxa +.section spsxb +.section spsya +.section spsyb +.section spsza +.section spszb +.section sps1a +.section sps1b +.section sps2a +.section sps2b +.section sps3a +.section sps3b +.section sps4a +.section sps4b +.section sps5a +.section sps5b +.section sps6a +.section sps6b +.section sps7a +.section sps7b +.section sps8a +.section sps8b +.section sps9a +.section sps9b +.section sps0a +.section sps0b +.section sptaa +.section sptab +.section sptba +.section sptbb +.section sptca +.section sptcb +.section sptda +.section sptdb +.section sptea +.section spteb +.section sptfa +.section sptfb +.section sptga +.section sptgb +.section sptha +.section spthb +.section sptia +.section sptib +.section sptja +.section sptjb +.section sptka +.section sptkb +.section sptla +.section sptlb +.section sptma +.section sptmb +.section sptna +.section sptnb +.section sptoa +.section sptob +.section sptpa +.section sptpb +.section sptqa +.section sptqb +.section sptra +.section sptrb +.section sptsa +.section sptsb +.section sptta +.section spttb +.section sptua +.section sptub +.section sptva +.section sptvb +.section sptwa +.section sptwb +.section sptxa +.section sptxb +.section sptya +.section sptyb +.section sptza +.section sptzb +.section spt1a +.section spt1b +.section spt2a +.section spt2b +.section spt3a +.section spt3b +.section spt4a +.section spt4b +.section spt5a +.section spt5b +.section spt6a +.section spt6b +.section spt7a +.section spt7b +.section spt8a +.section spt8b +.section spt9a +.section spt9b +.section spt0a +.section spt0b +.section spuaa +.section spuab +.section spuba +.section spubb +.section spuca +.section spucb +.section spuda +.section spudb +.section spuea +.section spueb +.section spufa +.section spufb +.section spuga +.section spugb +.section spuha +.section spuhb +.section spuia +.section spuib +.section spuja +.section spujb +.section spuka +.section spukb +.section spula +.section spulb +.section spuma +.section spumb +.section spuna +.section spunb +.section spuoa +.section spuob +.section spupa +.section spupb +.section spuqa +.section spuqb +.section spura +.section spurb +.section spusa +.section spusb +.section sputa +.section sputb +.section spuua +.section spuub +.section spuva +.section spuvb +.section spuwa +.section spuwb +.section spuxa +.section spuxb +.section spuya +.section spuyb +.section spuza +.section spuzb +.section spu1a +.section spu1b +.section spu2a +.section spu2b +.section spu3a +.section spu3b +.section spu4a +.section spu4b +.section spu5a +.section spu5b +.section spu6a +.section spu6b +.section spu7a +.section spu7b +.section spu8a +.section spu8b +.section spu9a +.section spu9b +.section spu0a +.section spu0b +.section spvaa +.section spvab +.section spvba +.section spvbb +.section spvca +.section spvcb +.section spvda +.section spvdb +.section spvea +.section spveb +.section spvfa +.section spvfb +.section spvga +.section spvgb +.section spvha +.section spvhb +.section spvia +.section spvib +.section spvja +.section spvjb +.section spvka +.section spvkb +.section spvla +.section spvlb +.section spvma +.section spvmb +.section spvna +.section spvnb +.section spvoa +.section spvob +.section spvpa +.section spvpb +.section spvqa +.section spvqb +.section spvra +.section spvrb +.section spvsa +.section spvsb +.section spvta +.section spvtb +.section spvua +.section spvub +.section spvva +.section spvvb +.section spvwa +.section spvwb +.section spvxa +.section spvxb +.section spvya +.section spvyb +.section spvza +.section spvzb +.section spv1a +.section spv1b +.section spv2a +.section spv2b +.section spv3a +.section spv3b +.section spv4a +.section spv4b +.section spv5a +.section spv5b +.section spv6a +.section spv6b +.section spv7a +.section spv7b +.section spv8a +.section spv8b +.section spv9a +.section spv9b +.section spv0a +.section spv0b +.section spwaa +.section spwab +.section spwba +.section spwbb +.section spwca +.section spwcb +.section spwda +.section spwdb +.section spwea +.section spweb +.section spwfa +.section spwfb +.section spwga +.section spwgb +.section spwha +.section spwhb +.section spwia +.section spwib +.section spwja +.section spwjb +.section spwka +.section spwkb +.section spwla +.section spwlb +.section spwma +.section spwmb +.section spwna +.section spwnb +.section spwoa +.section spwob +.section spwpa +.section spwpb +.section spwqa +.section spwqb +.section spwra +.section spwrb +.section spwsa +.section spwsb +.section spwta +.section spwtb +.section spwua +.section spwub +.section spwva +.section spwvb +.section spwwa +.section spwwb +.section spwxa +.section spwxb +.section spwya +.section spwyb +.section spwza +.section spwzb +.section spw1a +.section spw1b +.section spw2a +.section spw2b +.section spw3a +.section spw3b +.section spw4a +.section spw4b +.section spw5a +.section spw5b +.section spw6a +.section spw6b +.section spw7a +.section spw7b +.section spw8a +.section spw8b +.section spw9a +.section spw9b +.section spw0a +.section spw0b +.section spxaa +.section spxab +.section spxba +.section spxbb +.section spxca +.section spxcb +.section spxda +.section spxdb +.section spxea +.section spxeb +.section spxfa +.section spxfb +.section spxga +.section spxgb +.section spxha +.section spxhb +.section spxia +.section spxib +.section spxja +.section spxjb +.section spxka +.section spxkb +.section spxla +.section spxlb +.section spxma +.section spxmb +.section spxna +.section spxnb +.section spxoa +.section spxob +.section spxpa +.section spxpb +.section spxqa +.section spxqb +.section spxra +.section spxrb +.section spxsa +.section spxsb +.section spxta +.section spxtb +.section spxua +.section spxub +.section spxva +.section spxvb +.section spxwa +.section spxwb +.section spxxa +.section spxxb +.section spxya +.section spxyb +.section spxza +.section spxzb +.section spx1a +.section spx1b +.section spx2a +.section spx2b +.section spx3a +.section spx3b +.section spx4a +.section spx4b +.section spx5a +.section spx5b +.section spx6a +.section spx6b +.section spx7a +.section spx7b +.section spx8a +.section spx8b +.section spx9a +.section spx9b +.section spx0a +.section spx0b +.section spyaa +.section spyab +.section spyba +.section spybb +.section spyca +.section spycb +.section spyda +.section spydb +.section spyea +.section spyeb +.section spyfa +.section spyfb +.section spyga +.section spygb +.section spyha +.section spyhb +.section spyia +.section spyib +.section spyja +.section spyjb +.section spyka +.section spykb +.section spyla +.section spylb +.section spyma +.section spymb +.section spyna +.section spynb +.section spyoa +.section spyob +.section spypa +.section spypb +.section spyqa +.section spyqb +.section spyra +.section spyrb +.section spysa +.section spysb +.section spyta +.section spytb +.section spyua +.section spyub +.section spyva +.section spyvb +.section spywa +.section spywb +.section spyxa +.section spyxb +.section spyya +.section spyyb +.section spyza +.section spyzb +.section spy1a +.section spy1b +.section spy2a +.section spy2b +.section spy3a +.section spy3b +.section spy4a +.section spy4b +.section spy5a +.section spy5b +.section spy6a +.section spy6b +.section spy7a +.section spy7b +.section spy8a +.section spy8b +.section spy9a +.section spy9b +.section spy0a +.section spy0b +.section spzaa +.section spzab +.section spzba +.section spzbb +.section spzca +.section spzcb +.section spzda +.section spzdb +.section spzea +.section spzeb +.section spzfa +.section spzfb +.section spzga +.section spzgb +.section spzha +.section spzhb +.section spzia +.section spzib +.section spzja +.section spzjb +.section spzka +.section spzkb +.section spzla +.section spzlb +.section spzma +.section spzmb +.section spzna +.section spznb +.section spzoa +.section spzob +.section spzpa +.section spzpb +.section spzqa +.section spzqb +.section spzra +.section spzrb +.section spzsa +.section spzsb +.section spzta +.section spztb +.section spzua +.section spzub +.section spzva +.section spzvb +.section spzwa +.section spzwb +.section spzxa +.section spzxb +.section spzya +.section spzyb +.section spzza +.section spzzb +.section spz1a +.section spz1b +.section spz2a +.section spz2b +.section spz3a +.section spz3b +.section spz4a +.section spz4b +.section spz5a +.section spz5b +.section spz6a +.section spz6b +.section spz7a +.section spz7b +.section spz8a +.section spz8b +.section spz9a +.section spz9b +.section spz0a +.section spz0b +.section sp1aa +.section sp1ab +.section sp1ba +.section sp1bb +.section sp1ca +.section sp1cb +.section sp1da +.section sp1db +.section sp1ea +.section sp1eb +.section sp1fa +.section sp1fb +.section sp1ga +.section sp1gb +.section sp1ha +.section sp1hb +.section sp1ia +.section sp1ib +.section sp1ja +.section sp1jb +.section sp1ka +.section sp1kb +.section sp1la +.section sp1lb +.section sp1ma +.section sp1mb +.section sp1na +.section sp1nb +.section sp1oa +.section sp1ob +.section sp1pa +.section sp1pb +.section sp1qa +.section sp1qb +.section sp1ra +.section sp1rb +.section sp1sa +.section sp1sb +.section sp1ta +.section sp1tb +.section sp1ua +.section sp1ub +.section sp1va +.section sp1vb +.section sp1wa +.section sp1wb +.section sp1xa +.section sp1xb +.section sp1ya +.section sp1yb +.section sp1za +.section sp1zb +.section sp11a +.section sp11b +.section sp12a +.section sp12b +.section sp13a +.section sp13b +.section sp14a +.section sp14b +.section sp15a +.section sp15b +.section sp16a +.section sp16b +.section sp17a +.section sp17b +.section sp18a +.section sp18b +.section sp19a +.section sp19b +.section sp10a +.section sp10b +.section sp2aa +.section sp2ab +.section sp2ba +.section sp2bb +.section sp2ca +.section sp2cb +.section sp2da +.section sp2db +.section sp2ea +.section sp2eb +.section sp2fa +.section sp2fb +.section sp2ga +.section sp2gb +.section sp2ha +.section sp2hb +.section sp2ia +.section sp2ib +.section sp2ja +.section sp2jb +.section sp2ka +.section sp2kb +.section sp2la +.section sp2lb +.section sp2ma +.section sp2mb +.section sp2na +.section sp2nb +.section sp2oa +.section sp2ob +.section sp2pa +.section sp2pb +.section sp2qa +.section sp2qb +.section sp2ra +.section sp2rb +.section sp2sa +.section sp2sb +.section sp2ta +.section sp2tb +.section sp2ua +.section sp2ub +.section sp2va +.section sp2vb +.section sp2wa +.section sp2wb +.section sp2xa +.section sp2xb +.section sp2ya +.section sp2yb +.section sp2za +.section sp2zb +.section sp21a +.section sp21b +.section sp22a +.section sp22b +.section sp23a +.section sp23b +.section sp24a +.section sp24b +.section sp25a +.section sp25b +.section sp26a +.section sp26b +.section sp27a +.section sp27b +.section sp28a +.section sp28b +.section sp29a +.section sp29b +.section sp20a +.section sp20b +.section sp3aa +.section sp3ab +.section sp3ba +.section sp3bb +.section sp3ca +.section sp3cb +.section sp3da +.section sp3db +.section sp3ea +.section sp3eb +.section sp3fa +.section sp3fb +.section sp3ga +.section sp3gb +.section sp3ha +.section sp3hb +.section sp3ia +.section sp3ib +.section sp3ja +.section sp3jb +.section sp3ka +.section sp3kb +.section sp3la +.section sp3lb +.section sp3ma +.section sp3mb +.section sp3na +.section sp3nb +.section sp3oa +.section sp3ob +.section sp3pa +.section sp3pb +.section sp3qa +.section sp3qb +.section sp3ra +.section sp3rb +.section sp3sa +.section sp3sb +.section sp3ta +.section sp3tb +.section sp3ua +.section sp3ub +.section sp3va +.section sp3vb +.section sp3wa +.section sp3wb +.section sp3xa +.section sp3xb +.section sp3ya +.section sp3yb +.section sp3za +.section sp3zb +.section sp31a +.section sp31b +.section sp32a +.section sp32b +.section sp33a +.section sp33b +.section sp34a +.section sp34b +.section sp35a +.section sp35b +.section sp36a +.section sp36b +.section sp37a +.section sp37b +.section sp38a +.section sp38b +.section sp39a +.section sp39b +.section sp30a +.section sp30b +.section sp4aa +.section sp4ab +.section sp4ba +.section sp4bb +.section sp4ca +.section sp4cb +.section sp4da +.section sp4db +.section sp4ea +.section sp4eb +.section sp4fa +.section sp4fb +.section sp4ga +.section sp4gb +.section sp4ha +.section sp4hb +.section sp4ia +.section sp4ib +.section sp4ja +.section sp4jb +.section sp4ka +.section sp4kb +.section sp4la +.section sp4lb +.section sp4ma +.section sp4mb +.section sp4na +.section sp4nb +.section sp4oa +.section sp4ob +.section sp4pa +.section sp4pb +.section sp4qa +.section sp4qb +.section sp4ra +.section sp4rb +.section sp4sa +.section sp4sb +.section sp4ta +.section sp4tb +.section sp4ua +.section sp4ub +.section sp4va +.section sp4vb +.section sp4wa +.section sp4wb +.section sp4xa +.section sp4xb +.section sp4ya +.section sp4yb +.section sp4za +.section sp4zb +.section sp41a +.section sp41b +.section sp42a +.section sp42b +.section sp43a +.section sp43b +.section sp44a +.section sp44b +.section sp45a +.section sp45b +.section sp46a +.section sp46b +.section sp47a +.section sp47b +.section sp48a +.section sp48b +.section sp49a +.section sp49b +.section sp40a +.section sp40b +.section sp5aa +.section sp5ab +.section sp5ba +.section sp5bb +.section sp5ca +.section sp5cb +.section sp5da +.section sp5db +.section sp5ea +.section sp5eb +.section sp5fa +.section sp5fb +.section sp5ga +.section sp5gb +.section sp5ha +.section sp5hb +.section sp5ia +.section sp5ib +.section sp5ja +.section sp5jb +.section sp5ka +.section sp5kb +.section sp5la +.section sp5lb +.section sp5ma +.section sp5mb +.section sp5na +.section sp5nb +.section sp5oa +.section sp5ob +.section sp5pa +.section sp5pb +.section sp5qa +.section sp5qb +.section sp5ra +.section sp5rb +.section sp5sa +.section sp5sb +.section sp5ta +.section sp5tb +.section sp5ua +.section sp5ub +.section sp5va +.section sp5vb +.section sp5wa +.section sp5wb +.section sp5xa +.section sp5xb +.section sp5ya +.section sp5yb +.section sp5za +.section sp5zb +.section sp51a +.section sp51b +.section sp52a +.section sp52b +.section sp53a +.section sp53b +.section sp54a +.section sp54b +.section sp55a +.section sp55b +.section sp56a +.section sp56b +.section sp57a +.section sp57b +.section sp58a +.section sp58b +.section sp59a +.section sp59b +.section sp50a +.section sp50b +.section sp6aa +.section sp6ab +.section sp6ba +.section sp6bb +.section sp6ca +.section sp6cb +.section sp6da +.section sp6db +.section sp6ea +.section sp6eb +.section sp6fa +.section sp6fb +.section sp6ga +.section sp6gb +.section sp6ha +.section sp6hb +.section sp6ia +.section sp6ib +.section sp6ja +.section sp6jb +.section sp6ka +.section sp6kb +.section sp6la +.section sp6lb +.section sp6ma +.section sp6mb +.section sp6na +.section sp6nb +.section sp6oa +.section sp6ob +.section sp6pa +.section sp6pb +.section sp6qa +.section sp6qb +.section sp6ra +.section sp6rb +.section sp6sa +.section sp6sb +.section sp6ta +.section sp6tb +.section sp6ua +.section sp6ub +.section sp6va +.section sp6vb +.section sp6wa +.section sp6wb +.section sp6xa +.section sp6xb +.section sp6ya +.section sp6yb +.section sp6za +.section sp6zb +.section sp61a +.section sp61b +.section sp62a +.section sp62b +.section sp63a +.section sp63b +.section sp64a +.section sp64b +.section sp65a +.section sp65b +.section sp66a +.section sp66b +.section sp67a +.section sp67b +.section sp68a +.section sp68b +.section sp69a +.section sp69b +.section sp60a +.section sp60b +.section sp7aa +.section sp7ab +.section sp7ba +.section sp7bb +.section sp7ca +.section sp7cb +.section sp7da +.section sp7db +.section sp7ea +.section sp7eb +.section sp7fa +.section sp7fb +.section sp7ga +.section sp7gb +.section sp7ha +.section sp7hb +.section sp7ia +.section sp7ib +.section sp7ja +.section sp7jb +.section sp7ka +.section sp7kb +.section sp7la +.section sp7lb +.section sp7ma +.section sp7mb +.section sp7na +.section sp7nb +.section sp7oa +.section sp7ob +.section sp7pa +.section sp7pb +.section sp7qa +.section sp7qb +.section sp7ra +.section sp7rb +.section sp7sa +.section sp7sb +.section sp7ta +.section sp7tb +.section sp7ua +.section sp7ub +.section sp7va +.section sp7vb +.section sp7wa +.section sp7wb +.section sp7xa +.section sp7xb +.section sp7ya +.section sp7yb +.section sp7za +.section sp7zb +.section sp71a +.section sp71b +.section sp72a +.section sp72b +.section sp73a +.section sp73b +.section sp74a +.section sp74b +.section sp75a +.section sp75b +.section sp76a +.section sp76b +.section sp77a +.section sp77b +.section sp78a +.section sp78b +.section sp79a +.section sp79b +.section sp70a +.section sp70b +.section sp8aa +.section sp8ab +.section sp8ba +.section sp8bb +.section sp8ca +.section sp8cb +.section sp8da +.section sp8db +.section sp8ea +.section sp8eb +.section sp8fa +.section sp8fb +.section sp8ga +.section sp8gb +.section sp8ha +.section sp8hb +.section sp8ia +.section sp8ib +.section sp8ja +.section sp8jb +.section sp8ka +.section sp8kb +.section sp8la +.section sp8lb +.section sp8ma +.section sp8mb +.section sp8na +.section sp8nb +.section sp8oa +.section sp8ob +.section sp8pa +.section sp8pb +.section sp8qa +.section sp8qb +.section sp8ra +.section sp8rb +.section sp8sa +.section sp8sb +.section sp8ta +.section sp8tb +.section sp8ua +.section sp8ub +.section sp8va +.section sp8vb +.section sp8wa +.section sp8wb +.section sp8xa +.section sp8xb +.section sp8ya +.section sp8yb +.section sp8za +.section sp8zb +.section sp81a +.section sp81b +.section sp82a +.section sp82b +.section sp83a +.section sp83b +.section sp84a +.section sp84b +.section sp85a +.section sp85b +.section sp86a +.section sp86b +.section sp87a +.section sp87b +.section sp88a +.section sp88b +.section sp89a +.section sp89b +.section sp80a +.section sp80b +.section sp9aa +.section sp9ab +.section sp9ba +.section sp9bb +.section sp9ca +.section sp9cb +.section sp9da +.section sp9db +.section sp9ea +.section sp9eb +.section sp9fa +.section sp9fb +.section sp9ga +.section sp9gb +.section sp9ha +.section sp9hb +.section sp9ia +.section sp9ib +.section sp9ja +.section sp9jb +.section sp9ka +.section sp9kb +.section sp9la +.section sp9lb +.section sp9ma +.section sp9mb +.section sp9na +.section sp9nb +.section sp9oa +.section sp9ob +.section sp9pa +.section sp9pb +.section sp9qa +.section sp9qb +.section sp9ra +.section sp9rb +.section sp9sa +.section sp9sb +.section sp9ta +.section sp9tb +.section sp9ua +.section sp9ub +.section sp9va +.section sp9vb +.section sp9wa +.section sp9wb +.section sp9xa +.section sp9xb +.section sp9ya +.section sp9yb +.section sp9za +.section sp9zb +.section sp91a +.section sp91b +.section sp92a +.section sp92b +.section sp93a +.section sp93b +.section sp94a +.section sp94b +.section sp95a +.section sp95b +.section sp96a +.section sp96b +.section sp97a +.section sp97b +.section sp98a +.section sp98b +.section sp99a +.section sp99b +.section sp90a +.section sp90b +.section sp0aa +.section sp0ab +.section sp0ba +.section sp0bb +.section sp0ca +.section sp0cb +.section sp0da +.section sp0db +.section sp0ea +.section sp0eb +.section sp0fa +.section sp0fb +.section sp0ga +.section sp0gb +.section sp0ha +.section sp0hb +.section sp0ia +.section sp0ib +.section sp0ja +.section sp0jb +.section sp0ka +.section sp0kb +.section sp0la +.section sp0lb +.section sp0ma +.section sp0mb +.section sp0na +.section sp0nb +.section sp0oa +.section sp0ob +.section sp0pa +.section sp0pb +.section sp0qa +.section sp0qb +.section sp0ra +.section sp0rb +.section sp0sa +.section sp0sb +.section sp0ta +.section sp0tb +.section sp0ua +.section sp0ub +.section sp0va +.section sp0vb +.section sp0wa +.section sp0wb +.section sp0xa +.section sp0xb +.section sp0ya +.section sp0yb +.section sp0za +.section sp0zb +.section sp01a +.section sp01b +.section sp02a +.section sp02b +.section sp03a +.section sp03b +.section sp04a +.section sp04b +.section sp05a +.section sp05b +.section sp06a +.section sp06b +.section sp07a +.section sp07b +.section sp08a +.section sp08b +.section sp09a +.section sp09b +.section sp00a +.section sp00b +.section sqaaa +.section sqaab +.section sqaba +.section sqabb +.section sqaca +.section sqacb +.section sqada +.section sqadb +.section sqaea +.section sqaeb +.section sqafa +.section sqafb +.section sqaga +.section sqagb +.section sqaha +.section sqahb +.section sqaia +.section sqaib +.section sqaja +.section sqajb +.section sqaka +.section sqakb +.section sqala +.section sqalb +.section sqama +.section sqamb +.section sqana +.section sqanb +.section sqaoa +.section sqaob +.section sqapa +.section sqapb +.section sqaqa +.section sqaqb +.section sqara +.section sqarb +.section sqasa +.section sqasb +.section sqata +.section sqatb +.section sqaua +.section sqaub +.section sqava +.section sqavb +.section sqawa +.section sqawb +.section sqaxa +.section sqaxb +.section sqaya +.section sqayb +.section sqaza +.section sqazb +.section sqa1a +.section sqa1b +.section sqa2a +.section sqa2b +.section sqa3a +.section sqa3b +.section sqa4a +.section sqa4b +.section sqa5a +.section sqa5b +.section sqa6a +.section sqa6b +.section sqa7a +.section sqa7b +.section sqa8a +.section sqa8b +.section sqa9a +.section sqa9b +.section sqa0a +.section sqa0b +.section sqbaa +.section sqbab +.section sqbba +.section sqbbb +.section sqbca +.section sqbcb +.section sqbda +.section sqbdb +.section sqbea +.section sqbeb +.section sqbfa +.section sqbfb +.section sqbga +.section sqbgb +.section sqbha +.section sqbhb +.section sqbia +.section sqbib +.section sqbja +.section sqbjb +.section sqbka +.section sqbkb +.section sqbla +.section sqblb +.section sqbma +.section sqbmb +.section sqbna +.section sqbnb +.section sqboa +.section sqbob +.section sqbpa +.section sqbpb +.section sqbqa +.section sqbqb +.section sqbra +.section sqbrb +.section sqbsa +.section sqbsb +.section sqbta +.section sqbtb +.section sqbua +.section sqbub +.section sqbva +.section sqbvb +.section sqbwa +.section sqbwb +.section sqbxa +.section sqbxb +.section sqbya +.section sqbyb +.section sqbza +.section sqbzb +.section sqb1a +.section sqb1b +.section sqb2a +.section sqb2b +.section sqb3a +.section sqb3b +.section sqb4a +.section sqb4b +.section sqb5a +.section sqb5b +.section sqb6a +.section sqb6b +.section sqb7a +.section sqb7b +.section sqb8a +.section sqb8b +.section sqb9a +.section sqb9b +.section sqb0a +.section sqb0b +.section sqcaa +.section sqcab +.section sqcba +.section sqcbb +.section sqcca +.section sqccb +.section sqcda +.section sqcdb +.section sqcea +.section sqceb +.section sqcfa +.section sqcfb +.section sqcga +.section sqcgb +.section sqcha +.section sqchb +.section sqcia +.section sqcib +.section sqcja +.section sqcjb +.section sqcka +.section sqckb +.section sqcla +.section sqclb +.section sqcma +.section sqcmb +.section sqcna +.section sqcnb +.section sqcoa +.section sqcob +.section sqcpa +.section sqcpb +.section sqcqa +.section sqcqb +.section sqcra +.section sqcrb +.section sqcsa +.section sqcsb +.section sqcta +.section sqctb +.section sqcua +.section sqcub +.section sqcva +.section sqcvb +.section sqcwa +.section sqcwb +.section sqcxa +.section sqcxb +.section sqcya +.section sqcyb +.section sqcza +.section sqczb +.section sqc1a +.section sqc1b +.section sqc2a +.section sqc2b +.section sqc3a +.section sqc3b +.section sqc4a +.section sqc4b +.section sqc5a +.section sqc5b +.section sqc6a +.section sqc6b +.section sqc7a +.section sqc7b +.section sqc8a +.section sqc8b +.section sqc9a +.section sqc9b +.section sqc0a +.section sqc0b +.section sqdaa +.section sqdab +.section sqdba +.section sqdbb +.section sqdca +.section sqdcb +.section sqdda +.section sqddb +.section sqdea +.section sqdeb +.section sqdfa +.section sqdfb +.section sqdga +.section sqdgb +.section sqdha +.section sqdhb +.section sqdia +.section sqdib +.section sqdja +.section sqdjb +.section sqdka +.section sqdkb +.section sqdla +.section sqdlb +.section sqdma +.section sqdmb +.section sqdna +.section sqdnb +.section sqdoa +.section sqdob +.section sqdpa +.section sqdpb +.section sqdqa +.section sqdqb +.section sqdra +.section sqdrb +.section sqdsa +.section sqdsb +.section sqdta +.section sqdtb +.section sqdua +.section sqdub +.section sqdva +.section sqdvb +.section sqdwa +.section sqdwb +.section sqdxa +.section sqdxb +.section sqdya +.section sqdyb +.section sqdza +.section sqdzb +.section sqd1a +.section sqd1b +.section sqd2a +.section sqd2b +.section sqd3a +.section sqd3b +.section sqd4a +.section sqd4b +.section sqd5a +.section sqd5b +.section sqd6a +.section sqd6b +.section sqd7a +.section sqd7b +.section sqd8a +.section sqd8b +.section sqd9a +.section sqd9b +.section sqd0a +.section sqd0b +.section sqeaa +.section sqeab +.section sqeba +.section sqebb +.section sqeca +.section sqecb +.section sqeda +.section sqedb +.section sqeea +.section sqeeb +.section sqefa +.section sqefb +.section sqega +.section sqegb +.section sqeha +.section sqehb +.section sqeia +.section sqeib +.section sqeja +.section sqejb +.section sqeka +.section sqekb +.section sqela +.section sqelb +.section sqema +.section sqemb +.section sqena +.section sqenb +.section sqeoa +.section sqeob +.section sqepa +.section sqepb +.section sqeqa +.section sqeqb +.section sqera +.section sqerb +.section sqesa +.section sqesb +.section sqeta +.section sqetb +.section sqeua +.section sqeub +.section sqeva +.section sqevb +.section sqewa +.section sqewb +.section sqexa +.section sqexb +.section sqeya +.section sqeyb +.section sqeza +.section sqezb +.section sqe1a +.section sqe1b +.section sqe2a +.section sqe2b +.section sqe3a +.section sqe3b +.section sqe4a +.section sqe4b +.section sqe5a +.section sqe5b +.section sqe6a +.section sqe6b +.section sqe7a +.section sqe7b +.section sqe8a +.section sqe8b +.section sqe9a +.section sqe9b +.section sqe0a +.section sqe0b +.section sqfaa +.section sqfab +.section sqfba +.section sqfbb +.section sqfca +.section sqfcb +.section sqfda +.section sqfdb +.section sqfea +.section sqfeb +.section sqffa +.section sqffb +.section sqfga +.section sqfgb +.section sqfha +.section sqfhb +.section sqfia +.section sqfib +.section sqfja +.section sqfjb +.section sqfka +.section sqfkb +.section sqfla +.section sqflb +.section sqfma +.section sqfmb +.section sqfna +.section sqfnb +.section sqfoa +.section sqfob +.section sqfpa +.section sqfpb +.section sqfqa +.section sqfqb +.section sqfra +.section sqfrb +.section sqfsa +.section sqfsb +.section sqfta +.section sqftb +.section sqfua +.section sqfub +.section sqfva +.section sqfvb +.section sqfwa +.section sqfwb +.section sqfxa +.section sqfxb +.section sqfya +.section sqfyb +.section sqfza +.section sqfzb +.section sqf1a +.section sqf1b +.section sqf2a +.section sqf2b +.section sqf3a +.section sqf3b +.section sqf4a +.section sqf4b +.section sqf5a +.section sqf5b +.section sqf6a +.section sqf6b +.section sqf7a +.section sqf7b +.section sqf8a +.section sqf8b +.section sqf9a +.section sqf9b +.section sqf0a +.section sqf0b +.section sqgaa +.section sqgab +.section sqgba +.section sqgbb +.section sqgca +.section sqgcb +.section sqgda +.section sqgdb +.section sqgea +.section sqgeb +.section sqgfa +.section sqgfb +.section sqgga +.section sqggb +.section sqgha +.section sqghb +.section sqgia +.section sqgib +.section sqgja +.section sqgjb +.section sqgka +.section sqgkb +.section sqgla +.section sqglb +.section sqgma +.section sqgmb +.section sqgna +.section sqgnb +.section sqgoa +.section sqgob +.section sqgpa +.section sqgpb +.section sqgqa +.section sqgqb +.section sqgra +.section sqgrb +.section sqgsa +.section sqgsb +.section sqgta +.section sqgtb +.section sqgua +.section sqgub +.section sqgva +.section sqgvb +.section sqgwa +.section sqgwb +.section sqgxa +.section sqgxb +.section sqgya +.section sqgyb +.section sqgza +.section sqgzb +.section sqg1a +.section sqg1b +.section sqg2a +.section sqg2b +.section sqg3a +.section sqg3b +.section sqg4a +.section sqg4b +.section sqg5a +.section sqg5b +.section sqg6a +.section sqg6b +.section sqg7a +.section sqg7b +.section sqg8a +.section sqg8b +.section sqg9a +.section sqg9b +.section sqg0a +.section sqg0b +.section sqhaa +.section sqhab +.section sqhba +.section sqhbb +.section sqhca +.section sqhcb +.section sqhda +.section sqhdb +.section sqhea +.section sqheb +.section sqhfa +.section sqhfb +.section sqhga +.section sqhgb +.section sqhha +.section sqhhb +.section sqhia +.section sqhib +.section sqhja +.section sqhjb +.section sqhka +.section sqhkb +.section sqhla +.section sqhlb +.section sqhma +.section sqhmb +.section sqhna +.section sqhnb +.section sqhoa +.section sqhob +.section sqhpa +.section sqhpb +.section sqhqa +.section sqhqb +.section sqhra +.section sqhrb +.section sqhsa +.section sqhsb +.section sqhta +.section sqhtb +.section sqhua +.section sqhub +.section sqhva +.section sqhvb +.section sqhwa +.section sqhwb +.section sqhxa +.section sqhxb +.section sqhya +.section sqhyb +.section sqhza +.section sqhzb +.section sqh1a +.section sqh1b +.section sqh2a +.section sqh2b +.section sqh3a +.section sqh3b +.section sqh4a +.section sqh4b +.section sqh5a +.section sqh5b +.section sqh6a +.section sqh6b +.section sqh7a +.section sqh7b +.section sqh8a +.section sqh8b +.section sqh9a +.section sqh9b +.section sqh0a +.section sqh0b +.section sqiaa +.section sqiab +.section sqiba +.section sqibb +.section sqica +.section sqicb +.section sqida +.section sqidb +.section sqiea +.section sqieb +.section sqifa +.section sqifb +.section sqiga +.section sqigb +.section sqiha +.section sqihb +.section sqiia +.section sqiib +.section sqija +.section sqijb +.section sqika +.section sqikb +.section sqila +.section sqilb +.section sqima +.section sqimb +.section sqina +.section sqinb +.section sqioa +.section sqiob +.section sqipa +.section sqipb +.section sqiqa +.section sqiqb +.section sqira +.section sqirb +.section sqisa +.section sqisb +.section sqita +.section sqitb +.section sqiua +.section sqiub +.section sqiva +.section sqivb +.section sqiwa +.section sqiwb +.section sqixa +.section sqixb +.section sqiya +.section sqiyb +.section sqiza +.section sqizb +.section sqi1a +.section sqi1b +.section sqi2a +.section sqi2b +.section sqi3a +.section sqi3b +.section sqi4a +.section sqi4b +.section sqi5a +.section sqi5b +.section sqi6a +.section sqi6b +.section sqi7a +.section sqi7b +.section sqi8a +.section sqi8b +.section sqi9a +.section sqi9b +.section sqi0a +.section sqi0b +.section sqjaa +.section sqjab +.section sqjba +.section sqjbb +.section sqjca +.section sqjcb +.section sqjda +.section sqjdb +.section sqjea +.section sqjeb +.section sqjfa +.section sqjfb +.section sqjga +.section sqjgb +.section sqjha +.section sqjhb +.section sqjia +.section sqjib +.section sqjja +.section sqjjb +.section sqjka +.section sqjkb +.section sqjla +.section sqjlb +.section sqjma +.section sqjmb +.section sqjna +.section sqjnb +.section sqjoa +.section sqjob +.section sqjpa +.section sqjpb +.section sqjqa +.section sqjqb +.section sqjra +.section sqjrb +.section sqjsa +.section sqjsb +.section sqjta +.section sqjtb +.section sqjua +.section sqjub +.section sqjva +.section sqjvb +.section sqjwa +.section sqjwb +.section sqjxa +.section sqjxb +.section sqjya +.section sqjyb +.section sqjza +.section sqjzb +.section sqj1a +.section sqj1b +.section sqj2a +.section sqj2b +.section sqj3a +.section sqj3b +.section sqj4a +.section sqj4b +.section sqj5a +.section sqj5b +.section sqj6a +.section sqj6b +.section sqj7a +.section sqj7b +.section sqj8a +.section sqj8b +.section sqj9a +.section sqj9b +.section sqj0a +.section sqj0b +.section sqkaa +.section sqkab +.section sqkba +.section sqkbb +.section sqkca +.section sqkcb +.section sqkda +.section sqkdb +.section sqkea +.section sqkeb +.section sqkfa +.section sqkfb +.section sqkga +.section sqkgb +.section sqkha +.section sqkhb +.section sqkia +.section sqkib +.section sqkja +.section sqkjb +.section sqkka +.section sqkkb +.section sqkla +.section sqklb +.section sqkma +.section sqkmb +.section sqkna +.section sqknb +.section sqkoa +.section sqkob +.section sqkpa +.section sqkpb +.section sqkqa +.section sqkqb +.section sqkra +.section sqkrb +.section sqksa +.section sqksb +.section sqkta +.section sqktb +.section sqkua +.section sqkub +.section sqkva +.section sqkvb +.section sqkwa +.section sqkwb +.section sqkxa +.section sqkxb +.section sqkya +.section sqkyb +.section sqkza +.section sqkzb +.section sqk1a +.section sqk1b +.section sqk2a +.section sqk2b +.section sqk3a +.section sqk3b +.section sqk4a +.section sqk4b +.section sqk5a +.section sqk5b +.section sqk6a +.section sqk6b +.section sqk7a +.section sqk7b +.section sqk8a +.section sqk8b +.section sqk9a +.section sqk9b +.section sqk0a +.section sqk0b +.section sqlaa +.section sqlab +.section sqlba +.section sqlbb +.section sqlca +.section sqlcb +.section sqlda +.section sqldb +.section sqlea +.section sqleb +.section sqlfa +.section sqlfb +.section sqlga +.section sqlgb +.section sqlha +.section sqlhb +.section sqlia +.section sqlib +.section sqlja +.section sqljb +.section sqlka +.section sqlkb +.section sqlla +.section sqllb +.section sqlma +.section sqlmb +.section sqlna +.section sqlnb +.section sqloa +.section sqlob +.section sqlpa +.section sqlpb +.section sqlqa +.section sqlqb +.section sqlra +.section sqlrb +.section sqlsa +.section sqlsb +.section sqlta +.section sqltb +.section sqlua +.section sqlub +.section sqlva +.section sqlvb +.section sqlwa +.section sqlwb +.section sqlxa +.section sqlxb +.section sqlya +.section sqlyb +.section sqlza +.section sqlzb +.section sql1a +.section sql1b +.section sql2a +.section sql2b +.section sql3a +.section sql3b +.section sql4a +.section sql4b +.section sql5a +.section sql5b +.section sql6a +.section sql6b +.section sql7a +.section sql7b +.section sql8a +.section sql8b +.section sql9a +.section sql9b +.section sql0a +.section sql0b +.section sqmaa +.section sqmab +.section sqmba +.section sqmbb +.section sqmca +.section sqmcb +.section sqmda +.section sqmdb +.section sqmea +.section sqmeb +.section sqmfa +.section sqmfb +.section sqmga +.section sqmgb +.section sqmha +.section sqmhb +.section sqmia +.section sqmib +.section sqmja +.section sqmjb +.section sqmka +.section sqmkb +.section sqmla +.section sqmlb +.section sqmma +.section sqmmb +.section sqmna +.section sqmnb +.section sqmoa +.section sqmob +.section sqmpa +.section sqmpb +.section sqmqa +.section sqmqb +.section sqmra +.section sqmrb +.section sqmsa +.section sqmsb +.section sqmta +.section sqmtb +.section sqmua +.section sqmub +.section sqmva +.section sqmvb +.section sqmwa +.section sqmwb +.section sqmxa +.section sqmxb +.section sqmya +.section sqmyb +.section sqmza +.section sqmzb +.section sqm1a +.section sqm1b +.section sqm2a +.section sqm2b +.section sqm3a +.section sqm3b +.section sqm4a +.section sqm4b +.section sqm5a +.section sqm5b +.section sqm6a +.section sqm6b +.section sqm7a +.section sqm7b +.section sqm8a +.section sqm8b +.section sqm9a +.section sqm9b +.section sqm0a +.section sqm0b +.section sqnaa +.section sqnab +.section sqnba +.section sqnbb +.section sqnca +.section sqncb +.section sqnda +.section sqndb +.section sqnea +.section sqneb +.section sqnfa +.section sqnfb +.section sqnga +.section sqngb +.section sqnha +.section sqnhb +.section sqnia +.section sqnib +.section sqnja +.section sqnjb +.section sqnka +.section sqnkb +.section sqnla +.section sqnlb +.section sqnma +.section sqnmb +.section sqnna +.section sqnnb +.section sqnoa +.section sqnob +.section sqnpa +.section sqnpb +.section sqnqa +.section sqnqb +.section sqnra +.section sqnrb +.section sqnsa +.section sqnsb +.section sqnta +.section sqntb +.section sqnua +.section sqnub +.section sqnva +.section sqnvb +.section sqnwa +.section sqnwb +.section sqnxa +.section sqnxb +.section sqnya +.section sqnyb +.section sqnza +.section sqnzb +.section sqn1a +.section sqn1b +.section sqn2a +.section sqn2b +.section sqn3a +.section sqn3b +.section sqn4a +.section sqn4b +.section sqn5a +.section sqn5b +.section sqn6a +.section sqn6b +.section sqn7a +.section sqn7b +.section sqn8a +.section sqn8b +.section sqn9a +.section sqn9b +.section sqn0a +.section sqn0b +.section sqoaa +.section sqoab +.section sqoba +.section sqobb +.section sqoca +.section sqocb +.section sqoda +.section sqodb +.section sqoea +.section sqoeb +.section sqofa +.section sqofb +.section sqoga +.section sqogb +.section sqoha +.section sqohb +.section sqoia +.section sqoib +.section sqoja +.section sqojb +.section sqoka +.section sqokb +.section sqola +.section sqolb +.section sqoma +.section sqomb +.section sqona +.section sqonb +.section sqooa +.section sqoob +.section sqopa +.section sqopb +.section sqoqa +.section sqoqb +.section sqora +.section sqorb +.section sqosa +.section sqosb +.section sqota +.section sqotb +.section sqoua +.section sqoub +.section sqova +.section sqovb +.section sqowa +.section sqowb +.section sqoxa +.section sqoxb +.section sqoya +.section sqoyb +.section sqoza +.section sqozb +.section sqo1a +.section sqo1b +.section sqo2a +.section sqo2b +.section sqo3a +.section sqo3b +.section sqo4a +.section sqo4b +.section sqo5a +.section sqo5b +.section sqo6a +.section sqo6b +.section sqo7a +.section sqo7b +.section sqo8a +.section sqo8b +.section sqo9a +.section sqo9b +.section sqo0a +.section sqo0b +.section sqpaa +.section sqpab +.section sqpba +.section sqpbb +.section sqpca +.section sqpcb +.section sqpda +.section sqpdb +.section sqpea +.section sqpeb +.section sqpfa +.section sqpfb +.section sqpga +.section sqpgb +.section sqpha +.section sqphb +.section sqpia +.section sqpib +.section sqpja +.section sqpjb +.section sqpka +.section sqpkb +.section sqpla +.section sqplb +.section sqpma +.section sqpmb +.section sqpna +.section sqpnb +.section sqpoa +.section sqpob +.section sqppa +.section sqppb +.section sqpqa +.section sqpqb +.section sqpra +.section sqprb +.section sqpsa +.section sqpsb +.section sqpta +.section sqptb +.section sqpua +.section sqpub +.section sqpva +.section sqpvb +.section sqpwa +.section sqpwb +.section sqpxa +.section sqpxb +.section sqpya +.section sqpyb +.section sqpza +.section sqpzb +.section sqp1a +.section sqp1b +.section sqp2a +.section sqp2b +.section sqp3a +.section sqp3b +.section sqp4a +.section sqp4b +.section sqp5a +.section sqp5b +.section sqp6a +.section sqp6b +.section sqp7a +.section sqp7b +.section sqp8a +.section sqp8b +.section sqp9a +.section sqp9b +.section sqp0a +.section sqp0b +.section sqqaa +.section sqqab +.section sqqba +.section sqqbb +.section sqqca +.section sqqcb +.section sqqda +.section sqqdb +.section sqqea +.section sqqeb +.section sqqfa +.section sqqfb +.section sqqga +.section sqqgb +.section sqqha +.section sqqhb +.section sqqia +.section sqqib +.section sqqja +.section sqqjb +.section sqqka +.section sqqkb +.section sqqla +.section sqqlb +.section sqqma +.section sqqmb +.section sqqna +.section sqqnb +.section sqqoa +.section sqqob +.section sqqpa +.section sqqpb +.section sqqqa +.section sqqqb +.section sqqra +.section sqqrb +.section sqqsa +.section sqqsb +.section sqqta +.section sqqtb +.section sqqua +.section sqqub +.section sqqva +.section sqqvb +.section sqqwa +.section sqqwb +.section sqqxa +.section sqqxb +.section sqqya +.section sqqyb +.section sqqza +.section sqqzb +.section sqq1a +.section sqq1b +.section sqq2a +.section sqq2b +.section sqq3a +.section sqq3b +.section sqq4a +.section sqq4b +.section sqq5a +.section sqq5b +.section sqq6a +.section sqq6b +.section sqq7a +.section sqq7b +.section sqq8a +.section sqq8b +.section sqq9a +.section sqq9b +.section sqq0a +.section sqq0b +.section sqraa +.section sqrab +.section sqrba +.section sqrbb +.section sqrca +.section sqrcb +.section sqrda +.section sqrdb +.section sqrea +.section sqreb +.section sqrfa +.section sqrfb +.section sqrga +.section sqrgb +.section sqrha +.section sqrhb +.section sqria +.section sqrib +.section sqrja +.section sqrjb +.section sqrka +.section sqrkb +.section sqrla +.section sqrlb +.section sqrma +.section sqrmb +.section sqrna +.section sqrnb +.section sqroa +.section sqrob +.section sqrpa +.section sqrpb +.section sqrqa +.section sqrqb +.section sqrra +.section sqrrb +.section sqrsa +.section sqrsb +.section sqrta +.section sqrtb +.section sqrua +.section sqrub +.section sqrva +.section sqrvb +.section sqrwa +.section sqrwb +.section sqrxa +.section sqrxb +.section sqrya +.section sqryb +.section sqrza +.section sqrzb +.section sqr1a +.section sqr1b +.section sqr2a +.section sqr2b +.section sqr3a +.section sqr3b +.section sqr4a +.section sqr4b +.section sqr5a +.section sqr5b +.section sqr6a +.section sqr6b +.section sqr7a +.section sqr7b +.section sqr8a +.section sqr8b +.section sqr9a +.section sqr9b +.section sqr0a +.section sqr0b +.section sqsaa +.section sqsab +.section sqsba +.section sqsbb +.section sqsca +.section sqscb +.section sqsda +.section sqsdb +.section sqsea +.section sqseb +.section sqsfa +.section sqsfb +.section sqsga +.section sqsgb +.section sqsha +.section sqshb +.section sqsia +.section sqsib +.section sqsja +.section sqsjb +.section sqska +.section sqskb +.section sqsla +.section sqslb +.section sqsma +.section sqsmb +.section sqsna +.section sqsnb +.section sqsoa +.section sqsob +.section sqspa +.section sqspb +.section sqsqa +.section sqsqb +.section sqsra +.section sqsrb +.section sqssa +.section sqssb +.section sqsta +.section sqstb +.section sqsua +.section sqsub +.section sqsva +.section sqsvb +.section sqswa +.section sqswb +.section sqsxa +.section sqsxb +.section sqsya +.section sqsyb +.section sqsza +.section sqszb +.section sqs1a +.section sqs1b +.section sqs2a +.section sqs2b +.section sqs3a +.section sqs3b +.section sqs4a +.section sqs4b +.section sqs5a +.section sqs5b +.section sqs6a +.section sqs6b +.section sqs7a +.section sqs7b +.section sqs8a +.section sqs8b +.section sqs9a +.section sqs9b +.section sqs0a +.section sqs0b +.section sqtaa +.section sqtab +.section sqtba +.section sqtbb +.section sqtca +.section sqtcb +.section sqtda +.section sqtdb +.section sqtea +.section sqteb +.section sqtfa +.section sqtfb +.section sqtga +.section sqtgb +.section sqtha +.section sqthb +.section sqtia +.section sqtib +.section sqtja +.section sqtjb +.section sqtka +.section sqtkb +.section sqtla +.section sqtlb +.section sqtma +.section sqtmb +.section sqtna +.section sqtnb +.section sqtoa +.section sqtob +.section sqtpa +.section sqtpb +.section sqtqa +.section sqtqb +.section sqtra +.section sqtrb +.section sqtsa +.section sqtsb +.section sqtta +.section sqttb +.section sqtua +.section sqtub +.section sqtva +.section sqtvb +.section sqtwa +.section sqtwb +.section sqtxa +.section sqtxb +.section sqtya +.section sqtyb +.section sqtza +.section sqtzb +.section sqt1a +.section sqt1b +.section sqt2a +.section sqt2b +.section sqt3a +.section sqt3b +.section sqt4a +.section sqt4b +.section sqt5a +.section sqt5b +.section sqt6a +.section sqt6b +.section sqt7a +.section sqt7b +.section sqt8a +.section sqt8b +.section sqt9a +.section sqt9b +.section sqt0a +.section sqt0b +.section squaa +.section squab +.section squba +.section squbb +.section squca +.section squcb +.section squda +.section squdb +.section squea +.section squeb +.section squfa +.section squfb +.section squga +.section squgb +.section squha +.section squhb +.section squia +.section squib +.section squja +.section squjb +.section squka +.section squkb +.section squla +.section squlb +.section squma +.section squmb +.section squna +.section squnb +.section squoa +.section squob +.section squpa +.section squpb +.section squqa +.section squqb +.section squra +.section squrb +.section squsa +.section squsb +.section squta +.section squtb +.section squua +.section squub +.section squva +.section squvb +.section squwa +.section squwb +.section squxa +.section squxb +.section squya +.section squyb +.section squza +.section squzb +.section squ1a +.section squ1b +.section squ2a +.section squ2b +.section squ3a +.section squ3b +.section squ4a +.section squ4b +.section squ5a +.section squ5b +.section squ6a +.section squ6b +.section squ7a +.section squ7b +.section squ8a +.section squ8b +.section squ9a +.section squ9b +.section squ0a +.section squ0b +.section sqvaa +.section sqvab +.section sqvba +.section sqvbb +.section sqvca +.section sqvcb +.section sqvda +.section sqvdb +.section sqvea +.section sqveb +.section sqvfa +.section sqvfb +.section sqvga +.section sqvgb +.section sqvha +.section sqvhb +.section sqvia +.section sqvib +.section sqvja +.section sqvjb +.section sqvka +.section sqvkb +.section sqvla +.section sqvlb +.section sqvma +.section sqvmb +.section sqvna +.section sqvnb +.section sqvoa +.section sqvob +.section sqvpa +.section sqvpb +.section sqvqa +.section sqvqb +.section sqvra +.section sqvrb +.section sqvsa +.section sqvsb +.section sqvta +.section sqvtb +.section sqvua +.section sqvub +.section sqvva +.section sqvvb +.section sqvwa +.section sqvwb +.section sqvxa +.section sqvxb +.section sqvya +.section sqvyb +.section sqvza +.section sqvzb +.section sqv1a +.section sqv1b +.section sqv2a +.section sqv2b +.section sqv3a +.section sqv3b +.section sqv4a +.section sqv4b +.section sqv5a +.section sqv5b +.section sqv6a +.section sqv6b +.section sqv7a +.section sqv7b +.section sqv8a +.section sqv8b +.section sqv9a +.section sqv9b +.section sqv0a +.section sqv0b +.section sqwaa +.section sqwab +.section sqwba +.section sqwbb +.section sqwca +.section sqwcb +.section sqwda +.section sqwdb +.section sqwea +.section sqweb +.section sqwfa +.section sqwfb +.section sqwga +.section sqwgb +.section sqwha +.section sqwhb +.section sqwia +.section sqwib +.section sqwja +.section sqwjb +.section sqwka +.section sqwkb +.section sqwla +.section sqwlb +.section sqwma +.section sqwmb +.section sqwna +.section sqwnb +.section sqwoa +.section sqwob +.section sqwpa +.section sqwpb +.section sqwqa +.section sqwqb +.section sqwra +.section sqwrb +.section sqwsa +.section sqwsb +.section sqwta +.section sqwtb +.section sqwua +.section sqwub +.section sqwva +.section sqwvb +.section sqwwa +.section sqwwb +.section sqwxa +.section sqwxb +.section sqwya +.section sqwyb +.section sqwza +.section sqwzb +.section sqw1a +.section sqw1b +.section sqw2a +.section sqw2b +.section sqw3a +.section sqw3b +.section sqw4a +.section sqw4b +.section sqw5a +.section sqw5b +.section sqw6a +.section sqw6b +.section sqw7a +.section sqw7b +.section sqw8a +.section sqw8b +.section sqw9a +.section sqw9b +.section sqw0a +.section sqw0b +.section sqxaa +.section sqxab +.section sqxba +.section sqxbb +.section sqxca +.section sqxcb +.section sqxda +.section sqxdb +.section sqxea +.section sqxeb +.section sqxfa +.section sqxfb +.section sqxga +.section sqxgb +.section sqxha +.section sqxhb +.section sqxia +.section sqxib +.section sqxja +.section sqxjb +.section sqxka +.section sqxkb +.section sqxla +.section sqxlb +.section sqxma +.section sqxmb +.section sqxna +.section sqxnb +.section sqxoa +.section sqxob +.section sqxpa +.section sqxpb +.section sqxqa +.section sqxqb +.section sqxra +.section sqxrb +.section sqxsa +.section sqxsb +.section sqxta +.section sqxtb +.section sqxua +.section sqxub +.section sqxva +.section sqxvb +.section sqxwa +.section sqxwb +.section sqxxa +.section sqxxb +.section sqxya +.section sqxyb +.section sqxza +.section sqxzb +.section sqx1a +.section sqx1b +.section sqx2a +.section sqx2b +.section sqx3a +.section sqx3b +.section sqx4a +.section sqx4b +.section sqx5a +.section sqx5b +.section sqx6a +.section sqx6b +.section sqx7a +.section sqx7b +.section sqx8a +.section sqx8b +.section sqx9a +.section sqx9b +.section sqx0a +.section sqx0b +.section sqyaa +.section sqyab +.section sqyba +.section sqybb +.section sqyca +.section sqycb +.section sqyda +.section sqydb +.section sqyea +.section sqyeb +.section sqyfa +.section sqyfb +.section sqyga +.section sqygb +.section sqyha +.section sqyhb +.section sqyia +.section sqyib +.section sqyja +.section sqyjb +.section sqyka +.section sqykb +.section sqyla +.section sqylb +.section sqyma +.section sqymb +.section sqyna +.section sqynb +.section sqyoa +.section sqyob +.section sqypa +.section sqypb +.section sqyqa +.section sqyqb +.section sqyra +.section sqyrb +.section sqysa +.section sqysb +.section sqyta +.section sqytb +.section sqyua +.section sqyub +.section sqyva +.section sqyvb +.section sqywa +.section sqywb +.section sqyxa +.section sqyxb +.section sqyya +.section sqyyb +.section sqyza +.section sqyzb +.section sqy1a +.section sqy1b +.section sqy2a +.section sqy2b +.section sqy3a +.section sqy3b +.section sqy4a +.section sqy4b +.section sqy5a +.section sqy5b +.section sqy6a +.section sqy6b +.section sqy7a +.section sqy7b +.section sqy8a +.section sqy8b +.section sqy9a +.section sqy9b +.section sqy0a +.section sqy0b +.section sqzaa +.section sqzab +.section sqzba +.section sqzbb +.section sqzca +.section sqzcb +.section sqzda +.section sqzdb +.section sqzea +.section sqzeb +.section sqzfa +.section sqzfb +.section sqzga +.section sqzgb +.section sqzha +.section sqzhb +.section sqzia +.section sqzib +.section sqzja +.section sqzjb +.section sqzka +.section sqzkb +.section sqzla +.section sqzlb +.section sqzma +.section sqzmb +.section sqzna +.section sqznb +.section sqzoa +.section sqzob +.section sqzpa +.section sqzpb +.section sqzqa +.section sqzqb +.section sqzra +.section sqzrb +.section sqzsa +.section sqzsb +.section sqzta +.section sqztb +.section sqzua +.section sqzub +.section sqzva +.section sqzvb +.section sqzwa +.section sqzwb +.section sqzxa +.section sqzxb +.section sqzya +.section sqzyb +.section sqzza +.section sqzzb +.section sqz1a +.section sqz1b +.section sqz2a +.section sqz2b +.section sqz3a +.section sqz3b +.section sqz4a +.section sqz4b +.section sqz5a +.section sqz5b +.section sqz6a +.section sqz6b +.section sqz7a +.section sqz7b +.section sqz8a +.section sqz8b +.section sqz9a +.section sqz9b +.section sqz0a +.section sqz0b +.section sq1aa +.section sq1ab +.section sq1ba +.section sq1bb +.section sq1ca +.section sq1cb +.section sq1da +.section sq1db +.section sq1ea +.section sq1eb +.section sq1fa +.section sq1fb +.section sq1ga +.section sq1gb +.section sq1ha +.section sq1hb +.section sq1ia +.section sq1ib +.section sq1ja +.section sq1jb +.section sq1ka +.section sq1kb +.section sq1la +.section sq1lb +.section sq1ma +.section sq1mb +.section sq1na +.section sq1nb +.section sq1oa +.section sq1ob +.section sq1pa +.section sq1pb +.section sq1qa +.section sq1qb +.section sq1ra +.section sq1rb +.section sq1sa +.section sq1sb +.section sq1ta +.section sq1tb +.section sq1ua +.section sq1ub +.section sq1va +.section sq1vb +.section sq1wa +.section sq1wb +.section sq1xa +.section sq1xb +.section sq1ya +.section sq1yb +.section sq1za +.section sq1zb +.section sq11a +.section sq11b +.section sq12a +.section sq12b +.section sq13a +.section sq13b +.section sq14a +.section sq14b +.section sq15a +.section sq15b +.section sq16a +.section sq16b +.section sq17a +.section sq17b +.section sq18a +.section sq18b +.section sq19a +.section sq19b +.section sq10a +.section sq10b +.section sq2aa +.section sq2ab +.section sq2ba +.section sq2bb +.section sq2ca +.section sq2cb +.section sq2da +.section sq2db +.section sq2ea +.section sq2eb +.section sq2fa +.section sq2fb +.section sq2ga +.section sq2gb +.section sq2ha +.section sq2hb +.section sq2ia +.section sq2ib +.section sq2ja +.section sq2jb +.section sq2ka +.section sq2kb +.section sq2la +.section sq2lb +.section sq2ma +.section sq2mb +.section sq2na +.section sq2nb +.section sq2oa +.section sq2ob +.section sq2pa +.section sq2pb +.section sq2qa +.section sq2qb +.section sq2ra +.section sq2rb +.section sq2sa +.section sq2sb +.section sq2ta +.section sq2tb +.section sq2ua +.section sq2ub +.section sq2va +.section sq2vb +.section sq2wa +.section sq2wb +.section sq2xa +.section sq2xb +.section sq2ya +.section sq2yb +.section sq2za +.section sq2zb +.section sq21a +.section sq21b +.section sq22a +.section sq22b +.section sq23a +.section sq23b +.section sq24a +.section sq24b +.section sq25a +.section sq25b +.section sq26a +.section sq26b +.section sq27a +.section sq27b +.section sq28a +.section sq28b +.section sq29a +.section sq29b +.section sq20a +.section sq20b +.section sq3aa +.section sq3ab +.section sq3ba +.section sq3bb +.section sq3ca +.section sq3cb +.section sq3da +.section sq3db +.section sq3ea +.section sq3eb +.section sq3fa +.section sq3fb +.section sq3ga +.section sq3gb +.section sq3ha +.section sq3hb +.section sq3ia +.section sq3ib +.section sq3ja +.section sq3jb +.section sq3ka +.section sq3kb +.section sq3la +.section sq3lb +.section sq3ma +.section sq3mb +.section sq3na +.section sq3nb +.section sq3oa +.section sq3ob +.section sq3pa +.section sq3pb +.section sq3qa +.section sq3qb +.section sq3ra +.section sq3rb +.section sq3sa +.section sq3sb +.section sq3ta +.section sq3tb +.section sq3ua +.section sq3ub +.section sq3va +.section sq3vb +.section sq3wa +.section sq3wb +.section sq3xa +.section sq3xb +.section sq3ya +.section sq3yb +.section sq3za +.section sq3zb +.section sq31a +.section sq31b +.section sq32a +.section sq32b +.section sq33a +.section sq33b +.section sq34a +.section sq34b +.section sq35a +.section sq35b +.section sq36a +.section sq36b +.section sq37a +.section sq37b +.section sq38a +.section sq38b +.section sq39a +.section sq39b +.section sq30a +.section sq30b +.section sq4aa +.section sq4ab +.section sq4ba +.section sq4bb +.section sq4ca +.section sq4cb +.section sq4da +.section sq4db +.section sq4ea +.section sq4eb +.section sq4fa +.section sq4fb +.section sq4ga +.section sq4gb +.section sq4ha +.section sq4hb +.section sq4ia +.section sq4ib +.section sq4ja +.section sq4jb +.section sq4ka +.section sq4kb +.section sq4la +.section sq4lb +.section sq4ma +.section sq4mb +.section sq4na +.section sq4nb +.section sq4oa +.section sq4ob +.section sq4pa +.section sq4pb +.section sq4qa +.section sq4qb +.section sq4ra +.section sq4rb +.section sq4sa +.section sq4sb +.section sq4ta +.section sq4tb +.section sq4ua +.section sq4ub +.section sq4va +.section sq4vb +.section sq4wa +.section sq4wb +.section sq4xa +.section sq4xb +.section sq4ya +.section sq4yb +.section sq4za +.section sq4zb +.section sq41a +.section sq41b +.section sq42a +.section sq42b +.section sq43a +.section sq43b +.section sq44a +.section sq44b +.section sq45a +.section sq45b +.section sq46a +.section sq46b +.section sq47a +.section sq47b +.section sq48a +.section sq48b +.section sq49a +.section sq49b +.section sq40a +.section sq40b +.section sq5aa +.section sq5ab +.section sq5ba +.section sq5bb +.section sq5ca +.section sq5cb +.section sq5da +.section sq5db +.section sq5ea +.section sq5eb +.section sq5fa +.section sq5fb +.section sq5ga +.section sq5gb +.section sq5ha +.section sq5hb +.section sq5ia +.section sq5ib +.section sq5ja +.section sq5jb +.section sq5ka +.section sq5kb +.section sq5la +.section sq5lb +.section sq5ma +.section sq5mb +.section sq5na +.section sq5nb +.section sq5oa +.section sq5ob +.section sq5pa +.section sq5pb +.section sq5qa +.section sq5qb +.section sq5ra +.section sq5rb +.section sq5sa +.section sq5sb +.section sq5ta +.section sq5tb +.section sq5ua +.section sq5ub +.section sq5va +.section sq5vb +.section sq5wa +.section sq5wb +.section sq5xa +.section sq5xb +.section sq5ya +.section sq5yb +.section sq5za +.section sq5zb +.section sq51a +.section sq51b +.section sq52a +.section sq52b +.section sq53a +.section sq53b +.section sq54a +.section sq54b +.section sq55a +.section sq55b +.section sq56a +.section sq56b +.section sq57a +.section sq57b +.section sq58a +.section sq58b +.section sq59a +.section sq59b +.section sq50a +.section sq50b +.section sq6aa +.section sq6ab +.section sq6ba +.section sq6bb +.section sq6ca +.section sq6cb +.section sq6da +.section sq6db +.section sq6ea +.section sq6eb +.section sq6fa +.section sq6fb +.section sq6ga +.section sq6gb +.section sq6ha +.section sq6hb +.section sq6ia +.section sq6ib +.section sq6ja +.section sq6jb +.section sq6ka +.section sq6kb +.section sq6la +.section sq6lb +.section sq6ma +.section sq6mb +.section sq6na +.section sq6nb +.section sq6oa +.section sq6ob +.section sq6pa +.section sq6pb +.section sq6qa +.section sq6qb +.section sq6ra +.section sq6rb +.section sq6sa +.section sq6sb +.section sq6ta +.section sq6tb +.section sq6ua +.section sq6ub +.section sq6va +.section sq6vb +.section sq6wa +.section sq6wb +.section sq6xa +.section sq6xb +.section sq6ya +.section sq6yb +.section sq6za +.section sq6zb +.section sq61a +.section sq61b +.section sq62a +.section sq62b +.section sq63a +.section sq63b +.section sq64a +.section sq64b +.section sq65a +.section sq65b +.section sq66a +.section sq66b +.section sq67a +.section sq67b +.section sq68a +.section sq68b +.section sq69a +.section sq69b +.section sq60a +.section sq60b +.section sq7aa +.section sq7ab +.section sq7ba +.section sq7bb +.section sq7ca +.section sq7cb +.section sq7da +.section sq7db +.section sq7ea +.section sq7eb +.section sq7fa +.section sq7fb +.section sq7ga +.section sq7gb +.section sq7ha +.section sq7hb +.section sq7ia +.section sq7ib +.section sq7ja +.section sq7jb +.section sq7ka +.section sq7kb +.section sq7la +.section sq7lb +.section sq7ma +.section sq7mb +.section sq7na +.section sq7nb +.section sq7oa +.section sq7ob +.section sq7pa +.section sq7pb +.section sq7qa +.section sq7qb +.section sq7ra +.section sq7rb +.section sq7sa +.section sq7sb +.section sq7ta +.section sq7tb +.section sq7ua +.section sq7ub +.section sq7va +.section sq7vb +.section sq7wa +.section sq7wb +.section sq7xa +.section sq7xb +.section sq7ya +.section sq7yb +.section sq7za +.section sq7zb +.section sq71a +.section sq71b +.section sq72a +.section sq72b +.section sq73a +.section sq73b +.section sq74a +.section sq74b +.section sq75a +.section sq75b +.section sq76a +.section sq76b +.section sq77a +.section sq77b +.section sq78a +.section sq78b +.section sq79a +.section sq79b +.section sq70a +.section sq70b +.section sq8aa +.section sq8ab +.section sq8ba +.section sq8bb +.section sq8ca +.section sq8cb +.section sq8da +.section sq8db +.section sq8ea +.section sq8eb +.section sq8fa +.section sq8fb +.section sq8ga +.section sq8gb +.section sq8ha +.section sq8hb +.section sq8ia +.section sq8ib +.section sq8ja +.section sq8jb +.section sq8ka +.section sq8kb +.section sq8la +.section sq8lb +.section sq8ma +.section sq8mb +.section sq8na +.section sq8nb +.section sq8oa +.section sq8ob +.section sq8pa +.section sq8pb +.section sq8qa +.section sq8qb +.section sq8ra +.section sq8rb +.section sq8sa +.section sq8sb +.section sq8ta +.section sq8tb +.section sq8ua +.section sq8ub +.section sq8va +.section sq8vb +.section sq8wa +.section sq8wb +.section sq8xa +.section sq8xb +.section sq8ya +.section sq8yb +.section sq8za +.section sq8zb +.section sq81a +.section sq81b +.section sq82a +.section sq82b +.section sq83a +.section sq83b +.section sq84a +.section sq84b +.section sq85a +.section sq85b +.section sq86a +.section sq86b +.section sq87a +.section sq87b +.section sq88a +.section sq88b +.section sq89a +.section sq89b +.section sq80a +.section sq80b +.section sq9aa +.section sq9ab +.section sq9ba +.section sq9bb +.section sq9ca +.section sq9cb +.section sq9da +.section sq9db +.section sq9ea +.section sq9eb +.section sq9fa +.section sq9fb +.section sq9ga +.section sq9gb +.section sq9ha +.section sq9hb +.section sq9ia +.section sq9ib +.section sq9ja +.section sq9jb +.section sq9ka +.section sq9kb +.section sq9la +.section sq9lb +.section sq9ma +.section sq9mb +.section sq9na +.section sq9nb +.section sq9oa +.section sq9ob +.section sq9pa +.section sq9pb +.section sq9qa +.section sq9qb +.section sq9ra +.section sq9rb +.section sq9sa +.section sq9sb +.section sq9ta +.section sq9tb +.section sq9ua +.section sq9ub +.section sq9va +.section sq9vb +.section sq9wa +.section sq9wb +.section sq9xa +.section sq9xb +.section sq9ya +.section sq9yb +.section sq9za +.section sq9zb +.section sq91a +.section sq91b +.section sq92a +.section sq92b +.section sq93a +.section sq93b +.section sq94a +.section sq94b +.section sq95a +.section sq95b +.section sq96a +.section sq96b +.section sq97a +.section sq97b +.section sq98a +.section sq98b +.section sq99a +.section sq99b +.section sq90a +.section sq90b +.section sq0aa +.section sq0ab +.section sq0ba +.section sq0bb +.section sq0ca +.section sq0cb +.section sq0da +.section sq0db +.section sq0ea +.section sq0eb +.section sq0fa +.section sq0fb +.section sq0ga +.section sq0gb +.section sq0ha +.section sq0hb +.section sq0ia +.section sq0ib +.section sq0ja +.section sq0jb +.section sq0ka +.section sq0kb +.section sq0la +.section sq0lb +.section sq0ma +.section sq0mb +.section sq0na +.section sq0nb +.section sq0oa +.section sq0ob +.section sq0pa +.section sq0pb +.section sq0qa +.section sq0qb +.section sq0ra +.section sq0rb +.section sq0sa +.section sq0sb +.section sq0ta +.section sq0tb +.section sq0ua +.section sq0ub +.section sq0va +.section sq0vb +.section sq0wa +.section sq0wb +.section sq0xa +.section sq0xb +.section sq0ya +.section sq0yb +.section sq0za +.section sq0zb +.section sq01a +.section sq01b +.section sq02a +.section sq02b +.section sq03a +.section sq03b +.section sq04a +.section sq04b +.section sq05a +.section sq05b +.section sq06a +.section sq06b +.section sq07a +.section sq07b +.section sq08a +.section sq08b +.section sq09a +.section sq09b +.section sq00a +.section sq00b +.section sraaa +.section sraab +.section sraba +.section srabb +.section sraca +.section sracb +.section srada +.section sradb +.section sraea +.section sraeb +.section srafa +.section srafb +.section sraga +.section sragb +.section sraha +.section srahb +.section sraia +.section sraib +.section sraja +.section srajb +.section sraka +.section srakb +.section srala +.section sralb +.section srama +.section sramb +.section srana +.section sranb +.section sraoa +.section sraob +.section srapa +.section srapb +.section sraqa +.section sraqb +.section srara +.section srarb +.section srasa +.section srasb +.section srata +.section sratb +.section sraua +.section sraub +.section srava +.section sravb +.section srawa +.section srawb +.section sraxa +.section sraxb +.section sraya +.section srayb +.section sraza +.section srazb +.section sra1a +.section sra1b +.section sra2a +.section sra2b +.section sra3a +.section sra3b +.section sra4a +.section sra4b +.section sra5a +.section sra5b +.section sra6a +.section sra6b +.section sra7a +.section sra7b +.section sra8a +.section sra8b +.section sra9a +.section sra9b +.section sra0a +.section sra0b +.section srbaa +.section srbab +.section srbba +.section srbbb +.section srbca +.section srbcb +.section srbda +.section srbdb +.section srbea +.section srbeb +.section srbfa +.section srbfb +.section srbga +.section srbgb +.section srbha +.section srbhb +.section srbia +.section srbib +.section srbja +.section srbjb +.section srbka +.section srbkb +.section srbla +.section srblb +.section srbma +.section srbmb +.section srbna +.section srbnb +.section srboa +.section srbob +.section srbpa +.section srbpb +.section srbqa +.section srbqb +.section srbra +.section srbrb +.section srbsa +.section srbsb +.section srbta +.section srbtb +.section srbua +.section srbub +.section srbva +.section srbvb +.section srbwa +.section srbwb +.section srbxa +.section srbxb +.section srbya +.section srbyb +.section srbza +.section srbzb +.section srb1a +.section srb1b +.section srb2a +.section srb2b +.section srb3a +.section srb3b +.section srb4a +.section srb4b +.section srb5a +.section srb5b +.section srb6a +.section srb6b +.section srb7a +.section srb7b +.section srb8a +.section srb8b +.section srb9a +.section srb9b +.section srb0a +.section srb0b +.section srcaa +.section srcab +.section srcba +.section srcbb +.section srcca +.section srccb +.section srcda +.section srcdb +.section srcea +.section srceb +.section srcfa +.section srcfb +.section srcga +.section srcgb +.section srcha +.section srchb +.section srcia +.section srcib +.section srcja +.section srcjb +.section srcka +.section srckb +.section srcla +.section srclb +.section srcma +.section srcmb +.section srcna +.section srcnb +.section srcoa +.section srcob +.section srcpa +.section srcpb +.section srcqa +.section srcqb +.section srcra +.section srcrb +.section srcsa +.section srcsb +.section srcta +.section srctb +.section srcua +.section srcub +.section srcva +.section srcvb +.section srcwa +.section srcwb +.section srcxa +.section srcxb +.section srcya +.section srcyb +.section srcza +.section srczb +.section src1a +.section src1b +.section src2a +.section src2b +.section src3a +.section src3b +.section src4a +.section src4b +.section src5a +.section src5b +.section src6a +.section src6b +.section src7a +.section src7b +.section src8a +.section src8b +.section src9a +.section src9b +.section src0a +.section src0b +.section srdaa +.section srdab +.section srdba +.section srdbb +.section srdca +.section srdcb +.section srdda +.section srddb +.section srdea +.section srdeb +.section srdfa +.section srdfb +.section srdga +.section srdgb +.section srdha +.section srdhb +.section srdia +.section srdib +.section srdja +.section srdjb +.section srdka +.section srdkb +.section srdla +.section srdlb +.section srdma +.section srdmb +.section srdna +.section srdnb +.section srdoa +.section srdob +.section srdpa +.section srdpb +.section srdqa +.section srdqb +.section srdra +.section srdrb +.section srdsa +.section srdsb +.section srdta +.section srdtb +.section srdua +.section srdub +.section srdva +.section srdvb +.section srdwa +.section srdwb +.section srdxa +.section srdxb +.section srdya +.section srdyb +.section srdza +.section srdzb +.section srd1a +.section srd1b +.section srd2a +.section srd2b +.section srd3a +.section srd3b +.section srd4a +.section srd4b +.section srd5a +.section srd5b +.section srd6a +.section srd6b +.section srd7a +.section srd7b +.section srd8a +.section srd8b +.section srd9a +.section srd9b +.section srd0a +.section srd0b +.section sreaa +.section sreab +.section sreba +.section srebb +.section sreca +.section srecb +.section sreda +.section sredb +.section sreea +.section sreeb +.section srefa +.section srefb +.section srega +.section sregb +.section sreha +.section srehb +.section sreia +.section sreib +.section sreja +.section srejb +.section sreka +.section srekb +.section srela +.section srelb +.section srema +.section sremb +.section srena +.section srenb +.section sreoa +.section sreob +.section srepa +.section srepb +.section sreqa +.section sreqb +.section srera +.section srerb +.section sresa +.section sresb +.section sreta +.section sretb +.section sreua +.section sreub +.section sreva +.section srevb +.section srewa +.section srewb +.section srexa +.section srexb +.section sreya +.section sreyb +.section sreza +.section srezb +.section sre1a +.section sre1b +.section sre2a +.section sre2b +.section sre3a +.section sre3b +.section sre4a +.section sre4b +.section sre5a +.section sre5b +.section sre6a +.section sre6b +.section sre7a +.section sre7b +.section sre8a +.section sre8b +.section sre9a +.section sre9b +.section sre0a +.section sre0b +.section srfaa +.section srfab +.section srfba +.section srfbb +.section srfca +.section srfcb +.section srfda +.section srfdb +.section srfea +.section srfeb +.section srffa +.section srffb +.section srfga +.section srfgb +.section srfha +.section srfhb +.section srfia +.section srfib +.section srfja +.section srfjb +.section srfka +.section srfkb +.section srfla +.section srflb +.section srfma +.section srfmb +.section srfna +.section srfnb +.section srfoa +.section srfob +.section srfpa +.section srfpb +.section srfqa +.section srfqb +.section srfra +.section srfrb +.section srfsa +.section srfsb +.section srfta +.section srftb +.section srfua +.section srfub +.section srfva +.section srfvb +.section srfwa +.section srfwb +.section srfxa +.section srfxb +.section srfya +.section srfyb +.section srfza +.section srfzb +.section srf1a +.section srf1b +.section srf2a +.section srf2b +.section srf3a +.section srf3b +.section srf4a +.section srf4b +.section srf5a +.section srf5b +.section srf6a +.section srf6b +.section srf7a +.section srf7b +.section srf8a +.section srf8b +.section srf9a +.section srf9b +.section srf0a +.section srf0b +.section srgaa +.section srgab +.section srgba +.section srgbb +.section srgca +.section srgcb +.section srgda +.section srgdb +.section srgea +.section srgeb +.section srgfa +.section srgfb +.section srgga +.section srggb +.section srgha +.section srghb +.section srgia +.section srgib +.section srgja +.section srgjb +.section srgka +.section srgkb +.section srgla +.section srglb +.section srgma +.section srgmb +.section srgna +.section srgnb +.section srgoa +.section srgob +.section srgpa +.section srgpb +.section srgqa +.section srgqb +.section srgra +.section srgrb +.section srgsa +.section srgsb +.section srgta +.section srgtb +.section srgua +.section srgub +.section srgva +.section srgvb +.section srgwa +.section srgwb +.section srgxa +.section srgxb +.section srgya +.section srgyb +.section srgza +.section srgzb +.section srg1a +.section srg1b +.section srg2a +.section srg2b +.section srg3a +.section srg3b +.section srg4a +.section srg4b +.section srg5a +.section srg5b +.section srg6a +.section srg6b +.section srg7a +.section srg7b +.section srg8a +.section srg8b +.section srg9a +.section srg9b +.section srg0a +.section srg0b +.section srhaa +.section srhab +.section srhba +.section srhbb +.section srhca +.section srhcb +.section srhda +.section srhdb +.section srhea +.section srheb +.section srhfa +.section srhfb +.section srhga +.section srhgb +.section srhha +.section srhhb +.section srhia +.section srhib +.section srhja +.section srhjb +.section srhka +.section srhkb +.section srhla +.section srhlb +.section srhma +.section srhmb +.section srhna +.section srhnb +.section srhoa +.section srhob +.section srhpa +.section srhpb +.section srhqa +.section srhqb +.section srhra +.section srhrb +.section srhsa +.section srhsb +.section srhta +.section srhtb +.section srhua +.section srhub +.section srhva +.section srhvb +.section srhwa +.section srhwb +.section srhxa +.section srhxb +.section srhya +.section srhyb +.section srhza +.section srhzb +.section srh1a +.section srh1b +.section srh2a +.section srh2b +.section srh3a +.section srh3b +.section srh4a +.section srh4b +.section srh5a +.section srh5b +.section srh6a +.section srh6b +.section srh7a +.section srh7b +.section srh8a +.section srh8b +.section srh9a +.section srh9b +.section srh0a +.section srh0b +.section sriaa +.section sriab +.section sriba +.section sribb +.section srica +.section sricb +.section srida +.section sridb +.section sriea +.section srieb +.section srifa +.section srifb +.section sriga +.section srigb +.section sriha +.section srihb +.section sriia +.section sriib +.section srija +.section srijb +.section srika +.section srikb +.section srila +.section srilb +.section srima +.section srimb +.section srina +.section srinb +.section srioa +.section sriob +.section sripa +.section sripb +.section sriqa +.section sriqb +.section srira +.section srirb +.section srisa +.section srisb +.section srita +.section sritb +.section sriua +.section sriub +.section sriva +.section srivb +.section sriwa +.section sriwb +.section srixa +.section srixb +.section sriya +.section sriyb +.section sriza +.section srizb +.section sri1a +.section sri1b +.section sri2a +.section sri2b +.section sri3a +.section sri3b +.section sri4a +.section sri4b +.section sri5a +.section sri5b +.section sri6a +.section sri6b +.section sri7a +.section sri7b +.section sri8a +.section sri8b +.section sri9a +.section sri9b +.section sri0a +.section sri0b +.section srjaa +.section srjab +.section srjba +.section srjbb +.section srjca +.section srjcb +.section srjda +.section srjdb +.section srjea +.section srjeb +.section srjfa +.section srjfb +.section srjga +.section srjgb +.section srjha +.section srjhb +.section srjia +.section srjib +.section srjja +.section srjjb +.section srjka +.section srjkb +.section srjla +.section srjlb +.section srjma +.section srjmb +.section srjna +.section srjnb +.section srjoa +.section srjob +.section srjpa +.section srjpb +.section srjqa +.section srjqb +.section srjra +.section srjrb +.section srjsa +.section srjsb +.section srjta +.section srjtb +.section srjua +.section srjub +.section srjva +.section srjvb +.section srjwa +.section srjwb +.section srjxa +.section srjxb +.section srjya +.section srjyb +.section srjza +.section srjzb +.section srj1a +.section srj1b +.section srj2a +.section srj2b +.section srj3a +.section srj3b +.section srj4a +.section srj4b +.section srj5a +.section srj5b +.section srj6a +.section srj6b +.section srj7a +.section srj7b +.section srj8a +.section srj8b +.section srj9a +.section srj9b +.section srj0a +.section srj0b +.section srkaa +.section srkab +.section srkba +.section srkbb +.section srkca +.section srkcb +.section srkda +.section srkdb +.section srkea +.section srkeb +.section srkfa +.section srkfb +.section srkga +.section srkgb +.section srkha +.section srkhb +.section srkia +.section srkib +.section srkja +.section srkjb +.section srkka +.section srkkb +.section srkla +.section srklb +.section srkma +.section srkmb +.section srkna +.section srknb +.section srkoa +.section srkob +.section srkpa +.section srkpb +.section srkqa +.section srkqb +.section srkra +.section srkrb +.section srksa +.section srksb +.section srkta +.section srktb +.section srkua +.section srkub +.section srkva +.section srkvb +.section srkwa +.section srkwb +.section srkxa +.section srkxb +.section srkya +.section srkyb +.section srkza +.section srkzb +.section srk1a +.section srk1b +.section srk2a +.section srk2b +.section srk3a +.section srk3b +.section srk4a +.section srk4b +.section srk5a +.section srk5b +.section srk6a +.section srk6b +.section srk7a +.section srk7b +.section srk8a +.section srk8b +.section srk9a +.section srk9b +.section srk0a +.section srk0b +.section srlaa +.section srlab +.section srlba +.section srlbb +.section srlca +.section srlcb +.section srlda +.section srldb +.section srlea +.section srleb +.section srlfa +.section srlfb +.section srlga +.section srlgb +.section srlha +.section srlhb +.section srlia +.section srlib +.section srlja +.section srljb +.section srlka +.section srlkb +.section srlla +.section srllb +.section srlma +.section srlmb +.section srlna +.section srlnb +.section srloa +.section srlob +.section srlpa +.section srlpb +.section srlqa +.section srlqb +.section srlra +.section srlrb +.section srlsa +.section srlsb +.section srlta +.section srltb +.section srlua +.section srlub +.section srlva +.section srlvb +.section srlwa +.section srlwb +.section srlxa +.section srlxb +.section srlya +.section srlyb +.section srlza +.section srlzb +.section srl1a +.section srl1b +.section srl2a +.section srl2b +.section srl3a +.section srl3b +.section srl4a +.section srl4b +.section srl5a +.section srl5b +.section srl6a +.section srl6b +.section srl7a +.section srl7b +.section srl8a +.section srl8b +.section srl9a +.section srl9b +.section srl0a +.section srl0b +.section srmaa +.section srmab +.section srmba +.section srmbb +.section srmca +.section srmcb +.section srmda +.section srmdb +.section srmea +.section srmeb +.section srmfa +.section srmfb +.section srmga +.section srmgb +.section srmha +.section srmhb +.section srmia +.section srmib +.section srmja +.section srmjb +.section srmka +.section srmkb +.section srmla +.section srmlb +.section srmma +.section srmmb +.section srmna +.section srmnb +.section srmoa +.section srmob +.section srmpa +.section srmpb +.section srmqa +.section srmqb +.section srmra +.section srmrb +.section srmsa +.section srmsb +.section srmta +.section srmtb +.section srmua +.section srmub +.section srmva +.section srmvb +.section srmwa +.section srmwb +.section srmxa +.section srmxb +.section srmya +.section srmyb +.section srmza +.section srmzb +.section srm1a +.section srm1b +.section srm2a +.section srm2b +.section srm3a +.section srm3b +.section srm4a +.section srm4b +.section srm5a +.section srm5b +.section srm6a +.section srm6b +.section srm7a +.section srm7b +.section srm8a +.section srm8b +.section srm9a +.section srm9b +.section srm0a +.section srm0b +.section srnaa +.section srnab +.section srnba +.section srnbb +.section srnca +.section srncb +.section srnda +.section srndb +.section srnea +.section srneb +.section srnfa +.section srnfb +.section srnga +.section srngb +.section srnha +.section srnhb +.section srnia +.section srnib +.section srnja +.section srnjb +.section srnka +.section srnkb +.section srnla +.section srnlb +.section srnma +.section srnmb +.section srnna +.section srnnb +.section srnoa +.section srnob +.section srnpa +.section srnpb +.section srnqa +.section srnqb +.section srnra +.section srnrb +.section srnsa +.section srnsb +.section srnta +.section srntb +.section srnua +.section srnub +.section srnva +.section srnvb +.section srnwa +.section srnwb +.section srnxa +.section srnxb +.section srnya +.section srnyb +.section srnza +.section srnzb +.section srn1a +.section srn1b +.section srn2a +.section srn2b +.section srn3a +.section srn3b +.section srn4a +.section srn4b +.section srn5a +.section srn5b +.section srn6a +.section srn6b +.section srn7a +.section srn7b +.section srn8a +.section srn8b +.section srn9a +.section srn9b +.section srn0a +.section srn0b +.section sroaa +.section sroab +.section sroba +.section srobb +.section sroca +.section srocb +.section sroda +.section srodb +.section sroea +.section sroeb +.section srofa +.section srofb +.section sroga +.section srogb +.section sroha +.section srohb +.section sroia +.section sroib +.section sroja +.section srojb +.section sroka +.section srokb +.section srola +.section srolb +.section sroma +.section sromb +.section srona +.section sronb +.section srooa +.section sroob +.section sropa +.section sropb +.section sroqa +.section sroqb +.section srora +.section srorb +.section srosa +.section srosb +.section srota +.section srotb +.section sroua +.section sroub +.section srova +.section srovb +.section srowa +.section srowb +.section sroxa +.section sroxb +.section sroya +.section sroyb +.section sroza +.section srozb +.section sro1a +.section sro1b +.section sro2a +.section sro2b +.section sro3a +.section sro3b +.section sro4a +.section sro4b +.section sro5a +.section sro5b +.section sro6a +.section sro6b +.section sro7a +.section sro7b +.section sro8a +.section sro8b +.section sro9a +.section sro9b +.section sro0a +.section sro0b +.section srpaa +.section srpab +.section srpba +.section srpbb +.section srpca +.section srpcb +.section srpda +.section srpdb +.section srpea +.section srpeb +.section srpfa +.section srpfb +.section srpga +.section srpgb +.section srpha +.section srphb +.section srpia +.section srpib +.section srpja +.section srpjb +.section srpka +.section srpkb +.section srpla +.section srplb +.section srpma +.section srpmb +.section srpna +.section srpnb +.section srpoa +.section srpob +.section srppa +.section srppb +.section srpqa +.section srpqb +.section srpra +.section srprb +.section srpsa +.section srpsb +.section srpta +.section srptb +.section srpua +.section srpub +.section srpva +.section srpvb +.section srpwa +.section srpwb +.section srpxa +.section srpxb +.section srpya +.section srpyb +.section srpza +.section srpzb +.section srp1a +.section srp1b +.section srp2a +.section srp2b +.section srp3a +.section srp3b +.section srp4a +.section srp4b +.section srp5a +.section srp5b +.section srp6a +.section srp6b +.section srp7a +.section srp7b +.section srp8a +.section srp8b +.section srp9a +.section srp9b +.section srp0a +.section srp0b +.section srqaa +.section srqab +.section srqba +.section srqbb +.section srqca +.section srqcb +.section srqda +.section srqdb +.section srqea +.section srqeb +.section srqfa +.section srqfb +.section srqga +.section srqgb +.section srqha +.section srqhb +.section srqia +.section srqib +.section srqja +.section srqjb +.section srqka +.section srqkb +.section srqla +.section srqlb +.section srqma +.section srqmb +.section srqna +.section srqnb +.section srqoa +.section srqob +.section srqpa +.section srqpb +.section srqqa +.section srqqb +.section srqra +.section srqrb +.section srqsa +.section srqsb +.section srqta +.section srqtb +.section srqua +.section srqub +.section srqva +.section srqvb +.section srqwa +.section srqwb +.section srqxa +.section srqxb +.section srqya +.section srqyb +.section srqza +.section srqzb +.section srq1a +.section srq1b +.section srq2a +.section srq2b +.section srq3a +.section srq3b +.section srq4a +.section srq4b +.section srq5a +.section srq5b +.section srq6a +.section srq6b +.section srq7a +.section srq7b +.section srq8a +.section srq8b +.section srq9a +.section srq9b +.section srq0a +.section srq0b +.section srraa +.section srrab +.section srrba +.section srrbb +.section srrca +.section srrcb +.section srrda +.section srrdb +.section srrea +.section srreb +.section srrfa +.section srrfb +.section srrga +.section srrgb +.section srrha +.section srrhb +.section srria +.section srrib +.section srrja +.section srrjb +.section srrka +.section srrkb +.section srrla +.section srrlb +.section srrma +.section srrmb +.section srrna +.section srrnb +.section srroa +.section srrob +.section srrpa +.section srrpb +.section srrqa +.section srrqb +.section srrra +.section srrrb +.section srrsa +.section srrsb +.section srrta +.section srrtb +.section srrua +.section srrub +.section srrva +.section srrvb +.section srrwa +.section srrwb +.section srrxa +.section srrxb +.section srrya +.section srryb +.section srrza +.section srrzb +.section srr1a +.section srr1b +.section srr2a +.section srr2b +.section srr3a +.section srr3b +.section srr4a +.section srr4b +.section srr5a +.section srr5b +.section srr6a +.section srr6b +.section srr7a +.section srr7b +.section srr8a +.section srr8b +.section srr9a +.section srr9b +.section srr0a +.section srr0b +.section srsaa +.section srsab +.section srsba +.section srsbb +.section srsca +.section srscb +.section srsda +.section srsdb +.section srsea +.section srseb +.section srsfa +.section srsfb +.section srsga +.section srsgb +.section srsha +.section srshb +.section srsia +.section srsib +.section srsja +.section srsjb +.section srska +.section srskb +.section srsla +.section srslb +.section srsma +.section srsmb +.section srsna +.section srsnb +.section srsoa +.section srsob +.section srspa +.section srspb +.section srsqa +.section srsqb +.section srsra +.section srsrb +.section srssa +.section srssb +.section srsta +.section srstb +.section srsua +.section srsub +.section srsva +.section srsvb +.section srswa +.section srswb +.section srsxa +.section srsxb +.section srsya +.section srsyb +.section srsza +.section srszb +.section srs1a +.section srs1b +.section srs2a +.section srs2b +.section srs3a +.section srs3b +.section srs4a +.section srs4b +.section srs5a +.section srs5b +.section srs6a +.section srs6b +.section srs7a +.section srs7b +.section srs8a +.section srs8b +.section srs9a +.section srs9b +.section srs0a +.section srs0b +.section srtaa +.section srtab +.section srtba +.section srtbb +.section srtca +.section srtcb +.section srtda +.section srtdb +.section srtea +.section srteb +.section srtfa +.section srtfb +.section srtga +.section srtgb +.section srtha +.section srthb +.section srtia +.section srtib +.section srtja +.section srtjb +.section srtka +.section srtkb +.section srtla +.section srtlb +.section srtma +.section srtmb +.section srtna +.section srtnb +.section srtoa +.section srtob +.section srtpa +.section srtpb +.section srtqa +.section srtqb +.section srtra +.section srtrb +.section srtsa +.section srtsb +.section srtta +.section srttb +.section srtua +.section srtub +.section srtva +.section srtvb +.section srtwa +.section srtwb +.section srtxa +.section srtxb +.section srtya +.section srtyb +.section srtza +.section srtzb +.section srt1a +.section srt1b +.section srt2a +.section srt2b +.section srt3a +.section srt3b +.section srt4a +.section srt4b +.section srt5a +.section srt5b +.section srt6a +.section srt6b +.section srt7a +.section srt7b +.section srt8a +.section srt8b +.section srt9a +.section srt9b +.section srt0a +.section srt0b +.section sruaa +.section sruab +.section sruba +.section srubb +.section sruca +.section srucb +.section sruda +.section srudb +.section sruea +.section srueb +.section srufa +.section srufb +.section sruga +.section srugb +.section sruha +.section sruhb +.section sruia +.section sruib +.section sruja +.section srujb +.section sruka +.section srukb +.section srula +.section srulb +.section sruma +.section srumb +.section sruna +.section srunb +.section sruoa +.section sruob +.section srupa +.section srupb +.section sruqa +.section sruqb +.section srura +.section srurb +.section srusa +.section srusb +.section sruta +.section srutb +.section sruua +.section sruub +.section sruva +.section sruvb +.section sruwa +.section sruwb +.section sruxa +.section sruxb +.section sruya +.section sruyb +.section sruza +.section sruzb +.section sru1a +.section sru1b +.section sru2a +.section sru2b +.section sru3a +.section sru3b +.section sru4a +.section sru4b +.section sru5a +.section sru5b +.section sru6a +.section sru6b +.section sru7a +.section sru7b +.section sru8a +.section sru8b +.section sru9a +.section sru9b +.section sru0a +.section sru0b +.section srvaa +.section srvab +.section srvba +.section srvbb +.section srvca +.section srvcb +.section srvda +.section srvdb +.section srvea +.section srveb +.section srvfa +.section srvfb +.section srvga +.section srvgb +.section srvha +.section srvhb +.section srvia +.section srvib +.section srvja +.section srvjb +.section srvka +.section srvkb +.section srvla +.section srvlb +.section srvma +.section srvmb +.section srvna +.section srvnb +.section srvoa +.section srvob +.section srvpa +.section srvpb +.section srvqa +.section srvqb +.section srvra +.section srvrb +.section srvsa +.section srvsb +.section srvta +.section srvtb +.section srvua +.section srvub +.section srvva +.section srvvb +.section srvwa +.section srvwb +.section srvxa +.section srvxb +.section srvya +.section srvyb +.section srvza +.section srvzb +.section srv1a +.section srv1b +.section srv2a +.section srv2b +.section srv3a +.section srv3b +.section srv4a +.section srv4b +.section srv5a +.section srv5b +.section srv6a +.section srv6b +.section srv7a +.section srv7b +.section srv8a +.section srv8b +.section srv9a +.section srv9b +.section srv0a +.section srv0b +.section srwaa +.section srwab +.section srwba +.section srwbb +.section srwca +.section srwcb +.section srwda +.section srwdb +.section srwea +.section srweb +.section srwfa +.section srwfb +.section srwga +.section srwgb +.section srwha +.section srwhb +.section srwia +.section srwib +.section srwja +.section srwjb +.section srwka +.section srwkb +.section srwla +.section srwlb +.section srwma +.section srwmb +.section srwna +.section srwnb +.section srwoa +.section srwob +.section srwpa +.section srwpb +.section srwqa +.section srwqb +.section srwra +.section srwrb +.section srwsa +.section srwsb +.section srwta +.section srwtb +.section srwua +.section srwub +.section srwva +.section srwvb +.section srwwa +.section srwwb +.section srwxa +.section srwxb +.section srwya +.section srwyb +.section srwza +.section srwzb +.section srw1a +.section srw1b +.section srw2a +.section srw2b +.section srw3a +.section srw3b +.section srw4a +.section srw4b +.section srw5a +.section srw5b +.section srw6a +.section srw6b +.section srw7a +.section srw7b +.section srw8a +.section srw8b +.section srw9a +.section srw9b +.section srw0a +.section srw0b +.section srxaa +.section srxab +.section srxba +.section srxbb +.section srxca +.section srxcb +.section srxda +.section srxdb +.section srxea +.section srxeb +.section srxfa +.section srxfb +.section srxga +.section srxgb +.section srxha +.section srxhb +.section srxia +.section srxib +.section srxja +.section srxjb +.section srxka +.section srxkb +.section srxla +.section srxlb +.section srxma +.section srxmb +.section srxna +.section srxnb +.section srxoa +.section srxob +.section srxpa +.section srxpb +.section srxqa +.section srxqb +.section srxra +.section srxrb +.section srxsa +.section srxsb +.section srxta +.section srxtb +.section srxua +.section srxub +.section srxva +.section srxvb +.section srxwa +.section srxwb +.section srxxa +.section srxxb +.section srxya +.section srxyb +.section srxza +.section srxzb +.section srx1a +.section srx1b +.section srx2a +.section srx2b +.section srx3a +.section srx3b +.section srx4a +.section srx4b +.section srx5a +.section srx5b +.section srx6a +.section srx6b +.section srx7a +.section srx7b +.section srx8a +.section srx8b +.section srx9a +.section srx9b +.section srx0a +.section srx0b +.section sryaa +.section sryab +.section sryba +.section srybb +.section sryca +.section srycb +.section sryda +.section srydb +.section sryea +.section sryeb +.section sryfa +.section sryfb +.section sryga +.section srygb +.section sryha +.section sryhb +.section sryia +.section sryib +.section sryja +.section sryjb +.section sryka +.section srykb +.section sryla +.section srylb +.section sryma +.section srymb +.section sryna +.section srynb +.section sryoa +.section sryob +.section srypa +.section srypb +.section sryqa +.section sryqb +.section sryra +.section sryrb +.section srysa +.section srysb +.section sryta +.section srytb +.section sryua +.section sryub +.section sryva +.section sryvb +.section srywa +.section srywb +.section sryxa +.section sryxb +.section sryya +.section sryyb +.section sryza +.section sryzb +.section sry1a +.section sry1b +.section sry2a +.section sry2b +.section sry3a +.section sry3b +.section sry4a +.section sry4b +.section sry5a +.section sry5b +.section sry6a +.section sry6b +.section sry7a +.section sry7b +.section sry8a +.section sry8b +.section sry9a +.section sry9b +.section sry0a +.section sry0b +.section srzaa +.section srzab +.section srzba +.section srzbb +.section srzca +.section srzcb +.section srzda +.section srzdb +.section srzea +.section srzeb +.section srzfa +.section srzfb +.section srzga +.section srzgb +.section srzha +.section srzhb +.section srzia +.section srzib +.section srzja +.section srzjb +.section srzka +.section srzkb +.section srzla +.section srzlb +.section srzma +.section srzmb +.section srzna +.section srznb +.section srzoa +.section srzob +.section srzpa +.section srzpb +.section srzqa +.section srzqb +.section srzra +.section srzrb +.section srzsa +.section srzsb +.section srzta +.section srztb +.section srzua +.section srzub +.section srzva +.section srzvb +.section srzwa +.section srzwb +.section srzxa +.section srzxb +.section srzya +.section srzyb +.section srzza +.section srzzb +.section srz1a +.section srz1b +.section srz2a +.section srz2b +.section srz3a +.section srz3b +.section srz4a +.section srz4b +.section srz5a +.section srz5b +.section srz6a +.section srz6b +.section srz7a +.section srz7b +.section srz8a +.section srz8b +.section srz9a +.section srz9b +.section srz0a +.section srz0b +.section sr1aa +.section sr1ab +.section sr1ba +.section sr1bb +.section sr1ca +.section sr1cb +.section sr1da +.section sr1db +.section sr1ea +.section sr1eb +.section sr1fa +.section sr1fb +.section sr1ga +.section sr1gb +.section sr1ha +.section sr1hb +.section sr1ia +.section sr1ib +.section sr1ja +.section sr1jb +.section sr1ka +.section sr1kb +.section sr1la +.section sr1lb +.section sr1ma +.section sr1mb +.section sr1na +.section sr1nb +.section sr1oa +.section sr1ob +.section sr1pa +.section sr1pb +.section sr1qa +.section sr1qb +.section sr1ra +.section sr1rb +.section sr1sa +.section sr1sb +.section sr1ta +.section sr1tb +.section sr1ua +.section sr1ub +.section sr1va +.section sr1vb +.section sr1wa +.section sr1wb +.section sr1xa +.section sr1xb +.section sr1ya +.section sr1yb +.section sr1za +.section sr1zb +.section sr11a +.section sr11b +.section sr12a +.section sr12b +.section sr13a +.section sr13b +.section sr14a +.section sr14b +.section sr15a +.section sr15b +.section sr16a +.section sr16b +.section sr17a +.section sr17b +.section sr18a +.section sr18b +.section sr19a +.section sr19b +.section sr10a +.section sr10b +.section sr2aa +.section sr2ab +.section sr2ba +.section sr2bb +.section sr2ca +.section sr2cb +.section sr2da +.section sr2db +.section sr2ea +.section sr2eb +.section sr2fa +.section sr2fb +.section sr2ga +.section sr2gb +.section sr2ha +.section sr2hb +.section sr2ia +.section sr2ib +.section sr2ja +.section sr2jb +.section sr2ka +.section sr2kb +.section sr2la +.section sr2lb +.section sr2ma +.section sr2mb +.section sr2na +.section sr2nb +.section sr2oa +.section sr2ob +.section sr2pa +.section sr2pb +.section sr2qa +.section sr2qb +.section sr2ra +.section sr2rb +.section sr2sa +.section sr2sb +.section sr2ta +.section sr2tb +.section sr2ua +.section sr2ub +.section sr2va +.section sr2vb +.section sr2wa +.section sr2wb +.section sr2xa +.section sr2xb +.section sr2ya +.section sr2yb +.section sr2za +.section sr2zb +.section sr21a +.section sr21b +.section sr22a +.section sr22b +.section sr23a +.section sr23b +.section sr24a +.section sr24b +.section sr25a +.section sr25b +.section sr26a +.section sr26b +.section sr27a +.section sr27b +.section sr28a +.section sr28b +.section sr29a +.section sr29b +.section sr20a +.section sr20b +.section sr3aa +.section sr3ab +.section sr3ba +.section sr3bb +.section sr3ca +.section sr3cb +.section sr3da +.section sr3db +.section sr3ea +.section sr3eb +.section sr3fa +.section sr3fb +.section sr3ga +.section sr3gb +.section sr3ha +.section sr3hb +.section sr3ia +.section sr3ib +.section sr3ja +.section sr3jb +.section sr3ka +.section sr3kb +.section sr3la +.section sr3lb +.section sr3ma +.section sr3mb +.section sr3na +.section sr3nb +.section sr3oa +.section sr3ob +.section sr3pa +.section sr3pb +.section sr3qa +.section sr3qb +.section sr3ra +.section sr3rb +.section sr3sa +.section sr3sb +.section sr3ta +.section sr3tb +.section sr3ua +.section sr3ub +.section sr3va +.section sr3vb +.section sr3wa +.section sr3wb +.section sr3xa +.section sr3xb +.section sr3ya +.section sr3yb +.section sr3za +.section sr3zb +.section sr31a +.section sr31b +.section sr32a +.section sr32b +.section sr33a +.section sr33b +.section sr34a +.section sr34b +.section sr35a +.section sr35b +.section sr36a +.section sr36b +.section sr37a +.section sr37b +.section sr38a +.section sr38b +.section sr39a +.section sr39b +.section sr30a +.section sr30b +.section sr4aa +.section sr4ab +.section sr4ba +.section sr4bb +.section sr4ca +.section sr4cb +.section sr4da +.section sr4db +.section sr4ea +.section sr4eb +.section sr4fa +.section sr4fb +.section sr4ga +.section sr4gb +.section sr4ha +.section sr4hb +.section sr4ia +.section sr4ib +.section sr4ja +.section sr4jb +.section sr4ka +.section sr4kb +.section sr4la +.section sr4lb +.section sr4ma +.section sr4mb +.section sr4na +.section sr4nb +.section sr4oa +.section sr4ob +.section sr4pa +.section sr4pb +.section sr4qa +.section sr4qb +.section sr4ra +.section sr4rb +.section sr4sa +.section sr4sb +.section sr4ta +.section sr4tb +.section sr4ua +.section sr4ub +.section sr4va +.section sr4vb +.section sr4wa +.section sr4wb +.section sr4xa +.section sr4xb +.section sr4ya +.section sr4yb +.section sr4za +.section sr4zb +.section sr41a +.section sr41b +.section sr42a +.section sr42b +.section sr43a +.section sr43b +.section sr44a +.section sr44b +.section sr45a +.section sr45b +.section sr46a +.section sr46b +.section sr47a +.section sr47b +.section sr48a +.section sr48b +.section sr49a +.section sr49b +.section sr40a +.section sr40b +.section sr5aa +.section sr5ab +.section sr5ba +.section sr5bb +.section sr5ca +.section sr5cb +.section sr5da +.section sr5db +.section sr5ea +.section sr5eb +.section sr5fa +.section sr5fb +.section sr5ga +.section sr5gb +.section sr5ha +.section sr5hb +.section sr5ia +.section sr5ib +.section sr5ja +.section sr5jb +.section sr5ka +.section sr5kb +.section sr5la +.section sr5lb +.section sr5ma +.section sr5mb +.section sr5na +.section sr5nb +.section sr5oa +.section sr5ob +.section sr5pa +.section sr5pb +.section sr5qa +.section sr5qb +.section sr5ra +.section sr5rb +.section sr5sa +.section sr5sb +.section sr5ta +.section sr5tb +.section sr5ua +.section sr5ub +.section sr5va +.section sr5vb +.section sr5wa +.section sr5wb +.section sr5xa +.section sr5xb +.section sr5ya +.section sr5yb +.section sr5za +.section sr5zb +.section sr51a +.section sr51b +.section sr52a +.section sr52b +.section sr53a +.section sr53b +.section sr54a +.section sr54b +.section sr55a +.section sr55b +.section sr56a +.section sr56b +.section sr57a +.section sr57b +.section sr58a +.section sr58b +.section sr59a +.section sr59b +.section sr50a +.section sr50b +.section sr6aa +.section sr6ab +.section sr6ba +.section sr6bb +.section sr6ca +.section sr6cb +.section sr6da +.section sr6db +.section sr6ea +.section sr6eb +.section sr6fa +.section sr6fb +.section sr6ga +.section sr6gb +.section sr6ha +.section sr6hb +.section sr6ia +.section sr6ib +.section sr6ja +.section sr6jb +.section sr6ka +.section sr6kb +.section sr6la +.section sr6lb +.section sr6ma +.section sr6mb +.section sr6na +.section sr6nb +.section sr6oa +.section sr6ob +.section sr6pa +.section sr6pb +.section sr6qa +.section sr6qb +.section sr6ra +.section sr6rb +.section sr6sa +.section sr6sb +.section sr6ta +.section sr6tb +.section sr6ua +.section sr6ub +.section sr6va +.section sr6vb +.section sr6wa +.section sr6wb +.section sr6xa +.section sr6xb +.section sr6ya +.section sr6yb +.section sr6za +.section sr6zb +.section sr61a +.section sr61b +.section sr62a +.section sr62b +.section sr63a +.section sr63b +.section sr64a +.section sr64b +.section sr65a +.section sr65b +.section sr66a +.section sr66b +.section sr67a +.section sr67b +.section sr68a +.section sr68b +.section sr69a +.section sr69b +.section sr60a +.section sr60b +.section sr7aa +.section sr7ab +.section sr7ba +.section sr7bb +.section sr7ca +.section sr7cb +.section sr7da +.section sr7db +.section sr7ea +.section sr7eb +.section sr7fa +.section sr7fb +.section sr7ga +.section sr7gb +.section sr7ha +.section sr7hb +.section sr7ia +.section sr7ib +.section sr7ja +.section sr7jb +.section sr7ka +.section sr7kb +.section sr7la +.section sr7lb +.section sr7ma +.section sr7mb +.section sr7na +.section sr7nb +.section sr7oa +.section sr7ob +.section sr7pa +.section sr7pb +.section sr7qa +.section sr7qb +.section sr7ra +.section sr7rb +.section sr7sa +.section sr7sb +.section sr7ta +.section sr7tb +.section sr7ua +.section sr7ub +.section sr7va +.section sr7vb +.section sr7wa +.section sr7wb +.section sr7xa +.section sr7xb +.section sr7ya +.section sr7yb +.section sr7za +.section sr7zb +.section sr71a +.section sr71b +.section sr72a +.section sr72b +.section sr73a +.section sr73b +.section sr74a +.section sr74b +.section sr75a +.section sr75b +.section sr76a +.section sr76b +.section sr77a +.section sr77b +.section sr78a +.section sr78b +.section sr79a +.section sr79b +.section sr70a +.section sr70b +.section sr8aa +.section sr8ab +.section sr8ba +.section sr8bb +.section sr8ca +.section sr8cb +.section sr8da +.section sr8db +.section sr8ea +.section sr8eb +.section sr8fa +.section sr8fb +.section sr8ga +.section sr8gb +.section sr8ha +.section sr8hb +.section sr8ia +.section sr8ib +.section sr8ja +.section sr8jb +.section sr8ka +.section sr8kb +.section sr8la +.section sr8lb +.section sr8ma +.section sr8mb +.section sr8na +.section sr8nb +.section sr8oa +.section sr8ob +.section sr8pa +.section sr8pb +.section sr8qa +.section sr8qb +.section sr8ra +.section sr8rb +.section sr8sa +.section sr8sb +.section sr8ta +.section sr8tb +.section sr8ua +.section sr8ub +.section sr8va +.section sr8vb +.section sr8wa +.section sr8wb +.section sr8xa +.section sr8xb +.section sr8ya +.section sr8yb +.section sr8za +.section sr8zb +.section sr81a +.section sr81b +.section sr82a +.section sr82b +.section sr83a +.section sr83b +.section sr84a +.section sr84b +.section sr85a +.section sr85b +.section sr86a +.section sr86b +.section sr87a +.section sr87b +.section sr88a +.section sr88b +.section sr89a +.section sr89b +.section sr80a +.section sr80b +.section sr9aa +.section sr9ab +.section sr9ba +.section sr9bb +.section sr9ca +.section sr9cb +.section sr9da +.section sr9db +.section sr9ea +.section sr9eb +.section sr9fa +.section sr9fb +.section sr9ga +.section sr9gb +.section sr9ha +.section sr9hb +.section sr9ia +.section sr9ib +.section sr9ja +.section sr9jb +.section sr9ka +.section sr9kb +.section sr9la +.section sr9lb +.section sr9ma +.section sr9mb +.section sr9na +.section sr9nb +.section sr9oa +.section sr9ob +.section sr9pa +.section sr9pb +.section sr9qa +.section sr9qb +.section sr9ra +.section sr9rb +.section sr9sa +.section sr9sb +.section sr9ta +.section sr9tb +.section sr9ua +.section sr9ub +.section sr9va +.section sr9vb +.section sr9wa +.section sr9wb +.section sr9xa +.section sr9xb +.section sr9ya +.section sr9yb +.section sr9za +.section sr9zb +.section sr91a +.section sr91b +.section sr92a +.section sr92b +.section sr93a +.section sr93b +.section sr94a +.section sr94b +.section sr95a +.section sr95b +.section sr96a +.section sr96b +.section sr97a +.section sr97b +.section sr98a +.section sr98b +.section sr99a +.section sr99b +.section sr90a +.section sr90b +.section sr0aa +.section sr0ab +.section sr0ba +.section sr0bb +.section sr0ca +.section sr0cb +.section sr0da +.section sr0db +.section sr0ea +.section sr0eb +.section sr0fa +.section sr0fb +.section sr0ga +.section sr0gb +.section sr0ha +.section sr0hb +.section sr0ia +.section sr0ib +.section sr0ja +.section sr0jb +.section sr0ka +.section sr0kb +.section sr0la +.section sr0lb +.section sr0ma +.section sr0mb +.section sr0na +.section sr0nb +.section sr0oa +.section sr0ob +.section sr0pa +.section sr0pb +.section sr0qa +.section sr0qb +.section sr0ra +.section sr0rb +.section sr0sa +.section sr0sb +.section sr0ta +.section sr0tb +.section sr0ua +.section sr0ub +.section sr0va +.section sr0vb +.section sr0wa +.section sr0wb +.section sr0xa +.section sr0xb +.section sr0ya +.section sr0yb +.section sr0za +.section sr0zb +.section sr01a +.section sr01b +.section sr02a +.section sr02b +.section sr03a +.section sr03b +.section sr04a +.section sr04b +.section sr05a +.section sr05b +.section sr06a +.section sr06b +.section sr07a +.section sr07b +.section sr08a +.section sr08b +.section sr09a +.section sr09b +.section sr00a +.section sr00b +.section ssaaa +.section ssaab +.section ssaba +.section ssabb +.section ssaca +.section ssacb +.section ssada +.section ssadb +.section ssaea +.section ssaeb +.section ssafa +.section ssafb +.section ssaga +.section ssagb +.section ssaha +.section ssahb +.section ssaia +.section ssaib +.section ssaja +.section ssajb +.section ssaka +.section ssakb +.section ssala +.section ssalb +.section ssama +.section ssamb +.section ssana +.section ssanb +.section ssaoa +.section ssaob +.section ssapa +.section ssapb +.section ssaqa +.section ssaqb +.section ssara +.section ssarb +.section ssasa +.section ssasb +.section ssata +.section ssatb +.section ssaua +.section ssaub +.section ssava +.section ssavb +.section ssawa +.section ssawb +.section ssaxa +.section ssaxb +.section ssaya +.section ssayb +.section ssaza +.section ssazb +.section ssa1a +.section ssa1b +.section ssa2a +.section ssa2b +.section ssa3a +.section ssa3b +.section ssa4a +.section ssa4b +.section ssa5a +.section ssa5b +.section ssa6a +.section ssa6b +.section ssa7a +.section ssa7b +.section ssa8a +.section ssa8b +.section ssa9a +.section ssa9b +.section ssa0a +.section ssa0b +.section ssbaa +.section ssbab +.section ssbba +.section ssbbb +.section ssbca +.section ssbcb +.section ssbda +.section ssbdb +.section ssbea +.section ssbeb +.section ssbfa +.section ssbfb +.section ssbga +.section ssbgb +.section ssbha +.section ssbhb +.section ssbia +.section ssbib +.section ssbja +.section ssbjb +.section ssbka +.section ssbkb +.section ssbla +.section ssblb +.section ssbma +.section ssbmb +.section ssbna +.section ssbnb +.section ssboa +.section ssbob +.section ssbpa +.section ssbpb +.section ssbqa +.section ssbqb +.section ssbra +.section ssbrb +.section ssbsa +.section ssbsb +.section ssbta +.section ssbtb +.section ssbua +.section ssbub +.section ssbva +.section ssbvb +.section ssbwa +.section ssbwb +.section ssbxa +.section ssbxb +.section ssbya +.section ssbyb +.section ssbza +.section ssbzb +.section ssb1a +.section ssb1b +.section ssb2a +.section ssb2b +.section ssb3a +.section ssb3b +.section ssb4a +.section ssb4b +.section ssb5a +.section ssb5b +.section ssb6a +.section ssb6b +.section ssb7a +.section ssb7b +.section ssb8a +.section ssb8b +.section ssb9a +.section ssb9b +.section ssb0a +.section ssb0b +.section sscaa +.section sscab +.section sscba +.section sscbb +.section sscca +.section ssccb +.section sscda +.section sscdb +.section sscea +.section ssceb +.section sscfa +.section sscfb +.section sscga +.section sscgb +.section sscha +.section sschb +.section sscia +.section sscib +.section sscja +.section sscjb +.section sscka +.section ssckb +.section sscla +.section ssclb +.section sscma +.section sscmb +.section sscna +.section sscnb +.section sscoa +.section sscob +.section sscpa +.section sscpb +.section sscqa +.section sscqb +.section sscra +.section sscrb +.section sscsa +.section sscsb +.section sscta +.section ssctb +.section sscua +.section sscub +.section sscva +.section sscvb +.section sscwa +.section sscwb +.section sscxa +.section sscxb +.section sscya +.section sscyb +.section sscza +.section ssczb +.section ssc1a +.section ssc1b +.section ssc2a +.section ssc2b +.section ssc3a +.section ssc3b +.section ssc4a +.section ssc4b +.section ssc5a +.section ssc5b +.section ssc6a +.section ssc6b +.section ssc7a +.section ssc7b +.section ssc8a +.section ssc8b +.section ssc9a +.section ssc9b +.section ssc0a +.section ssc0b +.section ssdaa +.section ssdab +.section ssdba +.section ssdbb +.section ssdca +.section ssdcb +.section ssdda +.section ssddb +.section ssdea +.section ssdeb +.section ssdfa +.section ssdfb +.section ssdga +.section ssdgb +.section ssdha +.section ssdhb +.section ssdia +.section ssdib +.section ssdja +.section ssdjb +.section ssdka +.section ssdkb +.section ssdla +.section ssdlb +.section ssdma +.section ssdmb +.section ssdna +.section ssdnb +.section ssdoa +.section ssdob +.section ssdpa +.section ssdpb +.section ssdqa +.section ssdqb +.section ssdra +.section ssdrb +.section ssdsa +.section ssdsb +.section ssdta +.section ssdtb +.section ssdua +.section ssdub +.section ssdva +.section ssdvb +.section ssdwa +.section ssdwb +.section ssdxa +.section ssdxb +.section ssdya +.section ssdyb +.section ssdza +.section ssdzb +.section ssd1a +.section ssd1b +.section ssd2a +.section ssd2b +.section ssd3a +.section ssd3b +.section ssd4a +.section ssd4b +.section ssd5a +.section ssd5b +.section ssd6a +.section ssd6b +.section ssd7a +.section ssd7b +.section ssd8a +.section ssd8b +.section ssd9a +.section ssd9b +.section ssd0a +.section ssd0b +.section sseaa +.section sseab +.section sseba +.section ssebb +.section sseca +.section ssecb +.section sseda +.section ssedb +.section sseea +.section sseeb +.section ssefa +.section ssefb +.section ssega +.section ssegb +.section sseha +.section ssehb +.section sseia +.section sseib +.section sseja +.section ssejb +.section sseka +.section ssekb +.section ssela +.section sselb +.section ssema +.section ssemb +.section ssena +.section ssenb +.section sseoa +.section sseob +.section ssepa +.section ssepb +.section sseqa +.section sseqb +.section ssera +.section sserb +.section ssesa +.section ssesb +.section sseta +.section ssetb +.section sseua +.section sseub +.section sseva +.section ssevb +.section ssewa +.section ssewb +.section ssexa +.section ssexb +.section sseya +.section sseyb +.section sseza +.section ssezb +.section sse1a +.section sse1b +.section sse2a +.section sse2b +.section sse3a +.section sse3b +.section sse4a +.section sse4b +.section sse5a +.section sse5b +.section sse6a +.section sse6b +.section sse7a +.section sse7b +.section sse8a +.section sse8b +.section sse9a +.section sse9b +.section sse0a +.section sse0b +.section ssfaa +.section ssfab +.section ssfba +.section ssfbb +.section ssfca +.section ssfcb +.section ssfda +.section ssfdb +.section ssfea +.section ssfeb +.section ssffa +.section ssffb +.section ssfga +.section ssfgb +.section ssfha +.section ssfhb +.section ssfia +.section ssfib +.section ssfja +.section ssfjb +.section ssfka +.section ssfkb +.section ssfla +.section ssflb +.section ssfma +.section ssfmb +.section ssfna +.section ssfnb +.section ssfoa +.section ssfob +.section ssfpa +.section ssfpb +.section ssfqa +.section ssfqb +.section ssfra +.section ssfrb +.section ssfsa +.section ssfsb +.section ssfta +.section ssftb +.section ssfua +.section ssfub +.section ssfva +.section ssfvb +.section ssfwa +.section ssfwb +.section ssfxa +.section ssfxb +.section ssfya +.section ssfyb +.section ssfza +.section ssfzb +.section ssf1a +.section ssf1b +.section ssf2a +.section ssf2b +.section ssf3a +.section ssf3b +.section ssf4a +.section ssf4b +.section ssf5a +.section ssf5b +.section ssf6a +.section ssf6b +.section ssf7a +.section ssf7b +.section ssf8a +.section ssf8b +.section ssf9a +.section ssf9b +.section ssf0a +.section ssf0b +.section ssgaa +.section ssgab +.section ssgba +.section ssgbb +.section ssgca +.section ssgcb +.section ssgda +.section ssgdb +.section ssgea +.section ssgeb +.section ssgfa +.section ssgfb +.section ssgga +.section ssggb +.section ssgha +.section ssghb +.section ssgia +.section ssgib +.section ssgja +.section ssgjb +.section ssgka +.section ssgkb +.section ssgla +.section ssglb +.section ssgma +.section ssgmb +.section ssgna +.section ssgnb +.section ssgoa +.section ssgob +.section ssgpa +.section ssgpb +.section ssgqa +.section ssgqb +.section ssgra +.section ssgrb +.section ssgsa +.section ssgsb +.section ssgta +.section ssgtb +.section ssgua +.section ssgub +.section ssgva +.section ssgvb +.section ssgwa +.section ssgwb +.section ssgxa +.section ssgxb +.section ssgya +.section ssgyb +.section ssgza +.section ssgzb +.section ssg1a +.section ssg1b +.section ssg2a +.section ssg2b +.section ssg3a +.section ssg3b +.section ssg4a +.section ssg4b +.section ssg5a +.section ssg5b +.section ssg6a +.section ssg6b +.section ssg7a +.section ssg7b +.section ssg8a +.section ssg8b +.section ssg9a +.section ssg9b +.section ssg0a +.section ssg0b +.section sshaa +.section sshab +.section sshba +.section sshbb +.section sshca +.section sshcb +.section sshda +.section sshdb +.section sshea +.section ssheb +.section sshfa +.section sshfb +.section sshga +.section sshgb +.section sshha +.section sshhb +.section sshia +.section sshib +.section sshja +.section sshjb +.section sshka +.section sshkb +.section sshla +.section sshlb +.section sshma +.section sshmb +.section sshna +.section sshnb +.section sshoa +.section sshob +.section sshpa +.section sshpb +.section sshqa +.section sshqb +.section sshra +.section sshrb +.section sshsa +.section sshsb +.section sshta +.section sshtb +.section sshua +.section sshub +.section sshva +.section sshvb +.section sshwa +.section sshwb +.section sshxa +.section sshxb +.section sshya +.section sshyb +.section sshza +.section sshzb +.section ssh1a +.section ssh1b +.section ssh2a +.section ssh2b +.section ssh3a +.section ssh3b +.section ssh4a +.section ssh4b +.section ssh5a +.section ssh5b +.section ssh6a +.section ssh6b +.section ssh7a +.section ssh7b +.section ssh8a +.section ssh8b +.section ssh9a +.section ssh9b +.section ssh0a +.section ssh0b +.section ssiaa +.section ssiab +.section ssiba +.section ssibb +.section ssica +.section ssicb +.section ssida +.section ssidb +.section ssiea +.section ssieb +.section ssifa +.section ssifb +.section ssiga +.section ssigb +.section ssiha +.section ssihb +.section ssiia +.section ssiib +.section ssija +.section ssijb +.section ssika +.section ssikb +.section ssila +.section ssilb +.section ssima +.section ssimb +.section ssina +.section ssinb +.section ssioa +.section ssiob +.section ssipa +.section ssipb +.section ssiqa +.section ssiqb +.section ssira +.section ssirb +.section ssisa +.section ssisb +.section ssita +.section ssitb +.section ssiua +.section ssiub +.section ssiva +.section ssivb +.section ssiwa +.section ssiwb +.section ssixa +.section ssixb +.section ssiya +.section ssiyb +.section ssiza +.section ssizb +.section ssi1a +.section ssi1b +.section ssi2a +.section ssi2b +.section ssi3a +.section ssi3b +.section ssi4a +.section ssi4b +.section ssi5a +.section ssi5b +.section ssi6a +.section ssi6b +.section ssi7a +.section ssi7b +.section ssi8a +.section ssi8b +.section ssi9a +.section ssi9b +.section ssi0a +.section ssi0b +.section ssjaa +.section ssjab +.section ssjba +.section ssjbb +.section ssjca +.section ssjcb +.section ssjda +.section ssjdb +.section ssjea +.section ssjeb +.section ssjfa +.section ssjfb +.section ssjga +.section ssjgb +.section ssjha +.section ssjhb +.section ssjia +.section ssjib +.section ssjja +.section ssjjb +.section ssjka +.section ssjkb +.section ssjla +.section ssjlb +.section ssjma +.section ssjmb +.section ssjna +.section ssjnb +.section ssjoa +.section ssjob +.section ssjpa +.section ssjpb +.section ssjqa +.section ssjqb +.section ssjra +.section ssjrb +.section ssjsa +.section ssjsb +.section ssjta +.section ssjtb +.section ssjua +.section ssjub +.section ssjva +.section ssjvb +.section ssjwa +.section ssjwb +.section ssjxa +.section ssjxb +.section ssjya +.section ssjyb +.section ssjza +.section ssjzb +.section ssj1a +.section ssj1b +.section ssj2a +.section ssj2b +.section ssj3a +.section ssj3b +.section ssj4a +.section ssj4b +.section ssj5a +.section ssj5b +.section ssj6a +.section ssj6b +.section ssj7a +.section ssj7b +.section ssj8a +.section ssj8b +.section ssj9a +.section ssj9b +.section ssj0a +.section ssj0b +.section sskaa +.section sskab +.section sskba +.section sskbb +.section sskca +.section sskcb +.section sskda +.section sskdb +.section sskea +.section sskeb +.section sskfa +.section sskfb +.section sskga +.section sskgb +.section sskha +.section sskhb +.section sskia +.section sskib +.section sskja +.section sskjb +.section sskka +.section sskkb +.section sskla +.section ssklb +.section sskma +.section sskmb +.section sskna +.section ssknb +.section sskoa +.section sskob +.section sskpa +.section sskpb +.section sskqa +.section sskqb +.section sskra +.section sskrb +.section ssksa +.section ssksb +.section sskta +.section ssktb +.section sskua +.section sskub +.section sskva +.section sskvb +.section sskwa +.section sskwb +.section sskxa +.section sskxb +.section sskya +.section sskyb +.section sskza +.section sskzb +.section ssk1a +.section ssk1b +.section ssk2a +.section ssk2b +.section ssk3a +.section ssk3b +.section ssk4a +.section ssk4b +.section ssk5a +.section ssk5b +.section ssk6a +.section ssk6b +.section ssk7a +.section ssk7b +.section ssk8a +.section ssk8b +.section ssk9a +.section ssk9b +.section ssk0a +.section ssk0b +.section sslaa +.section sslab +.section sslba +.section sslbb +.section sslca +.section sslcb +.section sslda +.section ssldb +.section sslea +.section ssleb +.section sslfa +.section sslfb +.section sslga +.section sslgb +.section sslha +.section sslhb +.section sslia +.section sslib +.section sslja +.section ssljb +.section sslka +.section sslkb +.section sslla +.section ssllb +.section sslma +.section sslmb +.section sslna +.section sslnb +.section ssloa +.section sslob +.section sslpa +.section sslpb +.section sslqa +.section sslqb +.section sslra +.section sslrb +.section sslsa +.section sslsb +.section sslta +.section ssltb +.section sslua +.section sslub +.section sslva +.section sslvb +.section sslwa +.section sslwb +.section sslxa +.section sslxb +.section sslya +.section sslyb +.section sslza +.section sslzb +.section ssl1a +.section ssl1b +.section ssl2a +.section ssl2b +.section ssl3a +.section ssl3b +.section ssl4a +.section ssl4b +.section ssl5a +.section ssl5b +.section ssl6a +.section ssl6b +.section ssl7a +.section ssl7b +.section ssl8a +.section ssl8b +.section ssl9a +.section ssl9b +.section ssl0a +.section ssl0b +.section ssmaa +.section ssmab +.section ssmba +.section ssmbb +.section ssmca +.section ssmcb +.section ssmda +.section ssmdb +.section ssmea +.section ssmeb +.section ssmfa +.section ssmfb +.section ssmga +.section ssmgb +.section ssmha +.section ssmhb +.section ssmia +.section ssmib +.section ssmja +.section ssmjb +.section ssmka +.section ssmkb +.section ssmla +.section ssmlb +.section ssmma +.section ssmmb +.section ssmna +.section ssmnb +.section ssmoa +.section ssmob +.section ssmpa +.section ssmpb +.section ssmqa +.section ssmqb +.section ssmra +.section ssmrb +.section ssmsa +.section ssmsb +.section ssmta +.section ssmtb +.section ssmua +.section ssmub +.section ssmva +.section ssmvb +.section ssmwa +.section ssmwb +.section ssmxa +.section ssmxb +.section ssmya +.section ssmyb +.section ssmza +.section ssmzb +.section ssm1a +.section ssm1b +.section ssm2a +.section ssm2b +.section ssm3a +.section ssm3b +.section ssm4a +.section ssm4b +.section ssm5a +.section ssm5b +.section ssm6a +.section ssm6b +.section ssm7a +.section ssm7b +.section ssm8a +.section ssm8b +.section ssm9a +.section ssm9b +.section ssm0a +.section ssm0b +.section ssnaa +.section ssnab +.section ssnba +.section ssnbb +.section ssnca +.section ssncb +.section ssnda +.section ssndb +.section ssnea +.section ssneb +.section ssnfa +.section ssnfb +.section ssnga +.section ssngb +.section ssnha +.section ssnhb +.section ssnia +.section ssnib +.section ssnja +.section ssnjb +.section ssnka +.section ssnkb +.section ssnla +.section ssnlb +.section ssnma +.section ssnmb +.section ssnna +.section ssnnb +.section ssnoa +.section ssnob +.section ssnpa +.section ssnpb +.section ssnqa +.section ssnqb +.section ssnra +.section ssnrb +.section ssnsa +.section ssnsb +.section ssnta +.section ssntb +.section ssnua +.section ssnub +.section ssnva +.section ssnvb +.section ssnwa +.section ssnwb +.section ssnxa +.section ssnxb +.section ssnya +.section ssnyb +.section ssnza +.section ssnzb +.section ssn1a +.section ssn1b +.section ssn2a +.section ssn2b +.section ssn3a +.section ssn3b +.section ssn4a +.section ssn4b +.section ssn5a +.section ssn5b +.section ssn6a +.section ssn6b +.section ssn7a +.section ssn7b +.section ssn8a +.section ssn8b +.section ssn9a +.section ssn9b +.section ssn0a +.section ssn0b +.section ssoaa +.section ssoab +.section ssoba +.section ssobb +.section ssoca +.section ssocb +.section ssoda +.section ssodb +.section ssoea +.section ssoeb +.section ssofa +.section ssofb +.section ssoga +.section ssogb +.section ssoha +.section ssohb +.section ssoia +.section ssoib +.section ssoja +.section ssojb +.section ssoka +.section ssokb +.section ssola +.section ssolb +.section ssoma +.section ssomb +.section ssona +.section ssonb +.section ssooa +.section ssoob +.section ssopa +.section ssopb +.section ssoqa +.section ssoqb +.section ssora +.section ssorb +.section ssosa +.section ssosb +.section ssota +.section ssotb +.section ssoua +.section ssoub +.section ssova +.section ssovb +.section ssowa +.section ssowb +.section ssoxa +.section ssoxb +.section ssoya +.section ssoyb +.section ssoza +.section ssozb +.section sso1a +.section sso1b +.section sso2a +.section sso2b +.section sso3a +.section sso3b +.section sso4a +.section sso4b +.section sso5a +.section sso5b +.section sso6a +.section sso6b +.section sso7a +.section sso7b +.section sso8a +.section sso8b +.section sso9a +.section sso9b +.section sso0a +.section sso0b +.section sspaa +.section sspab +.section sspba +.section sspbb +.section sspca +.section sspcb +.section sspda +.section sspdb +.section sspea +.section sspeb +.section sspfa +.section sspfb +.section sspga +.section sspgb +.section sspha +.section ssphb +.section sspia +.section sspib +.section sspja +.section sspjb +.section sspka +.section sspkb +.section sspla +.section ssplb +.section sspma +.section sspmb +.section sspna +.section sspnb +.section sspoa +.section sspob +.section ssppa +.section ssppb +.section sspqa +.section sspqb +.section sspra +.section ssprb +.section sspsa +.section sspsb +.section sspta +.section ssptb +.section sspua +.section sspub +.section sspva +.section sspvb +.section sspwa +.section sspwb +.section sspxa +.section sspxb +.section sspya +.section sspyb +.section sspza +.section sspzb +.section ssp1a +.section ssp1b +.section ssp2a +.section ssp2b +.section ssp3a +.section ssp3b +.section ssp4a +.section ssp4b +.section ssp5a +.section ssp5b +.section ssp6a +.section ssp6b +.section ssp7a +.section ssp7b +.section ssp8a +.section ssp8b +.section ssp9a +.section ssp9b +.section ssp0a +.section ssp0b +.section ssqaa +.section ssqab +.section ssqba +.section ssqbb +.section ssqca +.section ssqcb +.section ssqda +.section ssqdb +.section ssqea +.section ssqeb +.section ssqfa +.section ssqfb +.section ssqga +.section ssqgb +.section ssqha +.section ssqhb +.section ssqia +.section ssqib +.section ssqja +.section ssqjb +.section ssqka +.section ssqkb +.section ssqla +.section ssqlb +.section ssqma +.section ssqmb +.section ssqna +.section ssqnb +.section ssqoa +.section ssqob +.section ssqpa +.section ssqpb +.section ssqqa +.section ssqqb +.section ssqra +.section ssqrb +.section ssqsa +.section ssqsb +.section ssqta +.section ssqtb +.section ssqua +.section ssqub +.section ssqva +.section ssqvb +.section ssqwa +.section ssqwb +.section ssqxa +.section ssqxb +.section ssqya +.section ssqyb +.section ssqza +.section ssqzb +.section ssq1a +.section ssq1b +.section ssq2a +.section ssq2b +.section ssq3a +.section ssq3b +.section ssq4a +.section ssq4b +.section ssq5a +.section ssq5b +.section ssq6a +.section ssq6b +.section ssq7a +.section ssq7b +.section ssq8a +.section ssq8b +.section ssq9a +.section ssq9b +.section ssq0a +.section ssq0b +.section ssraa +.section ssrab +.section ssrba +.section ssrbb +.section ssrca +.section ssrcb +.section ssrda +.section ssrdb +.section ssrea +.section ssreb +.section ssrfa +.section ssrfb +.section ssrga +.section ssrgb +.section ssrha +.section ssrhb +.section ssria +.section ssrib +.section ssrja +.section ssrjb +.section ssrka +.section ssrkb +.section ssrla +.section ssrlb +.section ssrma +.section ssrmb +.section ssrna +.section ssrnb +.section ssroa +.section ssrob +.section ssrpa +.section ssrpb +.section ssrqa +.section ssrqb +.section ssrra +.section ssrrb +.section ssrsa +.section ssrsb +.section ssrta +.section ssrtb +.section ssrua +.section ssrub +.section ssrva +.section ssrvb +.section ssrwa +.section ssrwb +.section ssrxa +.section ssrxb +.section ssrya +.section ssryb +.section ssrza +.section ssrzb +.section ssr1a +.section ssr1b +.section ssr2a +.section ssr2b +.section ssr3a +.section ssr3b +.section ssr4a +.section ssr4b +.section ssr5a +.section ssr5b +.section ssr6a +.section ssr6b +.section ssr7a +.section ssr7b +.section ssr8a +.section ssr8b +.section ssr9a +.section ssr9b +.section ssr0a +.section ssr0b +.section sssaa +.section sssab +.section sssba +.section sssbb +.section sssca +.section ssscb +.section sssda +.section sssdb +.section sssea +.section ssseb +.section sssfa +.section sssfb +.section sssga +.section sssgb +.section sssha +.section ssshb +.section sssia +.section sssib +.section sssja +.section sssjb +.section ssska +.section ssskb +.section sssla +.section ssslb +.section sssma +.section sssmb +.section sssna +.section sssnb +.section sssoa +.section sssob +.section ssspa +.section ssspb +.section sssqa +.section sssqb +.section sssra +.section sssrb +.section ssssa +.section ssssb +.section sssta +.section ssstb +.section sssua +.section sssub +.section sssva +.section sssvb +.section ssswa +.section ssswb +.section sssxa +.section sssxb +.section sssya +.section sssyb +.section sssza +.section ssszb +.section sss1a +.section sss1b +.section sss2a +.section sss2b +.section sss3a +.section sss3b +.section sss4a +.section sss4b +.section sss5a +.section sss5b +.section sss6a +.section sss6b +.section sss7a +.section sss7b +.section sss8a +.section sss8b +.section sss9a +.section sss9b +.section sss0a +.section sss0b +.section sstaa +.section sstab +.section sstba +.section sstbb +.section sstca +.section sstcb +.section sstda +.section sstdb +.section sstea +.section ssteb +.section sstfa +.section sstfb +.section sstga +.section sstgb +.section sstha +.section ssthb +.section sstia +.section sstib +.section sstja +.section sstjb +.section sstka +.section sstkb +.section sstla +.section sstlb +.section sstma +.section sstmb +.section sstna +.section sstnb +.section sstoa +.section sstob +.section sstpa +.section sstpb +.section sstqa +.section sstqb +.section sstra +.section sstrb +.section sstsa +.section sstsb +.section sstta +.section ssttb +.section sstua +.section sstub +.section sstva +.section sstvb +.section sstwa +.section sstwb +.section sstxa +.section sstxb +.section sstya +.section sstyb +.section sstza +.section sstzb +.section sst1a +.section sst1b +.section sst2a +.section sst2b +.section sst3a +.section sst3b +.section sst4a +.section sst4b +.section sst5a +.section sst5b +.section sst6a +.section sst6b +.section sst7a +.section sst7b +.section sst8a +.section sst8b +.section sst9a +.section sst9b +.section sst0a +.section sst0b +.section ssuaa +.section ssuab +.section ssuba +.section ssubb +.section ssuca +.section ssucb +.section ssuda +.section ssudb +.section ssuea +.section ssueb +.section ssufa +.section ssufb +.section ssuga +.section ssugb +.section ssuha +.section ssuhb +.section ssuia +.section ssuib +.section ssuja +.section ssujb +.section ssuka +.section ssukb +.section ssula +.section ssulb +.section ssuma +.section ssumb +.section ssuna +.section ssunb +.section ssuoa +.section ssuob +.section ssupa +.section ssupb +.section ssuqa +.section ssuqb +.section ssura +.section ssurb +.section ssusa +.section ssusb +.section ssuta +.section ssutb +.section ssuua +.section ssuub +.section ssuva +.section ssuvb +.section ssuwa +.section ssuwb +.section ssuxa +.section ssuxb +.section ssuya +.section ssuyb +.section ssuza +.section ssuzb +.section ssu1a +.section ssu1b +.section ssu2a +.section ssu2b +.section ssu3a +.section ssu3b +.section ssu4a +.section ssu4b +.section ssu5a +.section ssu5b +.section ssu6a +.section ssu6b +.section ssu7a +.section ssu7b +.section ssu8a +.section ssu8b +.section ssu9a +.section ssu9b +.section ssu0a +.section ssu0b +.section ssvaa +.section ssvab +.section ssvba +.section ssvbb +.section ssvca +.section ssvcb +.section ssvda +.section ssvdb +.section ssvea +.section ssveb +.section ssvfa +.section ssvfb +.section ssvga +.section ssvgb +.section ssvha +.section ssvhb +.section ssvia +.section ssvib +.section ssvja +.section ssvjb +.section ssvka +.section ssvkb +.section ssvla +.section ssvlb +.section ssvma +.section ssvmb +.section ssvna +.section ssvnb +.section ssvoa +.section ssvob +.section ssvpa +.section ssvpb +.section ssvqa +.section ssvqb +.section ssvra +.section ssvrb +.section ssvsa +.section ssvsb +.section ssvta +.section ssvtb +.section ssvua +.section ssvub +.section ssvva +.section ssvvb +.section ssvwa +.section ssvwb +.section ssvxa +.section ssvxb +.section ssvya +.section ssvyb +.section ssvza +.section ssvzb +.section ssv1a +.section ssv1b +.section ssv2a +.section ssv2b +.section ssv3a +.section ssv3b +.section ssv4a +.section ssv4b +.section ssv5a +.section ssv5b +.section ssv6a +.section ssv6b +.section ssv7a +.section ssv7b +.section ssv8a +.section ssv8b +.section ssv9a +.section ssv9b +.section ssv0a +.section ssv0b +.section sswaa +.section sswab +.section sswba +.section sswbb +.section sswca +.section sswcb +.section sswda +.section sswdb +.section sswea +.section ssweb +.section sswfa +.section sswfb +.section sswga +.section sswgb +.section sswha +.section sswhb +.section sswia +.section sswib +.section sswja +.section sswjb +.section sswka +.section sswkb +.section sswla +.section sswlb +.section sswma +.section sswmb +.section sswna +.section sswnb +.section sswoa +.section sswob +.section sswpa +.section sswpb +.section sswqa +.section sswqb +.section sswra +.section sswrb +.section sswsa +.section sswsb +.section sswta +.section sswtb +.section sswua +.section sswub +.section sswva +.section sswvb +.section sswwa +.section sswwb +.section sswxa +.section sswxb +.section sswya +.section sswyb +.section sswza +.section sswzb +.section ssw1a +.section ssw1b +.section ssw2a +.section ssw2b +.section ssw3a +.section ssw3b +.section ssw4a +.section ssw4b +.section ssw5a +.section ssw5b +.section ssw6a +.section ssw6b +.section ssw7a +.section ssw7b +.section ssw8a +.section ssw8b +.section ssw9a +.section ssw9b +.section ssw0a +.section ssw0b +.section ssxaa +.section ssxab +.section ssxba +.section ssxbb +.section ssxca +.section ssxcb +.section ssxda +.section ssxdb +.section ssxea +.section ssxeb +.section ssxfa +.section ssxfb +.section ssxga +.section ssxgb +.section ssxha +.section ssxhb +.section ssxia +.section ssxib +.section ssxja +.section ssxjb +.section ssxka +.section ssxkb +.section ssxla +.section ssxlb +.section ssxma +.section ssxmb +.section ssxna +.section ssxnb +.section ssxoa +.section ssxob +.section ssxpa +.section ssxpb +.section ssxqa +.section ssxqb +.section ssxra +.section ssxrb +.section ssxsa +.section ssxsb +.section ssxta +.section ssxtb +.section ssxua +.section ssxub +.section ssxva +.section ssxvb +.section ssxwa +.section ssxwb +.section ssxxa +.section ssxxb +.section ssxya +.section ssxyb +.section ssxza +.section ssxzb +.section ssx1a +.section ssx1b +.section ssx2a +.section ssx2b +.section ssx3a +.section ssx3b +.section ssx4a +.section ssx4b +.section ssx5a +.section ssx5b +.section ssx6a +.section ssx6b +.section ssx7a +.section ssx7b +.section ssx8a +.section ssx8b +.section ssx9a +.section ssx9b +.section ssx0a +.section ssx0b +.section ssyaa +.section ssyab +.section ssyba +.section ssybb +.section ssyca +.section ssycb +.section ssyda +.section ssydb +.section ssyea +.section ssyeb +.section ssyfa +.section ssyfb +.section ssyga +.section ssygb +.section ssyha +.section ssyhb +.section ssyia +.section ssyib +.section ssyja +.section ssyjb +.section ssyka +.section ssykb +.section ssyla +.section ssylb +.section ssyma +.section ssymb +.section ssyna +.section ssynb +.section ssyoa +.section ssyob +.section ssypa +.section ssypb +.section ssyqa +.section ssyqb +.section ssyra +.section ssyrb +.section ssysa +.section ssysb +.section ssyta +.section ssytb +.section ssyua +.section ssyub +.section ssyva +.section ssyvb +.section ssywa +.section ssywb +.section ssyxa +.section ssyxb +.section ssyya +.section ssyyb +.section ssyza +.section ssyzb +.section ssy1a +.section ssy1b +.section ssy2a +.section ssy2b +.section ssy3a +.section ssy3b +.section ssy4a +.section ssy4b +.section ssy5a +.section ssy5b +.section ssy6a +.section ssy6b +.section ssy7a +.section ssy7b +.section ssy8a +.section ssy8b +.section ssy9a +.section ssy9b +.section ssy0a +.section ssy0b +.section sszaa +.section sszab +.section sszba +.section sszbb +.section sszca +.section sszcb +.section sszda +.section sszdb +.section sszea +.section sszeb +.section sszfa +.section sszfb +.section sszga +.section sszgb +.section sszha +.section sszhb +.section sszia +.section sszib +.section sszja +.section sszjb +.section sszka +.section sszkb +.section sszla +.section sszlb +.section sszma +.section sszmb +.section sszna +.section ssznb +.section sszoa +.section sszob +.section sszpa +.section sszpb +.section sszqa +.section sszqb +.section sszra +.section sszrb +.section sszsa +.section sszsb +.section sszta +.section ssztb +.section sszua +.section sszub +.section sszva +.section sszvb +.section sszwa +.section sszwb +.section sszxa +.section sszxb +.section sszya +.section sszyb +.section sszza +.section sszzb +.section ssz1a +.section ssz1b +.section ssz2a +.section ssz2b +.section ssz3a +.section ssz3b +.section ssz4a +.section ssz4b +.section ssz5a +.section ssz5b +.section ssz6a +.section ssz6b +.section ssz7a +.section ssz7b +.section ssz8a +.section ssz8b +.section ssz9a +.section ssz9b +.section ssz0a +.section ssz0b +.section ss1aa +.section ss1ab +.section ss1ba +.section ss1bb +.section ss1ca +.section ss1cb +.section ss1da +.section ss1db +.section ss1ea +.section ss1eb +.section ss1fa +.section ss1fb +.section ss1ga +.section ss1gb +.section ss1ha +.section ss1hb +.section ss1ia +.section ss1ib +.section ss1ja +.section ss1jb +.section ss1ka +.section ss1kb +.section ss1la +.section ss1lb +.section ss1ma +.section ss1mb +.section ss1na +.section ss1nb +.section ss1oa +.section ss1ob +.section ss1pa +.section ss1pb +.section ss1qa +.section ss1qb +.section ss1ra +.section ss1rb +.section ss1sa +.section ss1sb +.section ss1ta +.section ss1tb +.section ss1ua +.section ss1ub +.section ss1va +.section ss1vb +.section ss1wa +.section ss1wb +.section ss1xa +.section ss1xb +.section ss1ya +.section ss1yb +.section ss1za +.section ss1zb +.section ss11a +.section ss11b +.section ss12a +.section ss12b +.section ss13a +.section ss13b +.section ss14a +.section ss14b +.section ss15a +.section ss15b +.section ss16a +.section ss16b +.section ss17a +.section ss17b +.section ss18a +.section ss18b +.section ss19a +.section ss19b +.section ss10a +.section ss10b +.section ss2aa +.section ss2ab +.section ss2ba +.section ss2bb +.section ss2ca +.section ss2cb +.section ss2da +.section ss2db +.section ss2ea +.section ss2eb +.section ss2fa +.section ss2fb +.section ss2ga +.section ss2gb +.section ss2ha +.section ss2hb +.section ss2ia +.section ss2ib +.section ss2ja +.section ss2jb +.section ss2ka +.section ss2kb +.section ss2la +.section ss2lb +.section ss2ma +.section ss2mb +.section ss2na +.section ss2nb +.section ss2oa +.section ss2ob +.section ss2pa +.section ss2pb +.section ss2qa +.section ss2qb +.section ss2ra +.section ss2rb +.section ss2sa +.section ss2sb +.section ss2ta +.section ss2tb +.section ss2ua +.section ss2ub +.section ss2va +.section ss2vb +.section ss2wa +.section ss2wb +.section ss2xa +.section ss2xb +.section ss2ya +.section ss2yb +.section ss2za +.section ss2zb +.section ss21a +.section ss21b +.section ss22a +.section ss22b +.section ss23a +.section ss23b +.section ss24a +.section ss24b +.section ss25a +.section ss25b +.section ss26a +.section ss26b +.section ss27a +.section ss27b +.section ss28a +.section ss28b +.section ss29a +.section ss29b +.section ss20a +.section ss20b +.section ss3aa +.section ss3ab +.section ss3ba +.section ss3bb +.section ss3ca +.section ss3cb +.section ss3da +.section ss3db +.section ss3ea +.section ss3eb +.section ss3fa +.section ss3fb +.section ss3ga +.section ss3gb +.section ss3ha +.section ss3hb +.section ss3ia +.section ss3ib +.section ss3ja +.section ss3jb +.section ss3ka +.section ss3kb +.section ss3la +.section ss3lb +.section ss3ma +.section ss3mb +.section ss3na +.section ss3nb +.section ss3oa +.section ss3ob +.section ss3pa +.section ss3pb +.section ss3qa +.section ss3qb +.section ss3ra +.section ss3rb +.section ss3sa +.section ss3sb +.section ss3ta +.section ss3tb +.section ss3ua +.section ss3ub +.section ss3va +.section ss3vb +.section ss3wa +.section ss3wb +.section ss3xa +.section ss3xb +.section ss3ya +.section ss3yb +.section ss3za +.section ss3zb +.section ss31a +.section ss31b +.section ss32a +.section ss32b +.section ss33a +.section ss33b +.section ss34a +.section ss34b +.section ss35a +.section ss35b +.section ss36a +.section ss36b +.section ss37a +.section ss37b +.section ss38a +.section ss38b +.section ss39a +.section ss39b +.section ss30a +.section ss30b +.section ss4aa +.section ss4ab +.section ss4ba +.section ss4bb +.section ss4ca +.section ss4cb +.section ss4da +.section ss4db +.section ss4ea +.section ss4eb +.section ss4fa +.section ss4fb +.section ss4ga +.section ss4gb +.section ss4ha +.section ss4hb +.section ss4ia +.section ss4ib +.section ss4ja +.section ss4jb +.section ss4ka +.section ss4kb +.section ss4la +.section ss4lb +.section ss4ma +.section ss4mb +.section ss4na +.section ss4nb +.section ss4oa +.section ss4ob +.section ss4pa +.section ss4pb +.section ss4qa +.section ss4qb +.section ss4ra +.section ss4rb +.section ss4sa +.section ss4sb +.section ss4ta +.section ss4tb +.section ss4ua +.section ss4ub +.section ss4va +.section ss4vb +.section ss4wa +.section ss4wb +.section ss4xa +.section ss4xb +.section ss4ya +.section ss4yb +.section ss4za +.section ss4zb +.section ss41a +.section ss41b +.section ss42a +.section ss42b +.section ss43a +.section ss43b +.section ss44a +.section ss44b +.section ss45a +.section ss45b +.section ss46a +.section ss46b +.section ss47a +.section ss47b +.section ss48a +.section ss48b +.section ss49a +.section ss49b +.section ss40a +.section ss40b +.section ss5aa +.section ss5ab +.section ss5ba +.section ss5bb +.section ss5ca +.section ss5cb +.section ss5da +.section ss5db +.section ss5ea +.section ss5eb +.section ss5fa +.section ss5fb +.section ss5ga +.section ss5gb +.section ss5ha +.section ss5hb +.section ss5ia +.section ss5ib +.section ss5ja +.section ss5jb +.section ss5ka +.section ss5kb +.section ss5la +.section ss5lb +.section ss5ma +.section ss5mb +.section ss5na +.section ss5nb +.section ss5oa +.section ss5ob +.section ss5pa +.section ss5pb +.section ss5qa +.section ss5qb +.section ss5ra +.section ss5rb +.section ss5sa +.section ss5sb +.section ss5ta +.section ss5tb +.section ss5ua +.section ss5ub +.section ss5va +.section ss5vb +.section ss5wa +.section ss5wb +.section ss5xa +.section ss5xb +.section ss5ya +.section ss5yb +.section ss5za +.section ss5zb +.section ss51a +.section ss51b +.section ss52a +.section ss52b +.section ss53a +.section ss53b +.section ss54a +.section ss54b +.section ss55a +.section ss55b +.section ss56a +.section ss56b +.section ss57a +.section ss57b +.section ss58a +.section ss58b +.section ss59a +.section ss59b +.section ss50a +.section ss50b +.section ss6aa +.section ss6ab +.section ss6ba +.section ss6bb +.section ss6ca +.section ss6cb +.section ss6da +.section ss6db +.section ss6ea +.section ss6eb +.section ss6fa +.section ss6fb +.section ss6ga +.section ss6gb +.section ss6ha +.section ss6hb +.section ss6ia +.section ss6ib +.section ss6ja +.section ss6jb +.section ss6ka +.section ss6kb +.section ss6la +.section ss6lb +.section ss6ma +.section ss6mb +.section ss6na +.section ss6nb +.section ss6oa +.section ss6ob +.section ss6pa +.section ss6pb +.section ss6qa +.section ss6qb +.section ss6ra +.section ss6rb +.section ss6sa +.section ss6sb +.section ss6ta +.section ss6tb +.section ss6ua +.section ss6ub +.section ss6va +.section ss6vb +.section ss6wa +.section ss6wb +.section ss6xa +.section ss6xb +.section ss6ya +.section ss6yb +.section ss6za +.section ss6zb +.section ss61a +.section ss61b +.section ss62a +.section ss62b +.section ss63a +.section ss63b +.section ss64a +.section ss64b +.section ss65a +.section ss65b +.section ss66a +.section ss66b +.section ss67a +.section ss67b +.section ss68a +.section ss68b +.section ss69a +.section ss69b +.section ss60a +.section ss60b +.section ss7aa +.section ss7ab +.section ss7ba +.section ss7bb +.section ss7ca +.section ss7cb +.section ss7da +.section ss7db +.section ss7ea +.section ss7eb +.section ss7fa +.section ss7fb +.section ss7ga +.section ss7gb +.section ss7ha +.section ss7hb +.section ss7ia +.section ss7ib +.section ss7ja +.section ss7jb +.section ss7ka +.section ss7kb +.section ss7la +.section ss7lb +.section ss7ma +.section ss7mb +.section ss7na +.section ss7nb +.section ss7oa +.section ss7ob +.section ss7pa +.section ss7pb +.section ss7qa +.section ss7qb +.section ss7ra +.section ss7rb +.section ss7sa +.section ss7sb +.section ss7ta +.section ss7tb +.section ss7ua +.section ss7ub +.section ss7va +.section ss7vb +.section ss7wa +.section ss7wb +.section ss7xa +.section ss7xb +.section ss7ya +.section ss7yb +.section ss7za +.section ss7zb +.section ss71a +.section ss71b +.section ss72a +.section ss72b +.section ss73a +.section ss73b +.section ss74a +.section ss74b +.section ss75a +.section ss75b +.section ss76a +.section ss76b +.section ss77a +.section ss77b +.section ss78a +.section ss78b +.section ss79a +.section ss79b +.section ss70a +.section ss70b +.section ss8aa +.section ss8ab +.section ss8ba +.section ss8bb +.section ss8ca +.section ss8cb +.section ss8da +.section ss8db +.section ss8ea +.section ss8eb +.section ss8fa +.section ss8fb +.section ss8ga +.section ss8gb +.section ss8ha +.section ss8hb +.section ss8ia +.section ss8ib +.section ss8ja +.section ss8jb +.section ss8ka +.section ss8kb +.section ss8la +.section ss8lb +.section ss8ma +.section ss8mb +.section ss8na +.section ss8nb +.section ss8oa +.section ss8ob +.section ss8pa +.section ss8pb +.section ss8qa +.section ss8qb +.section ss8ra +.section ss8rb +.section ss8sa +.section ss8sb +.section ss8ta +.section ss8tb +.section ss8ua +.section ss8ub +.section ss8va +.section ss8vb +.section ss8wa +.section ss8wb +.section ss8xa +.section ss8xb +.section ss8ya +.section ss8yb +.section ss8za +.section ss8zb +.section ss81a +.section ss81b +.section ss82a +.section ss82b +.section ss83a +.section ss83b +.section ss84a +.section ss84b +.section ss85a +.section ss85b +.section ss86a +.section ss86b +.section ss87a +.section ss87b +.section ss88a +.section ss88b +.section ss89a +.section ss89b +.section ss80a +.section ss80b +.section ss9aa +.section ss9ab +.section ss9ba +.section ss9bb +.section ss9ca +.section ss9cb +.section ss9da +.section ss9db +.section ss9ea +.section ss9eb +.section ss9fa +.section ss9fb +.section ss9ga +.section ss9gb +.section ss9ha +.section ss9hb +.section ss9ia +.section ss9ib +.section ss9ja +.section ss9jb +.section ss9ka +.section ss9kb +.section ss9la +.section ss9lb +.section ss9ma +.section ss9mb +.section ss9na +.section ss9nb +.section ss9oa +.section ss9ob +.section ss9pa +.section ss9pb +.section ss9qa +.section ss9qb +.section ss9ra +.section ss9rb +.section ss9sa +.section ss9sb +.section ss9ta +.section ss9tb +.section ss9ua +.section ss9ub +.section ss9va +.section ss9vb +.section ss9wa +.section ss9wb +.section ss9xa +.section ss9xb +.section ss9ya +.section ss9yb +.section ss9za +.section ss9zb +.section ss91a +.section ss91b +.section ss92a +.section ss92b +.section ss93a +.section ss93b +.section ss94a +.section ss94b +.section ss95a +.section ss95b +.section ss96a +.section ss96b +.section ss97a +.section ss97b +.section ss98a +.section ss98b +.section ss99a +.section ss99b +.section ss90a +.section ss90b +.section ss0aa +.section ss0ab +.section ss0ba +.section ss0bb +.section ss0ca +.section ss0cb +.section ss0da +.section ss0db +.section ss0ea +.section ss0eb +.section ss0fa +.section ss0fb +.section ss0ga +.section ss0gb +.section ss0ha +.section ss0hb +.section ss0ia +.section ss0ib +.section ss0ja +.section ss0jb +.section ss0ka +.section ss0kb +.section ss0la +.section ss0lb +.section ss0ma +.section ss0mb +.section ss0na +.section ss0nb +.section ss0oa +.section ss0ob +.section ss0pa +.section ss0pb +.section ss0qa +.section ss0qb +.section ss0ra +.section ss0rb +.section ss0sa +.section ss0sb +.section ss0ta +.section ss0tb +.section ss0ua +.section ss0ub +.section ss0va +.section ss0vb +.section ss0wa +.section ss0wb +.section ss0xa +.section ss0xb +.section ss0ya +.section ss0yb +.section ss0za +.section ss0zb +.section ss01a +.section ss01b +.section ss02a +.section ss02b +.section ss03a +.section ss03b +.section ss04a +.section ss04b +.section ss05a +.section ss05b +.section ss06a +.section ss06b +.section ss07a +.section ss07b +.section ss08a +.section ss08b +.section ss09a +.section ss09b +.section ss00a +.section ss00b +.section staaa +.section staab +.section staba +.section stabb +.section staca +.section stacb +.section stada +.section stadb +.section staea +.section staeb +.section stafa +.section stafb +.section staga +.section stagb +.section staha +.section stahb +.section staia +.section staib +.section staja +.section stajb +.section staka +.section stakb +.section stala +.section stalb +.section stama +.section stamb +.section stana +.section stanb +.section staoa +.section staob +.section stapa +.section stapb +.section staqa +.section staqb +.section stara +.section starb +.section stasa +.section stasb +.section stata +.section statb +.section staua +.section staub +.section stava +.section stavb +.section stawa +.section stawb +.section staxa +.section staxb +.section staya +.section stayb +.section staza +.section stazb +.section sta1a +.section sta1b +.section sta2a +.section sta2b +.section sta3a +.section sta3b +.section sta4a +.section sta4b +.section sta5a +.section sta5b +.section sta6a +.section sta6b +.section sta7a +.section sta7b +.section sta8a +.section sta8b +.section sta9a +.section sta9b +.section sta0a +.section sta0b +.section stbaa +.section stbab +.section stbba +.section stbbb +.section stbca +.section stbcb +.section stbda +.section stbdb +.section stbea +.section stbeb +.section stbfa +.section stbfb +.section stbga +.section stbgb +.section stbha +.section stbhb +.section stbia +.section stbib +.section stbja +.section stbjb +.section stbka +.section stbkb +.section stbla +.section stblb +.section stbma +.section stbmb +.section stbna +.section stbnb +.section stboa +.section stbob +.section stbpa +.section stbpb +.section stbqa +.section stbqb +.section stbra +.section stbrb +.section stbsa +.section stbsb +.section stbta +.section stbtb +.section stbua +.section stbub +.section stbva +.section stbvb +.section stbwa +.section stbwb +.section stbxa +.section stbxb +.section stbya +.section stbyb +.section stbza +.section stbzb +.section stb1a +.section stb1b +.section stb2a +.section stb2b +.section stb3a +.section stb3b +.section stb4a +.section stb4b +.section stb5a +.section stb5b +.section stb6a +.section stb6b +.section stb7a +.section stb7b +.section stb8a +.section stb8b +.section stb9a +.section stb9b +.section stb0a +.section stb0b +.section stcaa +.section stcab +.section stcba +.section stcbb +.section stcca +.section stccb +.section stcda +.section stcdb +.section stcea +.section stceb +.section stcfa +.section stcfb +.section stcga +.section stcgb +.section stcha +.section stchb +.section stcia +.section stcib +.section stcja +.section stcjb +.section stcka +.section stckb +.section stcla +.section stclb +.section stcma +.section stcmb +.section stcna +.section stcnb +.section stcoa +.section stcob +.section stcpa +.section stcpb +.section stcqa +.section stcqb +.section stcra +.section stcrb +.section stcsa +.section stcsb +.section stcta +.section stctb +.section stcua +.section stcub +.section stcva +.section stcvb +.section stcwa +.section stcwb +.section stcxa +.section stcxb +.section stcya +.section stcyb +.section stcza +.section stczb +.section stc1a +.section stc1b +.section stc2a +.section stc2b +.section stc3a +.section stc3b +.section stc4a +.section stc4b +.section stc5a +.section stc5b +.section stc6a +.section stc6b +.section stc7a +.section stc7b +.section stc8a +.section stc8b +.section stc9a +.section stc9b +.section stc0a +.section stc0b +.section stdaa +.section stdab +.section stdba +.section stdbb +.section stdca +.section stdcb +.section stdda +.section stddb +.section stdea +.section stdeb +.section stdfa +.section stdfb +.section stdga +.section stdgb +.section stdha +.section stdhb +.section stdia +.section stdib +.section stdja +.section stdjb +.section stdka +.section stdkb +.section stdla +.section stdlb +.section stdma +.section stdmb +.section stdna +.section stdnb +.section stdoa +.section stdob +.section stdpa +.section stdpb +.section stdqa +.section stdqb +.section stdra +.section stdrb +.section stdsa +.section stdsb +.section stdta +.section stdtb +.section stdua +.section stdub +.section stdva +.section stdvb +.section stdwa +.section stdwb +.section stdxa +.section stdxb +.section stdya +.section stdyb +.section stdza +.section stdzb +.section std1a +.section std1b +.section std2a +.section std2b +.section std3a +.section std3b +.section std4a +.section std4b +.section std5a +.section std5b +.section std6a +.section std6b +.section std7a +.section std7b +.section std8a +.section std8b +.section std9a +.section std9b +.section std0a +.section std0b +.section steaa +.section steab +.section steba +.section stebb +.section steca +.section stecb +.section steda +.section stedb +.section steea +.section steeb +.section stefa +.section stefb +.section stega +.section stegb +.section steha +.section stehb +.section steia +.section steib +.section steja +.section stejb +.section steka +.section stekb +.section stela +.section stelb +.section stema +.section stemb +.section stena +.section stenb +.section steoa +.section steob +.section stepa +.section stepb +.section steqa +.section steqb +.section stera +.section sterb +.section stesa +.section stesb +.section steta +.section stetb +.section steua +.section steub +.section steva +.section stevb +.section stewa +.section stewb +.section stexa +.section stexb +.section steya +.section steyb +.section steza +.section stezb +.section ste1a +.section ste1b +.section ste2a +.section ste2b +.section ste3a +.section ste3b +.section ste4a +.section ste4b +.section ste5a +.section ste5b +.section ste6a +.section ste6b +.section ste7a +.section ste7b +.section ste8a +.section ste8b +.section ste9a +.section ste9b +.section ste0a +.section ste0b +.section stfaa +.section stfab +.section stfba +.section stfbb +.section stfca +.section stfcb +.section stfda +.section stfdb +.section stfea +.section stfeb +.section stffa +.section stffb +.section stfga +.section stfgb +.section stfha +.section stfhb +.section stfia +.section stfib +.section stfja +.section stfjb +.section stfka +.section stfkb +.section stfla +.section stflb +.section stfma +.section stfmb +.section stfna +.section stfnb +.section stfoa +.section stfob +.section stfpa +.section stfpb +.section stfqa +.section stfqb +.section stfra +.section stfrb +.section stfsa +.section stfsb +.section stfta +.section stftb +.section stfua +.section stfub +.section stfva +.section stfvb +.section stfwa +.section stfwb +.section stfxa +.section stfxb +.section stfya +.section stfyb +.section stfza +.section stfzb +.section stf1a +.section stf1b +.section stf2a +.section stf2b +.section stf3a +.section stf3b +.section stf4a +.section stf4b +.section stf5a +.section stf5b +.section stf6a +.section stf6b +.section stf7a +.section stf7b +.section stf8a +.section stf8b +.section stf9a +.section stf9b +.section stf0a +.section stf0b +.section stgaa +.section stgab +.section stgba +.section stgbb +.section stgca +.section stgcb +.section stgda +.section stgdb +.section stgea +.section stgeb +.section stgfa +.section stgfb +.section stgga +.section stggb +.section stgha +.section stghb +.section stgia +.section stgib +.section stgja +.section stgjb +.section stgka +.section stgkb +.section stgla +.section stglb +.section stgma +.section stgmb +.section stgna +.section stgnb +.section stgoa +.section stgob +.section stgpa +.section stgpb +.section stgqa +.section stgqb +.section stgra +.section stgrb +.section stgsa +.section stgsb +.section stgta +.section stgtb +.section stgua +.section stgub +.section stgva +.section stgvb +.section stgwa +.section stgwb +.section stgxa +.section stgxb +.section stgya +.section stgyb +.section stgza +.section stgzb +.section stg1a +.section stg1b +.section stg2a +.section stg2b +.section stg3a +.section stg3b +.section stg4a +.section stg4b +.section stg5a +.section stg5b +.section stg6a +.section stg6b +.section stg7a +.section stg7b +.section stg8a +.section stg8b +.section stg9a +.section stg9b +.section stg0a +.section stg0b +.section sthaa +.section sthab +.section sthba +.section sthbb +.section sthca +.section sthcb +.section sthda +.section sthdb +.section sthea +.section stheb +.section sthfa +.section sthfb +.section sthga +.section sthgb +.section sthha +.section sthhb +.section sthia +.section sthib +.section sthja +.section sthjb +.section sthka +.section sthkb +.section sthla +.section sthlb +.section sthma +.section sthmb +.section sthna +.section sthnb +.section sthoa +.section sthob +.section sthpa +.section sthpb +.section sthqa +.section sthqb +.section sthra +.section sthrb +.section sthsa +.section sthsb +.section sthta +.section sthtb +.section sthua +.section sthub +.section sthva +.section sthvb +.section sthwa +.section sthwb +.section sthxa +.section sthxb +.section sthya +.section sthyb +.section sthza +.section sthzb +.section sth1a +.section sth1b +.section sth2a +.section sth2b +.section sth3a +.section sth3b +.section sth4a +.section sth4b +.section sth5a +.section sth5b +.section sth6a +.section sth6b +.section sth7a +.section sth7b +.section sth8a +.section sth8b +.section sth9a +.section sth9b +.section sth0a +.section sth0b +.section stiaa +.section stiab +.section stiba +.section stibb +.section stica +.section sticb +.section stida +.section stidb +.section stiea +.section stieb +.section stifa +.section stifb +.section stiga +.section stigb +.section stiha +.section stihb +.section stiia +.section stiib +.section stija +.section stijb +.section stika +.section stikb +.section stila +.section stilb +.section stima +.section stimb +.section stina +.section stinb +.section stioa +.section stiob +.section stipa +.section stipb +.section stiqa +.section stiqb +.section stira +.section stirb +.section stisa +.section stisb +.section stita +.section stitb +.section stiua +.section stiub +.section stiva +.section stivb +.section stiwa +.section stiwb +.section stixa +.section stixb +.section stiya +.section stiyb +.section stiza +.section stizb +.section sti1a +.section sti1b +.section sti2a +.section sti2b +.section sti3a +.section sti3b +.section sti4a +.section sti4b +.section sti5a +.section sti5b +.section sti6a +.section sti6b +.section sti7a +.section sti7b +.section sti8a +.section sti8b +.section sti9a +.section sti9b +.section sti0a +.section sti0b +.section stjaa +.section stjab +.section stjba +.section stjbb +.section stjca +.section stjcb +.section stjda +.section stjdb +.section stjea +.section stjeb +.section stjfa +.section stjfb +.section stjga +.section stjgb +.section stjha +.section stjhb +.section stjia +.section stjib +.section stjja +.section stjjb +.section stjka +.section stjkb +.section stjla +.section stjlb +.section stjma +.section stjmb +.section stjna +.section stjnb +.section stjoa +.section stjob +.section stjpa +.section stjpb +.section stjqa +.section stjqb +.section stjra +.section stjrb +.section stjsa +.section stjsb +.section stjta +.section stjtb +.section stjua +.section stjub +.section stjva +.section stjvb +.section stjwa +.section stjwb +.section stjxa +.section stjxb +.section stjya +.section stjyb +.section stjza +.section stjzb +.section stj1a +.section stj1b +.section stj2a +.section stj2b +.section stj3a +.section stj3b +.section stj4a +.section stj4b +.section stj5a +.section stj5b +.section stj6a +.section stj6b +.section stj7a +.section stj7b +.section stj8a +.section stj8b +.section stj9a +.section stj9b +.section stj0a +.section stj0b +.section stkaa +.section stkab +.section stkba +.section stkbb +.section stkca +.section stkcb +.section stkda +.section stkdb +.section stkea +.section stkeb +.section stkfa +.section stkfb +.section stkga +.section stkgb +.section stkha +.section stkhb +.section stkia +.section stkib +.section stkja +.section stkjb +.section stkka +.section stkkb +.section stkla +.section stklb +.section stkma +.section stkmb +.section stkna +.section stknb +.section stkoa +.section stkob +.section stkpa +.section stkpb +.section stkqa +.section stkqb +.section stkra +.section stkrb +.section stksa +.section stksb +.section stkta +.section stktb +.section stkua +.section stkub +.section stkva +.section stkvb +.section stkwa +.section stkwb +.section stkxa +.section stkxb +.section stkya +.section stkyb +.section stkza +.section stkzb +.section stk1a +.section stk1b +.section stk2a +.section stk2b +.section stk3a +.section stk3b +.section stk4a +.section stk4b +.section stk5a +.section stk5b +.section stk6a +.section stk6b +.section stk7a +.section stk7b +.section stk8a +.section stk8b +.section stk9a +.section stk9b +.section stk0a +.section stk0b +.section stlaa +.section stlab +.section stlba +.section stlbb +.section stlca +.section stlcb +.section stlda +.section stldb +.section stlea +.section stleb +.section stlfa +.section stlfb +.section stlga +.section stlgb +.section stlha +.section stlhb +.section stlia +.section stlib +.section stlja +.section stljb +.section stlka +.section stlkb +.section stlla +.section stllb +.section stlma +.section stlmb +.section stlna +.section stlnb +.section stloa +.section stlob +.section stlpa +.section stlpb +.section stlqa +.section stlqb +.section stlra +.section stlrb +.section stlsa +.section stlsb +.section stlta +.section stltb +.section stlua +.section stlub +.section stlva +.section stlvb +.section stlwa +.section stlwb +.section stlxa +.section stlxb +.section stlya +.section stlyb +.section stlza +.section stlzb +.section stl1a +.section stl1b +.section stl2a +.section stl2b +.section stl3a +.section stl3b +.section stl4a +.section stl4b +.section stl5a +.section stl5b +.section stl6a +.section stl6b +.section stl7a +.section stl7b +.section stl8a +.section stl8b +.section stl9a +.section stl9b +.section stl0a +.section stl0b +.section stmaa +.section stmab +.section stmba +.section stmbb +.section stmca +.section stmcb +.section stmda +.section stmdb +.section stmea +.section stmeb +.section stmfa +.section stmfb +.section stmga +.section stmgb +.section stmha +.section stmhb +.section stmia +.section stmib +.section stmja +.section stmjb +.section stmka +.section stmkb +.section stmla +.section stmlb +.section stmma +.section stmmb +.section stmna +.section stmnb +.section stmoa +.section stmob +.section stmpa +.section stmpb +.section stmqa +.section stmqb +.section stmra +.section stmrb +.section stmsa +.section stmsb +.section stmta +.section stmtb +.section stmua +.section stmub +.section stmva +.section stmvb +.section stmwa +.section stmwb +.section stmxa +.section stmxb +.section stmya +.section stmyb +.section stmza +.section stmzb +.section stm1a +.section stm1b +.section stm2a +.section stm2b +.section stm3a +.section stm3b +.section stm4a +.section stm4b +.section stm5a +.section stm5b +.section stm6a +.section stm6b +.section stm7a +.section stm7b +.section stm8a +.section stm8b +.section stm9a +.section stm9b +.section stm0a +.section stm0b +.section stnaa +.section stnab +.section stnba +.section stnbb +.section stnca +.section stncb +.section stnda +.section stndb +.section stnea +.section stneb +.section stnfa +.section stnfb +.section stnga +.section stngb +.section stnha +.section stnhb +.section stnia +.section stnib +.section stnja +.section stnjb +.section stnka +.section stnkb +.section stnla +.section stnlb +.section stnma +.section stnmb +.section stnna +.section stnnb +.section stnoa +.section stnob +.section stnpa +.section stnpb +.section stnqa +.section stnqb +.section stnra +.section stnrb +.section stnsa +.section stnsb +.section stnta +.section stntb +.section stnua +.section stnub +.section stnva +.section stnvb +.section stnwa +.section stnwb +.section stnxa +.section stnxb +.section stnya +.section stnyb +.section stnza +.section stnzb +.section stn1a +.section stn1b +.section stn2a +.section stn2b +.section stn3a +.section stn3b +.section stn4a +.section stn4b +.section stn5a +.section stn5b +.section stn6a +.section stn6b +.section stn7a +.section stn7b +.section stn8a +.section stn8b +.section stn9a +.section stn9b +.section stn0a +.section stn0b +.section stoaa +.section stoab +.section stoba +.section stobb +.section stoca +.section stocb +.section stoda +.section stodb +.section stoea +.section stoeb +.section stofa +.section stofb +.section stoga +.section stogb +.section stoha +.section stohb +.section stoia +.section stoib +.section stoja +.section stojb +.section stoka +.section stokb +.section stola +.section stolb +.section stoma +.section stomb +.section stona +.section stonb +.section stooa +.section stoob +.section stopa +.section stopb +.section stoqa +.section stoqb +.section stora +.section storb +.section stosa +.section stosb +.section stota +.section stotb +.section stoua +.section stoub +.section stova +.section stovb +.section stowa +.section stowb +.section stoxa +.section stoxb +.section stoya +.section stoyb +.section stoza +.section stozb +.section sto1a +.section sto1b +.section sto2a +.section sto2b +.section sto3a +.section sto3b +.section sto4a +.section sto4b +.section sto5a +.section sto5b +.section sto6a +.section sto6b +.section sto7a +.section sto7b +.section sto8a +.section sto8b +.section sto9a +.section sto9b +.section sto0a +.section sto0b +.section stpaa +.section stpab +.section stpba +.section stpbb +.section stpca +.section stpcb +.section stpda +.section stpdb +.section stpea +.section stpeb +.section stpfa +.section stpfb +.section stpga +.section stpgb +.section stpha +.section stphb +.section stpia +.section stpib +.section stpja +.section stpjb +.section stpka +.section stpkb +.section stpla +.section stplb +.section stpma +.section stpmb +.section stpna +.section stpnb +.section stpoa +.section stpob +.section stppa +.section stppb +.section stpqa +.section stpqb +.section stpra +.section stprb +.section stpsa +.section stpsb +.section stpta +.section stptb +.section stpua +.section stpub +.section stpva +.section stpvb +.section stpwa +.section stpwb +.section stpxa +.section stpxb +.section stpya +.section stpyb +.section stpza +.section stpzb +.section stp1a +.section stp1b +.section stp2a +.section stp2b +.section stp3a +.section stp3b +.section stp4a +.section stp4b +.section stp5a +.section stp5b +.section stp6a +.section stp6b +.section stp7a +.section stp7b +.section stp8a +.section stp8b +.section stp9a +.section stp9b +.section stp0a +.section stp0b +.section stqaa +.section stqab +.section stqba +.section stqbb +.section stqca +.section stqcb +.section stqda +.section stqdb +.section stqea +.section stqeb +.section stqfa +.section stqfb +.section stqga +.section stqgb +.section stqha +.section stqhb +.section stqia +.section stqib +.section stqja +.section stqjb +.section stqka +.section stqkb +.section stqla +.section stqlb +.section stqma +.section stqmb +.section stqna +.section stqnb +.section stqoa +.section stqob +.section stqpa +.section stqpb +.section stqqa +.section stqqb +.section stqra +.section stqrb +.section stqsa +.section stqsb +.section stqta +.section stqtb +.section stqua +.section stqub +.section stqva +.section stqvb +.section stqwa +.section stqwb +.section stqxa +.section stqxb +.section stqya +.section stqyb +.section stqza +.section stqzb +.section stq1a +.section stq1b +.section stq2a +.section stq2b +.section stq3a +.section stq3b +.section stq4a +.section stq4b +.section stq5a +.section stq5b +.section stq6a +.section stq6b +.section stq7a +.section stq7b +.section stq8a +.section stq8b +.section stq9a +.section stq9b +.section stq0a +.section stq0b +.section straa +.section strab +.section strba +.section strbb +.section strca +.section strcb +.section strda +.section strdb +.section strea +.section streb +.section strfa +.section strfb +.section strga +.section strgb +.section strha +.section strhb +.section stria +.section strib +.section strja +.section strjb +.section strka +.section strkb +.section strla +.section strlb +.section strma +.section strmb +.section strna +.section strnb +.section stroa +.section strob +.section strpa +.section strpb +.section strqa +.section strqb +.section strra +.section strrb +.section strsa +.section strsb +.section strta +.section strtb +.section strua +.section strub +.section strva +.section strvb +.section strwa +.section strwb +.section strxa +.section strxb +.section strya +.section stryb +.section strza +.section strzb +.section str1a +.section str1b +.section str2a +.section str2b +.section str3a +.section str3b +.section str4a +.section str4b +.section str5a +.section str5b +.section str6a +.section str6b +.section str7a +.section str7b +.section str8a +.section str8b +.section str9a +.section str9b +.section str0a +.section str0b +.section stsaa +.section stsab +.section stsba +.section stsbb +.section stsca +.section stscb +.section stsda +.section stsdb +.section stsea +.section stseb +.section stsfa +.section stsfb +.section stsga +.section stsgb +.section stsha +.section stshb +.section stsia +.section stsib +.section stsja +.section stsjb +.section stska +.section stskb +.section stsla +.section stslb +.section stsma +.section stsmb +.section stsna +.section stsnb +.section stsoa +.section stsob +.section stspa +.section stspb +.section stsqa +.section stsqb +.section stsra +.section stsrb +.section stssa +.section stssb +.section ststa +.section ststb +.section stsua +.section stsub +.section stsva +.section stsvb +.section stswa +.section stswb +.section stsxa +.section stsxb +.section stsya +.section stsyb +.section stsza +.section stszb +.section sts1a +.section sts1b +.section sts2a +.section sts2b +.section sts3a +.section sts3b +.section sts4a +.section sts4b +.section sts5a +.section sts5b +.section sts6a +.section sts6b +.section sts7a +.section sts7b +.section sts8a +.section sts8b +.section sts9a +.section sts9b +.section sts0a +.section sts0b +.section sttaa +.section sttab +.section sttba +.section sttbb +.section sttca +.section sttcb +.section sttda +.section sttdb +.section sttea +.section stteb +.section sttfa +.section sttfb +.section sttga +.section sttgb +.section sttha +.section stthb +.section sttia +.section sttib +.section sttja +.section sttjb +.section sttka +.section sttkb +.section sttla +.section sttlb +.section sttma +.section sttmb +.section sttna +.section sttnb +.section sttoa +.section sttob +.section sttpa +.section sttpb +.section sttqa +.section sttqb +.section sttra +.section sttrb +.section sttsa +.section sttsb +.section sttta +.section stttb +.section sttua +.section sttub +.section sttva +.section sttvb +.section sttwa +.section sttwb +.section sttxa +.section sttxb +.section sttya +.section sttyb +.section sttza +.section sttzb +.section stt1a +.section stt1b +.section stt2a +.section stt2b +.section stt3a +.section stt3b +.section stt4a +.section stt4b +.section stt5a +.section stt5b +.section stt6a +.section stt6b +.section stt7a +.section stt7b +.section stt8a +.section stt8b +.section stt9a +.section stt9b +.section stt0a +.section stt0b +.section stuaa +.section stuab +.section stuba +.section stubb +.section stuca +.section stucb +.section studa +.section studb +.section stuea +.section stueb +.section stufa +.section stufb +.section stuga +.section stugb +.section stuha +.section stuhb +.section stuia +.section stuib +.section stuja +.section stujb +.section stuka +.section stukb +.section stula +.section stulb +.section stuma +.section stumb +.section stuna +.section stunb +.section stuoa +.section stuob +.section stupa +.section stupb +.section stuqa +.section stuqb +.section stura +.section sturb +.section stusa +.section stusb +.section stuta +.section stutb +.section stuua +.section stuub +.section stuva +.section stuvb +.section stuwa +.section stuwb +.section stuxa +.section stuxb +.section stuya +.section stuyb +.section stuza +.section stuzb +.section stu1a +.section stu1b +.section stu2a +.section stu2b +.section stu3a +.section stu3b +.section stu4a +.section stu4b +.section stu5a +.section stu5b +.section stu6a +.section stu6b +.section stu7a +.section stu7b +.section stu8a +.section stu8b +.section stu9a +.section stu9b +.section stu0a +.section stu0b +.section stvaa +.section stvab +.section stvba +.section stvbb +.section stvca +.section stvcb +.section stvda +.section stvdb +.section stvea +.section stveb +.section stvfa +.section stvfb +.section stvga +.section stvgb +.section stvha +.section stvhb +.section stvia +.section stvib +.section stvja +.section stvjb +.section stvka +.section stvkb +.section stvla +.section stvlb +.section stvma +.section stvmb +.section stvna +.section stvnb +.section stvoa +.section stvob +.section stvpa +.section stvpb +.section stvqa +.section stvqb +.section stvra +.section stvrb +.section stvsa +.section stvsb +.section stvta +.section stvtb +.section stvua +.section stvub +.section stvva +.section stvvb +.section stvwa +.section stvwb +.section stvxa +.section stvxb +.section stvya +.section stvyb +.section stvza +.section stvzb +.section stv1a +.section stv1b +.section stv2a +.section stv2b +.section stv3a +.section stv3b +.section stv4a +.section stv4b +.section stv5a +.section stv5b +.section stv6a +.section stv6b +.section stv7a +.section stv7b +.section stv8a +.section stv8b +.section stv9a +.section stv9b +.section stv0a +.section stv0b +.section stwaa +.section stwab +.section stwba +.section stwbb +.section stwca +.section stwcb +.section stwda +.section stwdb +.section stwea +.section stweb +.section stwfa +.section stwfb +.section stwga +.section stwgb +.section stwha +.section stwhb +.section stwia +.section stwib +.section stwja +.section stwjb +.section stwka +.section stwkb +.section stwla +.section stwlb +.section stwma +.section stwmb +.section stwna +.section stwnb +.section stwoa +.section stwob +.section stwpa +.section stwpb +.section stwqa +.section stwqb +.section stwra +.section stwrb +.section stwsa +.section stwsb +.section stwta +.section stwtb +.section stwua +.section stwub +.section stwva +.section stwvb +.section stwwa +.section stwwb +.section stwxa +.section stwxb +.section stwya +.section stwyb +.section stwza +.section stwzb +.section stw1a +.section stw1b +.section stw2a +.section stw2b +.section stw3a +.section stw3b +.section stw4a +.section stw4b +.section stw5a +.section stw5b +.section stw6a +.section stw6b +.section stw7a +.section stw7b +.section stw8a +.section stw8b +.section stw9a +.section stw9b +.section stw0a +.section stw0b +.section stxaa +.section stxab +.section stxba +.section stxbb +.section stxca +.section stxcb +.section stxda +.section stxdb +.section stxea +.section stxeb +.section stxfa +.section stxfb +.section stxga +.section stxgb +.section stxha +.section stxhb +.section stxia +.section stxib +.section stxja +.section stxjb +.section stxka +.section stxkb +.section stxla +.section stxlb +.section stxma +.section stxmb +.section stxna +.section stxnb +.section stxoa +.section stxob +.section stxpa +.section stxpb +.section stxqa +.section stxqb +.section stxra +.section stxrb +.section stxsa +.section stxsb +.section stxta +.section stxtb +.section stxua +.section stxub +.section stxva +.section stxvb +.section stxwa +.section stxwb +.section stxxa +.section stxxb +.section stxya +.section stxyb +.section stxza +.section stxzb +.section stx1a +.section stx1b +.section stx2a +.section stx2b +.section stx3a +.section stx3b +.section stx4a +.section stx4b +.section stx5a +.section stx5b +.section stx6a +.section stx6b +.section stx7a +.section stx7b +.section stx8a +.section stx8b +.section stx9a +.section stx9b +.section stx0a +.section stx0b +.section styaa +.section styab +.section styba +.section stybb +.section styca +.section stycb +.section styda +.section stydb +.section styea +.section styeb +.section styfa +.section styfb +.section styga +.section stygb +.section styha +.section styhb +.section styia +.section styib +.section styja +.section styjb +.section styka +.section stykb +.section styla +.section stylb +.section styma +.section stymb +.section styna +.section stynb +.section styoa +.section styob +.section stypa +.section stypb +.section styqa +.section styqb +.section styra +.section styrb +.section stysa +.section stysb +.section styta +.section stytb +.section styua +.section styub +.section styva +.section styvb +.section stywa +.section stywb +.section styxa +.section styxb +.section styya +.section styyb +.section styza +.section styzb +.section sty1a +.section sty1b +.section sty2a +.section sty2b +.section sty3a +.section sty3b +.section sty4a +.section sty4b +.section sty5a +.section sty5b +.section sty6a +.section sty6b +.section sty7a +.section sty7b +.section sty8a +.section sty8b +.section sty9a +.section sty9b +.section sty0a +.section sty0b +.section stzaa +.section stzab +.section stzba +.section stzbb +.section stzca +.section stzcb +.section stzda +.section stzdb +.section stzea +.section stzeb +.section stzfa +.section stzfb +.section stzga +.section stzgb +.section stzha +.section stzhb +.section stzia +.section stzib +.section stzja +.section stzjb +.section stzka +.section stzkb +.section stzla +.section stzlb +.section stzma +.section stzmb +.section stzna +.section stznb +.section stzoa +.section stzob +.section stzpa +.section stzpb +.section stzqa +.section stzqb +.section stzra +.section stzrb +.section stzsa +.section stzsb +.section stzta +.section stztb +.section stzua +.section stzub +.section stzva +.section stzvb +.section stzwa +.section stzwb +.section stzxa +.section stzxb +.section stzya +.section stzyb +.section stzza +.section stzzb +.section stz1a +.section stz1b +.section stz2a +.section stz2b +.section stz3a +.section stz3b +.section stz4a +.section stz4b +.section stz5a +.section stz5b +.section stz6a +.section stz6b +.section stz7a +.section stz7b +.section stz8a +.section stz8b +.section stz9a +.section stz9b +.section stz0a +.section stz0b +.section st1aa +.section st1ab +.section st1ba +.section st1bb +.section st1ca +.section st1cb +.section st1da +.section st1db +.section st1ea +.section st1eb +.section st1fa +.section st1fb +.section st1ga +.section st1gb +.section st1ha +.section st1hb +.section st1ia +.section st1ib +.section st1ja +.section st1jb +.section st1ka +.section st1kb +.section st1la +.section st1lb +.section st1ma +.section st1mb +.section st1na +.section st1nb +.section st1oa +.section st1ob +.section st1pa +.section st1pb +.section st1qa +.section st1qb +.section st1ra +.section st1rb +.section st1sa +.section st1sb +.section st1ta +.section st1tb +.section st1ua +.section st1ub +.section st1va +.section st1vb +.section st1wa +.section st1wb +.section st1xa +.section st1xb +.section st1ya +.section st1yb +.section st1za +.section st1zb +.section st11a +.section st11b +.section st12a +.section st12b +.section st13a +.section st13b +.section st14a +.section st14b +.section st15a +.section st15b +.section st16a +.section st16b +.section st17a +.section st17b +.section st18a +.section st18b +.section st19a +.section st19b +.section st10a +.section st10b +.section st2aa +.section st2ab +.section st2ba +.section st2bb +.section st2ca +.section st2cb +.section st2da +.section st2db +.section st2ea +.section st2eb +.section st2fa +.section st2fb +.section st2ga +.section st2gb +.section st2ha +.section st2hb +.section st2ia +.section st2ib +.section st2ja +.section st2jb +.section st2ka +.section st2kb +.section st2la +.section st2lb +.section st2ma +.section st2mb +.section st2na +.section st2nb +.section st2oa +.section st2ob +.section st2pa +.section st2pb +.section st2qa +.section st2qb +.section st2ra +.section st2rb +.section st2sa +.section st2sb +.section st2ta +.section st2tb +.section st2ua +.section st2ub +.section st2va +.section st2vb +.section st2wa +.section st2wb +.section st2xa +.section st2xb +.section st2ya +.section st2yb +.section st2za +.section st2zb +.section st21a +.section st21b +.section st22a +.section st22b +.section st23a +.section st23b +.section st24a +.section st24b +.section st25a +.section st25b +.section st26a +.section st26b +.section st27a +.section st27b +.section st28a +.section st28b +.section st29a +.section st29b +.section st20a +.section st20b +.section st3aa +.section st3ab +.section st3ba +.section st3bb +.section st3ca +.section st3cb +.section st3da +.section st3db +.section st3ea +.section st3eb +.section st3fa +.section st3fb +.section st3ga +.section st3gb +.section st3ha +.section st3hb +.section st3ia +.section st3ib +.section st3ja +.section st3jb +.section st3ka +.section st3kb +.section st3la +.section st3lb +.section st3ma +.section st3mb +.section st3na +.section st3nb +.section st3oa +.section st3ob +.section st3pa +.section st3pb +.section st3qa +.section st3qb +.section st3ra +.section st3rb +.section st3sa +.section st3sb +.section st3ta +.section st3tb +.section st3ua +.section st3ub +.section st3va +.section st3vb +.section st3wa +.section st3wb +.section st3xa +.section st3xb +.section st3ya +.section st3yb +.section st3za +.section st3zb +.section st31a +.section st31b +.section st32a +.section st32b +.section st33a +.section st33b +.section st34a +.section st34b +.section st35a +.section st35b +.section st36a +.section st36b +.section st37a +.section st37b +.section st38a +.section st38b +.section st39a +.section st39b +.section st30a +.section st30b +.section st4aa +.section st4ab +.section st4ba +.section st4bb +.section st4ca +.section st4cb +.section st4da +.section st4db +.section st4ea +.section st4eb +.section st4fa +.section st4fb +.section st4ga +.section st4gb +.section st4ha +.section st4hb +.section st4ia +.section st4ib +.section st4ja +.section st4jb +.section st4ka +.section st4kb +.section st4la +.section st4lb +.section st4ma +.section st4mb +.section st4na +.section st4nb +.section st4oa +.section st4ob +.section st4pa +.section st4pb +.section st4qa +.section st4qb +.section st4ra +.section st4rb +.section st4sa +.section st4sb +.section st4ta +.section st4tb +.section st4ua +.section st4ub +.section st4va +.section st4vb +.section st4wa +.section st4wb +.section st4xa +.section st4xb +.section st4ya +.section st4yb +.section st4za +.section st4zb +.section st41a +.section st41b +.section st42a +.section st42b +.section st43a +.section st43b +.section st44a +.section st44b +.section st45a +.section st45b +.section st46a +.section st46b +.section st47a +.section st47b +.section st48a +.section st48b +.section st49a +.section st49b +.section st40a +.section st40b +.section st5aa +.section st5ab +.section st5ba +.section st5bb +.section st5ca +.section st5cb +.section st5da +.section st5db +.section st5ea +.section st5eb +.section st5fa +.section st5fb +.section st5ga +.section st5gb +.section st5ha +.section st5hb +.section st5ia +.section st5ib +.section st5ja +.section st5jb +.section st5ka +.section st5kb +.section st5la +.section st5lb +.section st5ma +.section st5mb +.section st5na +.section st5nb +.section st5oa +.section st5ob +.section st5pa +.section st5pb +.section st5qa +.section st5qb +.section st5ra +.section st5rb +.section st5sa +.section st5sb +.section st5ta +.section st5tb +.section st5ua +.section st5ub +.section st5va +.section st5vb +.section st5wa +.section st5wb +.section st5xa +.section st5xb +.section st5ya +.section st5yb +.section st5za +.section st5zb +.section st51a +.section st51b +.section st52a +.section st52b +.section st53a +.section st53b +.section st54a +.section st54b +.section st55a +.section st55b +.section st56a +.section st56b +.section st57a +.section st57b +.section st58a +.section st58b +.section st59a +.section st59b +.section st50a +.section st50b +.section st6aa +.section st6ab +.section st6ba +.section st6bb +.section st6ca +.section st6cb +.section st6da +.section st6db +.section st6ea +.section st6eb +.section st6fa +.section st6fb +.section st6ga +.section st6gb +.section st6ha +.section st6hb +.section st6ia +.section st6ib +.section st6ja +.section st6jb +.section st6ka +.section st6kb +.section st6la +.section st6lb +.section st6ma +.section st6mb +.section st6na +.section st6nb +.section st6oa +.section st6ob +.section st6pa +.section st6pb +.section st6qa +.section st6qb +.section st6ra +.section st6rb +.section st6sa +.section st6sb +.section st6ta +.section st6tb +.section st6ua +.section st6ub +.section st6va +.section st6vb +.section st6wa +.section st6wb +.section st6xa +.section st6xb +.section st6ya +.section st6yb +.section st6za +.section st6zb +.section st61a +.section st61b +.section st62a +.section st62b +.section st63a +.section st63b +.section st64a +.section st64b +.section st65a +.section st65b +.section st66a +.section st66b +.section st67a +.section st67b +.section st68a +.section st68b +.section st69a +.section st69b +.section st60a +.section st60b +.section st7aa +.section st7ab +.section st7ba +.section st7bb +.section st7ca +.section st7cb +.section st7da +.section st7db +.section st7ea +.section st7eb +.section st7fa +.section st7fb +.section st7ga +.section st7gb +.section st7ha +.section st7hb +.section st7ia +.section st7ib +.section st7ja +.section st7jb +.section st7ka +.section st7kb +.section st7la +.section st7lb +.section st7ma +.section st7mb +.section st7na +.section st7nb +.section st7oa +.section st7ob +.section st7pa +.section st7pb +.section st7qa +.section st7qb +.section st7ra +.section st7rb +.section st7sa +.section st7sb +.section st7ta +.section st7tb +.section st7ua +.section st7ub +.section st7va +.section st7vb +.section st7wa +.section st7wb +.section st7xa +.section st7xb +.section st7ya +.section st7yb +.section st7za +.section st7zb +.section st71a +.section st71b +.section st72a +.section st72b +.section st73a +.section st73b +.section st74a +.section st74b +.section st75a +.section st75b +.section st76a +.section st76b +.section st77a +.section st77b +.section st78a +.section st78b +.section st79a +.section st79b +.section st70a +.section st70b +.section st8aa +.section st8ab +.section st8ba +.section st8bb +.section st8ca +.section st8cb +.section st8da +.section st8db +.section st8ea +.section st8eb +.section st8fa +.section st8fb +.section st8ga +.section st8gb +.section st8ha +.section st8hb +.section st8ia +.section st8ib +.section st8ja +.section st8jb +.section st8ka +.section st8kb +.section st8la +.section st8lb +.section st8ma +.section st8mb +.section st8na +.section st8nb +.section st8oa +.section st8ob +.section st8pa +.section st8pb +.section st8qa +.section st8qb +.section st8ra +.section st8rb +.section st8sa +.section st8sb +.section st8ta +.section st8tb +.section st8ua +.section st8ub +.section st8va +.section st8vb +.section st8wa +.section st8wb +.section st8xa +.section st8xb +.section st8ya +.section st8yb +.section st8za +.section st8zb +.section st81a +.section st81b +.section st82a +.section st82b +.section st83a +.section st83b +.section st84a +.section st84b +.section st85a +.section st85b +.section st86a +.section st86b +.section st87a +.section st87b +.section st88a +.section st88b +.section st89a +.section st89b +.section st80a +.section st80b +.section st9aa +.section st9ab +.section st9ba +.section st9bb +.section st9ca +.section st9cb +.section st9da +.section st9db +.section st9ea +.section st9eb +.section st9fa +.section st9fb +.section st9ga +.section st9gb +.section st9ha +.section st9hb +.section st9ia +.section st9ib +.section st9ja +.section st9jb +.section st9ka +.section st9kb +.section st9la +.section st9lb +.section st9ma +.section st9mb +.section st9na +.section st9nb +.section st9oa +.section st9ob +.section st9pa +.section st9pb +.section st9qa +.section st9qb +.section st9ra +.section st9rb +.section st9sa +.section st9sb +.section st9ta +.section st9tb +.section st9ua +.section st9ub +.section st9va +.section st9vb +.section st9wa +.section st9wb +.section st9xa +.section st9xb +.section st9ya +.section st9yb +.section st9za +.section st9zb +.section st91a +.section st91b +.section st92a +.section st92b +.section st93a +.section st93b +.section st94a +.section st94b +.section st95a +.section st95b +.section st96a +.section st96b +.section st97a +.section st97b +.section st98a +.section st98b +.section st99a +.section st99b +.section st90a +.section st90b +.section st0aa +.section st0ab +.section st0ba +.section st0bb +.section st0ca +.section st0cb +.section st0da +.section st0db +.section st0ea +.section st0eb +.section st0fa +.section st0fb +.section st0ga +.section st0gb +.section st0ha +.section st0hb +.section st0ia +.section st0ib +.section st0ja +.section st0jb +.section st0ka +.section st0kb +.section st0la +.section st0lb +.section st0ma +.section st0mb +.section st0na +.section st0nb +.section st0oa +.section st0ob +.section st0pa +.section st0pb +.section st0qa +.section st0qb +.section st0ra +.section st0rb +.section st0sa +.section st0sb +.section st0ta +.section st0tb +.section st0ua +.section st0ub +.section st0va +.section st0vb +.section st0wa +.section st0wb +.section st0xa +.section st0xb +.section st0ya +.section st0yb +.section st0za +.section st0zb +.section st01a +.section st01b +.section st02a +.section st02b +.section st03a +.section st03b +.section st04a +.section st04b +.section st05a +.section st05b +.section st06a +.section st06b +.section st07a +.section st07b +.section st08a +.section st08b +.section st09a +.section st09b +.section st00a +.section st00b +.section suaaa +.section suaab +.section suaba +.section suabb +.section suaca +.section suacb +.section suada +.section suadb +.section suaea +.section suaeb +.section suafa +.section suafb +.section suaga +.section suagb +.section suaha +.section suahb +.section suaia +.section suaib +.section suaja +.section suajb +.section suaka +.section suakb +.section suala +.section sualb +.section suama +.section suamb +.section suana +.section suanb +.section suaoa +.section suaob +.section suapa +.section suapb +.section suaqa +.section suaqb +.section suara +.section suarb +.section suasa +.section suasb +.section suata +.section suatb +.section suaua +.section suaub +.section suava +.section suavb +.section suawa +.section suawb +.section suaxa +.section suaxb +.section suaya +.section suayb +.section suaza +.section suazb +.section sua1a +.section sua1b +.section sua2a +.section sua2b +.section sua3a +.section sua3b +.section sua4a +.section sua4b +.section sua5a +.section sua5b +.section sua6a +.section sua6b +.section sua7a +.section sua7b +.section sua8a +.section sua8b +.section sua9a +.section sua9b +.section sua0a +.section sua0b +.section subaa +.section subab +.section subba +.section subbb +.section subca +.section subcb +.section subda +.section subdb +.section subea +.section subeb +.section subfa +.section subfb +.section subga +.section subgb +.section subha +.section subhb +.section subia +.section subib +.section subja +.section subjb +.section subka +.section subkb +.section subla +.section sublb +.section subma +.section submb +.section subna +.section subnb +.section suboa +.section subob +.section subpa +.section subpb +.section subqa +.section subqb +.section subra +.section subrb +.section subsa +.section subsb +.section subta +.section subtb +.section subua +.section subub +.section subva +.section subvb +.section subwa +.section subwb +.section subxa +.section subxb +.section subya +.section subyb +.section subza +.section subzb +.section sub1a +.section sub1b +.section sub2a +.section sub2b +.section sub3a +.section sub3b +.section sub4a +.section sub4b +.section sub5a +.section sub5b +.section sub6a +.section sub6b +.section sub7a +.section sub7b +.section sub8a +.section sub8b +.section sub9a +.section sub9b +.section sub0a +.section sub0b +.section sucaa +.section sucab +.section sucba +.section sucbb +.section succa +.section succb +.section sucda +.section sucdb +.section sucea +.section suceb +.section sucfa +.section sucfb +.section sucga +.section sucgb +.section sucha +.section suchb +.section sucia +.section sucib +.section sucja +.section sucjb +.section sucka +.section suckb +.section sucla +.section suclb +.section sucma +.section sucmb +.section sucna +.section sucnb +.section sucoa +.section sucob +.section sucpa +.section sucpb +.section sucqa +.section sucqb +.section sucra +.section sucrb +.section sucsa +.section sucsb +.section sucta +.section suctb +.section sucua +.section sucub +.section sucva +.section sucvb +.section sucwa +.section sucwb +.section sucxa +.section sucxb +.section sucya +.section sucyb +.section sucza +.section suczb +.section suc1a +.section suc1b +.section suc2a +.section suc2b +.section suc3a +.section suc3b +.section suc4a +.section suc4b +.section suc5a +.section suc5b +.section suc6a +.section suc6b +.section suc7a +.section suc7b +.section suc8a +.section suc8b +.section suc9a +.section suc9b +.section suc0a +.section suc0b +.section sudaa +.section sudab +.section sudba +.section sudbb +.section sudca +.section sudcb +.section sudda +.section suddb +.section sudea +.section sudeb +.section sudfa +.section sudfb +.section sudga +.section sudgb +.section sudha +.section sudhb +.section sudia +.section sudib +.section sudja +.section sudjb +.section sudka +.section sudkb +.section sudla +.section sudlb +.section sudma +.section sudmb +.section sudna +.section sudnb +.section sudoa +.section sudob +.section sudpa +.section sudpb +.section sudqa +.section sudqb +.section sudra +.section sudrb +.section sudsa +.section sudsb +.section sudta +.section sudtb +.section sudua +.section sudub +.section sudva +.section sudvb +.section sudwa +.section sudwb +.section sudxa +.section sudxb +.section sudya +.section sudyb +.section sudza +.section sudzb +.section sud1a +.section sud1b +.section sud2a +.section sud2b +.section sud3a +.section sud3b +.section sud4a +.section sud4b +.section sud5a +.section sud5b +.section sud6a +.section sud6b +.section sud7a +.section sud7b +.section sud8a +.section sud8b +.section sud9a +.section sud9b +.section sud0a +.section sud0b +.section sueaa +.section sueab +.section sueba +.section suebb +.section sueca +.section suecb +.section sueda +.section suedb +.section sueea +.section sueeb +.section suefa +.section suefb +.section suega +.section suegb +.section sueha +.section suehb +.section sueia +.section sueib +.section sueja +.section suejb +.section sueka +.section suekb +.section suela +.section suelb +.section suema +.section suemb +.section suena +.section suenb +.section sueoa +.section sueob +.section suepa +.section suepb +.section sueqa +.section sueqb +.section suera +.section suerb +.section suesa +.section suesb +.section sueta +.section suetb +.section sueua +.section sueub +.section sueva +.section suevb +.section suewa +.section suewb +.section suexa +.section suexb +.section sueya +.section sueyb +.section sueza +.section suezb +.section sue1a +.section sue1b +.section sue2a +.section sue2b +.section sue3a +.section sue3b +.section sue4a +.section sue4b +.section sue5a +.section sue5b +.section sue6a +.section sue6b +.section sue7a +.section sue7b +.section sue8a +.section sue8b +.section sue9a +.section sue9b +.section sue0a +.section sue0b +.section sufaa +.section sufab +.section sufba +.section sufbb +.section sufca +.section sufcb +.section sufda +.section sufdb +.section sufea +.section sufeb +.section suffa +.section suffb +.section sufga +.section sufgb +.section sufha +.section sufhb +.section sufia +.section sufib +.section sufja +.section sufjb +.section sufka +.section sufkb +.section sufla +.section suflb +.section sufma +.section sufmb +.section sufna +.section sufnb +.section sufoa +.section sufob +.section sufpa +.section sufpb +.section sufqa +.section sufqb +.section sufra +.section sufrb +.section sufsa +.section sufsb +.section sufta +.section suftb +.section sufua +.section sufub +.section sufva +.section sufvb +.section sufwa +.section sufwb +.section sufxa +.section sufxb +.section sufya +.section sufyb +.section sufza +.section sufzb +.section suf1a +.section suf1b +.section suf2a +.section suf2b +.section suf3a +.section suf3b +.section suf4a +.section suf4b +.section suf5a +.section suf5b +.section suf6a +.section suf6b +.section suf7a +.section suf7b +.section suf8a +.section suf8b +.section suf9a +.section suf9b +.section suf0a +.section suf0b +.section sugaa +.section sugab +.section sugba +.section sugbb +.section sugca +.section sugcb +.section sugda +.section sugdb +.section sugea +.section sugeb +.section sugfa +.section sugfb +.section sugga +.section suggb +.section sugha +.section sughb +.section sugia +.section sugib +.section sugja +.section sugjb +.section sugka +.section sugkb +.section sugla +.section suglb +.section sugma +.section sugmb +.section sugna +.section sugnb +.section sugoa +.section sugob +.section sugpa +.section sugpb +.section sugqa +.section sugqb +.section sugra +.section sugrb +.section sugsa +.section sugsb +.section sugta +.section sugtb +.section sugua +.section sugub +.section sugva +.section sugvb +.section sugwa +.section sugwb +.section sugxa +.section sugxb +.section sugya +.section sugyb +.section sugza +.section sugzb +.section sug1a +.section sug1b +.section sug2a +.section sug2b +.section sug3a +.section sug3b +.section sug4a +.section sug4b +.section sug5a +.section sug5b +.section sug6a +.section sug6b +.section sug7a +.section sug7b +.section sug8a +.section sug8b +.section sug9a +.section sug9b +.section sug0a +.section sug0b +.section suhaa +.section suhab +.section suhba +.section suhbb +.section suhca +.section suhcb +.section suhda +.section suhdb +.section suhea +.section suheb +.section suhfa +.section suhfb +.section suhga +.section suhgb +.section suhha +.section suhhb +.section suhia +.section suhib +.section suhja +.section suhjb +.section suhka +.section suhkb +.section suhla +.section suhlb +.section suhma +.section suhmb +.section suhna +.section suhnb +.section suhoa +.section suhob +.section suhpa +.section suhpb +.section suhqa +.section suhqb +.section suhra +.section suhrb +.section suhsa +.section suhsb +.section suhta +.section suhtb +.section suhua +.section suhub +.section suhva +.section suhvb +.section suhwa +.section suhwb +.section suhxa +.section suhxb +.section suhya +.section suhyb +.section suhza +.section suhzb +.section suh1a +.section suh1b +.section suh2a +.section suh2b +.section suh3a +.section suh3b +.section suh4a +.section suh4b +.section suh5a +.section suh5b +.section suh6a +.section suh6b +.section suh7a +.section suh7b +.section suh8a +.section suh8b +.section suh9a +.section suh9b +.section suh0a +.section suh0b +.section suiaa +.section suiab +.section suiba +.section suibb +.section suica +.section suicb +.section suida +.section suidb +.section suiea +.section suieb +.section suifa +.section suifb +.section suiga +.section suigb +.section suiha +.section suihb +.section suiia +.section suiib +.section suija +.section suijb +.section suika +.section suikb +.section suila +.section suilb +.section suima +.section suimb +.section suina +.section suinb +.section suioa +.section suiob +.section suipa +.section suipb +.section suiqa +.section suiqb +.section suira +.section suirb +.section suisa +.section suisb +.section suita +.section suitb +.section suiua +.section suiub +.section suiva +.section suivb +.section suiwa +.section suiwb +.section suixa +.section suixb +.section suiya +.section suiyb +.section suiza +.section suizb +.section sui1a +.section sui1b +.section sui2a +.section sui2b +.section sui3a +.section sui3b +.section sui4a +.section sui4b +.section sui5a +.section sui5b +.section sui6a +.section sui6b +.section sui7a +.section sui7b +.section sui8a +.section sui8b +.section sui9a +.section sui9b +.section sui0a +.section sui0b +.section sujaa +.section sujab +.section sujba +.section sujbb +.section sujca +.section sujcb +.section sujda +.section sujdb +.section sujea +.section sujeb +.section sujfa +.section sujfb +.section sujga +.section sujgb +.section sujha +.section sujhb +.section sujia +.section sujib +.section sujja +.section sujjb +.section sujka +.section sujkb +.section sujla +.section sujlb +.section sujma +.section sujmb +.section sujna +.section sujnb +.section sujoa +.section sujob +.section sujpa +.section sujpb +.section sujqa +.section sujqb +.section sujra +.section sujrb +.section sujsa +.section sujsb +.section sujta +.section sujtb +.section sujua +.section sujub +.section sujva +.section sujvb +.section sujwa +.section sujwb +.section sujxa +.section sujxb +.section sujya +.section sujyb +.section sujza +.section sujzb +.section suj1a +.section suj1b +.section suj2a +.section suj2b +.section suj3a +.section suj3b +.section suj4a +.section suj4b +.section suj5a +.section suj5b +.section suj6a +.section suj6b +.section suj7a +.section suj7b +.section suj8a +.section suj8b +.section suj9a +.section suj9b +.section suj0a +.section suj0b +.section sukaa +.section sukab +.section sukba +.section sukbb +.section sukca +.section sukcb +.section sukda +.section sukdb +.section sukea +.section sukeb +.section sukfa +.section sukfb +.section sukga +.section sukgb +.section sukha +.section sukhb +.section sukia +.section sukib +.section sukja +.section sukjb +.section sukka +.section sukkb +.section sukla +.section suklb +.section sukma +.section sukmb +.section sukna +.section suknb +.section sukoa +.section sukob +.section sukpa +.section sukpb +.section sukqa +.section sukqb +.section sukra +.section sukrb +.section suksa +.section suksb +.section sukta +.section suktb +.section sukua +.section sukub +.section sukva +.section sukvb +.section sukwa +.section sukwb +.section sukxa +.section sukxb +.section sukya +.section sukyb +.section sukza +.section sukzb +.section suk1a +.section suk1b +.section suk2a +.section suk2b +.section suk3a +.section suk3b +.section suk4a +.section suk4b +.section suk5a +.section suk5b +.section suk6a +.section suk6b +.section suk7a +.section suk7b +.section suk8a +.section suk8b +.section suk9a +.section suk9b +.section suk0a +.section suk0b +.section sulaa +.section sulab +.section sulba +.section sulbb +.section sulca +.section sulcb +.section sulda +.section suldb +.section sulea +.section suleb +.section sulfa +.section sulfb +.section sulga +.section sulgb +.section sulha +.section sulhb +.section sulia +.section sulib +.section sulja +.section suljb +.section sulka +.section sulkb +.section sulla +.section sullb +.section sulma +.section sulmb +.section sulna +.section sulnb +.section suloa +.section sulob +.section sulpa +.section sulpb +.section sulqa +.section sulqb +.section sulra +.section sulrb +.section sulsa +.section sulsb +.section sulta +.section sultb +.section sulua +.section sulub +.section sulva +.section sulvb +.section sulwa +.section sulwb +.section sulxa +.section sulxb +.section sulya +.section sulyb +.section sulza +.section sulzb +.section sul1a +.section sul1b +.section sul2a +.section sul2b +.section sul3a +.section sul3b +.section sul4a +.section sul4b +.section sul5a +.section sul5b +.section sul6a +.section sul6b +.section sul7a +.section sul7b +.section sul8a +.section sul8b +.section sul9a +.section sul9b +.section sul0a +.section sul0b +.section sumaa +.section sumab +.section sumba +.section sumbb +.section sumca +.section sumcb +.section sumda +.section sumdb +.section sumea +.section sumeb +.section sumfa +.section sumfb +.section sumga +.section sumgb +.section sumha +.section sumhb +.section sumia +.section sumib +.section sumja +.section sumjb +.section sumka +.section sumkb +.section sumla +.section sumlb +.section summa +.section summb +.section sumna +.section sumnb +.section sumoa +.section sumob +.section sumpa +.section sumpb +.section sumqa +.section sumqb +.section sumra +.section sumrb +.section sumsa +.section sumsb +.section sumta +.section sumtb +.section sumua +.section sumub +.section sumva +.section sumvb +.section sumwa +.section sumwb +.section sumxa +.section sumxb +.section sumya +.section sumyb +.section sumza +.section sumzb +.section sum1a +.section sum1b +.section sum2a +.section sum2b +.section sum3a +.section sum3b +.section sum4a +.section sum4b +.section sum5a +.section sum5b +.section sum6a +.section sum6b +.section sum7a +.section sum7b +.section sum8a +.section sum8b +.section sum9a +.section sum9b +.section sum0a +.section sum0b +.section sunaa +.section sunab +.section sunba +.section sunbb +.section sunca +.section suncb +.section sunda +.section sundb +.section sunea +.section suneb +.section sunfa +.section sunfb +.section sunga +.section sungb +.section sunha +.section sunhb +.section sunia +.section sunib +.section sunja +.section sunjb +.section sunka +.section sunkb +.section sunla +.section sunlb +.section sunma +.section sunmb +.section sunna +.section sunnb +.section sunoa +.section sunob +.section sunpa +.section sunpb +.section sunqa +.section sunqb +.section sunra +.section sunrb +.section sunsa +.section sunsb +.section sunta +.section suntb +.section sunua +.section sunub +.section sunva +.section sunvb +.section sunwa +.section sunwb +.section sunxa +.section sunxb +.section sunya +.section sunyb +.section sunza +.section sunzb +.section sun1a +.section sun1b +.section sun2a +.section sun2b +.section sun3a +.section sun3b +.section sun4a +.section sun4b +.section sun5a +.section sun5b +.section sun6a +.section sun6b +.section sun7a +.section sun7b +.section sun8a +.section sun8b +.section sun9a +.section sun9b +.section sun0a +.section sun0b +.section suoaa +.section suoab +.section suoba +.section suobb +.section suoca +.section suocb +.section suoda +.section suodb +.section suoea +.section suoeb +.section suofa +.section suofb +.section suoga +.section suogb +.section suoha +.section suohb +.section suoia +.section suoib +.section suoja +.section suojb +.section suoka +.section suokb +.section suola +.section suolb +.section suoma +.section suomb +.section suona +.section suonb +.section suooa +.section suoob +.section suopa +.section suopb +.section suoqa +.section suoqb +.section suora +.section suorb +.section suosa +.section suosb +.section suota +.section suotb +.section suoua +.section suoub +.section suova +.section suovb +.section suowa +.section suowb +.section suoxa +.section suoxb +.section suoya +.section suoyb +.section suoza +.section suozb +.section suo1a +.section suo1b +.section suo2a +.section suo2b +.section suo3a +.section suo3b +.section suo4a +.section suo4b +.section suo5a +.section suo5b +.section suo6a +.section suo6b +.section suo7a +.section suo7b +.section suo8a +.section suo8b +.section suo9a +.section suo9b +.section suo0a +.section suo0b +.section supaa +.section supab +.section supba +.section supbb +.section supca +.section supcb +.section supda +.section supdb +.section supea +.section supeb +.section supfa +.section supfb +.section supga +.section supgb +.section supha +.section suphb +.section supia +.section supib +.section supja +.section supjb +.section supka +.section supkb +.section supla +.section suplb +.section supma +.section supmb +.section supna +.section supnb +.section supoa +.section supob +.section suppa +.section suppb +.section supqa +.section supqb +.section supra +.section suprb +.section supsa +.section supsb +.section supta +.section suptb +.section supua +.section supub +.section supva +.section supvb +.section supwa +.section supwb +.section supxa +.section supxb +.section supya +.section supyb +.section supza +.section supzb +.section sup1a +.section sup1b +.section sup2a +.section sup2b +.section sup3a +.section sup3b +.section sup4a +.section sup4b +.section sup5a +.section sup5b +.section sup6a +.section sup6b +.section sup7a +.section sup7b +.section sup8a +.section sup8b +.section sup9a +.section sup9b +.section sup0a +.section sup0b +.section suqaa +.section suqab +.section suqba +.section suqbb +.section suqca +.section suqcb +.section suqda +.section suqdb +.section suqea +.section suqeb +.section suqfa +.section suqfb +.section suqga +.section suqgb +.section suqha +.section suqhb +.section suqia +.section suqib +.section suqja +.section suqjb +.section suqka +.section suqkb +.section suqla +.section suqlb +.section suqma +.section suqmb +.section suqna +.section suqnb +.section suqoa +.section suqob +.section suqpa +.section suqpb +.section suqqa +.section suqqb +.section suqra +.section suqrb +.section suqsa +.section suqsb +.section suqta +.section suqtb +.section suqua +.section suqub +.section suqva +.section suqvb +.section suqwa +.section suqwb +.section suqxa +.section suqxb +.section suqya +.section suqyb +.section suqza +.section suqzb +.section suq1a +.section suq1b +.section suq2a +.section suq2b +.section suq3a +.section suq3b +.section suq4a +.section suq4b +.section suq5a +.section suq5b +.section suq6a +.section suq6b +.section suq7a +.section suq7b +.section suq8a +.section suq8b +.section suq9a +.section suq9b +.section suq0a +.section suq0b +.section suraa +.section surab +.section surba +.section surbb +.section surca +.section surcb +.section surda +.section surdb +.section surea +.section sureb +.section surfa +.section surfb +.section surga +.section surgb +.section surha +.section surhb +.section suria +.section surib +.section surja +.section surjb +.section surka +.section surkb +.section surla +.section surlb +.section surma +.section surmb +.section surna +.section surnb +.section suroa +.section surob +.section surpa +.section surpb +.section surqa +.section surqb +.section surra +.section surrb +.section sursa +.section sursb +.section surta +.section surtb +.section surua +.section surub +.section surva +.section survb +.section surwa +.section surwb +.section surxa +.section surxb +.section surya +.section suryb +.section surza +.section surzb +.section sur1a +.section sur1b +.section sur2a +.section sur2b +.section sur3a +.section sur3b +.section sur4a +.section sur4b +.section sur5a +.section sur5b +.section sur6a +.section sur6b +.section sur7a +.section sur7b +.section sur8a +.section sur8b +.section sur9a +.section sur9b +.section sur0a +.section sur0b +.section susaa +.section susab +.section susba +.section susbb +.section susca +.section suscb +.section susda +.section susdb +.section susea +.section suseb +.section susfa +.section susfb +.section susga +.section susgb +.section susha +.section sushb +.section susia +.section susib +.section susja +.section susjb +.section suska +.section suskb +.section susla +.section suslb +.section susma +.section susmb +.section susna +.section susnb +.section susoa +.section susob +.section suspa +.section suspb +.section susqa +.section susqb +.section susra +.section susrb +.section sussa +.section sussb +.section susta +.section sustb +.section susua +.section susub +.section susva +.section susvb +.section suswa +.section suswb +.section susxa +.section susxb +.section susya +.section susyb +.section susza +.section suszb +.section sus1a +.section sus1b +.section sus2a +.section sus2b +.section sus3a +.section sus3b +.section sus4a +.section sus4b +.section sus5a +.section sus5b +.section sus6a +.section sus6b +.section sus7a +.section sus7b +.section sus8a +.section sus8b +.section sus9a +.section sus9b +.section sus0a +.section sus0b +.section sutaa +.section sutab +.section sutba +.section sutbb +.section sutca +.section sutcb +.section sutda +.section sutdb +.section sutea +.section suteb +.section sutfa +.section sutfb +.section sutga +.section sutgb +.section sutha +.section suthb +.section sutia +.section sutib +.section sutja +.section sutjb +.section sutka +.section sutkb +.section sutla +.section sutlb +.section sutma +.section sutmb +.section sutna +.section sutnb +.section sutoa +.section sutob +.section sutpa +.section sutpb +.section sutqa +.section sutqb +.section sutra +.section sutrb +.section sutsa +.section sutsb +.section sutta +.section suttb +.section sutua +.section sutub +.section sutva +.section sutvb +.section sutwa +.section sutwb +.section sutxa +.section sutxb +.section sutya +.section sutyb +.section sutza +.section sutzb +.section sut1a +.section sut1b +.section sut2a +.section sut2b +.section sut3a +.section sut3b +.section sut4a +.section sut4b +.section sut5a +.section sut5b +.section sut6a +.section sut6b +.section sut7a +.section sut7b +.section sut8a +.section sut8b +.section sut9a +.section sut9b +.section sut0a +.section sut0b +.section suuaa +.section suuab +.section suuba +.section suubb +.section suuca +.section suucb +.section suuda +.section suudb +.section suuea +.section suueb +.section suufa +.section suufb +.section suuga +.section suugb +.section suuha +.section suuhb +.section suuia +.section suuib +.section suuja +.section suujb +.section suuka +.section suukb +.section suula +.section suulb +.section suuma +.section suumb +.section suuna +.section suunb +.section suuoa +.section suuob +.section suupa +.section suupb +.section suuqa +.section suuqb +.section suura +.section suurb +.section suusa +.section suusb +.section suuta +.section suutb +.section suuua +.section suuub +.section suuva +.section suuvb +.section suuwa +.section suuwb +.section suuxa +.section suuxb +.section suuya +.section suuyb +.section suuza +.section suuzb +.section suu1a +.section suu1b +.section suu2a +.section suu2b +.section suu3a +.section suu3b +.section suu4a +.section suu4b +.section suu5a +.section suu5b +.section suu6a +.section suu6b +.section suu7a +.section suu7b +.section suu8a +.section suu8b +.section suu9a +.section suu9b +.section suu0a +.section suu0b +.section suvaa +.section suvab +.section suvba +.section suvbb +.section suvca +.section suvcb +.section suvda +.section suvdb +.section suvea +.section suveb +.section suvfa +.section suvfb +.section suvga +.section suvgb +.section suvha +.section suvhb +.section suvia +.section suvib +.section suvja +.section suvjb +.section suvka +.section suvkb +.section suvla +.section suvlb +.section suvma +.section suvmb +.section suvna +.section suvnb +.section suvoa +.section suvob +.section suvpa +.section suvpb +.section suvqa +.section suvqb +.section suvra +.section suvrb +.section suvsa +.section suvsb +.section suvta +.section suvtb +.section suvua +.section suvub +.section suvva +.section suvvb +.section suvwa +.section suvwb +.section suvxa +.section suvxb +.section suvya +.section suvyb +.section suvza +.section suvzb +.section suv1a +.section suv1b +.section suv2a +.section suv2b +.section suv3a +.section suv3b +.section suv4a +.section suv4b +.section suv5a +.section suv5b +.section suv6a +.section suv6b +.section suv7a +.section suv7b +.section suv8a +.section suv8b +.section suv9a +.section suv9b +.section suv0a +.section suv0b +.section suwaa +.section suwab +.section suwba +.section suwbb +.section suwca +.section suwcb +.section suwda +.section suwdb +.section suwea +.section suweb +.section suwfa +.section suwfb +.section suwga +.section suwgb +.section suwha +.section suwhb +.section suwia +.section suwib +.section suwja +.section suwjb +.section suwka +.section suwkb +.section suwla +.section suwlb +.section suwma +.section suwmb +.section suwna +.section suwnb +.section suwoa +.section suwob +.section suwpa +.section suwpb +.section suwqa +.section suwqb +.section suwra +.section suwrb +.section suwsa +.section suwsb +.section suwta +.section suwtb +.section suwua +.section suwub +.section suwva +.section suwvb +.section suwwa +.section suwwb +.section suwxa +.section suwxb +.section suwya +.section suwyb +.section suwza +.section suwzb +.section suw1a +.section suw1b +.section suw2a +.section suw2b +.section suw3a +.section suw3b +.section suw4a +.section suw4b +.section suw5a +.section suw5b +.section suw6a +.section suw6b +.section suw7a +.section suw7b +.section suw8a +.section suw8b +.section suw9a +.section suw9b +.section suw0a +.section suw0b +.section suxaa +.section suxab +.section suxba +.section suxbb +.section suxca +.section suxcb +.section suxda +.section suxdb +.section suxea +.section suxeb +.section suxfa +.section suxfb +.section suxga +.section suxgb +.section suxha +.section suxhb +.section suxia +.section suxib +.section suxja +.section suxjb +.section suxka +.section suxkb +.section suxla +.section suxlb +.section suxma +.section suxmb +.section suxna +.section suxnb +.section suxoa +.section suxob +.section suxpa +.section suxpb +.section suxqa +.section suxqb +.section suxra +.section suxrb +.section suxsa +.section suxsb +.section suxta +.section suxtb +.section suxua +.section suxub +.section suxva +.section suxvb +.section suxwa +.section suxwb +.section suxxa +.section suxxb +.section suxya +.section suxyb +.section suxza +.section suxzb +.section sux1a +.section sux1b +.section sux2a +.section sux2b +.section sux3a +.section sux3b +.section sux4a +.section sux4b +.section sux5a +.section sux5b +.section sux6a +.section sux6b +.section sux7a +.section sux7b +.section sux8a +.section sux8b +.section sux9a +.section sux9b +.section sux0a +.section sux0b +.section suyaa +.section suyab +.section suyba +.section suybb +.section suyca +.section suycb +.section suyda +.section suydb +.section suyea +.section suyeb +.section suyfa +.section suyfb +.section suyga +.section suygb +.section suyha +.section suyhb +.section suyia +.section suyib +.section suyja +.section suyjb +.section suyka +.section suykb +.section suyla +.section suylb +.section suyma +.section suymb +.section suyna +.section suynb +.section suyoa +.section suyob +.section suypa +.section suypb +.section suyqa +.section suyqb +.section suyra +.section suyrb +.section suysa +.section suysb +.section suyta +.section suytb +.section suyua +.section suyub +.section suyva +.section suyvb +.section suywa +.section suywb +.section suyxa +.section suyxb +.section suyya +.section suyyb +.section suyza +.section suyzb +.section suy1a +.section suy1b +.section suy2a +.section suy2b +.section suy3a +.section suy3b +.section suy4a +.section suy4b +.section suy5a +.section suy5b +.section suy6a +.section suy6b +.section suy7a +.section suy7b +.section suy8a +.section suy8b +.section suy9a +.section suy9b +.section suy0a +.section suy0b +.section suzaa +.section suzab +.section suzba +.section suzbb +.section suzca +.section suzcb +.section suzda +.section suzdb +.section suzea +.section suzeb +.section suzfa +.section suzfb +.section suzga +.section suzgb +.section suzha +.section suzhb +.section suzia +.section suzib +.section suzja +.section suzjb +.section suzka +.section suzkb +.section suzla +.section suzlb +.section suzma +.section suzmb +.section suzna +.section suznb +.section suzoa +.section suzob +.section suzpa +.section suzpb +.section suzqa +.section suzqb +.section suzra +.section suzrb +.section suzsa +.section suzsb +.section suzta +.section suztb +.section suzua +.section suzub +.section suzva +.section suzvb +.section suzwa +.section suzwb +.section suzxa +.section suzxb +.section suzya +.section suzyb +.section suzza +.section suzzb +.section suz1a +.section suz1b +.section suz2a +.section suz2b +.section suz3a +.section suz3b +.section suz4a +.section suz4b +.section suz5a +.section suz5b +.section suz6a +.section suz6b +.section suz7a +.section suz7b +.section suz8a +.section suz8b +.section suz9a +.section suz9b +.section suz0a +.section suz0b +.section su1aa +.section su1ab +.section su1ba +.section su1bb +.section su1ca +.section su1cb +.section su1da +.section su1db +.section su1ea +.section su1eb +.section su1fa +.section su1fb +.section su1ga +.section su1gb +.section su1ha +.section su1hb +.section su1ia +.section su1ib +.section su1ja +.section su1jb +.section su1ka +.section su1kb +.section su1la +.section su1lb +.section su1ma +.section su1mb +.section su1na +.section su1nb +.section su1oa +.section su1ob +.section su1pa +.section su1pb +.section su1qa +.section su1qb +.section su1ra +.section su1rb +.section su1sa +.section su1sb +.section su1ta +.section su1tb +.section su1ua +.section su1ub +.section su1va +.section su1vb +.section su1wa +.section su1wb +.section su1xa +.section su1xb +.section su1ya +.section su1yb +.section su1za +.section su1zb +.section su11a +.section su11b +.section su12a +.section su12b +.section su13a +.section su13b +.section su14a +.section su14b +.section su15a +.section su15b +.section su16a +.section su16b +.section su17a +.section su17b +.section su18a +.section su18b +.section su19a +.section su19b +.section su10a +.section su10b +.section su2aa +.section su2ab +.section su2ba +.section su2bb +.section su2ca +.section su2cb +.section su2da +.section su2db +.section su2ea +.section su2eb +.section su2fa +.section su2fb +.section su2ga +.section su2gb +.section su2ha +.section su2hb +.section su2ia +.section su2ib +.section su2ja +.section su2jb +.section su2ka +.section su2kb +.section su2la +.section su2lb +.section su2ma +.section su2mb +.section su2na +.section su2nb +.section su2oa +.section su2ob +.section su2pa +.section su2pb +.section su2qa +.section su2qb +.section su2ra +.section su2rb +.section su2sa +.section su2sb +.section su2ta +.section su2tb +.section su2ua +.section su2ub +.section su2va +.section su2vb +.section su2wa +.section su2wb +.section su2xa +.section su2xb +.section su2ya +.section su2yb +.section su2za +.section su2zb +.section su21a +.section su21b +.section su22a +.section su22b +.section su23a +.section su23b +.section su24a +.section su24b +.section su25a +.section su25b +.section su26a +.section su26b +.section su27a +.section su27b +.section su28a +.section su28b +.section su29a +.section su29b +.section su20a +.section su20b +.section su3aa +.section su3ab +.section su3ba +.section su3bb +.section su3ca +.section su3cb +.section su3da +.section su3db +.section su3ea +.section su3eb +.section su3fa +.section su3fb +.section su3ga +.section su3gb +.section su3ha +.section su3hb +.section su3ia +.section su3ib +.section su3ja +.section su3jb +.section su3ka +.section su3kb +.section su3la +.section su3lb +.section su3ma +.section su3mb +.section su3na +.section su3nb +.section su3oa +.section su3ob +.section su3pa +.section su3pb +.section su3qa +.section su3qb +.section su3ra +.section su3rb +.section su3sa +.section su3sb +.section su3ta +.section su3tb +.section su3ua +.section su3ub +.section su3va +.section su3vb +.section su3wa +.section su3wb +.section su3xa +.section su3xb +.section su3ya +.section su3yb +.section su3za +.section su3zb +.section su31a +.section su31b +.section su32a +.section su32b +.section su33a +.section su33b +.section su34a +.section su34b +.section su35a +.section su35b +.section su36a +.section su36b +.section su37a +.section su37b +.section su38a +.section su38b +.section su39a +.section su39b +.section su30a +.section su30b +.section su4aa +.section su4ab +.section su4ba +.section su4bb +.section su4ca +.section su4cb +.section su4da +.section su4db +.section su4ea +.section su4eb +.section su4fa +.section su4fb +.section su4ga +.section su4gb +.section su4ha +.section su4hb +.section su4ia +.section su4ib +.section su4ja +.section su4jb +.section su4ka +.section su4kb +.section su4la +.section su4lb +.section su4ma +.section su4mb +.section su4na +.section su4nb +.section su4oa +.section su4ob +.section su4pa +.section su4pb +.section su4qa +.section su4qb +.section su4ra +.section su4rb +.section su4sa +.section su4sb +.section su4ta +.section su4tb +.section su4ua +.section su4ub +.section su4va +.section su4vb +.section su4wa +.section su4wb +.section su4xa +.section su4xb +.section su4ya +.section su4yb +.section su4za +.section su4zb +.section su41a +.section su41b +.section su42a +.section su42b +.section su43a +.section su43b +.section su44a +.section su44b +.section su45a +.section su45b +.section su46a +.section su46b +.section su47a +.section su47b +.section su48a +.section su48b +.section su49a +.section su49b +.section su40a +.section su40b +.section su5aa +.section su5ab +.section su5ba +.section su5bb +.section su5ca +.section su5cb +.section su5da +.section su5db +.section su5ea +.section su5eb +.section su5fa +.section su5fb +.section su5ga +.section su5gb +.section su5ha +.section su5hb +.section su5ia +.section su5ib +.section su5ja +.section su5jb +.section su5ka +.section su5kb +.section su5la +.section su5lb +.section su5ma +.section su5mb +.section su5na +.section su5nb +.section su5oa +.section su5ob +.section su5pa +.section su5pb +.section su5qa +.section su5qb +.section su5ra +.section su5rb +.section su5sa +.section su5sb +.section su5ta +.section su5tb +.section su5ua +.section su5ub +.section su5va +.section su5vb +.section su5wa +.section su5wb +.section su5xa +.section su5xb +.section su5ya +.section su5yb +.section su5za +.section su5zb +.section su51a +.section su51b +.section su52a +.section su52b +.section su53a +.section su53b +.section su54a +.section su54b +.section su55a +.section su55b +.section su56a +.section su56b +.section su57a +.section su57b +.section su58a +.section su58b +.section su59a +.section su59b +.section su50a +.section su50b +.section su6aa +.section su6ab +.section su6ba +.section su6bb +.section su6ca +.section su6cb +.section su6da +.section su6db +.section su6ea +.section su6eb +.section su6fa +.section su6fb +.section su6ga +.section su6gb +.section su6ha +.section su6hb +.section su6ia +.section su6ib +.section su6ja +.section su6jb +.section su6ka +.section su6kb +.section su6la +.section su6lb +.section su6ma +.section su6mb +.section su6na +.section su6nb +.section su6oa +.section su6ob +.section su6pa +.section su6pb +.section su6qa +.section su6qb +.section su6ra +.section su6rb +.section su6sa +.section su6sb +.section su6ta +.section su6tb +.section su6ua +.section su6ub +.section su6va +.section su6vb +.section su6wa +.section su6wb +.section su6xa +.section su6xb +.section su6ya +.section su6yb +.section su6za +.section su6zb +.section su61a +.section su61b +.section su62a +.section su62b +.section su63a +.section su63b +.section su64a +.section su64b +.section su65a +.section su65b +.section su66a +.section su66b +.section su67a +.section su67b +.section su68a +.section su68b +.section su69a +.section su69b +.section su60a +.section su60b +.section su7aa +.section su7ab +.section su7ba +.section su7bb +.section su7ca +.section su7cb +.section su7da +.section su7db +.section su7ea +.section su7eb +.section su7fa +.section su7fb +.section su7ga +.section su7gb +.section su7ha +.section su7hb +.section su7ia +.section su7ib +.section su7ja +.section su7jb +.section su7ka +.section su7kb +.section su7la +.section su7lb +.section su7ma +.section su7mb +.section su7na +.section su7nb +.section su7oa +.section su7ob +.section su7pa +.section su7pb +.section su7qa +.section su7qb +.section su7ra +.section su7rb +.section su7sa +.section su7sb +.section su7ta +.section su7tb +.section su7ua +.section su7ub +.section su7va +.section su7vb +.section su7wa +.section su7wb +.section su7xa +.section su7xb +.section su7ya +.section su7yb +.section su7za +.section su7zb +.section su71a +.section su71b +.section su72a +.section su72b +.section su73a +.section su73b +.section su74a +.section su74b +.section su75a +.section su75b +.section su76a +.section su76b +.section su77a +.section su77b +.section su78a +.section su78b +.section su79a +.section su79b +.section su70a +.section su70b +.section su8aa +.section su8ab +.section su8ba +.section su8bb +.section su8ca +.section su8cb +.section su8da +.section su8db +.section su8ea +.section su8eb +.section su8fa +.section su8fb +.section su8ga +.section su8gb +.section su8ha +.section su8hb +.section su8ia +.section su8ib +.section su8ja +.section su8jb +.section su8ka +.section su8kb +.section su8la +.section su8lb +.section su8ma +.section su8mb +.section su8na +.section su8nb +.section su8oa +.section su8ob +.section su8pa +.section su8pb +.section su8qa +.section su8qb +.section su8ra +.section su8rb +.section su8sa +.section su8sb +.section su8ta +.section su8tb +.section su8ua +.section su8ub +.section su8va +.section su8vb +.section su8wa +.section su8wb +.section su8xa +.section su8xb +.section su8ya +.section su8yb +.section su8za +.section su8zb +.section su81a +.section su81b +.section su82a +.section su82b +.section su83a +.section su83b +.section su84a +.section su84b +.section su85a +.section su85b +.section su86a +.section su86b +.section su87a +.section su87b +.section su88a +.section su88b +.section su89a +.section su89b +.section su80a +.section su80b +.section su9aa +.section su9ab +.section su9ba +.section su9bb +.section su9ca +.section su9cb +.section su9da +.section su9db +.section su9ea +.section su9eb +.section su9fa +.section su9fb +.section su9ga +.section su9gb +.section su9ha +.section su9hb +.section su9ia +.section su9ib +.section su9ja +.section su9jb +.section su9ka +.section su9kb +.section su9la +.section su9lb +.section su9ma +.section su9mb +.section su9na +.section su9nb +.section su9oa +.section su9ob +.section su9pa +.section su9pb +.section su9qa +.section su9qb +.section su9ra +.section su9rb +.section su9sa +.section su9sb +.section su9ta +.section su9tb +.section su9ua +.section su9ub +.section su9va +.section su9vb +.section su9wa +.section su9wb +.section su9xa +.section su9xb +.section su9ya +.section su9yb +.section su9za +.section su9zb +.section su91a +.section su91b +.section su92a +.section su92b +.section su93a +.section su93b +.section su94a +.section su94b +.section su95a +.section su95b +.section su96a +.section su96b +.section su97a +.section su97b +.section su98a +.section su98b +.section su99a +.section su99b +.section su90a +.section su90b +.section su0aa +.section su0ab +.section su0ba +.section su0bb +.section su0ca +.section su0cb +.section su0da +.section su0db +.section su0ea +.section su0eb +.section su0fa +.section su0fb +.section su0ga +.section su0gb +.section su0ha +.section su0hb +.section su0ia +.section su0ib +.section su0ja +.section su0jb +.section su0ka +.section su0kb +.section su0la +.section su0lb +.section su0ma +.section su0mb +.section su0na +.section su0nb +.section su0oa +.section su0ob +.section su0pa +.section su0pb +.section su0qa +.section su0qb +.section su0ra +.section su0rb +.section su0sa +.section su0sb +.section su0ta +.section su0tb +.section su0ua +.section su0ub +.section su0va +.section su0vb +.section su0wa +.section su0wb +.section su0xa +.section su0xb +.section su0ya +.section su0yb +.section su0za +.section su0zb +.section su01a +.section su01b +.section su02a +.section su02b +.section su03a +.section su03b +.section su04a +.section su04b +.section su05a +.section su05b +.section su06a +.section su06b +.section su07a +.section su07b +.section su08a +.section su08b +.section su09a +.section su09b +.section su00a +.section su00b +.section svaaa +.section svaab +.section svaba +.section svabb +.section svaca +.section svacb +.section svada +.section svadb +.section svaea +.section svaeb +.section svafa +.section svafb +.section svaga +.section svagb +.section svaha +.section svahb +.section svaia +.section svaib +.section svaja +.section svajb +.section svaka +.section svakb +.section svala +.section svalb +.section svama +.section svamb +.section svana +.section svanb +.section svaoa +.section svaob +.section svapa +.section svapb +.section svaqa +.section svaqb +.section svara +.section svarb +.section svasa +.section svasb +.section svata +.section svatb +.section svaua +.section svaub +.section svava +.section svavb +.section svawa +.section svawb +.section svaxa +.section svaxb +.section svaya +.section svayb +.section svaza +.section svazb +.section sva1a +.section sva1b +.section sva2a +.section sva2b +.section sva3a +.section sva3b +.section sva4a +.section sva4b +.section sva5a +.section sva5b +.section sva6a +.section sva6b +.section sva7a +.section sva7b +.section sva8a +.section sva8b +.section sva9a +.section sva9b +.section sva0a +.section sva0b +.section svbaa +.section svbab +.section svbba +.section svbbb +.section svbca +.section svbcb +.section svbda +.section svbdb +.section svbea +.section svbeb +.section svbfa +.section svbfb +.section svbga +.section svbgb +.section svbha +.section svbhb +.section svbia +.section svbib +.section svbja +.section svbjb +.section svbka +.section svbkb +.section svbla +.section svblb +.section svbma +.section svbmb +.section svbna +.section svbnb +.section svboa +.section svbob +.section svbpa +.section svbpb +.section svbqa +.section svbqb +.section svbra +.section svbrb +.section svbsa +.section svbsb +.section svbta +.section svbtb +.section svbua +.section svbub +.section svbva +.section svbvb +.section svbwa +.section svbwb +.section svbxa +.section svbxb +.section svbya +.section svbyb +.section svbza +.section svbzb +.section svb1a +.section svb1b +.section svb2a +.section svb2b +.section svb3a +.section svb3b +.section svb4a +.section svb4b +.section svb5a +.section svb5b +.section svb6a +.section svb6b +.section svb7a +.section svb7b +.section svb8a +.section svb8b +.section svb9a +.section svb9b +.section svb0a +.section svb0b +.section svcaa +.section svcab +.section svcba +.section svcbb +.section svcca +.section svccb +.section svcda +.section svcdb +.section svcea +.section svceb +.section svcfa +.section svcfb +.section svcga +.section svcgb +.section svcha +.section svchb +.section svcia +.section svcib +.section svcja +.section svcjb +.section svcka +.section svckb +.section svcla +.section svclb +.section svcma +.section svcmb +.section svcna +.section svcnb +.section svcoa +.section svcob +.section svcpa +.section svcpb +.section svcqa +.section svcqb +.section svcra +.section svcrb +.section svcsa +.section svcsb +.section svcta +.section svctb +.section svcua +.section svcub +.section svcva +.section svcvb +.section svcwa +.section svcwb +.section svcxa +.section svcxb +.section svcya +.section svcyb +.section svcza +.section svczb +.section svc1a +.section svc1b +.section svc2a +.section svc2b +.section svc3a +.section svc3b +.section svc4a +.section svc4b +.section svc5a +.section svc5b +.section svc6a +.section svc6b +.section svc7a +.section svc7b +.section svc8a +.section svc8b +.section svc9a +.section svc9b +.section svc0a +.section svc0b +.section svdaa +.section svdab +.section svdba +.section svdbb +.section svdca +.section svdcb +.section svdda +.section svddb +.section svdea +.section svdeb +.section svdfa +.section svdfb +.section svdga +.section svdgb +.section svdha +.section svdhb +.section svdia +.section svdib +.section svdja +.section svdjb +.section svdka +.section svdkb +.section svdla +.section svdlb +.section svdma +.section svdmb +.section svdna +.section svdnb +.section svdoa +.section svdob +.section svdpa +.section svdpb +.section svdqa +.section svdqb +.section svdra +.section svdrb +.section svdsa +.section svdsb +.section svdta +.section svdtb +.section svdua +.section svdub +.section svdva +.section svdvb +.section svdwa +.section svdwb +.section svdxa +.section svdxb +.section svdya +.section svdyb +.section svdza +.section svdzb +.section svd1a +.section svd1b +.section svd2a +.section svd2b +.section svd3a +.section svd3b +.section svd4a +.section svd4b +.section svd5a +.section svd5b +.section svd6a +.section svd6b +.section svd7a +.section svd7b +.section svd8a +.section svd8b +.section svd9a +.section svd9b +.section svd0a +.section svd0b +.section sveaa +.section sveab +.section sveba +.section svebb +.section sveca +.section svecb +.section sveda +.section svedb +.section sveea +.section sveeb +.section svefa +.section svefb +.section svega +.section svegb +.section sveha +.section svehb +.section sveia +.section sveib +.section sveja +.section svejb +.section sveka +.section svekb +.section svela +.section svelb +.section svema +.section svemb +.section svena +.section svenb +.section sveoa +.section sveob +.section svepa +.section svepb +.section sveqa +.section sveqb +.section svera +.section sverb +.section svesa +.section svesb +.section sveta +.section svetb +.section sveua +.section sveub +.section sveva +.section svevb +.section svewa +.section svewb +.section svexa +.section svexb +.section sveya +.section sveyb +.section sveza +.section svezb +.section sve1a +.section sve1b +.section sve2a +.section sve2b +.section sve3a +.section sve3b +.section sve4a +.section sve4b +.section sve5a +.section sve5b +.section sve6a +.section sve6b +.section sve7a +.section sve7b +.section sve8a +.section sve8b +.section sve9a +.section sve9b +.section sve0a +.section sve0b +.section svfaa +.section svfab +.section svfba +.section svfbb +.section svfca +.section svfcb +.section svfda +.section svfdb +.section svfea +.section svfeb +.section svffa +.section svffb +.section svfga +.section svfgb +.section svfha +.section svfhb +.section svfia +.section svfib +.section svfja +.section svfjb +.section svfka +.section svfkb +.section svfla +.section svflb +.section svfma +.section svfmb +.section svfna +.section svfnb +.section svfoa +.section svfob +.section svfpa +.section svfpb +.section svfqa +.section svfqb +.section svfra +.section svfrb +.section svfsa +.section svfsb +.section svfta +.section svftb +.section svfua +.section svfub +.section svfva +.section svfvb +.section svfwa +.section svfwb +.section svfxa +.section svfxb +.section svfya +.section svfyb +.section svfza +.section svfzb +.section svf1a +.section svf1b +.section svf2a +.section svf2b +.section svf3a +.section svf3b +.section svf4a +.section svf4b +.section svf5a +.section svf5b +.section svf6a +.section svf6b +.section svf7a +.section svf7b +.section svf8a +.section svf8b +.section svf9a +.section svf9b +.section svf0a +.section svf0b +.section svgaa +.section svgab +.section svgba +.section svgbb +.section svgca +.section svgcb +.section svgda +.section svgdb +.section svgea +.section svgeb +.section svgfa +.section svgfb +.section svgga +.section svggb +.section svgha +.section svghb +.section svgia +.section svgib +.section svgja +.section svgjb +.section svgka +.section svgkb +.section svgla +.section svglb +.section svgma +.section svgmb +.section svgna +.section svgnb +.section svgoa +.section svgob +.section svgpa +.section svgpb +.section svgqa +.section svgqb +.section svgra +.section svgrb +.section svgsa +.section svgsb +.section svgta +.section svgtb +.section svgua +.section svgub +.section svgva +.section svgvb +.section svgwa +.section svgwb +.section svgxa +.section svgxb +.section svgya +.section svgyb +.section svgza +.section svgzb +.section svg1a +.section svg1b +.section svg2a +.section svg2b +.section svg3a +.section svg3b +.section svg4a +.section svg4b +.section svg5a +.section svg5b +.section svg6a +.section svg6b +.section svg7a +.section svg7b +.section svg8a +.section svg8b +.section svg9a +.section svg9b +.section svg0a +.section svg0b +.section svhaa +.section svhab +.section svhba +.section svhbb +.section svhca +.section svhcb +.section svhda +.section svhdb +.section svhea +.section svheb +.section svhfa +.section svhfb +.section svhga +.section svhgb +.section svhha +.section svhhb +.section svhia +.section svhib +.section svhja +.section svhjb +.section svhka +.section svhkb +.section svhla +.section svhlb +.section svhma +.section svhmb +.section svhna +.section svhnb +.section svhoa +.section svhob +.section svhpa +.section svhpb +.section svhqa +.section svhqb +.section svhra +.section svhrb +.section svhsa +.section svhsb +.section svhta +.section svhtb +.section svhua +.section svhub +.section svhva +.section svhvb +.section svhwa +.section svhwb +.section svhxa +.section svhxb +.section svhya +.section svhyb +.section svhza +.section svhzb +.section svh1a +.section svh1b +.section svh2a +.section svh2b +.section svh3a +.section svh3b +.section svh4a +.section svh4b +.section svh5a +.section svh5b +.section svh6a +.section svh6b +.section svh7a +.section svh7b +.section svh8a +.section svh8b +.section svh9a +.section svh9b +.section svh0a +.section svh0b +.section sviaa +.section sviab +.section sviba +.section svibb +.section svica +.section svicb +.section svida +.section svidb +.section sviea +.section svieb +.section svifa +.section svifb +.section sviga +.section svigb +.section sviha +.section svihb +.section sviia +.section sviib +.section svija +.section svijb +.section svika +.section svikb +.section svila +.section svilb +.section svima +.section svimb +.section svina +.section svinb +.section svioa +.section sviob +.section svipa +.section svipb +.section sviqa +.section sviqb +.section svira +.section svirb +.section svisa +.section svisb +.section svita +.section svitb +.section sviua +.section sviub +.section sviva +.section svivb +.section sviwa +.section sviwb +.section svixa +.section svixb +.section sviya +.section sviyb +.section sviza +.section svizb +.section svi1a +.section svi1b +.section svi2a +.section svi2b +.section svi3a +.section svi3b +.section svi4a +.section svi4b +.section svi5a +.section svi5b +.section svi6a +.section svi6b +.section svi7a +.section svi7b +.section svi8a +.section svi8b +.section svi9a +.section svi9b +.section svi0a +.section svi0b +.section svjaa +.section svjab +.section svjba +.section svjbb +.section svjca +.section svjcb +.section svjda +.section svjdb +.section svjea +.section svjeb +.section svjfa +.section svjfb +.section svjga +.section svjgb +.section svjha +.section svjhb +.section svjia +.section svjib +.section svjja +.section svjjb +.section svjka +.section svjkb +.section svjla +.section svjlb +.section svjma +.section svjmb +.section svjna +.section svjnb +.section svjoa +.section svjob +.section svjpa +.section svjpb +.section svjqa +.section svjqb +.section svjra +.section svjrb +.section svjsa +.section svjsb +.section svjta +.section svjtb +.section svjua +.section svjub +.section svjva +.section svjvb +.section svjwa +.section svjwb +.section svjxa +.section svjxb +.section svjya +.section svjyb +.section svjza +.section svjzb +.section svj1a +.section svj1b +.section svj2a +.section svj2b +.section svj3a +.section svj3b +.section svj4a +.section svj4b +.section svj5a +.section svj5b +.section svj6a +.section svj6b +.section svj7a +.section svj7b +.section svj8a +.section svj8b +.section svj9a +.section svj9b +.section svj0a +.section svj0b +.section svkaa +.section svkab +.section svkba +.section svkbb +.section svkca +.section svkcb +.section svkda +.section svkdb +.section svkea +.section svkeb +.section svkfa +.section svkfb +.section svkga +.section svkgb +.section svkha +.section svkhb +.section svkia +.section svkib +.section svkja +.section svkjb +.section svkka +.section svkkb +.section svkla +.section svklb +.section svkma +.section svkmb +.section svkna +.section svknb +.section svkoa +.section svkob +.section svkpa +.section svkpb +.section svkqa +.section svkqb +.section svkra +.section svkrb +.section svksa +.section svksb +.section svkta +.section svktb +.section svkua +.section svkub +.section svkva +.section svkvb +.section svkwa +.section svkwb +.section svkxa +.section svkxb +.section svkya +.section svkyb +.section svkza +.section svkzb +.section svk1a +.section svk1b +.section svk2a +.section svk2b +.section svk3a +.section svk3b +.section svk4a +.section svk4b +.section svk5a +.section svk5b +.section svk6a +.section svk6b +.section svk7a +.section svk7b +.section svk8a +.section svk8b +.section svk9a +.section svk9b +.section svk0a +.section svk0b +.section svlaa +.section svlab +.section svlba +.section svlbb +.section svlca +.section svlcb +.section svlda +.section svldb +.section svlea +.section svleb +.section svlfa +.section svlfb +.section svlga +.section svlgb +.section svlha +.section svlhb +.section svlia +.section svlib +.section svlja +.section svljb +.section svlka +.section svlkb +.section svlla +.section svllb +.section svlma +.section svlmb +.section svlna +.section svlnb +.section svloa +.section svlob +.section svlpa +.section svlpb +.section svlqa +.section svlqb +.section svlra +.section svlrb +.section svlsa +.section svlsb +.section svlta +.section svltb +.section svlua +.section svlub +.section svlva +.section svlvb +.section svlwa +.section svlwb +.section svlxa +.section svlxb +.section svlya +.section svlyb +.section svlza +.section svlzb +.section svl1a +.section svl1b +.section svl2a +.section svl2b +.section svl3a +.section svl3b +.section svl4a +.section svl4b +.section svl5a +.section svl5b +.section svl6a +.section svl6b +.section svl7a +.section svl7b +.section svl8a +.section svl8b +.section svl9a +.section svl9b +.section svl0a +.section svl0b +.section svmaa +.section svmab +.section svmba +.section svmbb +.section svmca +.section svmcb +.section svmda +.section svmdb +.section svmea +.section svmeb +.section svmfa +.section svmfb +.section svmga +.section svmgb +.section svmha +.section svmhb +.section svmia +.section svmib +.section svmja +.section svmjb +.section svmka +.section svmkb +.section svmla +.section svmlb +.section svmma +.section svmmb +.section svmna +.section svmnb +.section svmoa +.section svmob +.section svmpa +.section svmpb +.section svmqa +.section svmqb +.section svmra +.section svmrb +.section svmsa +.section svmsb +.section svmta +.section svmtb +.section svmua +.section svmub +.section svmva +.section svmvb +.section svmwa +.section svmwb +.section svmxa +.section svmxb +.section svmya +.section svmyb +.section svmza +.section svmzb +.section svm1a +.section svm1b +.section svm2a +.section svm2b +.section svm3a +.section svm3b +.section svm4a +.section svm4b +.section svm5a +.section svm5b +.section svm6a +.section svm6b +.section svm7a +.section svm7b +.section svm8a +.section svm8b +.section svm9a +.section svm9b +.section svm0a +.section svm0b +.section svnaa +.section svnab +.section svnba +.section svnbb +.section svnca +.section svncb +.section svnda +.section svndb +.section svnea +.section svneb +.section svnfa +.section svnfb +.section svnga +.section svngb +.section svnha +.section svnhb +.section svnia +.section svnib +.section svnja +.section svnjb +.section svnka +.section svnkb +.section svnla +.section svnlb +.section svnma +.section svnmb +.section svnna +.section svnnb +.section svnoa +.section svnob +.section svnpa +.section svnpb +.section svnqa +.section svnqb +.section svnra +.section svnrb +.section svnsa +.section svnsb +.section svnta +.section svntb +.section svnua +.section svnub +.section svnva +.section svnvb +.section svnwa +.section svnwb +.section svnxa +.section svnxb +.section svnya +.section svnyb +.section svnza +.section svnzb +.section svn1a +.section svn1b +.section svn2a +.section svn2b +.section svn3a +.section svn3b +.section svn4a +.section svn4b +.section svn5a +.section svn5b +.section svn6a +.section svn6b +.section svn7a +.section svn7b +.section svn8a +.section svn8b +.section svn9a +.section svn9b +.section svn0a +.section svn0b +.section svoaa +.section svoab +.section svoba +.section svobb +.section svoca +.section svocb +.section svoda +.section svodb +.section svoea +.section svoeb +.section svofa +.section svofb +.section svoga +.section svogb +.section svoha +.section svohb +.section svoia +.section svoib +.section svoja +.section svojb +.section svoka +.section svokb +.section svola +.section svolb +.section svoma +.section svomb +.section svona +.section svonb +.section svooa +.section svoob +.section svopa +.section svopb +.section svoqa +.section svoqb +.section svora +.section svorb +.section svosa +.section svosb +.section svota +.section svotb +.section svoua +.section svoub +.section svova +.section svovb +.section svowa +.section svowb +.section svoxa +.section svoxb +.section svoya +.section svoyb +.section svoza +.section svozb +.section svo1a +.section svo1b +.section svo2a +.section svo2b +.section svo3a +.section svo3b +.section svo4a +.section svo4b +.section svo5a +.section svo5b +.section svo6a +.section svo6b +.section svo7a +.section svo7b +.section svo8a +.section svo8b +.section svo9a +.section svo9b +.section svo0a +.section svo0b +.section svpaa +.section svpab +.section svpba +.section svpbb +.section svpca +.section svpcb +.section svpda +.section svpdb +.section svpea +.section svpeb +.section svpfa +.section svpfb +.section svpga +.section svpgb +.section svpha +.section svphb +.section svpia +.section svpib +.section svpja +.section svpjb +.section svpka +.section svpkb +.section svpla +.section svplb +.section svpma +.section svpmb +.section svpna +.section svpnb +.section svpoa +.section svpob +.section svppa +.section svppb +.section svpqa +.section svpqb +.section svpra +.section svprb +.section svpsa +.section svpsb +.section svpta +.section svptb +.section svpua +.section svpub +.section svpva +.section svpvb +.section svpwa +.section svpwb +.section svpxa +.section svpxb +.section svpya +.section svpyb +.section svpza +.section svpzb +.section svp1a +.section svp1b +.section svp2a +.section svp2b +.section svp3a +.section svp3b +.section svp4a +.section svp4b +.section svp5a +.section svp5b +.section svp6a +.section svp6b +.section svp7a +.section svp7b +.section svp8a +.section svp8b +.section svp9a +.section svp9b +.section svp0a +.section svp0b +.section svqaa +.section svqab +.section svqba +.section svqbb +.section svqca +.section svqcb +.section svqda +.section svqdb +.section svqea +.section svqeb +.section svqfa +.section svqfb +.section svqga +.section svqgb +.section svqha +.section svqhb +.section svqia +.section svqib +.section svqja +.section svqjb +.section svqka +.section svqkb +.section svqla +.section svqlb +.section svqma +.section svqmb +.section svqna +.section svqnb +.section svqoa +.section svqob +.section svqpa +.section svqpb +.section svqqa +.section svqqb +.section svqra +.section svqrb +.section svqsa +.section svqsb +.section svqta +.section svqtb +.section svqua +.section svqub +.section svqva +.section svqvb +.section svqwa +.section svqwb +.section svqxa +.section svqxb +.section svqya +.section svqyb +.section svqza +.section svqzb +.section svq1a +.section svq1b +.section svq2a +.section svq2b +.section svq3a +.section svq3b +.section svq4a +.section svq4b +.section svq5a +.section svq5b +.section svq6a +.section svq6b +.section svq7a +.section svq7b +.section svq8a +.section svq8b +.section svq9a +.section svq9b +.section svq0a +.section svq0b +.section svraa +.section svrab +.section svrba +.section svrbb +.section svrca +.section svrcb +.section svrda +.section svrdb +.section svrea +.section svreb +.section svrfa +.section svrfb +.section svrga +.section svrgb +.section svrha +.section svrhb +.section svria +.section svrib +.section svrja +.section svrjb +.section svrka +.section svrkb +.section svrla +.section svrlb +.section svrma +.section svrmb +.section svrna +.section svrnb +.section svroa +.section svrob +.section svrpa +.section svrpb +.section svrqa +.section svrqb +.section svrra +.section svrrb +.section svrsa +.section svrsb +.section svrta +.section svrtb +.section svrua +.section svrub +.section svrva +.section svrvb +.section svrwa +.section svrwb +.section svrxa +.section svrxb +.section svrya +.section svryb +.section svrza +.section svrzb +.section svr1a +.section svr1b +.section svr2a +.section svr2b +.section svr3a +.section svr3b +.section svr4a +.section svr4b +.section svr5a +.section svr5b +.section svr6a +.section svr6b +.section svr7a +.section svr7b +.section svr8a +.section svr8b +.section svr9a +.section svr9b +.section svr0a +.section svr0b +.section svsaa +.section svsab +.section svsba +.section svsbb +.section svsca +.section svscb +.section svsda +.section svsdb +.section svsea +.section svseb +.section svsfa +.section svsfb +.section svsga +.section svsgb +.section svsha +.section svshb +.section svsia +.section svsib +.section svsja +.section svsjb +.section svska +.section svskb +.section svsla +.section svslb +.section svsma +.section svsmb +.section svsna +.section svsnb +.section svsoa +.section svsob +.section svspa +.section svspb +.section svsqa +.section svsqb +.section svsra +.section svsrb +.section svssa +.section svssb +.section svsta +.section svstb +.section svsua +.section svsub +.section svsva +.section svsvb +.section svswa +.section svswb +.section svsxa +.section svsxb +.section svsya +.section svsyb +.section svsza +.section svszb +.section svs1a +.section svs1b +.section svs2a +.section svs2b +.section svs3a +.section svs3b +.section svs4a +.section svs4b +.section svs5a +.section svs5b +.section svs6a +.section svs6b +.section svs7a +.section svs7b +.section svs8a +.section svs8b +.section svs9a +.section svs9b +.section svs0a +.section svs0b +.section svtaa +.section svtab +.section svtba +.section svtbb +.section svtca +.section svtcb +.section svtda +.section svtdb +.section svtea +.section svteb +.section svtfa +.section svtfb +.section svtga +.section svtgb +.section svtha +.section svthb +.section svtia +.section svtib +.section svtja +.section svtjb +.section svtka +.section svtkb +.section svtla +.section svtlb +.section svtma +.section svtmb +.section svtna +.section svtnb +.section svtoa +.section svtob +.section svtpa +.section svtpb +.section svtqa +.section svtqb +.section svtra +.section svtrb +.section svtsa +.section svtsb +.section svtta +.section svttb +.section svtua +.section svtub +.section svtva +.section svtvb +.section svtwa +.section svtwb +.section svtxa +.section svtxb +.section svtya +.section svtyb +.section svtza +.section svtzb +.section svt1a +.section svt1b +.section svt2a +.section svt2b +.section svt3a +.section svt3b +.section svt4a +.section svt4b +.section svt5a +.section svt5b +.section svt6a +.section svt6b +.section svt7a +.section svt7b +.section svt8a +.section svt8b +.section svt9a +.section svt9b +.section svt0a +.section svt0b +.section svuaa +.section svuab +.section svuba +.section svubb +.section svuca +.section svucb +.section svuda +.section svudb +.section svuea +.section svueb +.section svufa +.section svufb +.section svuga +.section svugb +.section svuha +.section svuhb +.section svuia +.section svuib +.section svuja +.section svujb +.section svuka +.section svukb +.section svula +.section svulb +.section svuma +.section svumb +.section svuna +.section svunb +.section svuoa +.section svuob +.section svupa +.section svupb +.section svuqa +.section svuqb +.section svura +.section svurb +.section svusa +.section svusb +.section svuta +.section svutb +.section svuua +.section svuub +.section svuva +.section svuvb +.section svuwa +.section svuwb +.section svuxa +.section svuxb +.section svuya +.section svuyb +.section svuza +.section svuzb +.section svu1a +.section svu1b +.section svu2a +.section svu2b +.section svu3a +.section svu3b +.section svu4a +.section svu4b +.section svu5a +.section svu5b +.section svu6a +.section svu6b +.section svu7a +.section svu7b +.section svu8a +.section svu8b +.section svu9a +.section svu9b +.section svu0a +.section svu0b +.section svvaa +.section svvab +.section svvba +.section svvbb +.section svvca +.section svvcb +.section svvda +.section svvdb +.section svvea +.section svveb +.section svvfa +.section svvfb +.section svvga +.section svvgb +.section svvha +.section svvhb +.section svvia +.section svvib +.section svvja +.section svvjb +.section svvka +.section svvkb +.section svvla +.section svvlb +.section svvma +.section svvmb +.section svvna +.section svvnb +.section svvoa +.section svvob +.section svvpa +.section svvpb +.section svvqa +.section svvqb +.section svvra +.section svvrb +.section svvsa +.section svvsb +.section svvta +.section svvtb +.section svvua +.section svvub +.section svvva +.section svvvb +.section svvwa +.section svvwb +.section svvxa +.section svvxb +.section svvya +.section svvyb +.section svvza +.section svvzb +.section svv1a +.section svv1b +.section svv2a +.section svv2b +.section svv3a +.section svv3b +.section svv4a +.section svv4b +.section svv5a +.section svv5b +.section svv6a +.section svv6b +.section svv7a +.section svv7b +.section svv8a +.section svv8b +.section svv9a +.section svv9b +.section svv0a +.section svv0b +.section svwaa +.section svwab +.section svwba +.section svwbb +.section svwca +.section svwcb +.section svwda +.section svwdb +.section svwea +.section svweb +.section svwfa +.section svwfb +.section svwga +.section svwgb +.section svwha +.section svwhb +.section svwia +.section svwib +.section svwja +.section svwjb +.section svwka +.section svwkb +.section svwla +.section svwlb +.section svwma +.section svwmb +.section svwna +.section svwnb +.section svwoa +.section svwob +.section svwpa +.section svwpb +.section svwqa +.section svwqb +.section svwra +.section svwrb +.section svwsa +.section svwsb +.section svwta +.section svwtb +.section svwua +.section svwub +.section svwva +.section svwvb +.section svwwa +.section svwwb +.section svwxa +.section svwxb +.section svwya +.section svwyb +.section svwza +.section svwzb +.section svw1a +.section svw1b +.section svw2a +.section svw2b +.section svw3a +.section svw3b +.section svw4a +.section svw4b +.section svw5a +.section svw5b +.section svw6a +.section svw6b +.section svw7a +.section svw7b +.section svw8a +.section svw8b +.section svw9a +.section svw9b +.section svw0a +.section svw0b +.section svxaa +.section svxab +.section svxba +.section svxbb +.section svxca +.section svxcb +.section svxda +.section svxdb +.section svxea +.section svxeb +.section svxfa +.section svxfb +.section svxga +.section svxgb +.section svxha +.section svxhb +.section svxia +.section svxib +.section svxja +.section svxjb +.section svxka +.section svxkb +.section svxla +.section svxlb +.section svxma +.section svxmb +.section svxna +.section svxnb +.section svxoa +.section svxob +.section svxpa +.section svxpb +.section svxqa +.section svxqb +.section svxra +.section svxrb +.section svxsa +.section svxsb +.section svxta +.section svxtb +.section svxua +.section svxub +.section svxva +.section svxvb +.section svxwa +.section svxwb +.section svxxa +.section svxxb +.section svxya +.section svxyb +.section svxza +.section svxzb +.section svx1a +.section svx1b +.section svx2a +.section svx2b +.section svx3a +.section svx3b +.section svx4a +.section svx4b +.section svx5a +.section svx5b +.section svx6a +.section svx6b +.section svx7a +.section svx7b +.section svx8a +.section svx8b +.section svx9a +.section svx9b +.section svx0a +.section svx0b +.section svyaa +.section svyab +.section svyba +.section svybb +.section svyca +.section svycb +.section svyda +.section svydb +.section svyea +.section svyeb +.section svyfa +.section svyfb +.section svyga +.section svygb +.section svyha +.section svyhb +.section svyia +.section svyib +.section svyja +.section svyjb +.section svyka +.section svykb +.section svyla +.section svylb +.section svyma +.section svymb +.section svyna +.section svynb +.section svyoa +.section svyob +.section svypa +.section svypb +.section svyqa +.section svyqb +.section svyra +.section svyrb +.section svysa +.section svysb +.section svyta +.section svytb +.section svyua +.section svyub +.section svyva +.section svyvb +.section svywa +.section svywb +.section svyxa +.section svyxb +.section svyya +.section svyyb +.section svyza +.section svyzb +.section svy1a +.section svy1b +.section svy2a +.section svy2b +.section svy3a +.section svy3b +.section svy4a +.section svy4b +.section svy5a +.section svy5b +.section svy6a +.section svy6b +.section svy7a +.section svy7b +.section svy8a +.section svy8b +.section svy9a +.section svy9b +.section svy0a +.section svy0b +.section svzaa +.section svzab +.section svzba +.section svzbb +.section svzca +.section svzcb +.section svzda +.section svzdb +.section svzea +.section svzeb +.section svzfa +.section svzfb +.section svzga +.section svzgb +.section svzha +.section svzhb +.section svzia +.section svzib +.section svzja +.section svzjb +.section svzka +.section svzkb +.section svzla +.section svzlb +.section svzma +.section svzmb +.section svzna +.section svznb +.section svzoa +.section svzob +.section svzpa +.section svzpb +.section svzqa +.section svzqb +.section svzra +.section svzrb +.section svzsa +.section svzsb +.section svzta +.section svztb +.section svzua +.section svzub +.section svzva +.section svzvb +.section svzwa +.section svzwb +.section svzxa +.section svzxb +.section svzya +.section svzyb +.section svzza +.section svzzb +.section svz1a +.section svz1b +.section svz2a +.section svz2b +.section svz3a +.section svz3b +.section svz4a +.section svz4b +.section svz5a +.section svz5b +.section svz6a +.section svz6b +.section svz7a +.section svz7b +.section svz8a +.section svz8b +.section svz9a +.section svz9b +.section svz0a +.section svz0b +.section sv1aa +.section sv1ab +.section sv1ba +.section sv1bb +.section sv1ca +.section sv1cb +.section sv1da +.section sv1db +.section sv1ea +.section sv1eb +.section sv1fa +.section sv1fb +.section sv1ga +.section sv1gb +.section sv1ha +.section sv1hb +.section sv1ia +.section sv1ib +.section sv1ja +.section sv1jb +.section sv1ka +.section sv1kb +.section sv1la +.section sv1lb +.section sv1ma +.section sv1mb +.section sv1na +.section sv1nb +.section sv1oa +.section sv1ob +.section sv1pa +.section sv1pb +.section sv1qa +.section sv1qb +.section sv1ra +.section sv1rb +.section sv1sa +.section sv1sb +.section sv1ta +.section sv1tb +.section sv1ua +.section sv1ub +.section sv1va +.section sv1vb +.section sv1wa +.section sv1wb +.section sv1xa +.section sv1xb +.section sv1ya +.section sv1yb +.section sv1za +.section sv1zb +.section sv11a +.section sv11b +.section sv12a +.section sv12b +.section sv13a +.section sv13b +.section sv14a +.section sv14b +.section sv15a +.section sv15b +.section sv16a +.section sv16b +.section sv17a +.section sv17b +.section sv18a +.section sv18b +.section sv19a +.section sv19b +.section sv10a +.section sv10b +.section sv2aa +.section sv2ab +.section sv2ba +.section sv2bb +.section sv2ca +.section sv2cb +.section sv2da +.section sv2db +.section sv2ea +.section sv2eb +.section sv2fa +.section sv2fb +.section sv2ga +.section sv2gb +.section sv2ha +.section sv2hb +.section sv2ia +.section sv2ib +.section sv2ja +.section sv2jb +.section sv2ka +.section sv2kb +.section sv2la +.section sv2lb +.section sv2ma +.section sv2mb +.section sv2na +.section sv2nb +.section sv2oa +.section sv2ob +.section sv2pa +.section sv2pb +.section sv2qa +.section sv2qb +.section sv2ra +.section sv2rb +.section sv2sa +.section sv2sb +.section sv2ta +.section sv2tb +.section sv2ua +.section sv2ub +.section sv2va +.section sv2vb +.section sv2wa +.section sv2wb +.section sv2xa +.section sv2xb +.section sv2ya +.section sv2yb +.section sv2za +.section sv2zb +.section sv21a +.section sv21b +.section sv22a +.section sv22b +.section sv23a +.section sv23b +.section sv24a +.section sv24b +.section sv25a +.section sv25b +.section sv26a +.section sv26b +.section sv27a +.section sv27b +.section sv28a +.section sv28b +.section sv29a +.section sv29b +.section sv20a +.section sv20b +.section sv3aa +.section sv3ab +.section sv3ba +.section sv3bb +.section sv3ca +.section sv3cb +.section sv3da +.section sv3db +.section sv3ea +.section sv3eb +.section sv3fa +.section sv3fb +.section sv3ga +.section sv3gb +.section sv3ha +.section sv3hb +.section sv3ia +.section sv3ib +.section sv3ja +.section sv3jb +.section sv3ka +.section sv3kb +.section sv3la +.section sv3lb +.section sv3ma +.section sv3mb +.section sv3na +.section sv3nb +.section sv3oa +.section sv3ob +.section sv3pa +.section sv3pb +.section sv3qa +.section sv3qb +.section sv3ra +.section sv3rb +.section sv3sa +.section sv3sb +.section sv3ta +.section sv3tb +.section sv3ua +.section sv3ub +.section sv3va +.section sv3vb +.section sv3wa +.section sv3wb +.section sv3xa +.section sv3xb +.section sv3ya +.section sv3yb +.section sv3za +.section sv3zb +.section sv31a +.section sv31b +.section sv32a +.section sv32b +.section sv33a +.section sv33b +.section sv34a +.section sv34b +.section sv35a +.section sv35b +.section sv36a +.section sv36b +.section sv37a +.section sv37b +.section sv38a +.section sv38b +.section sv39a +.section sv39b +.section sv30a +.section sv30b +.section sv4aa +.section sv4ab +.section sv4ba +.section sv4bb +.section sv4ca +.section sv4cb +.section sv4da +.section sv4db +.section sv4ea +.section sv4eb +.section sv4fa +.section sv4fb +.section sv4ga +.section sv4gb +.section sv4ha +.section sv4hb +.section sv4ia +.section sv4ib +.section sv4ja +.section sv4jb +.section sv4ka +.section sv4kb +.section sv4la +.section sv4lb +.section sv4ma +.section sv4mb +.section sv4na +.section sv4nb +.section sv4oa +.section sv4ob +.section sv4pa +.section sv4pb +.section sv4qa +.section sv4qb +.section sv4ra +.section sv4rb +.section sv4sa +.section sv4sb +.section sv4ta +.section sv4tb +.section sv4ua +.section sv4ub +.section sv4va +.section sv4vb +.section sv4wa +.section sv4wb +.section sv4xa +.section sv4xb +.section sv4ya +.section sv4yb +.section sv4za +.section sv4zb +.section sv41a +.section sv41b +.section sv42a +.section sv42b +.section sv43a +.section sv43b +.section sv44a +.section sv44b +.section sv45a +.section sv45b +.section sv46a +.section sv46b +.section sv47a +.section sv47b +.section sv48a +.section sv48b +.section sv49a +.section sv49b +.section sv40a +.section sv40b +.section sv5aa +.section sv5ab +.section sv5ba +.section sv5bb +.section sv5ca +.section sv5cb +.section sv5da +.section sv5db +.section sv5ea +.section sv5eb +.section sv5fa +.section sv5fb +.section sv5ga +.section sv5gb +.section sv5ha +.section sv5hb +.section sv5ia +.section sv5ib +.section sv5ja +.section sv5jb +.section sv5ka +.section sv5kb +.section sv5la +.section sv5lb +.section sv5ma +.section sv5mb +.section sv5na +.section sv5nb +.section sv5oa +.section sv5ob +.section sv5pa +.section sv5pb +.section sv5qa +.section sv5qb +.section sv5ra +.section sv5rb +.section sv5sa +.section sv5sb +.section sv5ta +.section sv5tb +.section sv5ua +.section sv5ub +.section sv5va +.section sv5vb +.section sv5wa +.section sv5wb +.section sv5xa +.section sv5xb +.section sv5ya +.section sv5yb +.section sv5za +.section sv5zb +.section sv51a +.section sv51b +.section sv52a +.section sv52b +.section sv53a +.section sv53b +.section sv54a +.section sv54b +.section sv55a +.section sv55b +.section sv56a +.section sv56b +.section sv57a +.section sv57b +.section sv58a +.section sv58b +.section sv59a +.section sv59b +.section sv50a +.section sv50b +.section sv6aa +.section sv6ab +.section sv6ba +.section sv6bb +.section sv6ca +.section sv6cb +.section sv6da +.section sv6db +.section sv6ea +.section sv6eb +.section sv6fa +.section sv6fb +.section sv6ga +.section sv6gb +.section sv6ha +.section sv6hb +.section sv6ia +.section sv6ib +.section sv6ja +.section sv6jb +.section sv6ka +.section sv6kb +.section sv6la +.section sv6lb +.section sv6ma +.section sv6mb +.section sv6na +.section sv6nb +.section sv6oa +.section sv6ob +.section sv6pa +.section sv6pb +.section sv6qa +.section sv6qb +.section sv6ra +.section sv6rb +.section sv6sa +.section sv6sb +.section sv6ta +.section sv6tb +.section sv6ua +.section sv6ub +.section sv6va +.section sv6vb +.section sv6wa +.section sv6wb +.section sv6xa +.section sv6xb +.section sv6ya +.section sv6yb +.section sv6za +.section sv6zb +.section sv61a +.section sv61b +.section sv62a +.section sv62b +.section sv63a +.section sv63b +.section sv64a +.section sv64b +.section sv65a +.section sv65b +.section sv66a +.section sv66b +.section sv67a +.section sv67b +.section sv68a +.section sv68b +.section sv69a +.section sv69b +.section sv60a +.section sv60b +.section sv7aa +.section sv7ab +.section sv7ba +.section sv7bb +.section sv7ca +.section sv7cb +.section sv7da +.section sv7db +.section sv7ea +.section sv7eb +.section sv7fa +.section sv7fb +.section sv7ga +.section sv7gb +.section sv7ha +.section sv7hb +.section sv7ia +.section sv7ib +.section sv7ja +.section sv7jb +.section sv7ka +.section sv7kb +.section sv7la +.section sv7lb +.section sv7ma +.section sv7mb +.section sv7na +.section sv7nb +.section sv7oa +.section sv7ob +.section sv7pa +.section sv7pb +.section sv7qa +.section sv7qb +.section sv7ra +.section sv7rb +.section sv7sa +.section sv7sb +.section sv7ta +.section sv7tb +.section sv7ua +.section sv7ub +.section sv7va +.section sv7vb +.section sv7wa +.section sv7wb +.section sv7xa +.section sv7xb +.section sv7ya +.section sv7yb +.section sv7za +.section sv7zb +.section sv71a +.section sv71b +.section sv72a +.section sv72b +.section sv73a +.section sv73b +.section sv74a +.section sv74b +.section sv75a +.section sv75b +.section sv76a +.section sv76b +.section sv77a +.section sv77b +.section sv78a +.section sv78b +.section sv79a +.section sv79b +.section sv70a +.section sv70b +.section sv8aa +.section sv8ab +.section sv8ba +.section sv8bb +.section sv8ca +.section sv8cb +.section sv8da +.section sv8db +.section sv8ea +.section sv8eb +.section sv8fa +.section sv8fb +.section sv8ga +.section sv8gb +.section sv8ha +.section sv8hb +.section sv8ia +.section sv8ib +.section sv8ja +.section sv8jb +.section sv8ka +.section sv8kb +.section sv8la +.section sv8lb +.section sv8ma +.section sv8mb +.section sv8na +.section sv8nb +.section sv8oa +.section sv8ob +.section sv8pa +.section sv8pb +.section sv8qa +.section sv8qb +.section sv8ra +.section sv8rb +.section sv8sa +.section sv8sb +.section sv8ta +.section sv8tb +.section sv8ua +.section sv8ub +.section sv8va +.section sv8vb +.section sv8wa +.section sv8wb +.section sv8xa +.section sv8xb +.section sv8ya +.section sv8yb +.section sv8za +.section sv8zb +.section sv81a +.section sv81b +.section sv82a +.section sv82b +.section sv83a +.section sv83b +.section sv84a +.section sv84b +.section sv85a +.section sv85b +.section sv86a +.section sv86b +.section sv87a +.section sv87b +.section sv88a +.section sv88b +.section sv89a +.section sv89b +.section sv80a +.section sv80b +.section sv9aa +.section sv9ab +.section sv9ba +.section sv9bb +.section sv9ca +.section sv9cb +.section sv9da +.section sv9db +.section sv9ea +.section sv9eb +.section sv9fa +.section sv9fb +.section sv9ga +.section sv9gb +.section sv9ha +.section sv9hb +.section sv9ia +.section sv9ib +.section sv9ja +.section sv9jb +.section sv9ka +.section sv9kb +.section sv9la +.section sv9lb +.section sv9ma +.section sv9mb +.section sv9na +.section sv9nb +.section sv9oa +.section sv9ob +.section sv9pa +.section sv9pb +.section sv9qa +.section sv9qb +.section sv9ra +.section sv9rb +.section sv9sa +.section sv9sb +.section sv9ta +.section sv9tb +.section sv9ua +.section sv9ub +.section sv9va +.section sv9vb +.section sv9wa +.section sv9wb +.section sv9xa +.section sv9xb +.section sv9ya +.section sv9yb +.section sv9za +.section sv9zb +.section sv91a +.section sv91b +.section sv92a +.section sv92b +.section sv93a +.section sv93b +.section sv94a +.section sv94b +.section sv95a +.section sv95b +.section sv96a +.section sv96b +.section sv97a +.section sv97b +.section sv98a +.section sv98b +.section sv99a +.section sv99b +.section sv90a +.section sv90b +.section sv0aa +.section sv0ab +.section sv0ba +.section sv0bb +.section sv0ca +.section sv0cb +.section sv0da +.section sv0db +.section sv0ea +.section sv0eb +.section sv0fa +.section sv0fb +.section sv0ga +.section sv0gb +.section sv0ha +.section sv0hb +.section sv0ia +.section sv0ib +.section sv0ja +.section sv0jb +.section sv0ka +.section sv0kb +.section sv0la +.section sv0lb +.section sv0ma +.section sv0mb +.section sv0na +.section sv0nb +.section sv0oa +.section sv0ob +.section sv0pa +.section sv0pb +.section sv0qa +.section sv0qb +.section sv0ra +.section sv0rb +.section sv0sa +.section sv0sb +.section sv0ta +.section sv0tb +.section sv0ua +.section sv0ub +.section sv0va +.section sv0vb +.section sv0wa +.section sv0wb +.section sv0xa +.section sv0xb +.section sv0ya +.section sv0yb +.section sv0za +.section sv0zb +.section sv01a +.section sv01b +.section sv02a +.section sv02b +.section sv03a +.section sv03b +.section sv04a +.section sv04b +.section sv05a +.section sv05b +.section sv06a +.section sv06b +.section sv07a +.section sv07b +.section sv08a +.section sv08b +.section sv09a +.section sv09b +.section sv00a +.section sv00b +.section swaaa +.section swaab +.section swaba +.section swabb +.section swaca +.section swacb +.section swada +.section swadb +.section swaea +.section swaeb +.section swafa +.section swafb +.section swaga +.section swagb +.section swaha +.section swahb +.section swaia +.section swaib +.section swaja +.section swajb +.section swaka +.section swakb +.section swala +.section swalb +.section swama +.section swamb +.section swana +.section swanb +.section swaoa +.section swaob +.section swapa +.section swapb +.section swaqa +.section swaqb +.section swara +.section swarb +.section swasa +.section swasb +.section swata +.section swatb +.section swaua +.section swaub +.section swava +.section swavb +.section swawa +.section swawb +.section swaxa +.section swaxb +.section swaya +.section swayb +.section swaza +.section swazb +.section swa1a +.section swa1b +.section swa2a +.section swa2b +.section swa3a +.section swa3b +.section swa4a +.section swa4b +.section swa5a +.section swa5b +.section swa6a +.section swa6b +.section swa7a +.section swa7b +.section swa8a +.section swa8b +.section swa9a +.section swa9b +.section swa0a +.section swa0b +.section swbaa +.section swbab +.section swbba +.section swbbb +.section swbca +.section swbcb +.section swbda +.section swbdb +.section swbea +.section swbeb +.section swbfa +.section swbfb +.section swbga +.section swbgb +.section swbha +.section swbhb +.section swbia +.section swbib +.section swbja +.section swbjb +.section swbka +.section swbkb +.section swbla +.section swblb +.section swbma +.section swbmb +.section swbna +.section swbnb +.section swboa +.section swbob +.section swbpa +.section swbpb +.section swbqa +.section swbqb +.section swbra +.section swbrb +.section swbsa +.section swbsb +.section swbta +.section swbtb +.section swbua +.section swbub +.section swbva +.section swbvb +.section swbwa +.section swbwb +.section swbxa +.section swbxb +.section swbya +.section swbyb +.section swbza +.section swbzb +.section swb1a +.section swb1b +.section swb2a +.section swb2b +.section swb3a +.section swb3b +.section swb4a +.section swb4b +.section swb5a +.section swb5b +.section swb6a +.section swb6b +.section swb7a +.section swb7b +.section swb8a +.section swb8b +.section swb9a +.section swb9b +.section swb0a +.section swb0b +.section swcaa +.section swcab +.section swcba +.section swcbb +.section swcca +.section swccb +.section swcda +.section swcdb +.section swcea +.section swceb +.section swcfa +.section swcfb +.section swcga +.section swcgb +.section swcha +.section swchb +.section swcia +.section swcib +.section swcja +.section swcjb +.section swcka +.section swckb +.section swcla +.section swclb +.section swcma +.section swcmb +.section swcna +.section swcnb +.section swcoa +.section swcob +.section swcpa +.section swcpb +.section swcqa +.section swcqb +.section swcra +.section swcrb +.section swcsa +.section swcsb +.section swcta +.section swctb +.section swcua +.section swcub +.section swcva +.section swcvb +.section swcwa +.section swcwb +.section swcxa +.section swcxb +.section swcya +.section swcyb +.section swcza +.section swczb +.section swc1a +.section swc1b +.section swc2a +.section swc2b +.section swc3a +.section swc3b +.section swc4a +.section swc4b +.section swc5a +.section swc5b +.section swc6a +.section swc6b +.section swc7a +.section swc7b +.section swc8a +.section swc8b +.section swc9a +.section swc9b +.section swc0a +.section swc0b +.section swdaa +.section swdab +.section swdba +.section swdbb +.section swdca +.section swdcb +.section swdda +.section swddb +.section swdea +.section swdeb +.section swdfa +.section swdfb +.section swdga +.section swdgb +.section swdha +.section swdhb +.section swdia +.section swdib +.section swdja +.section swdjb +.section swdka +.section swdkb +.section swdla +.section swdlb +.section swdma +.section swdmb +.section swdna +.section swdnb +.section swdoa +.section swdob +.section swdpa +.section swdpb +.section swdqa +.section swdqb +.section swdra +.section swdrb +.section swdsa +.section swdsb +.section swdta +.section swdtb +.section swdua +.section swdub +.section swdva +.section swdvb +.section swdwa +.section swdwb +.section swdxa +.section swdxb +.section swdya +.section swdyb +.section swdza +.section swdzb +.section swd1a +.section swd1b +.section swd2a +.section swd2b +.section swd3a +.section swd3b +.section swd4a +.section swd4b +.section swd5a +.section swd5b +.section swd6a +.section swd6b +.section swd7a +.section swd7b +.section swd8a +.section swd8b +.section swd9a +.section swd9b +.section swd0a +.section swd0b +.section sweaa +.section sweab +.section sweba +.section swebb +.section sweca +.section swecb +.section sweda +.section swedb +.section sweea +.section sweeb +.section swefa +.section swefb +.section swega +.section swegb +.section sweha +.section swehb +.section sweia +.section sweib +.section sweja +.section swejb +.section sweka +.section swekb +.section swela +.section swelb +.section swema +.section swemb +.section swena +.section swenb +.section sweoa +.section sweob +.section swepa +.section swepb +.section sweqa +.section sweqb +.section swera +.section swerb +.section swesa +.section swesb +.section sweta +.section swetb +.section sweua +.section sweub +.section sweva +.section swevb +.section swewa +.section swewb +.section swexa +.section swexb +.section sweya +.section sweyb +.section sweza +.section swezb +.section swe1a +.section swe1b +.section swe2a +.section swe2b +.section swe3a +.section swe3b +.section swe4a +.section swe4b +.section swe5a +.section swe5b +.section swe6a +.section swe6b +.section swe7a +.section swe7b +.section swe8a +.section swe8b +.section swe9a +.section swe9b +.section swe0a +.section swe0b +.section swfaa +.section swfab +.section swfba +.section swfbb +.section swfca +.section swfcb +.section swfda +.section swfdb +.section swfea +.section swfeb +.section swffa +.section swffb +.section swfga +.section swfgb +.section swfha +.section swfhb +.section swfia +.section swfib +.section swfja +.section swfjb +.section swfka +.section swfkb +.section swfla +.section swflb +.section swfma +.section swfmb +.section swfna +.section swfnb +.section swfoa +.section swfob +.section swfpa +.section swfpb +.section swfqa +.section swfqb +.section swfra +.section swfrb +.section swfsa +.section swfsb +.section swfta +.section swftb +.section swfua +.section swfub +.section swfva +.section swfvb +.section swfwa +.section swfwb +.section swfxa +.section swfxb +.section swfya +.section swfyb +.section swfza +.section swfzb +.section swf1a +.section swf1b +.section swf2a +.section swf2b +.section swf3a +.section swf3b +.section swf4a +.section swf4b +.section swf5a +.section swf5b +.section swf6a +.section swf6b +.section swf7a +.section swf7b +.section swf8a +.section swf8b +.section swf9a +.section swf9b +.section swf0a +.section swf0b +.section swgaa +.section swgab +.section swgba +.section swgbb +.section swgca +.section swgcb +.section swgda +.section swgdb +.section swgea +.section swgeb +.section swgfa +.section swgfb +.section swgga +.section swggb +.section swgha +.section swghb +.section swgia +.section swgib +.section swgja +.section swgjb +.section swgka +.section swgkb +.section swgla +.section swglb +.section swgma +.section swgmb +.section swgna +.section swgnb +.section swgoa +.section swgob +.section swgpa +.section swgpb +.section swgqa +.section swgqb +.section swgra +.section swgrb +.section swgsa +.section swgsb +.section swgta +.section swgtb +.section swgua +.section swgub +.section swgva +.section swgvb +.section swgwa +.section swgwb +.section swgxa +.section swgxb +.section swgya +.section swgyb +.section swgza +.section swgzb +.section swg1a +.section swg1b +.section swg2a +.section swg2b +.section swg3a +.section swg3b +.section swg4a +.section swg4b +.section swg5a +.section swg5b +.section swg6a +.section swg6b +.section swg7a +.section swg7b +.section swg8a +.section swg8b +.section swg9a +.section swg9b +.section swg0a +.section swg0b +.section swhaa +.section swhab +.section swhba +.section swhbb +.section swhca +.section swhcb +.section swhda +.section swhdb +.section swhea +.section swheb +.section swhfa +.section swhfb +.section swhga +.section swhgb +.section swhha +.section swhhb +.section swhia +.section swhib +.section swhja +.section swhjb +.section swhka +.section swhkb +.section swhla +.section swhlb +.section swhma +.section swhmb +.section swhna +.section swhnb +.section swhoa +.section swhob +.section swhpa +.section swhpb +.section swhqa +.section swhqb +.section swhra +.section swhrb +.section swhsa +.section swhsb +.section swhta +.section swhtb +.section swhua +.section swhub +.section swhva +.section swhvb +.section swhwa +.section swhwb +.section swhxa +.section swhxb +.section swhya +.section swhyb +.section swhza +.section swhzb +.section swh1a +.section swh1b +.section swh2a +.section swh2b +.section swh3a +.section swh3b +.section swh4a +.section swh4b +.section swh5a +.section swh5b +.section swh6a +.section swh6b +.section swh7a +.section swh7b +.section swh8a +.section swh8b +.section swh9a +.section swh9b +.section swh0a +.section swh0b +.section swiaa +.section swiab +.section swiba +.section swibb +.section swica +.section swicb +.section swida +.section swidb +.section swiea +.section swieb +.section swifa +.section swifb +.section swiga +.section swigb +.section swiha +.section swihb +.section swiia +.section swiib +.section swija +.section swijb +.section swika +.section swikb +.section swila +.section swilb +.section swima +.section swimb +.section swina +.section swinb +.section swioa +.section swiob +.section swipa +.section swipb +.section swiqa +.section swiqb +.section swira +.section swirb +.section swisa +.section swisb +.section swita +.section switb +.section swiua +.section swiub +.section swiva +.section swivb +.section swiwa +.section swiwb +.section swixa +.section swixb +.section swiya +.section swiyb +.section swiza +.section swizb +.section swi1a +.section swi1b +.section swi2a +.section swi2b +.section swi3a +.section swi3b +.section swi4a +.section swi4b +.section swi5a +.section swi5b +.section swi6a +.section swi6b +.section swi7a +.section swi7b +.section swi8a +.section swi8b +.section swi9a +.section swi9b +.section swi0a +.section swi0b +.section swjaa +.section swjab +.section swjba +.section swjbb +.section swjca +.section swjcb +.section swjda +.section swjdb +.section swjea +.section swjeb +.section swjfa +.section swjfb +.section swjga +.section swjgb +.section swjha +.section swjhb +.section swjia +.section swjib +.section swjja +.section swjjb +.section swjka +.section swjkb +.section swjla +.section swjlb +.section swjma +.section swjmb +.section swjna +.section swjnb +.section swjoa +.section swjob +.section swjpa +.section swjpb +.section swjqa +.section swjqb +.section swjra +.section swjrb +.section swjsa +.section swjsb +.section swjta +.section swjtb +.section swjua +.section swjub +.section swjva +.section swjvb +.section swjwa +.section swjwb +.section swjxa +.section swjxb +.section swjya +.section swjyb +.section swjza +.section swjzb +.section swj1a +.section swj1b +.section swj2a +.section swj2b +.section swj3a +.section swj3b +.section swj4a +.section swj4b +.section swj5a +.section swj5b +.section swj6a +.section swj6b +.section swj7a +.section swj7b +.section swj8a +.section swj8b +.section swj9a +.section swj9b +.section swj0a +.section swj0b +.section swkaa +.section swkab +.section swkba +.section swkbb +.section swkca +.section swkcb +.section swkda +.section swkdb +.section swkea +.section swkeb +.section swkfa +.section swkfb +.section swkga +.section swkgb +.section swkha +.section swkhb +.section swkia +.section swkib +.section swkja +.section swkjb +.section swkka +.section swkkb +.section swkla +.section swklb +.section swkma +.section swkmb +.section swkna +.section swknb +.section swkoa +.section swkob +.section swkpa +.section swkpb +.section swkqa +.section swkqb +.section swkra +.section swkrb +.section swksa +.section swksb +.section swkta +.section swktb +.section swkua +.section swkub +.section swkva +.section swkvb +.section swkwa +.section swkwb +.section swkxa +.section swkxb +.section swkya +.section swkyb +.section swkza +.section swkzb +.section swk1a +.section swk1b +.section swk2a +.section swk2b +.section swk3a +.section swk3b +.section swk4a +.section swk4b +.section swk5a +.section swk5b +.section swk6a +.section swk6b +.section swk7a +.section swk7b +.section swk8a +.section swk8b +.section swk9a +.section swk9b +.section swk0a +.section swk0b +.section swlaa +.section swlab +.section swlba +.section swlbb +.section swlca +.section swlcb +.section swlda +.section swldb +.section swlea +.section swleb +.section swlfa +.section swlfb +.section swlga +.section swlgb +.section swlha +.section swlhb +.section swlia +.section swlib +.section swlja +.section swljb +.section swlka +.section swlkb +.section swlla +.section swllb +.section swlma +.section swlmb +.section swlna +.section swlnb +.section swloa +.section swlob +.section swlpa +.section swlpb +.section swlqa +.section swlqb +.section swlra +.section swlrb +.section swlsa +.section swlsb +.section swlta +.section swltb +.section swlua +.section swlub +.section swlva +.section swlvb +.section swlwa +.section swlwb +.section swlxa +.section swlxb +.section swlya +.section swlyb +.section swlza +.section swlzb +.section swl1a +.section swl1b +.section swl2a +.section swl2b +.section swl3a +.section swl3b +.section swl4a +.section swl4b +.section swl5a +.section swl5b +.section swl6a +.section swl6b +.section swl7a +.section swl7b +.section swl8a +.section swl8b +.section swl9a +.section swl9b +.section swl0a +.section swl0b +.section swmaa +.section swmab +.section swmba +.section swmbb +.section swmca +.section swmcb +.section swmda +.section swmdb +.section swmea +.section swmeb +.section swmfa +.section swmfb +.section swmga +.section swmgb +.section swmha +.section swmhb +.section swmia +.section swmib +.section swmja +.section swmjb +.section swmka +.section swmkb +.section swmla +.section swmlb +.section swmma +.section swmmb +.section swmna +.section swmnb +.section swmoa +.section swmob +.section swmpa +.section swmpb +.section swmqa +.section swmqb +.section swmra +.section swmrb +.section swmsa +.section swmsb +.section swmta +.section swmtb +.section swmua +.section swmub +.section swmva +.section swmvb +.section swmwa +.section swmwb +.section swmxa +.section swmxb +.section swmya +.section swmyb +.section swmza +.section swmzb +.section swm1a +.section swm1b +.section swm2a +.section swm2b +.section swm3a +.section swm3b +.section swm4a +.section swm4b +.section swm5a +.section swm5b +.section swm6a +.section swm6b +.section swm7a +.section swm7b +.section swm8a +.section swm8b +.section swm9a +.section swm9b +.section swm0a +.section swm0b +.section swnaa +.section swnab +.section swnba +.section swnbb +.section swnca +.section swncb +.section swnda +.section swndb +.section swnea +.section swneb +.section swnfa +.section swnfb +.section swnga +.section swngb +.section swnha +.section swnhb +.section swnia +.section swnib +.section swnja +.section swnjb +.section swnka +.section swnkb +.section swnla +.section swnlb +.section swnma +.section swnmb +.section swnna +.section swnnb +.section swnoa +.section swnob +.section swnpa +.section swnpb +.section swnqa +.section swnqb +.section swnra +.section swnrb +.section swnsa +.section swnsb +.section swnta +.section swntb +.section swnua +.section swnub +.section swnva +.section swnvb +.section swnwa +.section swnwb +.section swnxa +.section swnxb +.section swnya +.section swnyb +.section swnza +.section swnzb +.section swn1a +.section swn1b +.section swn2a +.section swn2b +.section swn3a +.section swn3b +.section swn4a +.section swn4b +.section swn5a +.section swn5b +.section swn6a +.section swn6b +.section swn7a +.section swn7b +.section swn8a +.section swn8b +.section swn9a +.section swn9b +.section swn0a +.section swn0b +.section swoaa +.section swoab +.section swoba +.section swobb +.section swoca +.section swocb +.section swoda +.section swodb +.section swoea +.section swoeb +.section swofa +.section swofb +.section swoga +.section swogb +.section swoha +.section swohb +.section swoia +.section swoib +.section swoja +.section swojb +.section swoka +.section swokb +.section swola +.section swolb +.section swoma +.section swomb +.section swona +.section swonb +.section swooa +.section swoob +.section swopa +.section swopb +.section swoqa +.section swoqb +.section swora +.section sworb +.section swosa +.section swosb +.section swota +.section swotb +.section swoua +.section swoub +.section swova +.section swovb +.section swowa +.section swowb +.section swoxa +.section swoxb +.section swoya +.section swoyb +.section swoza +.section swozb +.section swo1a +.section swo1b +.section swo2a +.section swo2b +.section swo3a +.section swo3b +.section swo4a +.section swo4b +.section swo5a +.section swo5b +.section swo6a +.section swo6b +.section swo7a +.section swo7b +.section swo8a +.section swo8b +.section swo9a +.section swo9b +.section swo0a +.section swo0b +.section swpaa +.section swpab +.section swpba +.section swpbb +.section swpca +.section swpcb +.section swpda +.section swpdb +.section swpea +.section swpeb +.section swpfa +.section swpfb +.section swpga +.section swpgb +.section swpha +.section swphb +.section swpia +.section swpib +.section swpja +.section swpjb +.section swpka +.section swpkb +.section swpla +.section swplb +.section swpma +.section swpmb +.section swpna +.section swpnb +.section swpoa +.section swpob +.section swppa +.section swppb +.section swpqa +.section swpqb +.section swpra +.section swprb +.section swpsa +.section swpsb +.section swpta +.section swptb +.section swpua +.section swpub +.section swpva +.section swpvb +.section swpwa +.section swpwb +.section swpxa +.section swpxb +.section swpya +.section swpyb +.section swpza +.section swpzb +.section swp1a +.section swp1b +.section swp2a +.section swp2b +.section swp3a +.section swp3b +.section swp4a +.section swp4b +.section swp5a +.section swp5b +.section swp6a +.section swp6b +.section swp7a +.section swp7b +.section swp8a +.section swp8b +.section swp9a +.section swp9b +.section swp0a +.section swp0b +.section swqaa +.section swqab +.section swqba +.section swqbb +.section swqca +.section swqcb +.section swqda +.section swqdb +.section swqea +.section swqeb +.section swqfa +.section swqfb +.section swqga +.section swqgb +.section swqha +.section swqhb +.section swqia +.section swqib +.section swqja +.section swqjb +.section swqka +.section swqkb +.section swqla +.section swqlb +.section swqma +.section swqmb +.section swqna +.section swqnb +.section swqoa +.section swqob +.section swqpa +.section swqpb +.section swqqa +.section swqqb +.section swqra +.section swqrb +.section swqsa +.section swqsb +.section swqta +.section swqtb +.section swqua +.section swqub +.section swqva +.section swqvb +.section swqwa +.section swqwb +.section swqxa +.section swqxb +.section swqya +.section swqyb +.section swqza +.section swqzb +.section swq1a +.section swq1b +.section swq2a +.section swq2b +.section swq3a +.section swq3b +.section swq4a +.section swq4b +.section swq5a +.section swq5b +.section swq6a +.section swq6b +.section swq7a +.section swq7b +.section swq8a +.section swq8b +.section swq9a +.section swq9b +.section swq0a +.section swq0b +.section swraa +.section swrab +.section swrba +.section swrbb +.section swrca +.section swrcb +.section swrda +.section swrdb +.section swrea +.section swreb +.section swrfa +.section swrfb +.section swrga +.section swrgb +.section swrha +.section swrhb +.section swria +.section swrib +.section swrja +.section swrjb +.section swrka +.section swrkb +.section swrla +.section swrlb +.section swrma +.section swrmb +.section swrna +.section swrnb +.section swroa +.section swrob +.section swrpa +.section swrpb +.section swrqa +.section swrqb +.section swrra +.section swrrb +.section swrsa +.section swrsb +.section swrta +.section swrtb +.section swrua +.section swrub +.section swrva +.section swrvb +.section swrwa +.section swrwb +.section swrxa +.section swrxb +.section swrya +.section swryb +.section swrza +.section swrzb +.section swr1a +.section swr1b +.section swr2a +.section swr2b +.section swr3a +.section swr3b +.section swr4a +.section swr4b +.section swr5a +.section swr5b +.section swr6a +.section swr6b +.section swr7a +.section swr7b +.section swr8a +.section swr8b +.section swr9a +.section swr9b +.section swr0a +.section swr0b +.section swsaa +.section swsab +.section swsba +.section swsbb +.section swsca +.section swscb +.section swsda +.section swsdb +.section swsea +.section swseb +.section swsfa +.section swsfb +.section swsga +.section swsgb +.section swsha +.section swshb +.section swsia +.section swsib +.section swsja +.section swsjb +.section swska +.section swskb +.section swsla +.section swslb +.section swsma +.section swsmb +.section swsna +.section swsnb +.section swsoa +.section swsob +.section swspa +.section swspb +.section swsqa +.section swsqb +.section swsra +.section swsrb +.section swssa +.section swssb +.section swsta +.section swstb +.section swsua +.section swsub +.section swsva +.section swsvb +.section swswa +.section swswb +.section swsxa +.section swsxb +.section swsya +.section swsyb +.section swsza +.section swszb +.section sws1a +.section sws1b +.section sws2a +.section sws2b +.section sws3a +.section sws3b +.section sws4a +.section sws4b +.section sws5a +.section sws5b +.section sws6a +.section sws6b +.section sws7a +.section sws7b +.section sws8a +.section sws8b +.section sws9a +.section sws9b +.section sws0a +.section sws0b +.section swtaa +.section swtab +.section swtba +.section swtbb +.section swtca +.section swtcb +.section swtda +.section swtdb +.section swtea +.section swteb +.section swtfa +.section swtfb +.section swtga +.section swtgb +.section swtha +.section swthb +.section swtia +.section swtib +.section swtja +.section swtjb +.section swtka +.section swtkb +.section swtla +.section swtlb +.section swtma +.section swtmb +.section swtna +.section swtnb +.section swtoa +.section swtob +.section swtpa +.section swtpb +.section swtqa +.section swtqb +.section swtra +.section swtrb +.section swtsa +.section swtsb +.section swtta +.section swttb +.section swtua +.section swtub +.section swtva +.section swtvb +.section swtwa +.section swtwb +.section swtxa +.section swtxb +.section swtya +.section swtyb +.section swtza +.section swtzb +.section swt1a +.section swt1b +.section swt2a +.section swt2b +.section swt3a +.section swt3b +.section swt4a +.section swt4b +.section swt5a +.section swt5b +.section swt6a +.section swt6b +.section swt7a +.section swt7b +.section swt8a +.section swt8b +.section swt9a +.section swt9b +.section swt0a +.section swt0b +.section swuaa +.section swuab +.section swuba +.section swubb +.section swuca +.section swucb +.section swuda +.section swudb +.section swuea +.section swueb +.section swufa +.section swufb +.section swuga +.section swugb +.section swuha +.section swuhb +.section swuia +.section swuib +.section swuja +.section swujb +.section swuka +.section swukb +.section swula +.section swulb +.section swuma +.section swumb +.section swuna +.section swunb +.section swuoa +.section swuob +.section swupa +.section swupb +.section swuqa +.section swuqb +.section swura +.section swurb +.section swusa +.section swusb +.section swuta +.section swutb +.section swuua +.section swuub +.section swuva +.section swuvb +.section swuwa +.section swuwb +.section swuxa +.section swuxb +.section swuya +.section swuyb +.section swuza +.section swuzb +.section swu1a +.section swu1b +.section swu2a +.section swu2b +.section swu3a +.section swu3b +.section swu4a +.section swu4b +.section swu5a +.section swu5b +.section swu6a +.section swu6b +.section swu7a +.section swu7b +.section swu8a +.section swu8b +.section swu9a +.section swu9b +.section swu0a +.section swu0b +.section swvaa +.section swvab +.section swvba +.section swvbb +.section swvca +.section swvcb +.section swvda +.section swvdb +.section swvea +.section swveb +.section swvfa +.section swvfb +.section swvga +.section swvgb +.section swvha +.section swvhb +.section swvia +.section swvib +.section swvja +.section swvjb +.section swvka +.section swvkb +.section swvla +.section swvlb +.section swvma +.section swvmb +.section swvna +.section swvnb +.section swvoa +.section swvob +.section swvpa +.section swvpb +.section swvqa +.section swvqb +.section swvra +.section swvrb +.section swvsa +.section swvsb +.section swvta +.section swvtb +.section swvua +.section swvub +.section swvva +.section swvvb +.section swvwa +.section swvwb +.section swvxa +.section swvxb +.section swvya +.section swvyb +.section swvza +.section swvzb +.section swv1a +.section swv1b +.section swv2a +.section swv2b +.section swv3a +.section swv3b +.section swv4a +.section swv4b +.section swv5a +.section swv5b +.section swv6a +.section swv6b +.section swv7a +.section swv7b +.section swv8a +.section swv8b +.section swv9a +.section swv9b +.section swv0a +.section swv0b +.section swwaa +.section swwab +.section swwba +.section swwbb +.section swwca +.section swwcb +.section swwda +.section swwdb +.section swwea +.section swweb +.section swwfa +.section swwfb +.section swwga +.section swwgb +.section swwha +.section swwhb +.section swwia +.section swwib +.section swwja +.section swwjb +.section swwka +.section swwkb +.section swwla +.section swwlb +.section swwma +.section swwmb +.section swwna +.section swwnb +.section swwoa +.section swwob +.section swwpa +.section swwpb +.section swwqa +.section swwqb +.section swwra +.section swwrb +.section swwsa +.section swwsb +.section swwta +.section swwtb +.section swwua +.section swwub +.section swwva +.section swwvb +.section swwwa +.section swwwb +.section swwxa +.section swwxb +.section swwya +.section swwyb +.section swwza +.section swwzb +.section sww1a +.section sww1b +.section sww2a +.section sww2b +.section sww3a +.section sww3b +.section sww4a +.section sww4b +.section sww5a +.section sww5b +.section sww6a +.section sww6b +.section sww7a +.section sww7b +.section sww8a +.section sww8b +.section sww9a +.section sww9b +.section sww0a +.section sww0b +.section swxaa +.section swxab +.section swxba +.section swxbb +.section swxca +.section swxcb +.section swxda +.section swxdb +.section swxea +.section swxeb +.section swxfa +.section swxfb +.section swxga +.section swxgb +.section swxha +.section swxhb +.section swxia +.section swxib +.section swxja +.section swxjb +.section swxka +.section swxkb +.section swxla +.section swxlb +.section swxma +.section swxmb +.section swxna +.section swxnb +.section swxoa +.section swxob +.section swxpa +.section swxpb +.section swxqa +.section swxqb +.section swxra +.section swxrb +.section swxsa +.section swxsb +.section swxta +.section swxtb +.section swxua +.section swxub +.section swxva +.section swxvb +.section swxwa +.section swxwb +.section swxxa +.section swxxb +.section swxya +.section swxyb +.section swxza +.section swxzb +.section swx1a +.section swx1b +.section swx2a +.section swx2b +.section swx3a +.section swx3b +.section swx4a +.section swx4b +.section swx5a +.section swx5b +.section swx6a +.section swx6b +.section swx7a +.section swx7b +.section swx8a +.section swx8b +.section swx9a +.section swx9b +.section swx0a +.section swx0b +.section swyaa +.section swyab +.section swyba +.section swybb +.section swyca +.section swycb +.section swyda +.section swydb +.section swyea +.section swyeb +.section swyfa +.section swyfb +.section swyga +.section swygb +.section swyha +.section swyhb +.section swyia +.section swyib +.section swyja +.section swyjb +.section swyka +.section swykb +.section swyla +.section swylb +.section swyma +.section swymb +.section swyna +.section swynb +.section swyoa +.section swyob +.section swypa +.section swypb +.section swyqa +.section swyqb +.section swyra +.section swyrb +.section swysa +.section swysb +.section swyta +.section swytb +.section swyua +.section swyub +.section swyva +.section swyvb +.section swywa +.section swywb +.section swyxa +.section swyxb +.section swyya +.section swyyb +.section swyza +.section swyzb +.section swy1a +.section swy1b +.section swy2a +.section swy2b +.section swy3a +.section swy3b +.section swy4a +.section swy4b +.section swy5a +.section swy5b +.section swy6a +.section swy6b +.section swy7a +.section swy7b +.section swy8a +.section swy8b +.section swy9a +.section swy9b +.section swy0a +.section swy0b +.section swzaa +.section swzab +.section swzba +.section swzbb +.section swzca +.section swzcb +.section swzda +.section swzdb +.section swzea +.section swzeb +.section swzfa +.section swzfb +.section swzga +.section swzgb +.section swzha +.section swzhb +.section swzia +.section swzib +.section swzja +.section swzjb +.section swzka +.section swzkb +.section swzla +.section swzlb +.section swzma +.section swzmb +.section swzna +.section swznb +.section swzoa +.section swzob +.section swzpa +.section swzpb +.section swzqa +.section swzqb +.section swzra +.section swzrb +.section swzsa +.section swzsb +.section swzta +.section swztb +.section swzua +.section swzub +.section swzva +.section swzvb +.section swzwa +.section swzwb +.section swzxa +.section swzxb +.section swzya +.section swzyb +.section swzza +.section swzzb +.section swz1a +.section swz1b +.section swz2a +.section swz2b +.section swz3a +.section swz3b +.section swz4a +.section swz4b +.section swz5a +.section swz5b +.section swz6a +.section swz6b +.section swz7a +.section swz7b +.section swz8a +.section swz8b +.section swz9a +.section swz9b +.section swz0a +.section swz0b +.section sw1aa +.section sw1ab +.section sw1ba +.section sw1bb +.section sw1ca +.section sw1cb +.section sw1da +.section sw1db +.section sw1ea +.section sw1eb +.section sw1fa +.section sw1fb +.section sw1ga +.section sw1gb +.section sw1ha +.section sw1hb +.section sw1ia +.section sw1ib +.section sw1ja +.section sw1jb +.section sw1ka +.section sw1kb +.section sw1la +.section sw1lb +.section sw1ma +.section sw1mb +.section sw1na +.section sw1nb +.section sw1oa +.section sw1ob +.section sw1pa +.section sw1pb +.section sw1qa +.section sw1qb +.section sw1ra +.section sw1rb +.section sw1sa +.section sw1sb +.section sw1ta +.section sw1tb +.section sw1ua +.section sw1ub +.section sw1va +.section sw1vb +.section sw1wa +.section sw1wb +.section sw1xa +.section sw1xb +.section sw1ya +.section sw1yb +.section sw1za +.section sw1zb +.section sw11a +.section sw11b +.section sw12a +.section sw12b +.section sw13a +.section sw13b +.section sw14a +.section sw14b +.section sw15a +.section sw15b +.section sw16a +.section sw16b +.section sw17a +.section sw17b +.section sw18a +.section sw18b +.section sw19a +.section sw19b +.section sw10a +.section sw10b +.section sw2aa +.section sw2ab +.section sw2ba +.section sw2bb +.section sw2ca +.section sw2cb +.section sw2da +.section sw2db +.section sw2ea +.section sw2eb +.section sw2fa +.section sw2fb +.section sw2ga +.section sw2gb +.section sw2ha +.section sw2hb +.section sw2ia +.section sw2ib +.section sw2ja +.section sw2jb +.section sw2ka +.section sw2kb +.section sw2la +.section sw2lb +.section sw2ma +.section sw2mb +.section sw2na +.section sw2nb +.section sw2oa +.section sw2ob +.section sw2pa +.section sw2pb +.section sw2qa +.section sw2qb +.section sw2ra +.section sw2rb +.section sw2sa +.section sw2sb +.section sw2ta +.section sw2tb +.section sw2ua +.section sw2ub +.section sw2va +.section sw2vb +.section sw2wa +.section sw2wb +.section sw2xa +.section sw2xb +.section sw2ya +.section sw2yb +.section sw2za +.section sw2zb +.section sw21a +.section sw21b +.section sw22a +.section sw22b +.section sw23a +.section sw23b +.section sw24a +.section sw24b +.section sw25a +.section sw25b +.section sw26a +.section sw26b +.section sw27a +.section sw27b +.section sw28a +.section sw28b +.section sw29a +.section sw29b +.section sw20a +.section sw20b +.section sw3aa +.section sw3ab +.section sw3ba +.section sw3bb +.section sw3ca +.section sw3cb +.section sw3da +.section sw3db +.section sw3ea +.section sw3eb +.section sw3fa +.section sw3fb +.section sw3ga +.section sw3gb +.section sw3ha +.section sw3hb +.section sw3ia +.section sw3ib +.section sw3ja +.section sw3jb +.section sw3ka +.section sw3kb +.section sw3la +.section sw3lb +.section sw3ma +.section sw3mb +.section sw3na +.section sw3nb +.section sw3oa +.section sw3ob +.section sw3pa +.section sw3pb +.section sw3qa +.section sw3qb +.section sw3ra +.section sw3rb +.section sw3sa +.section sw3sb +.section sw3ta +.section sw3tb +.section sw3ua +.section sw3ub +.section sw3va +.section sw3vb +.section sw3wa +.section sw3wb +.section sw3xa +.section sw3xb +.section sw3ya +.section sw3yb +.section sw3za +.section sw3zb +.section sw31a +.section sw31b +.section sw32a +.section sw32b +.section sw33a +.section sw33b +.section sw34a +.section sw34b +.section sw35a +.section sw35b +.section sw36a +.section sw36b +.section sw37a +.section sw37b +.section sw38a +.section sw38b +.section sw39a +.section sw39b +.section sw30a +.section sw30b +.section sw4aa +.section sw4ab +.section sw4ba +.section sw4bb +.section sw4ca +.section sw4cb +.section sw4da +.section sw4db +.section sw4ea +.section sw4eb +.section sw4fa +.section sw4fb +.section sw4ga +.section sw4gb +.section sw4ha +.section sw4hb +.section sw4ia +.section sw4ib +.section sw4ja +.section sw4jb +.section sw4ka +.section sw4kb +.section sw4la +.section sw4lb +.section sw4ma +.section sw4mb +.section sw4na +.section sw4nb +.section sw4oa +.section sw4ob +.section sw4pa +.section sw4pb +.section sw4qa +.section sw4qb +.section sw4ra +.section sw4rb +.section sw4sa +.section sw4sb +.section sw4ta +.section sw4tb +.section sw4ua +.section sw4ub +.section sw4va +.section sw4vb +.section sw4wa +.section sw4wb +.section sw4xa +.section sw4xb +.section sw4ya +.section sw4yb +.section sw4za +.section sw4zb +.section sw41a +.section sw41b +.section sw42a +.section sw42b +.section sw43a +.section sw43b +.section sw44a +.section sw44b +.section sw45a +.section sw45b +.section sw46a +.section sw46b +.section sw47a +.section sw47b +.section sw48a +.section sw48b +.section sw49a +.section sw49b +.section sw40a +.section sw40b +.section sw5aa +.section sw5ab +.section sw5ba +.section sw5bb +.section sw5ca +.section sw5cb +.section sw5da +.section sw5db +.section sw5ea +.section sw5eb +.section sw5fa +.section sw5fb +.section sw5ga +.section sw5gb +.section sw5ha +.section sw5hb +.section sw5ia +.section sw5ib +.section sw5ja +.section sw5jb +.section sw5ka +.section sw5kb +.section sw5la +.section sw5lb +.section sw5ma +.section sw5mb +.section sw5na +.section sw5nb +.section sw5oa +.section sw5ob +.section sw5pa +.section sw5pb +.section sw5qa +.section sw5qb +.section sw5ra +.section sw5rb +.section sw5sa +.section sw5sb +.section sw5ta +.section sw5tb +.section sw5ua +.section sw5ub +.section sw5va +.section sw5vb +.section sw5wa +.section sw5wb +.section sw5xa +.section sw5xb +.section sw5ya +.section sw5yb +.section sw5za +.section sw5zb +.section sw51a +.section sw51b +.section sw52a +.section sw52b +.section sw53a +.section sw53b +.section sw54a +.section sw54b +.section sw55a +.section sw55b +.section sw56a +.section sw56b +.section sw57a +.section sw57b +.section sw58a +.section sw58b +.section sw59a +.section sw59b +.section sw50a +.section sw50b +.section sw6aa +.section sw6ab +.section sw6ba +.section sw6bb +.section sw6ca +.section sw6cb +.section sw6da +.section sw6db +.section sw6ea +.section sw6eb +.section sw6fa +.section sw6fb +.section sw6ga +.section sw6gb +.section sw6ha +.section sw6hb +.section sw6ia +.section sw6ib +.section sw6ja +.section sw6jb +.section sw6ka +.section sw6kb +.section sw6la +.section sw6lb +.section sw6ma +.section sw6mb +.section sw6na +.section sw6nb +.section sw6oa +.section sw6ob +.section sw6pa +.section sw6pb +.section sw6qa +.section sw6qb +.section sw6ra +.section sw6rb +.section sw6sa +.section sw6sb +.section sw6ta +.section sw6tb +.section sw6ua +.section sw6ub +.section sw6va +.section sw6vb +.section sw6wa +.section sw6wb +.section sw6xa +.section sw6xb +.section sw6ya +.section sw6yb +.section sw6za +.section sw6zb +.section sw61a +.section sw61b +.section sw62a +.section sw62b +.section sw63a +.section sw63b +.section sw64a +.section sw64b +.section sw65a +.section sw65b +.section sw66a +.section sw66b +.section sw67a +.section sw67b +.section sw68a +.section sw68b +.section sw69a +.section sw69b +.section sw60a +.section sw60b +.section sw7aa +.section sw7ab +.section sw7ba +.section sw7bb +.section sw7ca +.section sw7cb +.section sw7da +.section sw7db +.section sw7ea +.section sw7eb +.section sw7fa +.section sw7fb +.section sw7ga +.section sw7gb +.section sw7ha +.section sw7hb +.section sw7ia +.section sw7ib +.section sw7ja +.section sw7jb +.section sw7ka +.section sw7kb +.section sw7la +.section sw7lb +.section sw7ma +.section sw7mb +.section sw7na +.section sw7nb +.section sw7oa +.section sw7ob +.section sw7pa +.section sw7pb +.section sw7qa +.section sw7qb +.section sw7ra +.section sw7rb +.section sw7sa +.section sw7sb +.section sw7ta +.section sw7tb +.section sw7ua +.section sw7ub +.section sw7va +.section sw7vb +.section sw7wa +.section sw7wb +.section sw7xa +.section sw7xb +.section sw7ya +.section sw7yb +.section sw7za +.section sw7zb +.section sw71a +.section sw71b +.section sw72a +.section sw72b +.section sw73a +.section sw73b +.section sw74a +.section sw74b +.section sw75a +.section sw75b +.section sw76a +.section sw76b +.section sw77a +.section sw77b +.section sw78a +.section sw78b +.section sw79a +.section sw79b +.section sw70a +.section sw70b +.section sw8aa +.section sw8ab +.section sw8ba +.section sw8bb +.section sw8ca +.section sw8cb +.section sw8da +.section sw8db +.section sw8ea +.section sw8eb +.section sw8fa +.section sw8fb +.section sw8ga +.section sw8gb +.section sw8ha +.section sw8hb +.section sw8ia +.section sw8ib +.section sw8ja +.section sw8jb +.section sw8ka +.section sw8kb +.section sw8la +.section sw8lb +.section sw8ma +.section sw8mb +.section sw8na +.section sw8nb +.section sw8oa +.section sw8ob +.section sw8pa +.section sw8pb +.section sw8qa +.section sw8qb +.section sw8ra +.section sw8rb +.section sw8sa +.section sw8sb +.section sw8ta +.section sw8tb +.section sw8ua +.section sw8ub +.section sw8va +.section sw8vb +.section sw8wa +.section sw8wb +.section sw8xa +.section sw8xb +.section sw8ya +.section sw8yb +.section sw8za +.section sw8zb +.section sw81a +.section sw81b +.section sw82a +.section sw82b +.section sw83a +.section sw83b +.section sw84a +.section sw84b +.section sw85a +.section sw85b +.section sw86a +.section sw86b +.section sw87a +.section sw87b +.section sw88a +.section sw88b +.section sw89a +.section sw89b +.section sw80a +.section sw80b +.section sw9aa +.section sw9ab +.section sw9ba +.section sw9bb +.section sw9ca +.section sw9cb +.section sw9da +.section sw9db +.section sw9ea +.section sw9eb +.section sw9fa +.section sw9fb +.section sw9ga +.section sw9gb +.section sw9ha +.section sw9hb +.section sw9ia +.section sw9ib +.section sw9ja +.section sw9jb +.section sw9ka +.section sw9kb +.section sw9la +.section sw9lb +.section sw9ma +.section sw9mb +.section sw9na +.section sw9nb +.section sw9oa +.section sw9ob +.section sw9pa +.section sw9pb +.section sw9qa +.section sw9qb +.section sw9ra +.section sw9rb +.section sw9sa +.section sw9sb +.section sw9ta +.section sw9tb +.section sw9ua +.section sw9ub +.section sw9va +.section sw9vb +.section sw9wa +.section sw9wb +.section sw9xa +.section sw9xb +.section sw9ya +.section sw9yb +.section sw9za +.section sw9zb +.section sw91a +.section sw91b +.section sw92a +.section sw92b +.section sw93a +.section sw93b +.section sw94a +.section sw94b +.section sw95a +.section sw95b +.section sw96a +.section sw96b +.section sw97a +.section sw97b +.section sw98a +.section sw98b +.section sw99a +.section sw99b +.section sw90a +.section sw90b +.section sw0aa +.section sw0ab +.section sw0ba +.section sw0bb +.section sw0ca +.section sw0cb +.section sw0da +.section sw0db +.section sw0ea +.section sw0eb +.section sw0fa +.section sw0fb +.section sw0ga +.section sw0gb +.section sw0ha +.section sw0hb +.section sw0ia +.section sw0ib +.section sw0ja +.section sw0jb +.section sw0ka +.section sw0kb +.section sw0la +.section sw0lb +.section sw0ma +.section sw0mb +.section sw0na +.section sw0nb +.section sw0oa +.section sw0ob +.section sw0pa +.section sw0pb +.section sw0qa +.section sw0qb +.section sw0ra +.section sw0rb +.section sw0sa +.section sw0sb +.section sw0ta +.section sw0tb +.section sw0ua +.section sw0ub +.section sw0va +.section sw0vb +.section sw0wa +.section sw0wb +.section sw0xa +.section sw0xb +.section sw0ya +.section sw0yb +.section sw0za +.section sw0zb +.section sw01a +.section sw01b +.section sw02a +.section sw02b +.section sw03a +.section sw03b +.section sw04a +.section sw04b +.section sw05a +.section sw05b +.section sw06a +.section sw06b +.section sw07a +.section sw07b +.section sw08a +.section sw08b +.section sw09a +.section sw09b +.section sw00a +.section sw00b +.section sxaaa +.section sxaab +.section sxaba +.section sxabb +.section sxaca +.section sxacb +.section sxada +.section sxadb +.section sxaea +.section sxaeb +.section sxafa +.section sxafb +.section sxaga +.section sxagb +.section sxaha +.section sxahb +.section sxaia +.section sxaib +.section sxaja +.section sxajb +.section sxaka +.section sxakb +.section sxala +.section sxalb +.section sxama +.section sxamb +.section sxana +.section sxanb +.section sxaoa +.section sxaob +.section sxapa +.section sxapb +.section sxaqa +.section sxaqb +.section sxara +.section sxarb +.section sxasa +.section sxasb +.section sxata +.section sxatb +.section sxaua +.section sxaub +.section sxava +.section sxavb +.section sxawa +.section sxawb +.section sxaxa +.section sxaxb +.section sxaya +.section sxayb +.section sxaza +.section sxazb +.section sxa1a +.section sxa1b +.section sxa2a +.section sxa2b +.section sxa3a +.section sxa3b +.section sxa4a +.section sxa4b +.section sxa5a +.section sxa5b +.section sxa6a +.section sxa6b +.section sxa7a +.section sxa7b +.section sxa8a +.section sxa8b +.section sxa9a +.section sxa9b +.section sxa0a +.section sxa0b +.section sxbaa +.section sxbab +.section sxbba +.section sxbbb +.section sxbca +.section sxbcb +.section sxbda +.section sxbdb +.section sxbea +.section sxbeb +.section sxbfa +.section sxbfb +.section sxbga +.section sxbgb +.section sxbha +.section sxbhb +.section sxbia +.section sxbib +.section sxbja +.section sxbjb +.section sxbka +.section sxbkb +.section sxbla +.section sxblb +.section sxbma +.section sxbmb +.section sxbna +.section sxbnb +.section sxboa +.section sxbob +.section sxbpa +.section sxbpb +.section sxbqa +.section sxbqb +.section sxbra +.section sxbrb +.section sxbsa +.section sxbsb +.section sxbta +.section sxbtb +.section sxbua +.section sxbub +.section sxbva +.section sxbvb +.section sxbwa +.section sxbwb +.section sxbxa +.section sxbxb +.section sxbya +.section sxbyb +.section sxbza +.section sxbzb +.section sxb1a +.section sxb1b +.section sxb2a +.section sxb2b +.section sxb3a +.section sxb3b +.section sxb4a +.section sxb4b +.section sxb5a +.section sxb5b +.section sxb6a +.section sxb6b +.section sxb7a +.section sxb7b +.section sxb8a +.section sxb8b +.section sxb9a +.section sxb9b +.section sxb0a +.section sxb0b +.section sxcaa +.section sxcab +.section sxcba +.section sxcbb +.section sxcca +.section sxccb +.section sxcda +.section sxcdb +.section sxcea +.section sxceb +.section sxcfa +.section sxcfb +.section sxcga +.section sxcgb +.section sxcha +.section sxchb +.section sxcia +.section sxcib +.section sxcja +.section sxcjb +.section sxcka +.section sxckb +.section sxcla +.section sxclb +.section sxcma +.section sxcmb +.section sxcna +.section sxcnb +.section sxcoa +.section sxcob +.section sxcpa +.section sxcpb +.section sxcqa +.section sxcqb +.section sxcra +.section sxcrb +.section sxcsa +.section sxcsb +.section sxcta +.section sxctb +.section sxcua +.section sxcub +.section sxcva +.section sxcvb +.section sxcwa +.section sxcwb +.section sxcxa +.section sxcxb +.section sxcya +.section sxcyb +.section sxcza +.section sxczb +.section sxc1a +.section sxc1b +.section sxc2a +.section sxc2b +.section sxc3a +.section sxc3b +.section sxc4a +.section sxc4b +.section sxc5a +.section sxc5b +.section sxc6a +.section sxc6b +.section sxc7a +.section sxc7b +.section sxc8a +.section sxc8b +.section sxc9a +.section sxc9b +.section sxc0a +.section sxc0b +.section sxdaa +.section sxdab +.section sxdba +.section sxdbb +.section sxdca +.section sxdcb +.section sxdda +.section sxddb +.section sxdea +.section sxdeb +.section sxdfa +.section sxdfb +.section sxdga +.section sxdgb +.section sxdha +.section sxdhb +.section sxdia +.section sxdib +.section sxdja +.section sxdjb +.section sxdka +.section sxdkb +.section sxdla +.section sxdlb +.section sxdma +.section sxdmb +.section sxdna +.section sxdnb +.section sxdoa +.section sxdob +.section sxdpa +.section sxdpb +.section sxdqa +.section sxdqb +.section sxdra +.section sxdrb +.section sxdsa +.section sxdsb +.section sxdta +.section sxdtb +.section sxdua +.section sxdub +.section sxdva +.section sxdvb +.section sxdwa +.section sxdwb +.section sxdxa +.section sxdxb +.section sxdya +.section sxdyb +.section sxdza +.section sxdzb +.section sxd1a +.section sxd1b +.section sxd2a +.section sxd2b +.section sxd3a +.section sxd3b +.section sxd4a +.section sxd4b +.section sxd5a +.section sxd5b +.section sxd6a +.section sxd6b +.section sxd7a +.section sxd7b +.section sxd8a +.section sxd8b +.section sxd9a +.section sxd9b +.section sxd0a +.section sxd0b +.section sxeaa +.section sxeab +.section sxeba +.section sxebb +.section sxeca +.section sxecb +.section sxeda +.section sxedb +.section sxeea +.section sxeeb +.section sxefa +.section sxefb +.section sxega +.section sxegb +.section sxeha +.section sxehb +.section sxeia +.section sxeib +.section sxeja +.section sxejb +.section sxeka +.section sxekb +.section sxela +.section sxelb +.section sxema +.section sxemb +.section sxena +.section sxenb +.section sxeoa +.section sxeob +.section sxepa +.section sxepb +.section sxeqa +.section sxeqb +.section sxera +.section sxerb +.section sxesa +.section sxesb +.section sxeta +.section sxetb +.section sxeua +.section sxeub +.section sxeva +.section sxevb +.section sxewa +.section sxewb +.section sxexa +.section sxexb +.section sxeya +.section sxeyb +.section sxeza +.section sxezb +.section sxe1a +.section sxe1b +.section sxe2a +.section sxe2b +.section sxe3a +.section sxe3b +.section sxe4a +.section sxe4b +.section sxe5a +.section sxe5b +.section sxe6a +.section sxe6b +.section sxe7a +.section sxe7b +.section sxe8a +.section sxe8b +.section sxe9a +.section sxe9b +.section sxe0a +.section sxe0b +.section sxfaa +.section sxfab +.section sxfba +.section sxfbb +.section sxfca +.section sxfcb +.section sxfda +.section sxfdb +.section sxfea +.section sxfeb +.section sxffa +.section sxffb +.section sxfga +.section sxfgb +.section sxfha +.section sxfhb +.section sxfia +.section sxfib +.section sxfja +.section sxfjb +.section sxfka +.section sxfkb +.section sxfla +.section sxflb +.section sxfma +.section sxfmb +.section sxfna +.section sxfnb +.section sxfoa +.section sxfob +.section sxfpa +.section sxfpb +.section sxfqa +.section sxfqb +.section sxfra +.section sxfrb +.section sxfsa +.section sxfsb +.section sxfta +.section sxftb +.section sxfua +.section sxfub +.section sxfva +.section sxfvb +.section sxfwa +.section sxfwb +.section sxfxa +.section sxfxb +.section sxfya +.section sxfyb +.section sxfza +.section sxfzb +.section sxf1a +.section sxf1b +.section sxf2a +.section sxf2b +.section sxf3a +.section sxf3b +.section sxf4a +.section sxf4b +.section sxf5a +.section sxf5b +.section sxf6a +.section sxf6b +.section sxf7a +.section sxf7b +.section sxf8a +.section sxf8b +.section sxf9a +.section sxf9b +.section sxf0a +.section sxf0b +.section sxgaa +.section sxgab +.section sxgba +.section sxgbb +.section sxgca +.section sxgcb +.section sxgda +.section sxgdb +.section sxgea +.section sxgeb +.section sxgfa +.section sxgfb +.section sxgga +.section sxggb +.section sxgha +.section sxghb +.section sxgia +.section sxgib +.section sxgja +.section sxgjb +.section sxgka +.section sxgkb +.section sxgla +.section sxglb +.section sxgma +.section sxgmb +.section sxgna +.section sxgnb +.section sxgoa +.section sxgob +.section sxgpa +.section sxgpb +.section sxgqa +.section sxgqb +.section sxgra +.section sxgrb +.section sxgsa +.section sxgsb +.section sxgta +.section sxgtb +.section sxgua +.section sxgub +.section sxgva +.section sxgvb +.section sxgwa +.section sxgwb +.section sxgxa +.section sxgxb +.section sxgya +.section sxgyb +.section sxgza +.section sxgzb +.section sxg1a +.section sxg1b +.section sxg2a +.section sxg2b +.section sxg3a +.section sxg3b +.section sxg4a +.section sxg4b +.section sxg5a +.section sxg5b +.section sxg6a +.section sxg6b +.section sxg7a +.section sxg7b +.section sxg8a +.section sxg8b +.section sxg9a +.section sxg9b +.section sxg0a +.section sxg0b +.section sxhaa +.section sxhab +.section sxhba +.section sxhbb +.section sxhca +.section sxhcb +.section sxhda +.section sxhdb +.section sxhea +.section sxheb +.section sxhfa +.section sxhfb +.section sxhga +.section sxhgb +.section sxhha +.section sxhhb +.section sxhia +.section sxhib +.section sxhja +.section sxhjb +.section sxhka +.section sxhkb +.section sxhla +.section sxhlb +.section sxhma +.section sxhmb +.section sxhna +.section sxhnb +.section sxhoa +.section sxhob +.section sxhpa +.section sxhpb +.section sxhqa +.section sxhqb +.section sxhra +.section sxhrb +.section sxhsa +.section sxhsb +.section sxhta +.section sxhtb +.section sxhua +.section sxhub +.section sxhva +.section sxhvb +.section sxhwa +.section sxhwb +.section sxhxa +.section sxhxb +.section sxhya +.section sxhyb +.section sxhza +.section sxhzb +.section sxh1a +.section sxh1b +.section sxh2a +.section sxh2b +.section sxh3a +.section sxh3b +.section sxh4a +.section sxh4b +.section sxh5a +.section sxh5b +.section sxh6a +.section sxh6b +.section sxh7a +.section sxh7b +.section sxh8a +.section sxh8b +.section sxh9a +.section sxh9b +.section sxh0a +.section sxh0b +.section sxiaa +.section sxiab +.section sxiba +.section sxibb +.section sxica +.section sxicb +.section sxida +.section sxidb +.section sxiea +.section sxieb +.section sxifa +.section sxifb +.section sxiga +.section sxigb +.section sxiha +.section sxihb +.section sxiia +.section sxiib +.section sxija +.section sxijb +.section sxika +.section sxikb +.section sxila +.section sxilb +.section sxima +.section sximb +.section sxina +.section sxinb +.section sxioa +.section sxiob +.section sxipa +.section sxipb +.section sxiqa +.section sxiqb +.section sxira +.section sxirb +.section sxisa +.section sxisb +.section sxita +.section sxitb +.section sxiua +.section sxiub +.section sxiva +.section sxivb +.section sxiwa +.section sxiwb +.section sxixa +.section sxixb +.section sxiya +.section sxiyb +.section sxiza +.section sxizb +.section sxi1a +.section sxi1b +.section sxi2a +.section sxi2b +.section sxi3a +.section sxi3b +.section sxi4a +.section sxi4b +.section sxi5a +.section sxi5b +.section sxi6a +.section sxi6b +.section sxi7a +.section sxi7b +.section sxi8a +.section sxi8b +.section sxi9a +.section sxi9b +.section sxi0a +.section sxi0b +.section sxjaa +.section sxjab +.section sxjba +.section sxjbb +.section sxjca +.section sxjcb +.section sxjda +.section sxjdb +.section sxjea +.section sxjeb +.section sxjfa +.section sxjfb +.section sxjga +.section sxjgb +.section sxjha +.section sxjhb +.section sxjia +.section sxjib +.section sxjja +.section sxjjb +.section sxjka +.section sxjkb +.section sxjla +.section sxjlb +.section sxjma +.section sxjmb +.section sxjna +.section sxjnb +.section sxjoa +.section sxjob +.section sxjpa +.section sxjpb +.section sxjqa +.section sxjqb +.section sxjra +.section sxjrb +.section sxjsa +.section sxjsb +.section sxjta +.section sxjtb +.section sxjua +.section sxjub +.section sxjva +.section sxjvb +.section sxjwa +.section sxjwb +.section sxjxa +.section sxjxb +.section sxjya +.section sxjyb +.section sxjza +.section sxjzb +.section sxj1a +.section sxj1b +.section sxj2a +.section sxj2b +.section sxj3a +.section sxj3b +.section sxj4a +.section sxj4b +.section sxj5a +.section sxj5b +.section sxj6a +.section sxj6b +.section sxj7a +.section sxj7b +.section sxj8a +.section sxj8b +.section sxj9a +.section sxj9b +.section sxj0a +.section sxj0b +.section sxkaa +.section sxkab +.section sxkba +.section sxkbb +.section sxkca +.section sxkcb +.section sxkda +.section sxkdb +.section sxkea +.section sxkeb +.section sxkfa +.section sxkfb +.section sxkga +.section sxkgb +.section sxkha +.section sxkhb +.section sxkia +.section sxkib +.section sxkja +.section sxkjb +.section sxkka +.section sxkkb +.section sxkla +.section sxklb +.section sxkma +.section sxkmb +.section sxkna +.section sxknb +.section sxkoa +.section sxkob +.section sxkpa +.section sxkpb +.section sxkqa +.section sxkqb +.section sxkra +.section sxkrb +.section sxksa +.section sxksb +.section sxkta +.section sxktb +.section sxkua +.section sxkub +.section sxkva +.section sxkvb +.section sxkwa +.section sxkwb +.section sxkxa +.section sxkxb +.section sxkya +.section sxkyb +.section sxkza +.section sxkzb +.section sxk1a +.section sxk1b +.section sxk2a +.section sxk2b +.section sxk3a +.section sxk3b +.section sxk4a +.section sxk4b +.section sxk5a +.section sxk5b +.section sxk6a +.section sxk6b +.section sxk7a +.section sxk7b +.section sxk8a +.section sxk8b +.section sxk9a +.section sxk9b +.section sxk0a +.section sxk0b +.section sxlaa +.section sxlab +.section sxlba +.section sxlbb +.section sxlca +.section sxlcb +.section sxlda +.section sxldb +.section sxlea +.section sxleb +.section sxlfa +.section sxlfb +.section sxlga +.section sxlgb +.section sxlha +.section sxlhb +.section sxlia +.section sxlib +.section sxlja +.section sxljb +.section sxlka +.section sxlkb +.section sxlla +.section sxllb +.section sxlma +.section sxlmb +.section sxlna +.section sxlnb +.section sxloa +.section sxlob +.section sxlpa +.section sxlpb +.section sxlqa +.section sxlqb +.section sxlra +.section sxlrb +.section sxlsa +.section sxlsb +.section sxlta +.section sxltb +.section sxlua +.section sxlub +.section sxlva +.section sxlvb +.section sxlwa +.section sxlwb +.section sxlxa +.section sxlxb +.section sxlya +.section sxlyb +.section sxlza +.section sxlzb +.section sxl1a +.section sxl1b +.section sxl2a +.section sxl2b +.section sxl3a +.section sxl3b +.section sxl4a +.section sxl4b +.section sxl5a +.section sxl5b +.section sxl6a +.section sxl6b +.section sxl7a +.section sxl7b +.section sxl8a +.section sxl8b +.section sxl9a +.section sxl9b +.section sxl0a +.section sxl0b +.section sxmaa +.section sxmab +.section sxmba +.section sxmbb +.section sxmca +.section sxmcb +.section sxmda +.section sxmdb +.section sxmea +.section sxmeb +.section sxmfa +.section sxmfb +.section sxmga +.section sxmgb +.section sxmha +.section sxmhb +.section sxmia +.section sxmib +.section sxmja +.section sxmjb +.section sxmka +.section sxmkb +.section sxmla +.section sxmlb +.section sxmma +.section sxmmb +.section sxmna +.section sxmnb +.section sxmoa +.section sxmob +.section sxmpa +.section sxmpb +.section sxmqa +.section sxmqb +.section sxmra +.section sxmrb +.section sxmsa +.section sxmsb +.section sxmta +.section sxmtb +.section sxmua +.section sxmub +.section sxmva +.section sxmvb +.section sxmwa +.section sxmwb +.section sxmxa +.section sxmxb +.section sxmya +.section sxmyb +.section sxmza +.section sxmzb +.section sxm1a +.section sxm1b +.section sxm2a +.section sxm2b +.section sxm3a +.section sxm3b +.section sxm4a +.section sxm4b +.section sxm5a +.section sxm5b +.section sxm6a +.section sxm6b +.section sxm7a +.section sxm7b +.section sxm8a +.section sxm8b +.section sxm9a +.section sxm9b +.section sxm0a +.section sxm0b +.section sxnaa +.section sxnab +.section sxnba +.section sxnbb +.section sxnca +.section sxncb +.section sxnda +.section sxndb +.section sxnea +.section sxneb +.section sxnfa +.section sxnfb +.section sxnga +.section sxngb +.section sxnha +.section sxnhb +.section sxnia +.section sxnib +.section sxnja +.section sxnjb +.section sxnka +.section sxnkb +.section sxnla +.section sxnlb +.section sxnma +.section sxnmb +.section sxnna +.section sxnnb +.section sxnoa +.section sxnob +.section sxnpa +.section sxnpb +.section sxnqa +.section sxnqb +.section sxnra +.section sxnrb +.section sxnsa +.section sxnsb +.section sxnta +.section sxntb +.section sxnua +.section sxnub +.section sxnva +.section sxnvb +.section sxnwa +.section sxnwb +.section sxnxa +.section sxnxb +.section sxnya +.section sxnyb +.section sxnza +.section sxnzb +.section sxn1a +.section sxn1b +.section sxn2a +.section sxn2b +.section sxn3a +.section sxn3b +.section sxn4a +.section sxn4b +.section sxn5a +.section sxn5b +.section sxn6a +.section sxn6b +.section sxn7a +.section sxn7b +.section sxn8a +.section sxn8b +.section sxn9a +.section sxn9b +.section sxn0a +.section sxn0b +.section sxoaa +.section sxoab +.section sxoba +.section sxobb +.section sxoca +.section sxocb +.section sxoda +.section sxodb +.section sxoea +.section sxoeb +.section sxofa +.section sxofb +.section sxoga +.section sxogb +.section sxoha +.section sxohb +.section sxoia +.section sxoib +.section sxoja +.section sxojb +.section sxoka +.section sxokb +.section sxola +.section sxolb +.section sxoma +.section sxomb +.section sxona +.section sxonb +.section sxooa +.section sxoob +.section sxopa +.section sxopb +.section sxoqa +.section sxoqb +.section sxora +.section sxorb +.section sxosa +.section sxosb +.section sxota +.section sxotb +.section sxoua +.section sxoub +.section sxova +.section sxovb +.section sxowa +.section sxowb +.section sxoxa +.section sxoxb +.section sxoya +.section sxoyb +.section sxoza +.section sxozb +.section sxo1a +.section sxo1b +.section sxo2a +.section sxo2b +.section sxo3a +.section sxo3b +.section sxo4a +.section sxo4b +.section sxo5a +.section sxo5b +.section sxo6a +.section sxo6b +.section sxo7a +.section sxo7b +.section sxo8a +.section sxo8b +.section sxo9a +.section sxo9b +.section sxo0a +.section sxo0b +.section sxpaa +.section sxpab +.section sxpba +.section sxpbb +.section sxpca +.section sxpcb +.section sxpda +.section sxpdb +.section sxpea +.section sxpeb +.section sxpfa +.section sxpfb +.section sxpga +.section sxpgb +.section sxpha +.section sxphb +.section sxpia +.section sxpib +.section sxpja +.section sxpjb +.section sxpka +.section sxpkb +.section sxpla +.section sxplb +.section sxpma +.section sxpmb +.section sxpna +.section sxpnb +.section sxpoa +.section sxpob +.section sxppa +.section sxppb +.section sxpqa +.section sxpqb +.section sxpra +.section sxprb +.section sxpsa +.section sxpsb +.section sxpta +.section sxptb +.section sxpua +.section sxpub +.section sxpva +.section sxpvb +.section sxpwa +.section sxpwb +.section sxpxa +.section sxpxb +.section sxpya +.section sxpyb +.section sxpza +.section sxpzb +.section sxp1a +.section sxp1b +.section sxp2a +.section sxp2b +.section sxp3a +.section sxp3b +.section sxp4a +.section sxp4b +.section sxp5a +.section sxp5b +.section sxp6a +.section sxp6b +.section sxp7a +.section sxp7b +.section sxp8a +.section sxp8b +.section sxp9a +.section sxp9b +.section sxp0a +.section sxp0b +.section sxqaa +.section sxqab +.section sxqba +.section sxqbb +.section sxqca +.section sxqcb +.section sxqda +.section sxqdb +.section sxqea +.section sxqeb +.section sxqfa +.section sxqfb +.section sxqga +.section sxqgb +.section sxqha +.section sxqhb +.section sxqia +.section sxqib +.section sxqja +.section sxqjb +.section sxqka +.section sxqkb +.section sxqla +.section sxqlb +.section sxqma +.section sxqmb +.section sxqna +.section sxqnb +.section sxqoa +.section sxqob +.section sxqpa +.section sxqpb +.section sxqqa +.section sxqqb +.section sxqra +.section sxqrb +.section sxqsa +.section sxqsb +.section sxqta +.section sxqtb +.section sxqua +.section sxqub +.section sxqva +.section sxqvb +.section sxqwa +.section sxqwb +.section sxqxa +.section sxqxb +.section sxqya +.section sxqyb +.section sxqza +.section sxqzb +.section sxq1a +.section sxq1b +.section sxq2a +.section sxq2b +.section sxq3a +.section sxq3b +.section sxq4a +.section sxq4b +.section sxq5a +.section sxq5b +.section sxq6a +.section sxq6b +.section sxq7a +.section sxq7b +.section sxq8a +.section sxq8b +.section sxq9a +.section sxq9b +.section sxq0a +.section sxq0b +.section sxraa +.section sxrab +.section sxrba +.section sxrbb +.section sxrca +.section sxrcb +.section sxrda +.section sxrdb +.section sxrea +.section sxreb +.section sxrfa +.section sxrfb +.section sxrga +.section sxrgb +.section sxrha +.section sxrhb +.section sxria +.section sxrib +.section sxrja +.section sxrjb +.section sxrka +.section sxrkb +.section sxrla +.section sxrlb +.section sxrma +.section sxrmb +.section sxrna +.section sxrnb +.section sxroa +.section sxrob +.section sxrpa +.section sxrpb +.section sxrqa +.section sxrqb +.section sxrra +.section sxrrb +.section sxrsa +.section sxrsb +.section sxrta +.section sxrtb +.section sxrua +.section sxrub +.section sxrva +.section sxrvb +.section sxrwa +.section sxrwb +.section sxrxa +.section sxrxb +.section sxrya +.section sxryb +.section sxrza +.section sxrzb +.section sxr1a +.section sxr1b +.section sxr2a +.section sxr2b +.section sxr3a +.section sxr3b +.section sxr4a +.section sxr4b +.section sxr5a +.section sxr5b +.section sxr6a +.section sxr6b +.section sxr7a +.section sxr7b +.section sxr8a +.section sxr8b +.section sxr9a +.section sxr9b +.section sxr0a +.section sxr0b +.section sxsaa +.section sxsab +.section sxsba +.section sxsbb +.section sxsca +.section sxscb +.section sxsda +.section sxsdb +.section sxsea +.section sxseb +.section sxsfa +.section sxsfb +.section sxsga +.section sxsgb +.section sxsha +.section sxshb +.section sxsia +.section sxsib +.section sxsja +.section sxsjb +.section sxska +.section sxskb +.section sxsla +.section sxslb +.section sxsma +.section sxsmb +.section sxsna +.section sxsnb +.section sxsoa +.section sxsob +.section sxspa +.section sxspb +.section sxsqa +.section sxsqb +.section sxsra +.section sxsrb +.section sxssa +.section sxssb +.section sxsta +.section sxstb +.section sxsua +.section sxsub +.section sxsva +.section sxsvb +.section sxswa +.section sxswb +.section sxsxa +.section sxsxb +.section sxsya +.section sxsyb +.section sxsza +.section sxszb +.section sxs1a +.section sxs1b +.section sxs2a +.section sxs2b +.section sxs3a +.section sxs3b +.section sxs4a +.section sxs4b +.section sxs5a +.section sxs5b +.section sxs6a +.section sxs6b +.section sxs7a +.section sxs7b +.section sxs8a +.section sxs8b +.section sxs9a +.section sxs9b +.section sxs0a +.section sxs0b +.section sxtaa +.section sxtab +.section sxtba +.section sxtbb +.section sxtca +.section sxtcb +.section sxtda +.section sxtdb +.section sxtea +.section sxteb +.section sxtfa +.section sxtfb +.section sxtga +.section sxtgb +.section sxtha +.section sxthb +.section sxtia +.section sxtib +.section sxtja +.section sxtjb +.section sxtka +.section sxtkb +.section sxtla +.section sxtlb +.section sxtma +.section sxtmb +.section sxtna +.section sxtnb +.section sxtoa +.section sxtob +.section sxtpa +.section sxtpb +.section sxtqa +.section sxtqb +.section sxtra +.section sxtrb +.section sxtsa +.section sxtsb +.section sxtta +.section sxttb +.section sxtua +.section sxtub +.section sxtva +.section sxtvb +.section sxtwa +.section sxtwb +.section sxtxa +.section sxtxb +.section sxtya +.section sxtyb +.section sxtza +.section sxtzb +.section sxt1a +.section sxt1b +.section sxt2a +.section sxt2b +.section sxt3a +.section sxt3b +.section sxt4a +.section sxt4b +.section sxt5a +.section sxt5b +.section sxt6a +.section sxt6b +.section sxt7a +.section sxt7b +.section sxt8a +.section sxt8b +.section sxt9a +.section sxt9b +.section sxt0a +.section sxt0b +.section sxuaa +.section sxuab +.section sxuba +.section sxubb +.section sxuca +.section sxucb +.section sxuda +.section sxudb +.section sxuea +.section sxueb +.section sxufa +.section sxufb +.section sxuga +.section sxugb +.section sxuha +.section sxuhb +.section sxuia +.section sxuib +.section sxuja +.section sxujb +.section sxuka +.section sxukb +.section sxula +.section sxulb +.section sxuma +.section sxumb +.section sxuna +.section sxunb +.section sxuoa +.section sxuob +.section sxupa +.section sxupb +.section sxuqa +.section sxuqb +.section sxura +.section sxurb +.section sxusa +.section sxusb +.section sxuta +.section sxutb +.section sxuua +.section sxuub +.section sxuva +.section sxuvb +.section sxuwa +.section sxuwb +.section sxuxa +.section sxuxb +.section sxuya +.section sxuyb +.section sxuza +.section sxuzb +.section sxu1a +.section sxu1b +.section sxu2a +.section sxu2b +.section sxu3a +.section sxu3b +.section sxu4a +.section sxu4b +.section sxu5a +.section sxu5b +.section sxu6a +.section sxu6b +.section sxu7a +.section sxu7b +.section sxu8a +.section sxu8b +.section sxu9a +.section sxu9b +.section sxu0a +.section sxu0b +.section sxvaa +.section sxvab +.section sxvba +.section sxvbb +.section sxvca +.section sxvcb +.section sxvda +.section sxvdb +.section sxvea +.section sxveb +.section sxvfa +.section sxvfb +.section sxvga +.section sxvgb +.section sxvha +.section sxvhb +.section sxvia +.section sxvib +.section sxvja +.section sxvjb +.section sxvka +.section sxvkb +.section sxvla +.section sxvlb +.section sxvma +.section sxvmb +.section sxvna +.section sxvnb +.section sxvoa +.section sxvob +.section sxvpa +.section sxvpb +.section sxvqa +.section sxvqb +.section sxvra +.section sxvrb +.section sxvsa +.section sxvsb +.section sxvta +.section sxvtb +.section sxvua +.section sxvub +.section sxvva +.section sxvvb +.section sxvwa +.section sxvwb +.section sxvxa +.section sxvxb +.section sxvya +.section sxvyb +.section sxvza +.section sxvzb +.section sxv1a +.section sxv1b +.section sxv2a +.section sxv2b +.section sxv3a +.section sxv3b +.section sxv4a +.section sxv4b +.section sxv5a +.section sxv5b +.section sxv6a +.section sxv6b +.section sxv7a +.section sxv7b +.section sxv8a +.section sxv8b +.section sxv9a +.section sxv9b +.section sxv0a +.section sxv0b +.section sxwaa +.section sxwab +.section sxwba +.section sxwbb +.section sxwca +.section sxwcb +.section sxwda +.section sxwdb +.section sxwea +.section sxweb +.section sxwfa +.section sxwfb +.section sxwga +.section sxwgb +.section sxwha +.section sxwhb +.section sxwia +.section sxwib +.section sxwja +.section sxwjb +.section sxwka +.section sxwkb +.section sxwla +.section sxwlb +.section sxwma +.section sxwmb +.section sxwna +.section sxwnb +.section sxwoa +.section sxwob +.section sxwpa +.section sxwpb +.section sxwqa +.section sxwqb +.section sxwra +.section sxwrb +.section sxwsa +.section sxwsb +.section sxwta +.section sxwtb +.section sxwua +.section sxwub +.section sxwva +.section sxwvb +.section sxwwa +.section sxwwb +.section sxwxa +.section sxwxb +.section sxwya +.section sxwyb +.section sxwza +.section sxwzb +.section sxw1a +.section sxw1b +.section sxw2a +.section sxw2b +.section sxw3a +.section sxw3b +.section sxw4a +.section sxw4b +.section sxw5a +.section sxw5b +.section sxw6a +.section sxw6b +.section sxw7a +.section sxw7b +.section sxw8a +.section sxw8b +.section sxw9a +.section sxw9b +.section sxw0a +.section sxw0b +.section sxxaa +.section sxxab +.section sxxba +.section sxxbb +.section sxxca +.section sxxcb +.section sxxda +.section sxxdb +.section sxxea +.section sxxeb +.section sxxfa +.section sxxfb +.section sxxga +.section sxxgb +.section sxxha +.section sxxhb +.section sxxia +.section sxxib +.section sxxja +.section sxxjb +.section sxxka +.section sxxkb +.section sxxla +.section sxxlb +.section sxxma +.section sxxmb +.section sxxna +.section sxxnb +.section sxxoa +.section sxxob +.section sxxpa +.section sxxpb +.section sxxqa +.section sxxqb +.section sxxra +.section sxxrb +.section sxxsa +.section sxxsb +.section sxxta +.section sxxtb +.section sxxua +.section sxxub +.section sxxva +.section sxxvb +.section sxxwa +.section sxxwb +.section sxxxa +.section sxxxb +.section sxxya +.section sxxyb +.section sxxza +.section sxxzb +.section sxx1a +.section sxx1b +.section sxx2a +.section sxx2b +.section sxx3a +.section sxx3b +.section sxx4a +.section sxx4b +.section sxx5a +.section sxx5b +.section sxx6a +.section sxx6b +.section sxx7a +.section sxx7b +.section sxx8a +.section sxx8b +.section sxx9a +.section sxx9b +.section sxx0a +.section sxx0b +.section sxyaa +.section sxyab +.section sxyba +.section sxybb +.section sxyca +.section sxycb +.section sxyda +.section sxydb +.section sxyea +.section sxyeb +.section sxyfa +.section sxyfb +.section sxyga +.section sxygb +.section sxyha +.section sxyhb +.section sxyia +.section sxyib +.section sxyja +.section sxyjb +.section sxyka +.section sxykb +.section sxyla +.section sxylb +.section sxyma +.section sxymb +.section sxyna +.section sxynb +.section sxyoa +.section sxyob +.section sxypa +.section sxypb +.section sxyqa +.section sxyqb +.section sxyra +.section sxyrb +.section sxysa +.section sxysb +.section sxyta +.section sxytb +.section sxyua +.section sxyub +.section sxyva +.section sxyvb +.section sxywa +.section sxywb +.section sxyxa +.section sxyxb +.section sxyya +.section sxyyb +.section sxyza +.section sxyzb +.section sxy1a +.section sxy1b +.section sxy2a +.section sxy2b +.section sxy3a +.section sxy3b +.section sxy4a +.section sxy4b +.section sxy5a +.section sxy5b +.section sxy6a +.section sxy6b +.section sxy7a +.section sxy7b +.section sxy8a +.section sxy8b +.section sxy9a +.section sxy9b +.section sxy0a +.section sxy0b +.section sxzaa +.section sxzab +.section sxzba +.section sxzbb +.section sxzca +.section sxzcb +.section sxzda +.section sxzdb +.section sxzea +.section sxzeb +.section sxzfa +.section sxzfb +.section sxzga +.section sxzgb +.section sxzha +.section sxzhb +.section sxzia +.section sxzib +.section sxzja +.section sxzjb +.section sxzka +.section sxzkb +.section sxzla +.section sxzlb +.section sxzma +.section sxzmb +.section sxzna +.section sxznb +.section sxzoa +.section sxzob +.section sxzpa +.section sxzpb +.section sxzqa +.section sxzqb +.section sxzra +.section sxzrb +.section sxzsa +.section sxzsb +.section sxzta +.section sxztb +.section sxzua +.section sxzub +.section sxzva +.section sxzvb +.section sxzwa +.section sxzwb +.section sxzxa +.section sxzxb +.section sxzya +.section sxzyb +.section sxzza +.section sxzzb +.section sxz1a +.section sxz1b +.section sxz2a +.section sxz2b +.section sxz3a +.section sxz3b +.section sxz4a +.section sxz4b +.section sxz5a +.section sxz5b +.section sxz6a +.section sxz6b +.section sxz7a +.section sxz7b +.section sxz8a +.section sxz8b +.section sxz9a +.section sxz9b +.section sxz0a +.section sxz0b +.section sx1aa +.section sx1ab +.section sx1ba +.section sx1bb +.section sx1ca +.section sx1cb +.section sx1da +.section sx1db +.section sx1ea +.section sx1eb +.section sx1fa +.section sx1fb +.section sx1ga +.section sx1gb +.section sx1ha +.section sx1hb +.section sx1ia +.section sx1ib +.section sx1ja +.section sx1jb +.section sx1ka +.section sx1kb +.section sx1la +.section sx1lb +.section sx1ma +.section sx1mb +.section sx1na +.section sx1nb +.section sx1oa +.section sx1ob +.section sx1pa +.section sx1pb +.section sx1qa +.section sx1qb +.section sx1ra +.section sx1rb +.section sx1sa +.section sx1sb +.section sx1ta +.section sx1tb +.section sx1ua +.section sx1ub +.section sx1va +.section sx1vb +.section sx1wa +.section sx1wb +.section sx1xa +.section sx1xb +.section sx1ya +.section sx1yb +.section sx1za +.section sx1zb +.section sx11a +.section sx11b +.section sx12a +.section sx12b +.section sx13a +.section sx13b +.section sx14a +.section sx14b +.section sx15a +.section sx15b +.section sx16a +.section sx16b +.section sx17a +.section sx17b +.section sx18a +.section sx18b +.section sx19a +.section sx19b +.section sx10a +.section sx10b +.section sx2aa +.section sx2ab +.section sx2ba +.section sx2bb +.section sx2ca +.section sx2cb +.section sx2da +.section sx2db +.section sx2ea +.section sx2eb +.section sx2fa +.section sx2fb +.section sx2ga +.section sx2gb +.section sx2ha +.section sx2hb +.section sx2ia +.section sx2ib +.section sx2ja +.section sx2jb +.section sx2ka +.section sx2kb +.section sx2la +.section sx2lb +.section sx2ma +.section sx2mb +.section sx2na +.section sx2nb +.section sx2oa +.section sx2ob +.section sx2pa +.section sx2pb +.section sx2qa +.section sx2qb +.section sx2ra +.section sx2rb +.section sx2sa +.section sx2sb +.section sx2ta +.section sx2tb +.section sx2ua +.section sx2ub +.section sx2va +.section sx2vb +.section sx2wa +.section sx2wb +.section sx2xa +.section sx2xb +.section sx2ya +.section sx2yb +.section sx2za +.section sx2zb +.section sx21a +.section sx21b +.section sx22a +.section sx22b +.section sx23a +.section sx23b +.section sx24a +.section sx24b +.section sx25a +.section sx25b +.section sx26a +.section sx26b +.section sx27a +.section sx27b +.section sx28a +.section sx28b +.section sx29a +.section sx29b +.section sx20a +.section sx20b +.section sx3aa +.section sx3ab +.section sx3ba +.section sx3bb +.section sx3ca +.section sx3cb +.section sx3da +.section sx3db +.section sx3ea +.section sx3eb +.section sx3fa +.section sx3fb +.section sx3ga +.section sx3gb +.section sx3ha +.section sx3hb +.section sx3ia +.section sx3ib +.section sx3ja +.section sx3jb +.section sx3ka +.section sx3kb +.section sx3la +.section sx3lb +.section sx3ma +.section sx3mb +.section sx3na +.section sx3nb +.section sx3oa +.section sx3ob +.section sx3pa +.section sx3pb +.section sx3qa +.section sx3qb +.section sx3ra +.section sx3rb +.section sx3sa +.section sx3sb +.section sx3ta +.section sx3tb +.section sx3ua +.section sx3ub +.section sx3va +.section sx3vb +.section sx3wa +.section sx3wb +.section sx3xa +.section sx3xb +.section sx3ya +.section sx3yb +.section sx3za +.section sx3zb +.section sx31a +.section sx31b +.section sx32a +.section sx32b +.section sx33a +.section sx33b +.section sx34a +.section sx34b +.section sx35a +.section sx35b +.section sx36a +.section sx36b +.section sx37a +.section sx37b +.section sx38a +.section sx38b +.section sx39a +.section sx39b +.section sx30a +.section sx30b +.section sx4aa +.section sx4ab +.section sx4ba +.section sx4bb +.section sx4ca +.section sx4cb +.section sx4da +.section sx4db +.section sx4ea +.section sx4eb +.section sx4fa +.section sx4fb +.section sx4ga +.section sx4gb +.section sx4ha +.section sx4hb +.section sx4ia +.section sx4ib +.section sx4ja +.section sx4jb +.section sx4ka +.section sx4kb +.section sx4la +.section sx4lb +.section sx4ma +.section sx4mb +.section sx4na +.section sx4nb +.section sx4oa +.section sx4ob +.section sx4pa +.section sx4pb +.section sx4qa +.section sx4qb +.section sx4ra +.section sx4rb +.section sx4sa +.section sx4sb +.section sx4ta +.section sx4tb +.section sx4ua +.section sx4ub +.section sx4va +.section sx4vb +.section sx4wa +.section sx4wb +.section sx4xa +.section sx4xb +.section sx4ya +.section sx4yb +.section sx4za +.section sx4zb +.section sx41a +.section sx41b +.section sx42a +.section sx42b +.section sx43a +.section sx43b +.section sx44a +.section sx44b +.section sx45a +.section sx45b +.section sx46a +.section sx46b +.section sx47a +.section sx47b +.section sx48a +.section sx48b +.section sx49a +.section sx49b +.section sx40a +.section sx40b +.section sx5aa +.section sx5ab +.section sx5ba +.section sx5bb +.section sx5ca +.section sx5cb +.section sx5da +.section sx5db +.section sx5ea +.section sx5eb +.section sx5fa +.section sx5fb +.section sx5ga +.section sx5gb +.section sx5ha +.section sx5hb +.section sx5ia +.section sx5ib +.section sx5ja +.section sx5jb +.section sx5ka +.section sx5kb +.section sx5la +.section sx5lb +.section sx5ma +.section sx5mb +.section sx5na +.section sx5nb +.section sx5oa +.section sx5ob +.section sx5pa +.section sx5pb +.section sx5qa +.section sx5qb +.section sx5ra +.section sx5rb +.section sx5sa +.section sx5sb +.section sx5ta +.section sx5tb +.section sx5ua +.section sx5ub +.section sx5va +.section sx5vb +.section sx5wa +.section sx5wb +.section sx5xa +.section sx5xb +.section sx5ya +.section sx5yb +.section sx5za +.section sx5zb +.section sx51a +.section sx51b +.section sx52a +.section sx52b +.section sx53a +.section sx53b +.section sx54a +.section sx54b +.section sx55a +.section sx55b +.section sx56a +.section sx56b +.section sx57a +.section sx57b +.section sx58a +.section sx58b +.section sx59a +.section sx59b +.section sx50a +.section sx50b +.section sx6aa +.section sx6ab +.section sx6ba +.section sx6bb +.section sx6ca +.section sx6cb +.section sx6da +.section sx6db +.section sx6ea +.section sx6eb +.section sx6fa +.section sx6fb +.section sx6ga +.section sx6gb +.section sx6ha +.section sx6hb +.section sx6ia +.section sx6ib +.section sx6ja +.section sx6jb +.section sx6ka +.section sx6kb +.section sx6la +.section sx6lb +.section sx6ma +.section sx6mb +.section sx6na +.section sx6nb +.section sx6oa +.section sx6ob +.section sx6pa +.section sx6pb +.section sx6qa +.section sx6qb +.section sx6ra +.section sx6rb +.section sx6sa +.section sx6sb +.section sx6ta +.section sx6tb +.section sx6ua +.section sx6ub +.section sx6va +.section sx6vb +.section sx6wa +.section sx6wb +.section sx6xa +.section sx6xb +.section sx6ya +.section sx6yb +.section sx6za +.section sx6zb +.section sx61a +.section sx61b +.section sx62a +.section sx62b +.section sx63a +.section sx63b +.section sx64a +.section sx64b +.section sx65a +.section sx65b +.section sx66a +.section sx66b +.section sx67a +.section sx67b +.section sx68a +.section sx68b +.section sx69a +.section sx69b +.section sx60a +.section sx60b +.section sx7aa +.section sx7ab +.section sx7ba +.section sx7bb +.section sx7ca +.section sx7cb +.section sx7da +.section sx7db +.section sx7ea +.section sx7eb +.section sx7fa +.section sx7fb +.section sx7ga +.section sx7gb +.section sx7ha +.section sx7hb +.section sx7ia +.section sx7ib +.section sx7ja +.section sx7jb +.section sx7ka +.section sx7kb +.section sx7la +.section sx7lb +.section sx7ma +.section sx7mb +.section sx7na +.section sx7nb +.section sx7oa +.section sx7ob +.section sx7pa +.section sx7pb +.section sx7qa +.section sx7qb +.section sx7ra +.section sx7rb +.section sx7sa +.section sx7sb +.section sx7ta +.section sx7tb +.section sx7ua +.section sx7ub +.section sx7va +.section sx7vb +.section sx7wa +.section sx7wb +.section sx7xa +.section sx7xb +.section sx7ya +.section sx7yb +.section sx7za +.section sx7zb +.section sx71a +.section sx71b +.section sx72a +.section sx72b +.section sx73a +.section sx73b +.section sx74a +.section sx74b +.section sx75a +.section sx75b +.section sx76a +.section sx76b +.section sx77a +.section sx77b +.section sx78a +.section sx78b +.section sx79a +.section sx79b +.section sx70a +.section sx70b +.section sx8aa +.section sx8ab +.section sx8ba +.section sx8bb +.section sx8ca +.section sx8cb +.section sx8da +.section sx8db +.section sx8ea +.section sx8eb +.section sx8fa +.section sx8fb +.section sx8ga +.section sx8gb +.section sx8ha +.section sx8hb +.section sx8ia +.section sx8ib +.section sx8ja +.section sx8jb +.section sx8ka +.section sx8kb +.section sx8la +.section sx8lb +.section sx8ma +.section sx8mb +.section sx8na +.section sx8nb +.section sx8oa +.section sx8ob +.section sx8pa +.section sx8pb +.section sx8qa +.section sx8qb +.section sx8ra +.section sx8rb +.section sx8sa +.section sx8sb +.section sx8ta +.section sx8tb +.section sx8ua +.section sx8ub +.section sx8va +.section sx8vb +.section sx8wa +.section sx8wb +.section sx8xa +.section sx8xb +.section sx8ya +.section sx8yb +.section sx8za +.section sx8zb +.section sx81a +.section sx81b +.section sx82a +.section sx82b +.section sx83a +.section sx83b +.section sx84a +.section sx84b +.section sx85a +.section sx85b +.section sx86a +.section sx86b +.section sx87a +.section sx87b +.section sx88a +.section sx88b +.section sx89a +.section sx89b +.section sx80a +.section sx80b +.section sx9aa +.section sx9ab +.section sx9ba +.section sx9bb +.section sx9ca +.section sx9cb +.section sx9da +.section sx9db +.section sx9ea +.section sx9eb +.section sx9fa +.section sx9fb +.section sx9ga +.section sx9gb +.section sx9ha +.section sx9hb +.section sx9ia +.section sx9ib +.section sx9ja +.section sx9jb +.section sx9ka +.section sx9kb +.section sx9la +.section sx9lb +.section sx9ma +.section sx9mb +.section sx9na +.section sx9nb +.section sx9oa +.section sx9ob +.section sx9pa +.section sx9pb +.section sx9qa +.section sx9qb +.section sx9ra +.section sx9rb +.section sx9sa +.section sx9sb +.section sx9ta +.section sx9tb +.section sx9ua +.section sx9ub +.section sx9va +.section sx9vb +.section sx9wa +.section sx9wb +.section sx9xa +.section sx9xb +.section sx9ya +.section sx9yb +.section sx9za +.section sx9zb +.section sx91a +.section sx91b +.section sx92a +.section sx92b +.section sx93a +.section sx93b +.section sx94a +.section sx94b +.section sx95a +.section sx95b +.section sx96a +.section sx96b +.section sx97a +.section sx97b +.section sx98a +.section sx98b +.section sx99a +.section sx99b +.section sx90a +.section sx90b +.section sx0aa +.section sx0ab +.section sx0ba +.section sx0bb +.section sx0ca +.section sx0cb +.section sx0da +.section sx0db +.section sx0ea +.section sx0eb +.section sx0fa +.section sx0fb +.section sx0ga +.section sx0gb +.section sx0ha +.section sx0hb +.section sx0ia +.section sx0ib +.section sx0ja +.section sx0jb +.section sx0ka +.section sx0kb +.section sx0la +.section sx0lb +.section sx0ma +.section sx0mb +.section sx0na +.section sx0nb +.section sx0oa +.section sx0ob +.section sx0pa +.section sx0pb +.section sx0qa +.section sx0qb +.section sx0ra +.section sx0rb +.section sx0sa +.section sx0sb +.section sx0ta +.section sx0tb +.section sx0ua +.section sx0ub +.section sx0va +.section sx0vb +.section sx0wa +.section sx0wb +.section sx0xa +.section sx0xb +.section sx0ya +.section sx0yb +.section sx0za +.section sx0zb +.section sx01a +.section sx01b +.section sx02a +.section sx02b +.section sx03a +.section sx03b +.section sx04a +.section sx04b +.section sx05a +.section sx05b +.section sx06a +.section sx06b +.section sx07a +.section sx07b +.section sx08a +.section sx08b +.section sx09a +.section sx09b +.section sx00a +.section sx00b +.section syaaa +.section syaab +.section syaba +.section syabb +.section syaca +.section syacb +.section syada +.section syadb +.section syaea +.section syaeb +.section syafa +.section syafb +.section syaga +.section syagb +.section syaha +.section syahb +.section syaia +.section syaib +.section syaja +.section syajb +.section syaka +.section syakb +.section syala +.section syalb +.section syama +.section syamb +.section syana +.section syanb +.section syaoa +.section syaob +.section syapa +.section syapb +.section syaqa +.section syaqb +.section syara +.section syarb +.section syasa +.section syasb +.section syata +.section syatb +.section syaua +.section syaub +.section syava +.section syavb +.section syawa +.section syawb +.section syaxa +.section syaxb +.section syaya +.section syayb +.section syaza +.section syazb +.section sya1a +.section sya1b +.section sya2a +.section sya2b +.section sya3a +.section sya3b +.section sya4a +.section sya4b +.section sya5a +.section sya5b +.section sya6a +.section sya6b +.section sya7a +.section sya7b +.section sya8a +.section sya8b +.section sya9a +.section sya9b +.section sya0a +.section sya0b +.section sybaa +.section sybab +.section sybba +.section sybbb +.section sybca +.section sybcb +.section sybda +.section sybdb +.section sybea +.section sybeb +.section sybfa +.section sybfb +.section sybga +.section sybgb +.section sybha +.section sybhb +.section sybia +.section sybib +.section sybja +.section sybjb +.section sybka +.section sybkb +.section sybla +.section syblb +.section sybma +.section sybmb +.section sybna +.section sybnb +.section syboa +.section sybob +.section sybpa +.section sybpb +.section sybqa +.section sybqb +.section sybra +.section sybrb +.section sybsa +.section sybsb +.section sybta +.section sybtb +.section sybua +.section sybub +.section sybva +.section sybvb +.section sybwa +.section sybwb +.section sybxa +.section sybxb +.section sybya +.section sybyb +.section sybza +.section sybzb +.section syb1a +.section syb1b +.section syb2a +.section syb2b +.section syb3a +.section syb3b +.section syb4a +.section syb4b +.section syb5a +.section syb5b +.section syb6a +.section syb6b +.section syb7a +.section syb7b +.section syb8a +.section syb8b +.section syb9a +.section syb9b +.section syb0a +.section syb0b +.section sycaa +.section sycab +.section sycba +.section sycbb +.section sycca +.section syccb +.section sycda +.section sycdb +.section sycea +.section syceb +.section sycfa +.section sycfb +.section sycga +.section sycgb +.section sycha +.section sychb +.section sycia +.section sycib +.section sycja +.section sycjb +.section sycka +.section syckb +.section sycla +.section syclb +.section sycma +.section sycmb +.section sycna +.section sycnb +.section sycoa +.section sycob +.section sycpa +.section sycpb +.section sycqa +.section sycqb +.section sycra +.section sycrb +.section sycsa +.section sycsb +.section sycta +.section syctb +.section sycua +.section sycub +.section sycva +.section sycvb +.section sycwa +.section sycwb +.section sycxa +.section sycxb +.section sycya +.section sycyb +.section sycza +.section syczb +.section syc1a +.section syc1b +.section syc2a +.section syc2b +.section syc3a +.section syc3b +.section syc4a +.section syc4b +.section syc5a +.section syc5b +.section syc6a +.section syc6b +.section syc7a +.section syc7b +.section syc8a +.section syc8b +.section syc9a +.section syc9b +.section syc0a +.section syc0b +.section sydaa +.section sydab +.section sydba +.section sydbb +.section sydca +.section sydcb +.section sydda +.section syddb +.section sydea +.section sydeb +.section sydfa +.section sydfb +.section sydga +.section sydgb +.section sydha +.section sydhb +.section sydia +.section sydib +.section sydja +.section sydjb +.section sydka +.section sydkb +.section sydla +.section sydlb +.section sydma +.section sydmb +.section sydna +.section sydnb +.section sydoa +.section sydob +.section sydpa +.section sydpb +.section sydqa +.section sydqb +.section sydra +.section sydrb +.section sydsa +.section sydsb +.section sydta +.section sydtb +.section sydua +.section sydub +.section sydva +.section sydvb +.section sydwa +.section sydwb +.section sydxa +.section sydxb +.section sydya +.section sydyb +.section sydza +.section sydzb +.section syd1a +.section syd1b +.section syd2a +.section syd2b +.section syd3a +.section syd3b +.section syd4a +.section syd4b +.section syd5a +.section syd5b +.section syd6a +.section syd6b +.section syd7a +.section syd7b +.section syd8a +.section syd8b +.section syd9a +.section syd9b +.section syd0a +.section syd0b +.section syeaa +.section syeab +.section syeba +.section syebb +.section syeca +.section syecb +.section syeda +.section syedb +.section syeea +.section syeeb +.section syefa +.section syefb +.section syega +.section syegb +.section syeha +.section syehb +.section syeia +.section syeib +.section syeja +.section syejb +.section syeka +.section syekb +.section syela +.section syelb +.section syema +.section syemb +.section syena +.section syenb +.section syeoa +.section syeob +.section syepa +.section syepb +.section syeqa +.section syeqb +.section syera +.section syerb +.section syesa +.section syesb +.section syeta +.section syetb +.section syeua +.section syeub +.section syeva +.section syevb +.section syewa +.section syewb +.section syexa +.section syexb +.section syeya +.section syeyb +.section syeza +.section syezb +.section sye1a +.section sye1b +.section sye2a +.section sye2b +.section sye3a +.section sye3b +.section sye4a +.section sye4b +.section sye5a +.section sye5b +.section sye6a +.section sye6b +.section sye7a +.section sye7b +.section sye8a +.section sye8b +.section sye9a +.section sye9b +.section sye0a +.section sye0b +.section syfaa +.section syfab +.section syfba +.section syfbb +.section syfca +.section syfcb +.section syfda +.section syfdb +.section syfea +.section syfeb +.section syffa +.section syffb +.section syfga +.section syfgb +.section syfha +.section syfhb +.section syfia +.section syfib +.section syfja +.section syfjb +.section syfka +.section syfkb +.section syfla +.section syflb +.section syfma +.section syfmb +.section syfna +.section syfnb +.section syfoa +.section syfob +.section syfpa +.section syfpb +.section syfqa +.section syfqb +.section syfra +.section syfrb +.section syfsa +.section syfsb +.section syfta +.section syftb +.section syfua +.section syfub +.section syfva +.section syfvb +.section syfwa +.section syfwb +.section syfxa +.section syfxb +.section syfya +.section syfyb +.section syfza +.section syfzb +.section syf1a +.section syf1b +.section syf2a +.section syf2b +.section syf3a +.section syf3b +.section syf4a +.section syf4b +.section syf5a +.section syf5b +.section syf6a +.section syf6b +.section syf7a +.section syf7b +.section syf8a +.section syf8b +.section syf9a +.section syf9b +.section syf0a +.section syf0b +.section sygaa +.section sygab +.section sygba +.section sygbb +.section sygca +.section sygcb +.section sygda +.section sygdb +.section sygea +.section sygeb +.section sygfa +.section sygfb +.section sygga +.section syggb +.section sygha +.section syghb +.section sygia +.section sygib +.section sygja +.section sygjb +.section sygka +.section sygkb +.section sygla +.section syglb +.section sygma +.section sygmb +.section sygna +.section sygnb +.section sygoa +.section sygob +.section sygpa +.section sygpb +.section sygqa +.section sygqb +.section sygra +.section sygrb +.section sygsa +.section sygsb +.section sygta +.section sygtb +.section sygua +.section sygub +.section sygva +.section sygvb +.section sygwa +.section sygwb +.section sygxa +.section sygxb +.section sygya +.section sygyb +.section sygza +.section sygzb +.section syg1a +.section syg1b +.section syg2a +.section syg2b +.section syg3a +.section syg3b +.section syg4a +.section syg4b +.section syg5a +.section syg5b +.section syg6a +.section syg6b +.section syg7a +.section syg7b +.section syg8a +.section syg8b +.section syg9a +.section syg9b +.section syg0a +.section syg0b +.section syhaa +.section syhab +.section syhba +.section syhbb +.section syhca +.section syhcb +.section syhda +.section syhdb +.section syhea +.section syheb +.section syhfa +.section syhfb +.section syhga +.section syhgb +.section syhha +.section syhhb +.section syhia +.section syhib +.section syhja +.section syhjb +.section syhka +.section syhkb +.section syhla +.section syhlb +.section syhma +.section syhmb +.section syhna +.section syhnb +.section syhoa +.section syhob +.section syhpa +.section syhpb +.section syhqa +.section syhqb +.section syhra +.section syhrb +.section syhsa +.section syhsb +.section syhta +.section syhtb +.section syhua +.section syhub +.section syhva +.section syhvb +.section syhwa +.section syhwb +.section syhxa +.section syhxb +.section syhya +.section syhyb +.section syhza +.section syhzb +.section syh1a +.section syh1b +.section syh2a +.section syh2b +.section syh3a +.section syh3b +.section syh4a +.section syh4b +.section syh5a +.section syh5b +.section syh6a +.section syh6b +.section syh7a +.section syh7b +.section syh8a +.section syh8b +.section syh9a +.section syh9b +.section syh0a +.section syh0b +.section syiaa +.section syiab +.section syiba +.section syibb +.section syica +.section syicb +.section syida +.section syidb +.section syiea +.section syieb +.section syifa +.section syifb +.section syiga +.section syigb +.section syiha +.section syihb +.section syiia +.section syiib +.section syija +.section syijb +.section syika +.section syikb +.section syila +.section syilb +.section syima +.section syimb +.section syina +.section syinb +.section syioa +.section syiob +.section syipa +.section syipb +.section syiqa +.section syiqb +.section syira +.section syirb +.section syisa +.section syisb +.section syita +.section syitb +.section syiua +.section syiub +.section syiva +.section syivb +.section syiwa +.section syiwb +.section syixa +.section syixb +.section syiya +.section syiyb +.section syiza +.section syizb +.section syi1a +.section syi1b +.section syi2a +.section syi2b +.section syi3a +.section syi3b +.section syi4a +.section syi4b +.section syi5a +.section syi5b +.section syi6a +.section syi6b +.section syi7a +.section syi7b +.section syi8a +.section syi8b +.section syi9a +.section syi9b +.section syi0a +.section syi0b +.section syjaa +.section syjab +.section syjba +.section syjbb +.section syjca +.section syjcb +.section syjda +.section syjdb +.section syjea +.section syjeb +.section syjfa +.section syjfb +.section syjga +.section syjgb +.section syjha +.section syjhb +.section syjia +.section syjib +.section syjja +.section syjjb +.section syjka +.section syjkb +.section syjla +.section syjlb +.section syjma +.section syjmb +.section syjna +.section syjnb +.section syjoa +.section syjob +.section syjpa +.section syjpb +.section syjqa +.section syjqb +.section syjra +.section syjrb +.section syjsa +.section syjsb +.section syjta +.section syjtb +.section syjua +.section syjub +.section syjva +.section syjvb +.section syjwa +.section syjwb +.section syjxa +.section syjxb +.section syjya +.section syjyb +.section syjza +.section syjzb +.section syj1a +.section syj1b +.section syj2a +.section syj2b +.section syj3a +.section syj3b +.section syj4a +.section syj4b +.section syj5a +.section syj5b +.section syj6a +.section syj6b +.section syj7a +.section syj7b +.section syj8a +.section syj8b +.section syj9a +.section syj9b +.section syj0a +.section syj0b +.section sykaa +.section sykab +.section sykba +.section sykbb +.section sykca +.section sykcb +.section sykda +.section sykdb +.section sykea +.section sykeb +.section sykfa +.section sykfb +.section sykga +.section sykgb +.section sykha +.section sykhb +.section sykia +.section sykib +.section sykja +.section sykjb +.section sykka +.section sykkb +.section sykla +.section syklb +.section sykma +.section sykmb +.section sykna +.section syknb +.section sykoa +.section sykob +.section sykpa +.section sykpb +.section sykqa +.section sykqb +.section sykra +.section sykrb +.section syksa +.section syksb +.section sykta +.section syktb +.section sykua +.section sykub +.section sykva +.section sykvb +.section sykwa +.section sykwb +.section sykxa +.section sykxb +.section sykya +.section sykyb +.section sykza +.section sykzb +.section syk1a +.section syk1b +.section syk2a +.section syk2b +.section syk3a +.section syk3b +.section syk4a +.section syk4b +.section syk5a +.section syk5b +.section syk6a +.section syk6b +.section syk7a +.section syk7b +.section syk8a +.section syk8b +.section syk9a +.section syk9b +.section syk0a +.section syk0b +.section sylaa +.section sylab +.section sylba +.section sylbb +.section sylca +.section sylcb +.section sylda +.section syldb +.section sylea +.section syleb +.section sylfa +.section sylfb +.section sylga +.section sylgb +.section sylha +.section sylhb +.section sylia +.section sylib +.section sylja +.section syljb +.section sylka +.section sylkb +.section sylla +.section syllb +.section sylma +.section sylmb +.section sylna +.section sylnb +.section syloa +.section sylob +.section sylpa +.section sylpb +.section sylqa +.section sylqb +.section sylra +.section sylrb +.section sylsa +.section sylsb +.section sylta +.section syltb +.section sylua +.section sylub +.section sylva +.section sylvb +.section sylwa +.section sylwb +.section sylxa +.section sylxb +.section sylya +.section sylyb +.section sylza +.section sylzb +.section syl1a +.section syl1b +.section syl2a +.section syl2b +.section syl3a +.section syl3b +.section syl4a +.section syl4b +.section syl5a +.section syl5b +.section syl6a +.section syl6b +.section syl7a +.section syl7b +.section syl8a +.section syl8b +.section syl9a +.section syl9b +.section syl0a +.section syl0b +.section symaa +.section symab +.section symba +.section symbb +.section symca +.section symcb +.section symda +.section symdb +.section symea +.section symeb +.section symfa +.section symfb +.section symga +.section symgb +.section symha +.section symhb +.section symia +.section symib +.section symja +.section symjb +.section symka +.section symkb +.section symla +.section symlb +.section symma +.section symmb +.section symna +.section symnb +.section symoa +.section symob +.section sympa +.section sympb +.section symqa +.section symqb +.section symra +.section symrb +.section symsa +.section symsb +.section symta +.section symtb +.section symua +.section symub +.section symva +.section symvb +.section symwa +.section symwb +.section symxa +.section symxb +.section symya +.section symyb +.section symza +.section symzb +.section sym1a +.section sym1b +.section sym2a +.section sym2b +.section sym3a +.section sym3b +.section sym4a +.section sym4b +.section sym5a +.section sym5b +.section sym6a +.section sym6b +.section sym7a +.section sym7b +.section sym8a +.section sym8b +.section sym9a +.section sym9b +.section sym0a +.section sym0b +.section synaa +.section synab +.section synba +.section synbb +.section synca +.section syncb +.section synda +.section syndb +.section synea +.section syneb +.section synfa +.section synfb +.section synga +.section syngb +.section synha +.section synhb +.section synia +.section synib +.section synja +.section synjb +.section synka +.section synkb +.section synla +.section synlb +.section synma +.section synmb +.section synna +.section synnb +.section synoa +.section synob +.section synpa +.section synpb +.section synqa +.section synqb +.section synra +.section synrb +.section synsa +.section synsb +.section synta +.section syntb +.section synua +.section synub +.section synva +.section synvb +.section synwa +.section synwb +.section synxa +.section synxb +.section synya +.section synyb +.section synza +.section synzb +.section syn1a +.section syn1b +.section syn2a +.section syn2b +.section syn3a +.section syn3b +.section syn4a +.section syn4b +.section syn5a +.section syn5b +.section syn6a +.section syn6b +.section syn7a +.section syn7b +.section syn8a +.section syn8b +.section syn9a +.section syn9b +.section syn0a +.section syn0b +.section syoaa +.section syoab +.section syoba +.section syobb +.section syoca +.section syocb +.section syoda +.section syodb +.section syoea +.section syoeb +.section syofa +.section syofb +.section syoga +.section syogb +.section syoha +.section syohb +.section syoia +.section syoib +.section syoja +.section syojb +.section syoka +.section syokb +.section syola +.section syolb +.section syoma +.section syomb +.section syona +.section syonb +.section syooa +.section syoob +.section syopa +.section syopb +.section syoqa +.section syoqb +.section syora +.section syorb +.section syosa +.section syosb +.section syota +.section syotb +.section syoua +.section syoub +.section syova +.section syovb +.section syowa +.section syowb +.section syoxa +.section syoxb +.section syoya +.section syoyb +.section syoza +.section syozb +.section syo1a +.section syo1b +.section syo2a +.section syo2b +.section syo3a +.section syo3b +.section syo4a +.section syo4b +.section syo5a +.section syo5b +.section syo6a +.section syo6b +.section syo7a +.section syo7b +.section syo8a +.section syo8b +.section syo9a +.section syo9b +.section syo0a +.section syo0b +.section sypaa +.section sypab +.section sypba +.section sypbb +.section sypca +.section sypcb +.section sypda +.section sypdb +.section sypea +.section sypeb +.section sypfa +.section sypfb +.section sypga +.section sypgb +.section sypha +.section syphb +.section sypia +.section sypib +.section sypja +.section sypjb +.section sypka +.section sypkb +.section sypla +.section syplb +.section sypma +.section sypmb +.section sypna +.section sypnb +.section sypoa +.section sypob +.section syppa +.section syppb +.section sypqa +.section sypqb +.section sypra +.section syprb +.section sypsa +.section sypsb +.section sypta +.section syptb +.section sypua +.section sypub +.section sypva +.section sypvb +.section sypwa +.section sypwb +.section sypxa +.section sypxb +.section sypya +.section sypyb +.section sypza +.section sypzb +.section syp1a +.section syp1b +.section syp2a +.section syp2b +.section syp3a +.section syp3b +.section syp4a +.section syp4b +.section syp5a +.section syp5b +.section syp6a +.section syp6b +.section syp7a +.section syp7b +.section syp8a +.section syp8b +.section syp9a +.section syp9b +.section syp0a +.section syp0b +.section syqaa +.section syqab +.section syqba +.section syqbb +.section syqca +.section syqcb +.section syqda +.section syqdb +.section syqea +.section syqeb +.section syqfa +.section syqfb +.section syqga +.section syqgb +.section syqha +.section syqhb +.section syqia +.section syqib +.section syqja +.section syqjb +.section syqka +.section syqkb +.section syqla +.section syqlb +.section syqma +.section syqmb +.section syqna +.section syqnb +.section syqoa +.section syqob +.section syqpa +.section syqpb +.section syqqa +.section syqqb +.section syqra +.section syqrb +.section syqsa +.section syqsb +.section syqta +.section syqtb +.section syqua +.section syqub +.section syqva +.section syqvb +.section syqwa +.section syqwb +.section syqxa +.section syqxb +.section syqya +.section syqyb +.section syqza +.section syqzb +.section syq1a +.section syq1b +.section syq2a +.section syq2b +.section syq3a +.section syq3b +.section syq4a +.section syq4b +.section syq5a +.section syq5b +.section syq6a +.section syq6b +.section syq7a +.section syq7b +.section syq8a +.section syq8b +.section syq9a +.section syq9b +.section syq0a +.section syq0b +.section syraa +.section syrab +.section syrba +.section syrbb +.section syrca +.section syrcb +.section syrda +.section syrdb +.section syrea +.section syreb +.section syrfa +.section syrfb +.section syrga +.section syrgb +.section syrha +.section syrhb +.section syria +.section syrib +.section syrja +.section syrjb +.section syrka +.section syrkb +.section syrla +.section syrlb +.section syrma +.section syrmb +.section syrna +.section syrnb +.section syroa +.section syrob +.section syrpa +.section syrpb +.section syrqa +.section syrqb +.section syrra +.section syrrb +.section syrsa +.section syrsb +.section syrta +.section syrtb +.section syrua +.section syrub +.section syrva +.section syrvb +.section syrwa +.section syrwb +.section syrxa +.section syrxb +.section syrya +.section syryb +.section syrza +.section syrzb +.section syr1a +.section syr1b +.section syr2a +.section syr2b +.section syr3a +.section syr3b +.section syr4a +.section syr4b +.section syr5a +.section syr5b +.section syr6a +.section syr6b +.section syr7a +.section syr7b +.section syr8a +.section syr8b +.section syr9a +.section syr9b +.section syr0a +.section syr0b +.section sysaa +.section sysab +.section sysba +.section sysbb +.section sysca +.section syscb +.section sysda +.section sysdb +.section sysea +.section syseb +.section sysfa +.section sysfb +.section sysga +.section sysgb +.section sysha +.section syshb +.section sysia +.section sysib +.section sysja +.section sysjb +.section syska +.section syskb +.section sysla +.section syslb +.section sysma +.section sysmb +.section sysna +.section sysnb +.section sysoa +.section sysob +.section syspa +.section syspb +.section sysqa +.section sysqb +.section sysra +.section sysrb +.section syssa +.section syssb +.section systa +.section systb +.section sysua +.section sysub +.section sysva +.section sysvb +.section syswa +.section syswb +.section sysxa +.section sysxb +.section sysya +.section sysyb +.section sysza +.section syszb +.section sys1a +.section sys1b +.section sys2a +.section sys2b +.section sys3a +.section sys3b +.section sys4a +.section sys4b +.section sys5a +.section sys5b +.section sys6a +.section sys6b +.section sys7a +.section sys7b +.section sys8a +.section sys8b +.section sys9a +.section sys9b +.section sys0a +.section sys0b +.section sytaa +.section sytab +.section sytba +.section sytbb +.section sytca +.section sytcb +.section sytda +.section sytdb +.section sytea +.section syteb +.section sytfa +.section sytfb +.section sytga +.section sytgb +.section sytha +.section sythb +.section sytia +.section sytib +.section sytja +.section sytjb +.section sytka +.section sytkb +.section sytla +.section sytlb +.section sytma +.section sytmb +.section sytna +.section sytnb +.section sytoa +.section sytob +.section sytpa +.section sytpb +.section sytqa +.section sytqb +.section sytra +.section sytrb +.section sytsa +.section sytsb +.section sytta +.section syttb +.section sytua +.section sytub +.section sytva +.section sytvb +.section sytwa +.section sytwb +.section sytxa +.section sytxb +.section sytya +.section sytyb +.section sytza +.section sytzb +.section syt1a +.section syt1b +.section syt2a +.section syt2b +.section syt3a +.section syt3b +.section syt4a +.section syt4b +.section syt5a +.section syt5b +.section syt6a +.section syt6b +.section syt7a +.section syt7b +.section syt8a +.section syt8b +.section syt9a +.section syt9b +.section syt0a +.section syt0b +.section syuaa +.section syuab +.section syuba +.section syubb +.section syuca +.section syucb +.section syuda +.section syudb +.section syuea +.section syueb +.section syufa +.section syufb +.section syuga +.section syugb +.section syuha +.section syuhb +.section syuia +.section syuib +.section syuja +.section syujb +.section syuka +.section syukb +.section syula +.section syulb +.section syuma +.section syumb +.section syuna +.section syunb +.section syuoa +.section syuob +.section syupa +.section syupb +.section syuqa +.section syuqb +.section syura +.section syurb +.section syusa +.section syusb +.section syuta +.section syutb +.section syuua +.section syuub +.section syuva +.section syuvb +.section syuwa +.section syuwb +.section syuxa +.section syuxb +.section syuya +.section syuyb +.section syuza +.section syuzb +.section syu1a +.section syu1b +.section syu2a +.section syu2b +.section syu3a +.section syu3b +.section syu4a +.section syu4b +.section syu5a +.section syu5b +.section syu6a +.section syu6b +.section syu7a +.section syu7b +.section syu8a +.section syu8b +.section syu9a +.section syu9b +.section syu0a +.section syu0b +.section syvaa +.section syvab +.section syvba +.section syvbb +.section syvca +.section syvcb +.section syvda +.section syvdb +.section syvea +.section syveb +.section syvfa +.section syvfb +.section syvga +.section syvgb +.section syvha +.section syvhb +.section syvia +.section syvib +.section syvja +.section syvjb +.section syvka +.section syvkb +.section syvla +.section syvlb +.section syvma +.section syvmb +.section syvna +.section syvnb +.section syvoa +.section syvob +.section syvpa +.section syvpb +.section syvqa +.section syvqb +.section syvra +.section syvrb +.section syvsa +.section syvsb +.section syvta +.section syvtb +.section syvua +.section syvub +.section syvva +.section syvvb +.section syvwa +.section syvwb +.section syvxa +.section syvxb +.section syvya +.section syvyb +.section syvza +.section syvzb +.section syv1a +.section syv1b +.section syv2a +.section syv2b +.section syv3a +.section syv3b +.section syv4a +.section syv4b +.section syv5a +.section syv5b +.section syv6a +.section syv6b +.section syv7a +.section syv7b +.section syv8a +.section syv8b +.section syv9a +.section syv9b +.section syv0a +.section syv0b +.section sywaa +.section sywab +.section sywba +.section sywbb +.section sywca +.section sywcb +.section sywda +.section sywdb +.section sywea +.section syweb +.section sywfa +.section sywfb +.section sywga +.section sywgb +.section sywha +.section sywhb +.section sywia +.section sywib +.section sywja +.section sywjb +.section sywka +.section sywkb +.section sywla +.section sywlb +.section sywma +.section sywmb +.section sywna +.section sywnb +.section sywoa +.section sywob +.section sywpa +.section sywpb +.section sywqa +.section sywqb +.section sywra +.section sywrb +.section sywsa +.section sywsb +.section sywta +.section sywtb +.section sywua +.section sywub +.section sywva +.section sywvb +.section sywwa +.section sywwb +.section sywxa +.section sywxb +.section sywya +.section sywyb +.section sywza +.section sywzb +.section syw1a +.section syw1b +.section syw2a +.section syw2b +.section syw3a +.section syw3b +.section syw4a +.section syw4b +.section syw5a +.section syw5b +.section syw6a +.section syw6b +.section syw7a +.section syw7b +.section syw8a +.section syw8b +.section syw9a +.section syw9b +.section syw0a +.section syw0b +.section syxaa +.section syxab +.section syxba +.section syxbb +.section syxca +.section syxcb +.section syxda +.section syxdb +.section syxea +.section syxeb +.section syxfa +.section syxfb +.section syxga +.section syxgb +.section syxha +.section syxhb +.section syxia +.section syxib +.section syxja +.section syxjb +.section syxka +.section syxkb +.section syxla +.section syxlb +.section syxma +.section syxmb +.section syxna +.section syxnb +.section syxoa +.section syxob +.section syxpa +.section syxpb +.section syxqa +.section syxqb +.section syxra +.section syxrb +.section syxsa +.section syxsb +.section syxta +.section syxtb +.section syxua +.section syxub +.section syxva +.section syxvb +.section syxwa +.section syxwb +.section syxxa +.section syxxb +.section syxya +.section syxyb +.section syxza +.section syxzb +.section syx1a +.section syx1b +.section syx2a +.section syx2b +.section syx3a +.section syx3b +.section syx4a +.section syx4b +.section syx5a +.section syx5b +.section syx6a +.section syx6b +.section syx7a +.section syx7b +.section syx8a +.section syx8b +.section syx9a +.section syx9b +.section syx0a +.section syx0b +.section syyaa +.section syyab +.section syyba +.section syybb +.section syyca +.section syycb +.section syyda +.section syydb +.section syyea +.section syyeb +.section syyfa +.section syyfb +.section syyga +.section syygb +.section syyha +.section syyhb +.section syyia +.section syyib +.section syyja +.section syyjb +.section syyka +.section syykb +.section syyla +.section syylb +.section syyma +.section syymb +.section syyna +.section syynb +.section syyoa +.section syyob +.section syypa +.section syypb +.section syyqa +.section syyqb +.section syyra +.section syyrb +.section syysa +.section syysb +.section syyta +.section syytb +.section syyua +.section syyub +.section syyva +.section syyvb +.section syywa +.section syywb +.section syyxa +.section syyxb +.section syyya +.section syyyb +.section syyza +.section syyzb +.section syy1a +.section syy1b +.section syy2a +.section syy2b +.section syy3a +.section syy3b +.section syy4a +.section syy4b +.section syy5a +.section syy5b +.section syy6a +.section syy6b +.section syy7a +.section syy7b +.section syy8a +.section syy8b +.section syy9a +.section syy9b +.section syy0a +.section syy0b +.section syzaa +.section syzab +.section syzba +.section syzbb +.section syzca +.section syzcb +.section syzda +.section syzdb +.section syzea +.section syzeb +.section syzfa +.section syzfb +.section syzga +.section syzgb +.section syzha +.section syzhb +.section syzia +.section syzib +.section syzja +.section syzjb +.section syzka +.section syzkb +.section syzla +.section syzlb +.section syzma +.section syzmb +.section syzna +.section syznb +.section syzoa +.section syzob +.section syzpa +.section syzpb +.section syzqa +.section syzqb +.section syzra +.section syzrb +.section syzsa +.section syzsb +.section syzta +.section syztb +.section syzua +.section syzub +.section syzva +.section syzvb +.section syzwa +.section syzwb +.section syzxa +.section syzxb +.section syzya +.section syzyb +.section syzza +.section syzzb +.section syz1a +.section syz1b +.section syz2a +.section syz2b +.section syz3a +.section syz3b +.section syz4a +.section syz4b +.section syz5a +.section syz5b +.section syz6a +.section syz6b +.section syz7a +.section syz7b +.section syz8a +.section syz8b +.section syz9a +.section syz9b +.section syz0a +.section syz0b +.section sy1aa +.section sy1ab +.section sy1ba +.section sy1bb +.section sy1ca +.section sy1cb +.section sy1da +.section sy1db +.section sy1ea +.section sy1eb +.section sy1fa +.section sy1fb +.section sy1ga +.section sy1gb +.section sy1ha +.section sy1hb +.section sy1ia +.section sy1ib +.section sy1ja +.section sy1jb +.section sy1ka +.section sy1kb +.section sy1la +.section sy1lb +.section sy1ma +.section sy1mb +.section sy1na +.section sy1nb +.section sy1oa +.section sy1ob +.section sy1pa +.section sy1pb +.section sy1qa +.section sy1qb +.section sy1ra +.section sy1rb +.section sy1sa +.section sy1sb +.section sy1ta +.section sy1tb +.section sy1ua +.section sy1ub +.section sy1va +.section sy1vb +.section sy1wa +.section sy1wb +.section sy1xa +.section sy1xb +.section sy1ya +.section sy1yb +.section sy1za +.section sy1zb +.section sy11a +.section sy11b +.section sy12a +.section sy12b +.section sy13a +.section sy13b +.section sy14a +.section sy14b +.section sy15a +.section sy15b +.section sy16a +.section sy16b +.section sy17a +.section sy17b +.section sy18a +.section sy18b +.section sy19a +.section sy19b +.section sy10a +.section sy10b +.section sy2aa +.section sy2ab +.section sy2ba +.section sy2bb +.section sy2ca +.section sy2cb +.section sy2da +.section sy2db +.section sy2ea +.section sy2eb +.section sy2fa +.section sy2fb +.section sy2ga +.section sy2gb +.section sy2ha +.section sy2hb +.section sy2ia +.section sy2ib +.section sy2ja +.section sy2jb +.section sy2ka +.section sy2kb +.section sy2la +.section sy2lb +.section sy2ma +.section sy2mb +.section sy2na +.section sy2nb +.section sy2oa +.section sy2ob +.section sy2pa +.section sy2pb +.section sy2qa +.section sy2qb +.section sy2ra +.section sy2rb +.section sy2sa +.section sy2sb +.section sy2ta +.section sy2tb +.section sy2ua +.section sy2ub +.section sy2va +.section sy2vb +.section sy2wa +.section sy2wb +.section sy2xa +.section sy2xb +.section sy2ya +.section sy2yb +.section sy2za +.section sy2zb +.section sy21a +.section sy21b +.section sy22a +.section sy22b +.section sy23a +.section sy23b +.section sy24a +.section sy24b +.section sy25a +.section sy25b +.section sy26a +.section sy26b +.section sy27a +.section sy27b +.section sy28a +.section sy28b +.section sy29a +.section sy29b +.section sy20a +.section sy20b +.section sy3aa +.section sy3ab +.section sy3ba +.section sy3bb +.section sy3ca +.section sy3cb +.section sy3da +.section sy3db +.section sy3ea +.section sy3eb +.section sy3fa +.section sy3fb +.section sy3ga +.section sy3gb +.section sy3ha +.section sy3hb +.section sy3ia +.section sy3ib +.section sy3ja +.section sy3jb +.section sy3ka +.section sy3kb +.section sy3la +.section sy3lb +.section sy3ma +.section sy3mb +.section sy3na +.section sy3nb +.section sy3oa +.section sy3ob +.section sy3pa +.section sy3pb +.section sy3qa +.section sy3qb +.section sy3ra +.section sy3rb +.section sy3sa +.section sy3sb +.section sy3ta +.section sy3tb +.section sy3ua +.section sy3ub +.section sy3va +.section sy3vb +.section sy3wa +.section sy3wb +.section sy3xa +.section sy3xb +.section sy3ya +.section sy3yb +.section sy3za +.section sy3zb +.section sy31a +.section sy31b +.section sy32a +.section sy32b +.section sy33a +.section sy33b +.section sy34a +.section sy34b +.section sy35a +.section sy35b +.section sy36a +.section sy36b +.section sy37a +.section sy37b +.section sy38a +.section sy38b +.section sy39a +.section sy39b +.section sy30a +.section sy30b +.section sy4aa +.section sy4ab +.section sy4ba +.section sy4bb +.section sy4ca +.section sy4cb +.section sy4da +.section sy4db +.section sy4ea +.section sy4eb +.section sy4fa +.section sy4fb +.section sy4ga +.section sy4gb +.section sy4ha +.section sy4hb +.section sy4ia +.section sy4ib +.section sy4ja +.section sy4jb +.section sy4ka +.section sy4kb +.section sy4la +.section sy4lb +.section sy4ma +.section sy4mb +.section sy4na +.section sy4nb +.section sy4oa +.section sy4ob +.section sy4pa +.section sy4pb +.section sy4qa +.section sy4qb +.section sy4ra +.section sy4rb +.section sy4sa +.section sy4sb +.section sy4ta +.section sy4tb +.section sy4ua +.section sy4ub +.section sy4va +.section sy4vb +.section sy4wa +.section sy4wb +.section sy4xa +.section sy4xb +.section sy4ya +.section sy4yb +.section sy4za +.section sy4zb +.section sy41a +.section sy41b +.section sy42a +.section sy42b +.section sy43a +.section sy43b +.section sy44a +.section sy44b +.section sy45a +.section sy45b +.section sy46a +.section sy46b +.section sy47a +.section sy47b +.section sy48a +.section sy48b +.section sy49a +.section sy49b +.section sy40a +.section sy40b +.section sy5aa +.section sy5ab +.section sy5ba +.section sy5bb +.section sy5ca +.section sy5cb +.section sy5da +.section sy5db +.section sy5ea +.section sy5eb +.section sy5fa +.section sy5fb +.section sy5ga +.section sy5gb +.section sy5ha +.section sy5hb +.section sy5ia +.section sy5ib +.section sy5ja +.section sy5jb +.section sy5ka +.section sy5kb +.section sy5la +.section sy5lb +.section sy5ma +.section sy5mb +.section sy5na +.section sy5nb +.section sy5oa +.section sy5ob +.section sy5pa +.section sy5pb +.section sy5qa +.section sy5qb +.section sy5ra +.section sy5rb +.section sy5sa +.section sy5sb +.section sy5ta +.section sy5tb +.section sy5ua +.section sy5ub +.section sy5va +.section sy5vb +.section sy5wa +.section sy5wb +.section sy5xa +.section sy5xb +.section sy5ya +.section sy5yb +.section sy5za +.section sy5zb +.section sy51a +.section sy51b +.section sy52a +.section sy52b +.section sy53a +.section sy53b +.section sy54a +.section sy54b +.section sy55a +.section sy55b +.section sy56a +.section sy56b +.section sy57a +.section sy57b +.section sy58a +.section sy58b +.section sy59a +.section sy59b +.section sy50a +.section sy50b +.section sy6aa +.section sy6ab +.section sy6ba +.section sy6bb +.section sy6ca +.section sy6cb +.section sy6da +.section sy6db +.section sy6ea +.section sy6eb +.section sy6fa +.section sy6fb +.section sy6ga +.section sy6gb +.section sy6ha +.section sy6hb +.section sy6ia +.section sy6ib +.section sy6ja +.section sy6jb +.section sy6ka +.section sy6kb +.section sy6la +.section sy6lb +.section sy6ma +.section sy6mb +.section sy6na +.section sy6nb +.section sy6oa +.section sy6ob +.section sy6pa +.section sy6pb +.section sy6qa +.section sy6qb +.section sy6ra +.section sy6rb +.section sy6sa +.section sy6sb +.section sy6ta +.section sy6tb +.section sy6ua +.section sy6ub +.section sy6va +.section sy6vb +.section sy6wa +.section sy6wb +.section sy6xa +.section sy6xb +.section sy6ya +.section sy6yb +.section sy6za +.section sy6zb +.section sy61a +.section sy61b +.section sy62a +.section sy62b +.section sy63a +.section sy63b +.section sy64a +.section sy64b +.section sy65a +.section sy65b +.section sy66a +.section sy66b +.section sy67a +.section sy67b +.section sy68a +.section sy68b +.section sy69a +.section sy69b +.section sy60a +.section sy60b +.section sy7aa +.section sy7ab +.section sy7ba +.section sy7bb +.section sy7ca +.section sy7cb +.section sy7da +.section sy7db +.section sy7ea +.section sy7eb +.section sy7fa +.section sy7fb +.section sy7ga +.section sy7gb +.section sy7ha +.section sy7hb +.section sy7ia +.section sy7ib +.section sy7ja +.section sy7jb +.section sy7ka +.section sy7kb +.section sy7la +.section sy7lb +.section sy7ma +.section sy7mb +.section sy7na +.section sy7nb +.section sy7oa +.section sy7ob +.section sy7pa +.section sy7pb +.section sy7qa +.section sy7qb +.section sy7ra +.section sy7rb +.section sy7sa +.section sy7sb +.section sy7ta +.section sy7tb +.section sy7ua +.section sy7ub +.section sy7va +.section sy7vb +.section sy7wa +.section sy7wb +.section sy7xa +.section sy7xb +.section sy7ya +.section sy7yb +.section sy7za +.section sy7zb +.section sy71a +.section sy71b +.section sy72a +.section sy72b +.section sy73a +.section sy73b +.section sy74a +.section sy74b +.section sy75a +.section sy75b +.section sy76a +.section sy76b +.section sy77a +.section sy77b +.section sy78a +.section sy78b +.section sy79a +.section sy79b +.section sy70a +.section sy70b +.section sy8aa +.section sy8ab +.section sy8ba +.section sy8bb +.section sy8ca +.section sy8cb +.section sy8da +.section sy8db +.section sy8ea +.section sy8eb +.section sy8fa +.section sy8fb +.section sy8ga +.section sy8gb +.section sy8ha +.section sy8hb +.section sy8ia +.section sy8ib +.section sy8ja +.section sy8jb +.section sy8ka +.section sy8kb +.section sy8la +.section sy8lb +.section sy8ma +.section sy8mb +.section sy8na +.section sy8nb +.section sy8oa +.section sy8ob +.section sy8pa +.section sy8pb +.section sy8qa +.section sy8qb +.section sy8ra +.section sy8rb +.section sy8sa +.section sy8sb +.section sy8ta +.section sy8tb +.section sy8ua +.section sy8ub +.section sy8va +.section sy8vb +.section sy8wa +.section sy8wb +.section sy8xa +.section sy8xb +.section sy8ya +.section sy8yb +.section sy8za +.section sy8zb +.section sy81a +.section sy81b +.section sy82a +.section sy82b +.section sy83a +.section sy83b +.section sy84a +.section sy84b +.section sy85a +.section sy85b +.section sy86a +.section sy86b +.section sy87a +.section sy87b +.section sy88a +.section sy88b +.section sy89a +.section sy89b +.section sy80a +.section sy80b +.section sy9aa +.section sy9ab +.section sy9ba +.section sy9bb +.section sy9ca +.section sy9cb +.section sy9da +.section sy9db +.section sy9ea +.section sy9eb +.section sy9fa +.section sy9fb +.section sy9ga +.section sy9gb +.section sy9ha +.section sy9hb +.section sy9ia +.section sy9ib +.section sy9ja +.section sy9jb +.section sy9ka +.section sy9kb +.section sy9la +.section sy9lb +.section sy9ma +.section sy9mb +.section sy9na +.section sy9nb +.section sy9oa +.section sy9ob +.section sy9pa +.section sy9pb +.section sy9qa +.section sy9qb +.section sy9ra +.section sy9rb +.section sy9sa +.section sy9sb +.section sy9ta +.section sy9tb +.section sy9ua +.section sy9ub +.section sy9va +.section sy9vb +.section sy9wa +.section sy9wb +.section sy9xa +.section sy9xb +.section sy9ya +.section sy9yb +.section sy9za +.section sy9zb +.section sy91a +.section sy91b +.section sy92a +.section sy92b +.section sy93a +.section sy93b +.section sy94a +.section sy94b +.section sy95a +.section sy95b +.section sy96a +.section sy96b +.section sy97a +.section sy97b +.section sy98a +.section sy98b +.section sy99a +.section sy99b +.section sy90a +.section sy90b +.section sy0aa +.section sy0ab +.section sy0ba +.section sy0bb +.section sy0ca +.section sy0cb +.section sy0da +.section sy0db +.section sy0ea +.section sy0eb +.section sy0fa +.section sy0fb +.section sy0ga +.section sy0gb +.section sy0ha +.section sy0hb +.section sy0ia +.section sy0ib +.section sy0ja +.section sy0jb +.section sy0ka +.section sy0kb +.section sy0la +.section sy0lb +.section sy0ma +.section sy0mb +.section sy0na +.section sy0nb +.section sy0oa +.section sy0ob +.section sy0pa +.section sy0pb +.section sy0qa +.section sy0qb +.section sy0ra +.section sy0rb +.section sy0sa +.section sy0sb +.section sy0ta +.section sy0tb +.section sy0ua +.section sy0ub +.section sy0va +.section sy0vb +.section sy0wa +.section sy0wb +.section sy0xa +.section sy0xb +.section sy0ya +.section sy0yb +.section sy0za +.section sy0zb +.section sy01a +.section sy01b +.section sy02a +.section sy02b +.section sy03a +.section sy03b +.section sy04a +.section sy04b +.section sy05a +.section sy05b +.section sy06a +.section sy06b +.section sy07a +.section sy07b +.section sy08a +.section sy08b +.section sy09a +.section sy09b +.section sy00a +.section sy00b +.section szaaa +.section szaab +.section szaba +.section szabb +.section szaca +.section szacb +.section szada +.section szadb +.section szaea +.section szaeb +.section szafa +.section szafb +.section szaga +.section szagb +.section szaha +.section szahb +.section szaia +.section szaib +.section szaja +.section szajb +.section szaka +.section szakb +.section szala +.section szalb +.section szama +.section szamb +.section szana +.section szanb +.section szaoa +.section szaob +.section szapa +.section szapb +.section szaqa +.section szaqb +.section szara +.section szarb +.section szasa +.section szasb +.section szata +.section szatb +.section szaua +.section szaub +.section szava +.section szavb +.section szawa +.section szawb +.section szaxa +.section szaxb +.section szaya +.section szayb +.section szaza +.section szazb +.section sza1a +.section sza1b +.section sza2a +.section sza2b +.section sza3a +.section sza3b +.section sza4a +.section sza4b +.section sza5a +.section sza5b +.section sza6a +.section sza6b +.section sza7a +.section sza7b +.section sza8a +.section sza8b +.section sza9a +.section sza9b +.section sza0a +.section sza0b +.section szbaa +.section szbab +.section szbba +.section szbbb +.section szbca +.section szbcb +.section szbda +.section szbdb +.section szbea +.section szbeb +.section szbfa +.section szbfb +.section szbga +.section szbgb +.section szbha +.section szbhb +.section szbia +.section szbib +.section szbja +.section szbjb +.section szbka +.section szbkb +.section szbla +.section szblb +.section szbma +.section szbmb +.section szbna +.section szbnb +.section szboa +.section szbob +.section szbpa +.section szbpb +.section szbqa +.section szbqb +.section szbra +.section szbrb +.section szbsa +.section szbsb +.section szbta +.section szbtb +.section szbua +.section szbub +.section szbva +.section szbvb +.section szbwa +.section szbwb +.section szbxa +.section szbxb +.section szbya +.section szbyb +.section szbza +.section szbzb +.section szb1a +.section szb1b +.section szb2a +.section szb2b +.section szb3a +.section szb3b +.section szb4a +.section szb4b +.section szb5a +.section szb5b +.section szb6a +.section szb6b +.section szb7a +.section szb7b +.section szb8a +.section szb8b +.section szb9a +.section szb9b +.section szb0a +.section szb0b +.section szcaa +.section szcab +.section szcba +.section szcbb +.section szcca +.section szccb +.section szcda +.section szcdb +.section szcea +.section szceb +.section szcfa +.section szcfb +.section szcga +.section szcgb +.section szcha +.section szchb +.section szcia +.section szcib +.section szcja +.section szcjb +.section szcka +.section szckb +.section szcla +.section szclb +.section szcma +.section szcmb +.section szcna +.section szcnb +.section szcoa +.section szcob +.section szcpa +.section szcpb +.section szcqa +.section szcqb +.section szcra +.section szcrb +.section szcsa +.section szcsb +.section szcta +.section szctb +.section szcua +.section szcub +.section szcva +.section szcvb +.section szcwa +.section szcwb +.section szcxa +.section szcxb +.section szcya +.section szcyb +.section szcza +.section szczb +.section szc1a +.section szc1b +.section szc2a +.section szc2b +.section szc3a +.section szc3b +.section szc4a +.section szc4b +.section szc5a +.section szc5b +.section szc6a +.section szc6b +.section szc7a +.section szc7b +.section szc8a +.section szc8b +.section szc9a +.section szc9b +.section szc0a +.section szc0b +.section szdaa +.section szdab +.section szdba +.section szdbb +.section szdca +.section szdcb +.section szdda +.section szddb +.section szdea +.section szdeb +.section szdfa +.section szdfb +.section szdga +.section szdgb +.section szdha +.section szdhb +.section szdia +.section szdib +.section szdja +.section szdjb +.section szdka +.section szdkb +.section szdla +.section szdlb +.section szdma +.section szdmb +.section szdna +.section szdnb +.section szdoa +.section szdob +.section szdpa +.section szdpb +.section szdqa +.section szdqb +.section szdra +.section szdrb +.section szdsa +.section szdsb +.section szdta +.section szdtb +.section szdua +.section szdub +.section szdva +.section szdvb +.section szdwa +.section szdwb +.section szdxa +.section szdxb +.section szdya +.section szdyb +.section szdza +.section szdzb +.section szd1a +.section szd1b +.section szd2a +.section szd2b +.section szd3a +.section szd3b +.section szd4a +.section szd4b +.section szd5a +.section szd5b +.section szd6a +.section szd6b +.section szd7a +.section szd7b +.section szd8a +.section szd8b +.section szd9a +.section szd9b +.section szd0a +.section szd0b +.section szeaa +.section szeab +.section szeba +.section szebb +.section szeca +.section szecb +.section szeda +.section szedb +.section szeea +.section szeeb +.section szefa +.section szefb +.section szega +.section szegb +.section szeha +.section szehb +.section szeia +.section szeib +.section szeja +.section szejb +.section szeka +.section szekb +.section szela +.section szelb +.section szema +.section szemb +.section szena +.section szenb +.section szeoa +.section szeob +.section szepa +.section szepb +.section szeqa +.section szeqb +.section szera +.section szerb +.section szesa +.section szesb +.section szeta +.section szetb +.section szeua +.section szeub +.section szeva +.section szevb +.section szewa +.section szewb +.section szexa +.section szexb +.section szeya +.section szeyb +.section szeza +.section szezb +.section sze1a +.section sze1b +.section sze2a +.section sze2b +.section sze3a +.section sze3b +.section sze4a +.section sze4b +.section sze5a +.section sze5b +.section sze6a +.section sze6b +.section sze7a +.section sze7b +.section sze8a +.section sze8b +.section sze9a +.section sze9b +.section sze0a +.section sze0b +.section szfaa +.section szfab +.section szfba +.section szfbb +.section szfca +.section szfcb +.section szfda +.section szfdb +.section szfea +.section szfeb +.section szffa +.section szffb +.section szfga +.section szfgb +.section szfha +.section szfhb +.section szfia +.section szfib +.section szfja +.section szfjb +.section szfka +.section szfkb +.section szfla +.section szflb +.section szfma +.section szfmb +.section szfna +.section szfnb +.section szfoa +.section szfob +.section szfpa +.section szfpb +.section szfqa +.section szfqb +.section szfra +.section szfrb +.section szfsa +.section szfsb +.section szfta +.section szftb +.section szfua +.section szfub +.section szfva +.section szfvb +.section szfwa +.section szfwb +.section szfxa +.section szfxb +.section szfya +.section szfyb +.section szfza +.section szfzb +.section szf1a +.section szf1b +.section szf2a +.section szf2b +.section szf3a +.section szf3b +.section szf4a +.section szf4b +.section szf5a +.section szf5b +.section szf6a +.section szf6b +.section szf7a +.section szf7b +.section szf8a +.section szf8b +.section szf9a +.section szf9b +.section szf0a +.section szf0b +.section szgaa +.section szgab +.section szgba +.section szgbb +.section szgca +.section szgcb +.section szgda +.section szgdb +.section szgea +.section szgeb +.section szgfa +.section szgfb +.section szgga +.section szggb +.section szgha +.section szghb +.section szgia +.section szgib +.section szgja +.section szgjb +.section szgka +.section szgkb +.section szgla +.section szglb +.section szgma +.section szgmb +.section szgna +.section szgnb +.section szgoa +.section szgob +.section szgpa +.section szgpb +.section szgqa +.section szgqb +.section szgra +.section szgrb +.section szgsa +.section szgsb +.section szgta +.section szgtb +.section szgua +.section szgub +.section szgva +.section szgvb diff --git a/test/MC/ELF/no-fixup.s b/test/MC/ELF/no-fixup.s index 6e719bcc8c11..9d3489262f4f 100644 --- a/test/MC/ELF/no-fixup.s +++ b/test/MC/ELF/no-fixup.s @@ -1,14 +1,11 @@ -// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t -stats 2>%t.out -// RUN: FileCheck --input-file=%t.out %s +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t +// RUN: llvm-objdump -r %t | FileCheck %s -// Test that we create no fixups for this file since "a" and "b" are in the -// same fragment. +// Test that we create no fixups for this file since "a" and "b" +// are in the same fragment. If b was in a different section, a +// fixup causing a relocation would be generated in the object file. -// CHECK: assembler - Number of assembler layout and relaxation steps -// CHECK-NEXT: assembler - Number of emitted assembler fragments -// CHECK-NEXT: assembler - Number of emitted object file bytes -// CHECK-NEXT: assembler - Number of fragment layouts -// CHECK-NEXT: mcexpr - Number of MCExpr evaluations +// CHECK-NOT: RELOCATION RECORDS a: nop diff --git a/test/MC/ELF/relax-all-flag.s b/test/MC/ELF/relax-all-flag.s new file mode 100644 index 000000000000..4c1c78c3925d --- /dev/null +++ b/test/MC/ELF/relax-all-flag.s @@ -0,0 +1,19 @@ +// By default, the jmp here does not need relaxation (so the 0xeb opdoce can be +// used). +// However, with -mc-relax-all passed to MC, all jumps are relaxed and we +// expect to see a different instruction. + +// RUN: llvm-mc -filetype=obj -mc-relax-all -triple x86_64-pc-linux-gnu %s -o - \ +// RUN: | llvm-objdump -disassemble - | FileCheck -check-prefix=RELAXALL %s + +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +// RUN: | llvm-objdump -disassemble - | FileCheck %s + +.text +foo: + mov %rax, %rax + jmp foo + +// RELAXALL: 3: e9 +// CHECK: 3: eb + diff --git a/test/MC/MachO/ARM/lit.local.cfg b/test/MC/MachO/ARM/lit.local.cfg index 89764637feb0..9f0d39d9217b 100644 --- a/test/MC/MachO/ARM/lit.local.cfg +++ b/test/MC/MachO/ARM/lit.local.cfg @@ -1,4 +1,4 @@ -config.suffixes = ['.s'] +config.suffixes = ['.s', '.ll'] targets = set(config.root.targets_to_build.split()) if not 'ARM' in targets: diff --git a/test/MC/MachO/ARM/nop-armv4-padding.s b/test/MC/MachO/ARM/nop-armv4-padding.s index 8f646dbb396a..8e03d17a70c9 100644 --- a/test/MC/MachO/ARM/nop-armv4-padding.s +++ b/test/MC/MachO/ARM/nop-armv4-padding.s @@ -7,4 +7,4 @@ x: .align 4 add r0, r1, r2 -@ CHECK: ('_section_data', '020081e0 00001a0e 00001a0e 00001a0e 020081e0') +@ CHECK: ('_section_data', '020081e0 0000a0e1 0000a0e1 0000a0e1 020081e0') diff --git a/test/MC/MachO/bad-dollar.s b/test/MC/MachO/bad-dollar.s new file mode 100644 index 000000000000..fd72ed0230db --- /dev/null +++ b/test/MC/MachO/bad-dollar.s @@ -0,0 +1,5 @@ +// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s 2> %t.err > %t +// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s + +.long $1 +// CHECK-ERROR: 4:7: error: invalid token in expression diff --git a/test/MC/MachO/bad-macro.s b/test/MC/MachO/bad-macro.s new file mode 100644 index 000000000000..0aaba099e853 --- /dev/null +++ b/test/MC/MachO/bad-macro.s @@ -0,0 +1,14 @@ +// RUN: llvm-mc -triple x86_64-apple-darwin10 %s 2> %t.err > %t +// RUN: FileCheck --check-prefix=CHECK-OUTPUT < %t %s +// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s + +.macro test_macro reg1, reg2 +mov $1, %eax +mov $2, %eax +.endmacro +test_macro %ebx, %ecx + +// CHECK-ERROR: 5:1: warning: macro defined with named parameters which are not used in macro body, possible positional parameter found in body which will have no effect + +// CHECK-OUTPUT: movl $1, %eax +// CHECK-OUTPUT: movl $2, %eax diff --git a/test/MC/MachO/gen-dwarf-cpp.s b/test/MC/MachO/gen-dwarf-cpp.s index cb749f48eef6..e42a63a191b1 100644 --- a/test/MC/MachO/gen-dwarf-cpp.s +++ b/test/MC/MachO/gen-dwarf-cpp.s @@ -1,5 +1,5 @@ // RUN: llvm-mc -g -triple i386-apple-darwin10 %s -filetype=obj -o %t -// RUN: llvm-dwarfdump %t | FileCheck %s +// RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s # 100 "t.s" 1 .globl _bar diff --git a/test/MC/MachO/gen-dwarf-macro-cpp.s b/test/MC/MachO/gen-dwarf-macro-cpp.s index 05a449b4027c..6177814b6a78 100644 --- a/test/MC/MachO/gen-dwarf-macro-cpp.s +++ b/test/MC/MachO/gen-dwarf-macro-cpp.s @@ -1,5 +1,5 @@ // RUN: llvm-mc -g -triple i386-apple-darwin10 %s -filetype=obj -o %t -// RUN: llvm-dwarfdump %t | FileCheck %s +// RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s # 1 "foo.S" 2 .macro switcher diff --git a/test/MC/MachO/gen-dwarf-producer.s b/test/MC/MachO/gen-dwarf-producer.s new file mode 100644 index 000000000000..f7388db3a240 --- /dev/null +++ b/test/MC/MachO/gen-dwarf-producer.s @@ -0,0 +1,8 @@ +// RUN: env DEBUG_PRODUCER="my producer" llvm-mc -g -triple i386-apple-darwin10 %s -filetype=obj -o %t +// RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s + +.globl _bar +_bar: + ret + +// CHECK: DW_AT_producer [DW_FORM_string] ("my producer") diff --git a/test/MC/MachO/gen-dwarf.s b/test/MC/MachO/gen-dwarf.s index 4fbc32d295b7..d763dd120ab2 100644 --- a/test/MC/MachO/gen-dwarf.s +++ b/test/MC/MachO/gen-dwarf.s @@ -1,5 +1,5 @@ // RUN: llvm-mc -g -triple i386-apple-darwin10 %s -filetype=obj -o %t -// RUN: llvm-dwarfdump %t | FileCheck %s +// RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s .globl _bar _bar: @@ -86,7 +86,7 @@ _x: .long 1 // CHECK: .debug_aranges contents: // CHECK: Address Range Header: length = 0x0000001c, version = 0x0002, cu_offset = 0x00000000, addr_size = 0x04, seg_size = 0x00 -// CHECK: .debug_lines contents: +// CHECK: .debug_line contents: // CHECK: Line table prologue: // We don't check the total_length as it includes lengths of temp paths // CHECK: version: 2 diff --git a/test/MC/MachO/linker-option-1.s b/test/MC/MachO/linker-option-1.s new file mode 100644 index 000000000000..a01cab78f397 --- /dev/null +++ b/test/MC/MachO/linker-option-1.s @@ -0,0 +1,21 @@ +// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s 2> %t.err > %t +// RUN: FileCheck --check-prefix=CHECK-OUTPUT < %t %s +// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s + +// CHECK-OUTPUT: .linker_option "a" +.linker_option "a" +// CHECK-OUTPUT: .linker_option "a", "b" +.linker_option "a", "b" +// CHECK-OUTPUT-NOT: .linker_option +// CHECK-ERROR: expected string in '.linker_option' directive +// CHECK-ERROR: .linker_option 10 +// CHECK-ERROR: ^ +.linker_option 10 +// CHECK-ERROR: expected string in '.linker_option' directive +// CHECK-ERROR: .linker_option "a", +// CHECK-ERROR: ^ +.linker_option "a", +// CHECK-ERROR: unexpected token in '.linker_option' directive +// CHECK-ERROR: .linker_option "a" "b" +// CHECK-ERROR: ^ +.linker_option "a" "b" diff --git a/test/MC/MachO/linker-option-2.s b/test/MC/MachO/linker-option-2.s new file mode 100644 index 000000000000..bb5966be2734 --- /dev/null +++ b/test/MC/MachO/linker-option-2.s @@ -0,0 +1,25 @@ +// RUN: llvm-mc -n -triple x86_64-apple-darwin10 %s -filetype=obj | macho-dump | FileCheck %s + +// CHECK: ('load_commands_size', 104) +// CHECK: ('load_commands', [ +// CHECK: # Load Command 1 +// CHECK: (('command', 45) +// CHECK: ('size', 16) +// CHECK: ('count', 1) +// CHECK: ('_strings', [ +// CHECK: "a", +// CHECK: ]) +// CHECK: ), +// CHECK: # Load Command 2 +// CHECK: (('command', 45) +// CHECK: ('size', 16) +// CHECK: ('count', 2) +// CHECK: ('_strings', [ +// CHECK: "a", +// CHECK: "b", +// CHECK: ]) +// CHECK: ), +// CHECK: ]) + +.linker_option "a" +.linker_option "a", "b" diff --git a/test/MC/MachO/linker-options.ll b/test/MC/MachO/linker-options.ll new file mode 100644 index 000000000000..827adfd70890 --- /dev/null +++ b/test/MC/MachO/linker-options.ll @@ -0,0 +1,43 @@ +; RUN: llc -O0 -mtriple=x86_64-apple-darwin -o - %s > %t +; RUN: FileCheck --check-prefix=CHECK-ASM < %t %s + +; CHECK-ASM: .linker_option "-lz" +; CHECK-ASM-NEXT: .linker_option "-framework", "Cocoa" + +; RUN: llc -O0 -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | macho-dump > %t +; RUN: FileCheck --check-prefix=CHECK-OBJ < %t %s + +; CHECK-OBJ: ('load_commands', [ +; CHECK-OBJ: # Load Command 1 +; CHECK-OBJ: (('command', 45) +; CHECK-OBJ: ('size', 16) +; CHECK-OBJ: ('count', 1) +; CHECK-OBJ: ('_strings', [ +; CHECK-OBJ: "-lz", +; CHECK-OBJ: ]) +; CHECK-OBJ: ), +; CHECK-OBJ: # Load Command 2 +; CHECK-OBJ: (('command', 45) +; CHECK-OBJ: ('size', 32) +; CHECK-OBJ: ('count', 2) +; CHECK-OBJ: ('_strings', [ +; CHECK-OBJ: "-framework", +; CHECK-OBJ: "Cocoa", +; CHECK-OBJ: ]) +; CHECK-OBJ: # Load Command 3 +; CHECK-OBJ: (('command', 45) +; CHECK-OBJ: ('size', 24) +; CHECK-OBJ: ('count', 1) +; CHECK-OBJ: ('_strings', [ +; CHECK-OBJ: "-lmath", +; CHECK-OBJ: ]) +; CHECK-OBJ: ), +; CHECK-OBJ: ]) + +!0 = metadata !{ i32 6, metadata !"Linker Options", + metadata !{ + metadata !{ metadata !"-lz" }, + metadata !{ metadata !"-framework", metadata !"Cocoa" }, + metadata !{ metadata !"-lmath" } } } + +!llvm.module.flags = !{ !0 } diff --git a/test/MC/Mips/eh-frame.s b/test/MC/Mips/eh-frame.s new file mode 100644 index 000000000000..93ff0b8bd277 --- /dev/null +++ b/test/MC/Mips/eh-frame.s @@ -0,0 +1,167 @@ +// Test the bits of .eh_frame on mips that are already implemented correctly. + +// FIXME: This test would be a lot cleaner if llvm-objdump had the +// --dwarf=frames option. + +// RUN: llvm-mc -filetype=obj %s -o %t.o -arch=mips +// RUN: llvm-objdump -r -s %t.o | FileCheck --check-prefix=MIPS32 %s + +// RUN: llvm-mc -filetype=obj %s -o %t.o -arch=mipsel +// RUN: llvm-objdump -r -s %t.o | FileCheck --check-prefix=MIPS32EL %s + +// RUN: llvm-mc -filetype=obj %s -o %t.o -arch=mips64 +// RUN: llvm-objdump -r -s %t.o | FileCheck --check-prefix=MIPS64 %s + +// RUN: llvm-mc -filetype=obj %s -o %t.o -arch=mips64el +// RUN: llvm-objdump -r -s %t.o | FileCheck --check-prefix=MIPS64EL %s + +func: + .cfi_startproc + .cfi_endproc + +// MIPS32: RELOCATION RECORDS FOR [.eh_frame]: +// MIPS32-NEXT: R_MIPS_32 +// MIPS32: Contents of section .eh_frame: +// MIPS32-NEXT: 0000 + +// Length +// MIPS32: 00000010 + +// CIE ID +// MIPS32: 00000000 + +// Version +// MIPS32: 01 + +// Augmentation String +// MIPS32: 7a5200 + +// Code Alignment Factor +// MIPS32: 01 + +// Data Alignment Factor (-4) +// MIPS32: 7c + +// Return Address Register +// MIPS32: 1f + +// Augmentation Size +// MIPS32: 01 + +// MIPS32: .........zR..|.. +// MIPS32-NEXT: 0010 + +// Augmentation (fde pointer encoding: DW_EH_PE_sdata4) +// MIPS32: 0b +// FIXME: The instructions are different from the ones produces by gas. + +// MIPS32EL: RELOCATION RECORDS FOR [.eh_frame]: +// MIPS32EL-NEXT: R_MIPS_32 +// MIPS32EL: Contents of section .eh_frame: +// MIPS32EL-NEXT: 0000 + +// Length +// MIPS32EL: 10000000 + +// CIE ID +// MIPS32EL: 00000000 + +// Version +// MIPS32EL: 01 + +// Augmentation String +// MIPS32EL: 7a5200 + +// Code Alignment Factor +// MIPS32EL: 01 + +// Data Alignment Factor (-4) +// MIPS32EL: 7c + +// Return Address Register +// MIPS32EL: 1f + +// Augmentation Size +// MIPS32EL: 01 + +// MIPS32EL: .........zR..|.. +// MIPS32EL-NEXT: 0010 + +// Augmentation (fde pointer encoding: DW_EH_PE_sdata4) +// MIPS32EL: 0b +// FIXME: The instructions are different from the ones produces by gas. + +// MIPS64: RELOCATION RECORDS FOR [.eh_frame]: +// MIPS64-NEXT: R_MIPS_64 +// MIPS64: Contents of section .eh_frame: +// MIPS64-NEXT: 0000 + +// Length +// MIPS64: 00000010 + +// CIE ID +// MIPS64: 00000000 + +// Version +// MIPS64: 01 + +// Augmentation String +// MIPS64: 7a5200 + +// Code Alignment Factor +// MIPS64: 01 + +// Data Alignment Factor (-8). GAS uses -4. Should be ok as long as all +// offsets we need are a multiple of 8. +// MIPS64: 78 + +// Return Address Register +// MIPS64: 1f + +// Augmentation Size +// MIPS64: 01 + +// MIPS64: .........zR..x.. +// MIPS64-NEXT: 0010 + +// Augmentation (fde pointer encoding: DW_EH_PE_sdata8) +// MIPS64: 0c +// FIXME: The instructions are different from the ones produces by gas. + + +// MIPS64EL: RELOCATION RECORDS FOR [.eh_frame]: +// MIPS64EL-NEXT: R_MIPS_64 +// MIPS64EL: Contents of section .eh_frame: +// MIPS64EL-NEXT: 0000 + +// Length +// MIPS64EL: 10000000 + +// CIE ID +// MIPS64EL: 00000000 + +// Version +// MIPS64EL: 01 + +// Augmentation String +// MIPS64EL: 7a5200 + +// Code Alignment Factor +// MIPS64EL: 01 + +// Data Alignment Factor (-8). GAS uses -4. Should be ok as long as all +// offsets we need are a multiple of 8. +// MIPS64EL: 78 + +// Return Address Register +// MIPS64EL: 1f + +// Augmentation Size +// MIPS64EL: 01 + +// MIPS64EL: .........zR..x.. +// MIPS64EL-NEXT: 0010 + +// Augmentation (fde pointer encoding: DW_EH_PE_sdata8) +// MIPS64EL: 0c +// FIXME: The instructions are different from the ones produces by gas. diff --git a/test/MC/Mips/elf-gprel-32-64.ll b/test/MC/Mips/elf-gprel-32-64.ll new file mode 100644 index 000000000000..b94682214df7 --- /dev/null +++ b/test/MC/Mips/elf-gprel-32-64.ll @@ -0,0 +1,37 @@ +; RUN: llc -filetype=obj -march=mips64el -mcpu=mips64 %s -o - \ +; RUN: | elf-dump --dump-section-data \ +; RUN: | FileCheck %s + +define i32 @test(i32 %c) nounwind { +entry: + switch i32 %c, label %sw.default [ + i32 0, label %sw.bb + i32 1, label %sw.bb2 + i32 2, label %sw.bb5 + i32 3, label %sw.bb8 + ] + +sw.bb: + br label %return +sw.bb2: + br label %return +sw.bb5: + br label %return +sw.bb8: + br label %return +sw.default: + br label %return + +return: + %retval.0 = phi i32 [ -1, %sw.default ], [ 7, %sw.bb8 ], [ 2, %sw.bb5 ], [ 3, %sw.bb2 ], [ 1, %sw.bb ] + ret i32 %retval.0 +} + +; Check that the appropriate relocations were created. + +; R_MIPS_GPREL32/R_MIPS_64/R_MIPS_NONE +; CHECK: (('sh_name', 0x{{[a-z0-9]+}}) # '.rela.rodata' +; CHECK: ('r_type3', 0x00) +; CHECK-NEXT: ('r_type2', 0x12) +; CHECK-NEXT: ('r_type', 0x0c) + diff --git a/test/MC/Mips/elf-reginfo.ll b/test/MC/Mips/elf-reginfo.ll new file mode 100644 index 000000000000..1d7a18866c50 --- /dev/null +++ b/test/MC/Mips/elf-reginfo.ll @@ -0,0 +1,31 @@ + ; RUN: llc -filetype=obj -march=mips64el -mcpu=mips64 %s -o - \ + ; RUN: | elf-dump --dump-section-data | FileCheck --check-prefix=CHECK_64 %s + ; RUN: llc -filetype=obj -march=mipsel -mcpu=mips32 %s -o - \ + ; RUN: | elf-dump --dump-section-data | FileCheck --check-prefix=CHECK_32 %s + +; Check for register information sections. +; + +@str = private unnamed_addr constant [12 x i8] c"hello world\00" + +define i32 @main() nounwind { +entry: +; Check that the appropriate relocations were created. + +; check for .MIPS.options +; CHECK_64: (('sh_name', 0x{{[0-9|a-f]+}}) # '.MIPS.options' +; CHECK_64-NEXT: ('sh_type', 0x7000000d) +; CHECK_64-NEXT: ('sh_flags', 0x0000000008000002) + +; check for .reginfo +; CHECK_32: (('sh_name', 0x{{[0-9|a-f]+}}) # '.reginfo' +; CHECK_32-NEXT: ('sh_type', 0x70000006) +; CHECK_32-NEXT: ('sh_flags', 0x00000002) + + + %puts = tail call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @str, i64 0, i64 0)) + ret i32 0 + +} +declare i32 @puts(i8* nocapture) nounwind + diff --git a/test/MC/Mips/elf_eflags.ll b/test/MC/Mips/elf_eflags.ll new file mode 100644 index 000000000000..315cb812bf77 --- /dev/null +++ b/test/MC/Mips/elf_eflags.ll @@ -0,0 +1,66 @@ +; This tests ELF EFLAGS setting with direct object. +; When the assembler is ready a .s file for it will +; be created. + +; Non-shared (static) is the absence of pic and or cpic. + +; EF_MIPS_NOREORDER (0x00000001) is always on by default currently +; EF_MIPS_PIC (0x00000002) +; EF_MIPS_CPIC (0x00000004) - not tested yet +; EF_MIPS_ABI2 (0x00000020) - n32 not tested yet +; EF_MIPS_ARCH_32 (0x50000000) +; EF_MIPS_ARCH_64 (0x60000000) +; EF_MIPS_ARCH_32R2 (0x70000000) +; EF_MIPS_ARCH_64R2 (0x80000000) + +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32 -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32 %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32 %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32_PIC %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32R2 %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32R2_PIC %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32R2-MICROMIPS %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32R2-MICROMIPS_PIC %s + +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips64 -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE64 %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips64 %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE64_PIC %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips64r2 -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE64R2 %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips64r2 %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE64R2_PIC %s + +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+mips16 -relocation-model=pic %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-LE32R2-MIPS16 %s + +; 32(R1) bit with NO_REORDER and static +; CHECK-BE32: ('e_flags', 0x50001001) +; +; 32(R1) bit with NO_REORDER and PIC +; CHECK-BE32_PIC: ('e_flags', 0x50001003) +; +; 32R2 bit with NO_REORDER and static +; CHECK-BE32R2: ('e_flags', 0x70001001) +; +; 32R2 bit with NO_REORDER and PIC +; CHECK-BE32R2_PIC: ('e_flags', 0x70001003) +; +; 32R2 bit MICROMIPS with NO_REORDER and static +; CHECK-BE32R2-MICROMIPS: ('e_flags', 0x72001001) +; +; 32R2 bit MICROMIPS with NO_REORDER and PIC +;CHECK-BE32R2-MICROMIPS_PIC: ('e_flags', 0x72001003) +; +; 64(R1) bit with NO_REORDER and static +; CHECK-BE64: ('e_flags', 0x60000001) +; +; 64(R1) bit with NO_REORDER and PIC +; CHECK-BE64_PIC: ('e_flags', 0x60000003) +; +; 64R2 bit with NO_REORDER and static +; CHECK-BE64R2: ('e_flags', 0x80000001) +; +; 64R2 bit with NO_REORDER and PIC +; CHECK-BE64R2_PIC: ('e_flags', 0x80000003) +; +; 32R2 bit MIPS16 with PIC +; CHECK-LE32R2-MIPS16: ('e_flags', 0x74001002) + +define i32 @main() nounwind { +entry: + ret i32 0 +} diff --git a/test/MC/Mips/elf_st_other.ll b/test/MC/Mips/elf_st_other.ll new file mode 100644 index 000000000000..f188ce7ba387 --- /dev/null +++ b/test/MC/Mips/elf_st_other.ll @@ -0,0 +1,13 @@ +; This tests value of ELF st_other field for function symbol table entries. +; For microMIPS value should be equal to STO_MIPS_MICROMIPS. + +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips %s -o - | elf-dump --dump-section-data | FileCheck %s + +define i32 @main() nounwind { +entry: + ret i32 0 +} + +; CHECK: 'main' +; CHECK: ('st_other', 0x80) + diff --git a/test/MC/Mips/hilo-addressing.s b/test/MC/Mips/hilo-addressing.s new file mode 100644 index 000000000000..28459c206728 --- /dev/null +++ b/test/MC/Mips/hilo-addressing.s @@ -0,0 +1,11 @@ +# RUN: llvm-mc -show-encoding -triple mips-unknown-unknown %s | FileCheck %s + + .ent hilo_test + .equ addr, 0xdeadbeef +# CHECK: # encoding: [0x3c,0x04,0xde,0xae] + lui $4,%hi(addr) +# CHECK: # encoding: [0x03,0xe0,0x00,0x08] + jr $31 +# CHECK: # encoding: [0x80,0x82,0xbe,0xef] + lb $2,%lo(addr)($4) + .end hilo_test diff --git a/test/MC/Mips/mips-alu-instructions.s b/test/MC/Mips/mips-alu-instructions.s index 2997782cd01b..7384d19e440f 100644 --- a/test/MC/Mips/mips-alu-instructions.s +++ b/test/MC/Mips/mips-alu-instructions.s @@ -13,6 +13,7 @@ # CHECK: ins $19, $9, 6, 7 # encoding: [0x84,0x61,0x33,0x7d] # CHECK: nor $9, $6, $7 # encoding: [0x27,0x48,0xc7,0x00] # CHECK: or $3, $3, $5 # encoding: [0x25,0x18,0x65,0x00] +# CHECK: ori $4, $5, 17767 # encoding: [0x67,0x45,0xa4,0x34] # CHECK: ori $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x34] # CHECK: rotr $9, $6, 7 # encoding: [0xc2,0x49,0x26,0x00] # CHECK: rotrv $9, $6, $7 # encoding: [0x46,0x48,0xe6,0x00] @@ -31,7 +32,7 @@ # CHECK: xori $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x38] # CHECK: xori $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x38] # CHECK: wsbh $6, $7 # encoding: [0xa0,0x30,0x07,0x7c] -# CHECK: nor $7, $8, $zero # encoding: [0x27,0x38,0x00,0x01] +# CHECK: not $7, $8 # encoding: [0x27,0x38,0x00,0x01] and $9, $6, $7 and $9, $6, 17767 andi $9, $6, 17767 @@ -40,6 +41,7 @@ ins $19, $9, 6,7 nor $9, $6, $7 or $3, $3, $5 + or $4, $5, 17767 ori $9, $6, 17767 rotr $9, $6, 7 rotrv $9, $6, $7 @@ -78,9 +80,13 @@ # CHECK: multu $3, $5 # encoding: [0x19,0x00,0x65,0x00] # CHECK: sub $9, $6, $7 # encoding: [0x22,0x48,0xc7,0x00] # CHECK: subu $4, $3, $5 # encoding: [0x23,0x20,0x65,0x00] -# CHECK: sub $6, $zero, $7 # encoding: [0x22,0x30,0x07,0x00] -# CHECK: subu $6, $zero, $7 # encoding: [0x23,0x30,0x07,0x00] -# CHECK: add $7, $8, $zero # encoding: [0x20,0x38,0x00,0x01] +# CHECK: neg $6, $7 # encoding: [0x22,0x30,0x07,0x00] +# CHECK: negu $6, $7 # encoding: [0x23,0x30,0x07,0x00] +# CHECK: move $7, $8 # encoding: [0x21,0x38,0x00,0x01] +# CHECK: .set push +# CHECK: .set mips32r2 +# CHECK: rdhwr $5, $29 +# CHECK: .set pop # encoding: [0x3b,0xe8,0x05,0x7c] add $9,$6,$7 add $9,$6,17767 addu $9,$6,-15001 @@ -98,3 +104,4 @@ neg $6,$7 negu $6,$7 move $7,$8 + rdhwr $5, $29 diff --git a/test/MC/Mips/mips-coprocessor-encodings.s b/test/MC/Mips/mips-coprocessor-encodings.s index bad9163ba9fa..3d638c3ac9ce 100644 --- a/test/MC/Mips/mips-coprocessor-encodings.s +++ b/test/MC/Mips/mips-coprocessor-encodings.s @@ -1,4 +1,5 @@ -# RUN: llvm-mc %s -triple=mips64-unknown-freebsd -show-encoding | FileCheck --check-prefix=MIPS64 %s +# RUN: llvm-mc %s -triple=mips64-unknown-freebsd -show-encoding \ +# RUN:| FileCheck --check-prefix=MIPS64 %s # MIPS64: dmtc0 $12, $16, 2 # encoding: [0x40,0xac,0x80,0x02] # MIPS64: dmtc0 $12, $16, 0 # encoding: [0x40,0xac,0x80,0x00] diff --git a/test/MC/Mips/mips-expansions.s b/test/MC/Mips/mips-expansions.s index cfc15e883a95..3385fe19309f 100644 --- a/test/MC/Mips/mips-expansions.s +++ b/test/MC/Mips/mips-expansions.s @@ -16,6 +16,22 @@ # CHECK: lui $7, 1 # encoding: [0x01,0x00,0x07,0x3c] # CHECK: ori $7, $7, 2 # encoding: [0x02,0x00,0xe7,0x34] # CHECK: addu $7, $7, $8 # encoding: [0x21,0x38,0xe8,0x00] +# CHECK: lui $10, %hi(symbol) # encoding: [A,A,0x0a,0x3c] +# CHECK: # fixup A - offset: 0, value: symbol@ABS_HI, kind: fixup_Mips_HI16 +# CHECK: addu $10, $10, $4 # encoding: [0x21,0x50,0x44,0x01] +# CHECK: lw $10, %lo(symbol)($10) # encoding: [A,A,0x4a,0x8d] +# CHECK: # fixup A - offset: 0, value: symbol@ABS_LO, kind: fixup_Mips_LO16 +# CHECK: lui $1, %hi(symbol) # encoding: [A,A,0x01,0x3c] +# CHECK: # fixup A - offset: 0, value: symbol@ABS_HI, kind: fixup_Mips_HI16 +# CHECK: addu $1, $1, $9 # encoding: [0x21,0x08,0x29,0x00] +# CHECK: sw $10, %lo(symbol)($1) # encoding: [A,A,0x2a,0xac] +# CHECK: # fixup A - offset: 0, value: symbol@ABS_LO, kind: fixup_Mips_LO16 +# CHECK: lui $10, 10 # encoding: [0x0a,0x00,0x0a,0x3c] +# CHECK: addu $10, $10, $4 # encoding: [0x21,0x50,0x44,0x01] +# CHECK: lw $10, 123($10) # encoding: [0x7b,0x00,0x4a,0x8d] +# CHECK: lui $1, 2 # encoding: [0x02,0x00,0x01,0x3c] +# CHECK: addu $1, $1, $9 # encoding: [0x21,0x08,0x29,0x00] +# CHECK: sw $10, 57920($1) # encoding: [0x40,0xe2,0x2a,0xac] li $5,123 li $6,-2345 @@ -25,3 +41,9 @@ la $7,65538 la $a0, 20($a1) la $7,65538($8) + + lw $t2, symbol($a0) + sw $t2, symbol($t1) + + lw $t2, 655483($a0) + sw $t2, 123456($t1) diff --git a/test/MC/Mips/mips-jump-instructions.s b/test/MC/Mips/mips-jump-instructions.s index 998be418d204..1dcb287738ce 100644 --- a/test/MC/Mips/mips-jump-instructions.s +++ b/test/MC/Mips/mips-jump-instructions.s @@ -1,30 +1,34 @@ -# RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding -mcpu=mips32r2 | FileCheck %s +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding -mcpu=mips32r2 | \ +# RUN: FileCheck %s # Check that the assembler can handle the documented syntax # for jumps and branches. # CHECK: .section __TEXT,__text,regular,pure_instructions #------------------------------------------------------------------------------ # Branch instructions #------------------------------------------------------------------------------ -# CHECK: b 1332 # encoding: [0x34,0x05,0x00,0x10] +# CHECK: b 1332 # encoding: [0x4d,0x01,0x00,0x10] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: bc1f 1332 # encoding: [0x34,0x05,0x00,0x45] +# CHECK: bc1f 1332 # encoding: [0x4d,0x01,0x00,0x45] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: bc1t 1332 # encoding: [0x34,0x05,0x01,0x45] +# CHECK: bc1t 1332 # encoding: [0x4d,0x01,0x01,0x45] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: beq $9, $6, 1332 # encoding: [0x34,0x05,0x26,0x11] +# CHECK: beq $9, $6, 1332 # encoding: [0x4d,0x01,0x26,0x11] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: bgez $6, 1332 # encoding: [0x34,0x05,0xc1,0x04] +# CHECK: bgez $6, 1332 # encoding: [0x4d,0x01,0xc1,0x04] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: bgezal $6, 1332 # encoding: [0x34,0x05,0xd1,0x04] +# CHECK: bgezal $6, 1332 # encoding: [0x4d,0x01,0xd1,0x04] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: bgtz $6, 1332 # encoding: [0x34,0x05,0xc0,0x1c] +# CHECK: bgtz $6, 1332 # encoding: [0x4d,0x01,0xc0,0x1c] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: blez $6, 1332 # encoding: [0x34,0x05,0xc0,0x18] +# CHECK: blez $6, 1332 # encoding: [0x4d,0x01,0xc0,0x18] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: bne $9, $6, 1332 # encoding: [0x34,0x05,0x26,0x15] +# CHECK: bne $9, $6, 1332 # encoding: [0x4d,0x01,0x26,0x15] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: bal 1332 # encoding: [0x34,0x05,0x00,0x04] +# CHECK: bal 1332 # encoding: [0x4d,0x01,0x11,0x04] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] + +.set noreorder + b 1332 nop bc1f 1332 @@ -50,15 +54,24 @@ end_of_code: #------------------------------------------------------------------------------ # Jump instructions #------------------------------------------------------------------------------ -# CHECK: j 1328 # encoding: [0x30,0x05,0x00,0x08] +# CHECK: j 1328 # encoding: [0x4c,0x01,0x00,0x08] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] -# CHECK: jal 1328 # encoding: [0x30,0x05,0x00,0x0c] +# CHECK: jal 1328 # encoding: [0x4c,0x01,0x00,0x0c] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] # CHECK: jalr $6 # encoding: [0x09,0xf8,0xc0,0x00] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] +# CHECK: jalr $25 # encoding: [0x09,0xf8,0x20,0x03] +# CHECK: nop # encoding: [0x00,0x00,0x00,0x00] +# CHECK: jalr $10, $11 # encoding: [0x09,0x50,0x60,0x01] +# CHECK: nop # encoding: [0x00,0x00,0x00,0x00] # CHECK: jr $7 # encoding: [0x08,0x00,0xe0,0x00] # CHECK: nop # encoding: [0x00,0x00,0x00,0x00] # CHECK: jr $7 # encoding: [0x08,0x00,0xe0,0x00] +# CHECK: nop # encoding: [0x00,0x00,0x00,0x00] +# CHECK: jalr $25 # encoding: [0x09,0xf8,0x20,0x03] +# CHECK: nop # encoding: [0x00,0x00,0x00,0x00] +# CHECK: jalr $4, $25 # encoding: [0x09,0x20,0x20,0x03] +# CHECK: nop # encoding: [0x00,0x00,0x00,0x00] j 1328 @@ -67,6 +80,15 @@ end_of_code: nop jalr $6 nop + jalr $31, $25 + nop + jalr $10, $11 + nop jr $7 nop j $7 + nop + jal $25 + nop + jal $4,$25 + nop diff --git a/test/MC/Mips/mips64-alu-instructions.s b/test/MC/Mips/mips64-alu-instructions.s new file mode 100644 index 000000000000..1b4ebdfbbd49 --- /dev/null +++ b/test/MC/Mips/mips64-alu-instructions.s @@ -0,0 +1,100 @@ +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding -mcpu=mips64r2 | FileCheck %s +# Check that the assembler can handle the documented syntax +# for arithmetic and logical instructions. +# CHECK: .section __TEXT,__text,regular,pure_instructions +#------------------------------------------------------------------------------ +# Logical instructions +#------------------------------------------------------------------------------ +# CHECK: and $9, $6, $7 # encoding: [0x24,0x48,0xc7,0x00] +# CHECK: andi $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x30] +# CHECK: andi $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x30] +# CHECK: clo $6, $7 # encoding: [0x21,0x30,0xe6,0x70] +# CHECK: clz $6, $7 # encoding: [0x20,0x30,0xe6,0x70] +# CHECK: ins $19, $9, 6, 7 # encoding: [0x84,0x61,0x33,0x7d] +# CHECK: nor $9, $6, $7 # encoding: [0x27,0x48,0xc7,0x00] +# CHECK: or $3, $3, $5 # encoding: [0x25,0x18,0x65,0x00] +# CHECK: ori $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x34] +# CHECK: rotr $9, $6, 7 # encoding: [0xc2,0x49,0x26,0x00] +# CHECK: rotrv $9, $6, $7 # encoding: [0x46,0x48,0xe6,0x00] +# CHECK: sll $4, $3, 7 # encoding: [0xc0,0x21,0x03,0x00] +# CHECK: sllv $2, $3, $5 # encoding: [0x04,0x10,0xa3,0x00] +# CHECK: slt $3, $3, $5 # encoding: [0x2a,0x18,0x65,0x00] +# CHECK: slti $3, $3, 103 # encoding: [0x67,0x00,0x63,0x28] +# CHECK: slti $3, $3, 103 # encoding: [0x67,0x00,0x63,0x28] +# CHECK: sltiu $3, $3, 103 # encoding: [0x67,0x00,0x63,0x2c] +# CHECK: sltu $3, $3, $5 # encoding: [0x2b,0x18,0x65,0x00] +# CHECK: sra $4, $3, 7 # encoding: [0xc3,0x21,0x03,0x00] +# CHECK: srav $2, $3, $5 # encoding: [0x07,0x10,0xa3,0x00] +# CHECK: srl $4, $3, 7 # encoding: [0xc2,0x21,0x03,0x00] +# CHECK: srlv $2, $3, $5 # encoding: [0x06,0x10,0xa3,0x00] +# CHECK: xor $3, $3, $5 # encoding: [0x26,0x18,0x65,0x00] +# CHECK: xori $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x38] +# CHECK: xori $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x38] +# CHECK: wsbh $6, $7 # encoding: [0xa0,0x30,0x07,0x7c] +# CHECK: not $7, $8 # encoding: [0x27,0x38,0x00,0x01] + and $9, $6, $7 + and $9, $6, 17767 + andi $9, $6, 17767 + clo $6, $7 + clz $6, $7 + ins $19, $9, 6,7 + nor $9, $6, $7 + or $3, $3, $5 + ori $9, $6, 17767 + rotr $9, $6, 7 + rotrv $9, $6, $7 + sll $4, $3, 7 + sllv $2, $3, $5 + slt $3, $3, $5 + slt $3, $3, 103 + slti $3, $3, 103 + sltiu $3, $3, 103 + sltu $3, $3, $5 + sra $4, $3, 7 + srav $2, $3, $5 + srl $4, $3, 7 + srlv $2, $3, $5 + xor $3, $3, $5 + xor $9, $6, 17767 + xori $9, $6, 17767 + wsbh $6, $7 + not $7 ,$8 + +#------------------------------------------------------------------------------ +# Arithmetic instructions +#------------------------------------------------------------------------------ + +# CHECK: dadd $9, $6, $7 # encoding: [0x2c,0x48,0xc7,0x00] +# CHECK: daddi $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x60] +# CHECK: daddiu $9, $6, -15001 # encoding: [0x67,0xc5,0xc9,0x64] +# CHECK: daddi $9, $6, 17767 # encoding: [0x67,0x45,0xc9,0x60] +# CHECK: daddiu $9, $6, -15001 # encoding: [0x67,0xc5,0xc9,0x64] +# CHECK: daddu $9, $6, $7 # encoding: [0x2d,0x48,0xc7,0x00] +# CHECK: madd $6, $7 # encoding: [0x00,0x00,0xc7,0x70] +# CHECK: maddu $6, $7 # encoding: [0x01,0x00,0xc7,0x70] +# CHECK: msub $6, $7 # encoding: [0x04,0x00,0xc7,0x70] +# CHECK: msubu $6, $7 # encoding: [0x05,0x00,0xc7,0x70] +# CHECK: mult $3, $5 # encoding: [0x18,0x00,0x65,0x00] +# CHECK: multu $3, $5 # encoding: [0x19,0x00,0x65,0x00] +# CHECK: dsubu $4, $3, $5 # encoding: [0x2f,0x20,0x65,0x00] +# CHECK: move $7, $8 # encoding: [0x2d,0x38,0x00,0x01] +# CHECK: .set push +# CHECK: .set mips32r2 +# CHECK: rdhwr $5, $29 +# CHECK: .set pop # encoding: [0x3b,0xe8,0x05,0x7c] + + dadd $9,$6,$7 + dadd $9,$6,17767 + daddu $9,$6,-15001 + daddi $9,$6,17767 + daddiu $9,$6,-15001 + daddu $9,$6,$7 + madd $6,$7 + maddu $6,$7 + msub $6,$7 + msubu $6,$7 + mult $3,$5 + multu $3,$5 + dsubu $4,$3,$5 + move $7,$8 + rdhwr $5, $29 diff --git a/test/MC/Mips/mips_directives.s b/test/MC/Mips/mips_directives.s index e2f75a827d0a..df7e64563371 100644 --- a/test/MC/Mips/mips_directives.s +++ b/test/MC/Mips/mips_directives.s @@ -1,16 +1,25 @@ -# RUN: llvm-mc -triple mips-unknown-unknown %s -#this test produces no output so there isS no FileCheck call +# RUN: llvm-mc -show-encoding -triple mips-unknown-unknown %s | FileCheck %s +# $BB0_2: .ent directives_test - .frame $sp,0,$ra - .mask 0x00000000,0 - .fmask 0x00000000,0 - .set noreorder - .set nomacro - .set noat + .frame $sp,0,$ra + .mask 0x00000000,0 + .fmask 0x00000000,0 + .set noreorder + .set nomacro + .set noat $JTI0_0: - .gpword ($BB0_2) - .set at=$12 - .set macro - .set reorder - .end directives_test + .gpword ($BB0_2) + .word 0x77fffffc +# CHECK: $JTI0_0: +# CHECK-NEXT: .4byte 2013265916 + .set at=$12 + .set macro + .set reorder + .set at=$a0 + .set STORE_MASK,$t7 + .set FPU_MASK,$f7 +#CHECK: abs.s $f6, $f7 # encoding: [0x46,0x00,0x39,0x85] +#CHECK: and $3, $15, $15 # encoding: [0x01,0xef,0x18,0x24] + abs.s $f6,FPU_MASK + and $3,$t7,STORE_MASK diff --git a/test/MC/Mips/mips_gprel16.ll b/test/MC/Mips/mips_gprel16.ll new file mode 100644 index 000000000000..b5a282de560b --- /dev/null +++ b/test/MC/Mips/mips_gprel16.ll @@ -0,0 +1,33 @@ +; This addresses bug 14456. We were not writing +; out the addend to the gprel16 relocation. The +; addend is stored in the instruction immediate +; field. +;llc gprel16.ll -o gprel16.o -mcpu=mips32r2 -march=mipsel -filetype=obj -relocation-model=static + +; RUN: llc -mcpu=mips32r2 -march=mipsel -filetype=obj -relocation-model=static %s -o - \ +; RUN: | llvm-objdump -disassemble -mattr +mips32r2 - \ +; RUN: | FileCheck %s + +target triple = "mipsel-sde--elf-gcc" + +@var1 = internal global i32 0, align 4 +@var2 = internal global i32 0, align 4 + +define i32 @testvar1() nounwind { +entry: +; CHECK: lw ${{[0-9]+}}, 0($gp) + %0 = load i32* @var1, align 4 + %tobool = icmp ne i32 %0, 0 + %cond = select i1 %tobool, i32 1, i32 0 + ret i32 %cond +} + +define i32 @testvar2() nounwind { +entry: +; CHECK: lw ${{[0-9]+}}, 4($gp) + %0 = load i32* @var2, align 4 + %tobool = icmp ne i32 %0, 0 + %cond = select i1 %tobool, i32 1, i32 0 + ret i32 %cond +} + diff --git a/test/MC/Mips/nabi-regs.s b/test/MC/Mips/nabi-regs.s new file mode 100644 index 000000000000..9371208a2a9e --- /dev/null +++ b/test/MC/Mips/nabi-regs.s @@ -0,0 +1,36 @@ +# OABI (o32, o64) have a different symbolic register +# set for the A and T registers because the NABI allows +# for 4 more register parameters (A registers) offsetting +# the T registers. +# +# For now just check N64 +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding \ +# RUN: -mcpu=mips64r2 -arch=mips64 | \ +# RUN: FileCheck %s + +# CHECK: .section __TEXT,__text,regular,pure_instructions + .text +foo: + +# CHECK: add $16, $16, $4 # encoding: [0x02,0x04,0x80,0x20] + add $s0,$s0,$a0 +# CHECK: add $16, $16, $6 # encoding: [0x02,0x06,0x80,0x20] + add $s0,$s0,$a2 +# CHECK: add $16, $16, $7 # encoding: [0x02,0x07,0x80,0x20] + add $s0,$s0,$a3 +# CHECK: add $16, $16, $8 # encoding: [0x02,0x08,0x80,0x20] + add $s0,$s0,$a4 +# CHECK: add $16, $16, $9 # encoding: [0x02,0x09,0x80,0x20] + add $s0,$s0,$a5 +# CHECK: add $16, $16, $10 # encoding: [0x02,0x0a,0x80,0x20] + add $s0,$s0,$a6 +# CHECK: add $16, $16, $11 # encoding: [0x02,0x0b,0x80,0x20] + add $s0,$s0,$a7 +# CHECK: add $16, $16, $12 # encoding: [0x02,0x0c,0x80,0x20] + add $s0,$s0,$t0 +# CHECK: add $16, $16, $13 # encoding: [0x02,0x0d,0x80,0x20] + add $s0,$s0,$t1 +# CHECK: add $16, $16, $14 # encoding: [0x02,0x0e,0x80,0x20] + add $s0,$s0,$t2 +# CHECK: add $16, $16, $15 # encoding: [0x02,0x0f,0x80,0x20] + add $s0,$s0,$t3 diff --git a/test/MC/Mips/set-at-directive.s b/test/MC/Mips/set-at-directive.s new file mode 100644 index 000000000000..98a3a35b5428 --- /dev/null +++ b/test/MC/Mips/set-at-directive.s @@ -0,0 +1,132 @@ +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -show-encoding -mcpu=mips32r2 | \ +# RUN: FileCheck %s +# Check that the assembler can handle the documented syntax +# for ".set at" and set the correct value. + +# CHECK: .section __TEXT,__text,regular,pure_instructions + .text +foo: +# CHECK: jr $1 # encoding: [0x08,0x00,0x20,0x00] + .set at=$1 + jr $at + nop +# CHECK: jr $2 # encoding: [0x08,0x00,0x40,0x00] + .set at=$2 + jr $at + nop +# CHECK: jr $3 # encoding: [0x08,0x00,0x60,0x00] + .set at=$3 + jr $at + nop +# CHECK: jr $4 # encoding: [0x08,0x00,0x80,0x00] + .set at=$a0 + jr $at + nop +# CHECK: jr $5 # encoding: [0x08,0x00,0xa0,0x00] + .set at=$a1 + jr $at + nop +# CHECK: jr $6 # encoding: [0x08,0x00,0xc0,0x00] + .set at=$a2 + jr $at + nop +# CHECK: jr $7 # encoding: [0x08,0x00,0xe0,0x00] + .set at=$a3 + jr $at + nop +# CHECK: jr $8 # encoding: [0x08,0x00,0x00,0x01] + .set at=$8 + jr $at + nop +# CHECK: jr $9 # encoding: [0x08,0x00,0x20,0x01] + .set at=$9 + jr $at + nop +# CHECK: jr $10 # encoding: [0x08,0x00,0x40,0x01] + .set at=$10 + jr $at + nop +# CHECK: jr $11 # encoding: [0x08,0x00,0x60,0x01] + .set at=$11 + jr $at + nop +# CHECK: jr $12 # encoding: [0x08,0x00,0x80,0x01] + .set at=$12 + jr $at + nop +# CHECK: jr $13 # encoding: [0x08,0x00,0xa0,0x01] + .set at=$13 + jr $at + nop +# CHECK: jr $14 # encoding: [0x08,0x00,0xc0,0x01] + .set at=$14 + jr $at + nop +# CHECK: jr $15 # encoding: [0x08,0x00,0xe0,0x01] + .set at=$15 + jr $at + nop +# CHECK: jr $16 # encoding: [0x08,0x00,0x00,0x02] + .set at=$s0 + jr $at + nop +# CHECK: jr $17 # encoding: [0x08,0x00,0x20,0x02] + .set at=$s1 + jr $at + nop +# CHECK: jr $18 # encoding: [0x08,0x00,0x40,0x02] + .set at=$s2 + jr $at + nop +# CHECK: jr $19 # encoding: [0x08,0x00,0x60,0x02] + .set at=$s3 + jr $at + nop +# CHECK: jr $20 # encoding: [0x08,0x00,0x80,0x02] + .set at=$s4 + jr $at + nop +# CHECK: jr $21 # encoding: [0x08,0x00,0xa0,0x02] + .set at=$s5 + jr $at + nop +# CHECK: jr $22 # encoding: [0x08,0x00,0xc0,0x02] + .set at=$s6 + jr $at + nop +# CHECK: jr $23 # encoding: [0x08,0x00,0xe0,0x02] + .set at=$s7 + jr $at + nop +# CHECK: jr $24 # encoding: [0x08,0x00,0x00,0x03] + .set at=$24 + jr $at + nop +# CHECK: jr $25 # encoding: [0x08,0x00,0x20,0x03] + .set at=$25 + jr $at + nop +# CHECK: jr $26 # encoding: [0x08,0x00,0x40,0x03] + .set at=$26 + jr $at + nop +# CHECK: jr $27 # encoding: [0x08,0x00,0x60,0x03] + .set at=$27 + jr $at + nop +# CHECK: jr $gp # encoding: [0x08,0x00,0x80,0x03] + .set at=$gp + jr $at + nop +# CHECK: jr $fp # encoding: [0x08,0x00,0xc0,0x03] + .set at=$fp + jr $at + nop +# CHECK: jr $sp # encoding: [0x08,0x00,0xa0,0x03] + .set at=$sp + jr $at + nop +# CHECK: jr $ra # encoding: [0x08,0x00,0xe0,0x03] + .set at=$ra + jr $at + nop diff --git a/test/MC/PowerPC/ppc64-initial-cfa.ll b/test/MC/PowerPC/ppc64-initial-cfa.ll index 3936cf2e81e5..16236c9c650d 100644 --- a/test/MC/PowerPC/ppc64-initial-cfa.ll +++ b/test/MC/PowerPC/ppc64-initial-cfa.ll @@ -1,41 +1,78 @@ -;; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -filetype=obj %s -o - | \ -;; RUN: elf-dump --dump-section-data | FileCheck %s +; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -filetype=obj -relocation-model=static %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck %s -check-prefix=STATIC +; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -filetype=obj -relocation-model=pic %s -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck %s -check-prefix=PIC -;; FIXME: this file should be in .s form, change when asm parser is available. +; FIXME: this file should be in .s form, change when asm parser is available. define void @f() { entry: ret void } -;; CHECK: ('sh_name', 0x{{.*}}) # '.eh_frame' -;; CHECK-NEXT: ('sh_type', 0x00000001) -;; CHECK-NEXT: ('sh_flags', 0x0000000000000002) -;; CHECK-NEXT: ('sh_addr', 0x{{.*}}) -;; CHECK-NEXT: ('sh_offset', 0x{{.*}}) -;; CHECK-NEXT: ('sh_size', 0x0000000000000030) -;; CHECK-NEXT: ('sh_link', 0x00000000) -;; CHECK-NEXT: ('sh_info', 0x00000000) -;; CHECK-NEXT: ('sh_addralign', 0x0000000000000008) -;; CHECK-NEXT: ('sh_entsize', 0x0000000000000000) -;; CHECK-NEXT: ('_section_data', '00000010 00000000 017a5200 01784101 000c0100 00000018 00000018 00000000 00000000 00000000 00000010 00000000') - -;; CHECK: ('sh_name', 0x{{.*}}) # '.rela.eh_frame' -;; CHECK-NEXT: ('sh_type', 0x00000004) -;; CHECK-NEXT: ('sh_flags', 0x0000000000000000) -;; CHECK-NEXT: ('sh_addr', 0x{{.*}}) -;; CHECK-NEXT: ('sh_offset', 0x{{.*}}) -;; CHECK-NEXT: ('sh_size', 0x0000000000000018) -;; CHECK-NEXT: ('sh_link', 0x{{.*}}) -;; CHECK-NEXT: ('sh_info', 0x{{.*}}) -;; CHECK-NEXT: ('sh_addralign', 0x0000000000000008) -;; CHECK-NEXT: ('sh_entsize', 0x0000000000000018) -;; CHECK-NEXT: ('_relocations', [ -;; CHECK-NEXT: # Relocation 0 -;; CHECK-NEXT: (('r_offset', 0x000000000000001c) -;; CHECK-NEXT: ('r_sym', 0x{{.*}}) -;; CHECK-NEXT: ('r_type', 0x00000026) -;; CHECK-NEXT: ('r_addend', 0x0000000000000000) -;; CHECK-NEXT: ), -;; CHECK-NEXT: ]) +; STATIC: ('sh_name', 0x{{.*}}) # '.eh_frame' +; STATIC-NEXT: ('sh_type', 0x00000001) +; STATIC-NEXT: ('sh_flags', 0x0000000000000002) +; STATIC-NEXT: ('sh_addr', 0x{{.*}}) +; STATIC-NEXT: ('sh_offset', 0x{{.*}}) +; STATIC-NEXT: ('sh_size', 0x0000000000000028) +; STATIC-NEXT: ('sh_link', 0x00000000) +; STATIC-NEXT: ('sh_info', 0x00000000) +; STATIC-NEXT: ('sh_addralign', 0x0000000000000008) +; STATIC-NEXT: ('sh_entsize', 0x0000000000000000) +; STATIC-NEXT: ('_section_data', '00000010 00000000 017a5200 01784101 1b0c0100 00000010 00000018 00000000 00000010 00000000') +; STATIC: ('sh_name', 0x{{.*}}) # '.rela.eh_frame' +; STATIC-NEXT: ('sh_type', 0x00000004) +; STATIC-NEXT: ('sh_flags', 0x0000000000000000) +; STATIC-NEXT: ('sh_addr', 0x{{.*}}) +; STATIC-NEXT: ('sh_offset', 0x{{.*}}) +; STATIC-NEXT: ('sh_size', 0x0000000000000018) +; STATIC-NEXT: ('sh_link', 0x{{.*}}) +; STATIC-NEXT: ('sh_info', 0x{{.*}}) +; STATIC-NEXT: ('sh_addralign', 0x0000000000000008) +; STATIC-NEXT: ('sh_entsize', 0x0000000000000018) +; STATIC-NEXT: ('_relocations', [ + +; Static build should create R_PPC64_REL32 relocations +; STATIC-NEXT: # Relocation 0 +; STATIC-NEXT: (('r_offset', 0x000000000000001c) +; STATIC-NEXT: ('r_sym', 0x{{.*}}) +; STATIC-NEXT: ('r_type', 0x0000001a) +; STATIC-NEXT: ('r_addend', 0x0000000000000000) +; STATIC-NEXT: ), +; STATIC-NEXT: ]) + + +; PIC: ('sh_name', 0x{{.*}}) # '.eh_frame' +; PIC-NEXT: ('sh_type', 0x00000001) +; PIC-NEXT: ('sh_flags', 0x0000000000000002) +; PIC-NEXT: ('sh_addr', 0x{{.*}}) +; PIC-NEXT: ('sh_offset', 0x{{.*}}) +; PIC-NEXT: ('sh_size', 0x0000000000000028) +; PIC-NEXT: ('sh_link', 0x00000000) +; PIC-NEXT: ('sh_info', 0x00000000) +; PIC-NEXT: ('sh_addralign', 0x0000000000000008) +; PIC-NEXT: ('sh_entsize', 0x0000000000000000) +; PIC-NEXT: ('_section_data', '00000010 00000000 017a5200 01784101 1b0c0100 00000010 00000018 00000000 00000010 00000000') + +; PIC: ('sh_name', 0x{{.*}}) # '.rela.eh_frame' +; PIC-NEXT: ('sh_type', 0x00000004) +; PIC-NEXT: ('sh_flags', 0x0000000000000000) +; PIC-NEXT: ('sh_addr', 0x{{.*}}) +; PIC-NEXT: ('sh_offset', 0x{{.*}}) +; PIC-NEXT: ('sh_size', 0x0000000000000018) +; PIC-NEXT: ('sh_link', 0x{{.*}}) +; PIC-NEXT: ('sh_info', 0x{{.*}}) +; PIC-NEXT: ('sh_addralign', 0x0000000000000008) +; PIC-NEXT: ('sh_entsize', 0x0000000000000018) +; PIC-NEXT: ('_relocations', [ + +; PIC build should create R_PPC64_REL32 relocations +; PIC-NEXT: # Relocation 0 +; PIC-NEXT: (('r_offset', 0x000000000000001c) +; PIC-NEXT: ('r_sym', 0x{{.*}}) +; PIC-NEXT: ('r_type', 0x0000001a) +; PIC-NEXT: ('r_addend', 0x0000000000000000) +; PIC-NEXT: ), +; PIC-NEXT: ]) diff --git a/test/MC/PowerPC/ppc64-relocs-01.ll b/test/MC/PowerPC/ppc64-relocs-01.ll index 5996af84f448..4919e91400ba 100644 --- a/test/MC/PowerPC/ppc64-relocs-01.ll +++ b/test/MC/PowerPC/ppc64-relocs-01.ll @@ -1,4 +1,4 @@ -;; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -O3 \ +;; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -O3 -code-model=small \ ;; RUN: -filetype=obj %s -o - | \ ;; RUN: elf-dump --dump-section-data | FileCheck %s diff --git a/test/MC/X86/AlignedBundling/align-mode-argument-error.s b/test/MC/X86/AlignedBundling/align-mode-argument-error.s new file mode 100644 index 000000000000..b4ce0a9d103a --- /dev/null +++ b/test/MC/X86/AlignedBundling/align-mode-argument-error.s @@ -0,0 +1,8 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - 2>&1 | FileCheck %s + +# Missing .bundle_align_mode argument +# CHECK: error: unknown token + + .bundle_align_mode + imull $17, %ebx, %ebp + diff --git a/test/MC/X86/AlignedBundling/asm-printing-bundle-directives.s b/test/MC/X86/AlignedBundling/asm-printing-bundle-directives.s new file mode 100644 index 000000000000..387e0fe59bf2 --- /dev/null +++ b/test/MC/X86/AlignedBundling/asm-printing-bundle-directives.s @@ -0,0 +1,22 @@ +# RUN: llvm-mc -filetype=asm -triple x86_64-pc-linux-gnu %s -o - 2>&1 | FileCheck %s + +# Just a simple test for the assembly emitter - making sure it emits back the +# bundling directives. + + .text +foo: + .bundle_align_mode 4 +# CHECK: .bundle_align_mode 4 + pushq %rbp + .bundle_lock +# CHECK: .bundle_lock + cmpl %r14d, %ebp + jle .L_ELSE + .bundle_unlock +# CHECK: .bundle_unlock + .bundle_lock align_to_end +# CHECK: .bundle_lock align_to_end + add %rbx, %rdx + .bundle_unlock + + diff --git a/test/MC/X86/AlignedBundling/autogen-inst-offset-align-to-end.s b/test/MC/X86/AlignedBundling/autogen-inst-offset-align-to-end.s new file mode 100644 index 000000000000..fbf5b5294460 --- /dev/null +++ b/test/MC/X86/AlignedBundling/autogen-inst-offset-align-to-end.s @@ -0,0 +1,2899 @@ +# RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -triple i386 -disassemble -no-show-raw-insn - | FileCheck %s + +# !!! This test is auto-generated from utils/testgen/mc-bundling-x86-gen.py !!! +# It tests that bundle-aligned grouping works correctly in MC. Read the +# source of the script for more details. + + .text + .bundle_align_mode 4 + + .align 32, 0x90 +INSTRLEN_1_OFFSET_0: + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 0: nop +# CHECK: f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 21: nop +# CHECK: 2f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 42: nop +# CHECK: 4f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 63: nop +# CHECK: 6f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 84: nop +# CHECK: 8f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: a5: nop +# CHECK: af: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: c6: nop +# CHECK: cf: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: e7: nop +# CHECK: ef: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 108: nop +# CHECK: 10f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 129: nop +# CHECK: 12f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 14a: nop +# CHECK: 14f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 16b: nop +# CHECK: 16f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 18c: nop +# CHECK: 18f: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ad: nop +# CHECK: 1af: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ce: nop +# CHECK: 1cf: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ef: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_0: + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 200: nop +# CHECK: 20e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 221: nop +# CHECK: 22e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 242: nop +# CHECK: 24e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 263: nop +# CHECK: 26e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 284: nop +# CHECK: 28e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 2a5: nop +# CHECK: 2ae: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 2c6: nop +# CHECK: 2ce: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 2e7: nop +# CHECK: 2ee: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 308: nop +# CHECK: 30e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 329: nop +# CHECK: 32e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 34a: nop +# CHECK: 34e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 36b: nop +# CHECK: 36e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 38c: nop +# CHECK: 38e: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 3ad: nop +# CHECK: 3ae: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 3ce: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 3ef: nop +# CHECK: 3f0: nop +# CHECK: 3fe: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_0: + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 400: nop +# CHECK: 40d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 421: nop +# CHECK: 42d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 442: nop +# CHECK: 44d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 463: nop +# CHECK: 46d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 484: nop +# CHECK: 48d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 4a5: nop +# CHECK: 4ad: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 4c6: nop +# CHECK: 4cd: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 4e7: nop +# CHECK: 4ed: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 508: nop +# CHECK: 50d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 529: nop +# CHECK: 52d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 54a: nop +# CHECK: 54d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 56b: nop +# CHECK: 56d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 58c: nop +# CHECK: 58d: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 5ad: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 5ce: nop +# CHECK: 5d0: nop +# CHECK: 5dd: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 5ef: nop +# CHECK: 5f0: nop +# CHECK: 5fd: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_0: + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 600: nop +# CHECK: 60c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 621: nop +# CHECK: 62c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 642: nop +# CHECK: 64c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 663: nop +# CHECK: 66c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 684: nop +# CHECK: 68c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 6a5: nop +# CHECK: 6ac: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 6c6: nop +# CHECK: 6cc: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 6e7: nop +# CHECK: 6ec: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 708: nop +# CHECK: 70c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 729: nop +# CHECK: 72c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 74a: nop +# CHECK: 74c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 76b: nop +# CHECK: 76c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 78c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 7ad: nop +# CHECK: 7b0: nop +# CHECK: 7bc: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 7ce: nop +# CHECK: 7d0: nop +# CHECK: 7dc: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 7ef: nop +# CHECK: 7f0: nop +# CHECK: 7fc: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_0: + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 800: nop +# CHECK: 80b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 821: nop +# CHECK: 82b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 842: nop +# CHECK: 84b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 863: nop +# CHECK: 86b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 884: nop +# CHECK: 88b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 8a5: nop +# CHECK: 8ab: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 8c6: nop +# CHECK: 8cb: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 8e7: nop +# CHECK: 8eb: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 908: nop +# CHECK: 90b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 929: nop +# CHECK: 92b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 94a: nop +# CHECK: 94b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 96b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 98c: nop +# CHECK: 990: nop +# CHECK: 99b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 9ad: nop +# CHECK: 9b0: nop +# CHECK: 9bb: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 9ce: nop +# CHECK: 9d0: nop +# CHECK: 9db: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 9ef: nop +# CHECK: 9f0: nop +# CHECK: 9fb: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_0: + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a00: nop +# CHECK: a0a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a21: nop +# CHECK: a2a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a42: nop +# CHECK: a4a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a63: nop +# CHECK: a6a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a84: nop +# CHECK: a8a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: aa5: nop +# CHECK: aaa: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: ac6: nop +# CHECK: aca: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: ae7: nop +# CHECK: aea: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b08: nop +# CHECK: b0a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b29: nop +# CHECK: b2a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b4a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b6b: nop +# CHECK: b70: nop +# CHECK: b7a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b8c: nop +# CHECK: b90: nop +# CHECK: b9a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: bad: nop +# CHECK: bb0: nop +# CHECK: bba: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: bce: nop +# CHECK: bd0: nop +# CHECK: bda: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: bef: nop +# CHECK: bf0: nop +# CHECK: bfa: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_0: + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c00: nop +# CHECK: c09: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c21: nop +# CHECK: c29: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c42: nop +# CHECK: c49: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c63: nop +# CHECK: c69: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c84: nop +# CHECK: c89: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: ca5: nop +# CHECK: ca9: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: cc6: nop +# CHECK: cc9: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: ce7: nop +# CHECK: ce9: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d08: nop +# CHECK: d09: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d29: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d4a: nop +# CHECK: d50: nop +# CHECK: d59: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d6b: nop +# CHECK: d70: nop +# CHECK: d79: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d8c: nop +# CHECK: d90: nop +# CHECK: d99: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: dad: nop +# CHECK: db0: nop +# CHECK: db9: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: dce: nop +# CHECK: dd0: nop +# CHECK: dd9: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: def: nop +# CHECK: df0: nop +# CHECK: df9: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_0: + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e00: nop +# CHECK: e08: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e21: nop +# CHECK: e28: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e42: nop +# CHECK: e48: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e63: nop +# CHECK: e68: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e84: nop +# CHECK: e88: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: ea5: nop +# CHECK: ea8: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: ec6: nop +# CHECK: ec8: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: ee7: nop +# CHECK: ee8: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f08: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f29: nop +# CHECK: f30: nop +# CHECK: f38: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f4a: nop +# CHECK: f50: nop +# CHECK: f58: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f6b: nop +# CHECK: f70: nop +# CHECK: f78: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f8c: nop +# CHECK: f90: nop +# CHECK: f98: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: fad: nop +# CHECK: fb0: nop +# CHECK: fb8: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: fce: nop +# CHECK: fd0: nop +# CHECK: fd8: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: fef: nop +# CHECK: ff0: nop +# CHECK: ff8: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_0: + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1000: nop +# CHECK: 1007: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1021: nop +# CHECK: 1027: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1042: nop +# CHECK: 1047: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1063: nop +# CHECK: 1067: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1084: nop +# CHECK: 1087: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 10a5: nop +# CHECK: 10a7: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 10c6: nop +# CHECK: 10c7: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 10e7: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1108: nop +# CHECK: 1110: nop +# CHECK: 1117: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1129: nop +# CHECK: 1130: nop +# CHECK: 1137: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 114a: nop +# CHECK: 1150: nop +# CHECK: 1157: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 116b: nop +# CHECK: 1170: nop +# CHECK: 1177: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 118c: nop +# CHECK: 1190: nop +# CHECK: 1197: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 11ad: nop +# CHECK: 11b0: nop +# CHECK: 11b7: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 11ce: nop +# CHECK: 11d0: nop +# CHECK: 11d7: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 11ef: nop +# CHECK: 11f0: nop +# CHECK: 11f7: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_0: + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1200: nop +# CHECK: 1206: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1221: nop +# CHECK: 1226: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1242: nop +# CHECK: 1246: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1263: nop +# CHECK: 1266: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1284: nop +# CHECK: 1286: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 12a5: nop +# CHECK: 12a6: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 12c6: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 12e7: nop +# CHECK: 12f0: nop +# CHECK: 12f6: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1308: nop +# CHECK: 1310: nop +# CHECK: 1316: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1329: nop +# CHECK: 1330: nop +# CHECK: 1336: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 134a: nop +# CHECK: 1350: nop +# CHECK: 1356: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 136b: nop +# CHECK: 1370: nop +# CHECK: 1376: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 138c: nop +# CHECK: 1390: nop +# CHECK: 1396: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 13ad: nop +# CHECK: 13b0: nop +# CHECK: 13b6: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 13ce: nop +# CHECK: 13d0: nop +# CHECK: 13d6: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 13ef: nop +# CHECK: 13f0: nop +# CHECK: 13f6: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_0: + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1400: nop +# CHECK: 1405: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1421: nop +# CHECK: 1425: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1442: nop +# CHECK: 1445: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1463: nop +# CHECK: 1465: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1484: nop +# CHECK: 1485: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 14a5: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 14c6: nop +# CHECK: 14d0: nop +# CHECK: 14d5: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 14e7: nop +# CHECK: 14f0: nop +# CHECK: 14f5: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1508: nop +# CHECK: 1510: nop +# CHECK: 1515: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1529: nop +# CHECK: 1530: nop +# CHECK: 1535: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 154a: nop +# CHECK: 1550: nop +# CHECK: 1555: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 156b: nop +# CHECK: 1570: nop +# CHECK: 1575: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 158c: nop +# CHECK: 1590: nop +# CHECK: 1595: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 15ad: nop +# CHECK: 15b0: nop +# CHECK: 15b5: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 15ce: nop +# CHECK: 15d0: nop +# CHECK: 15d5: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 15ef: nop +# CHECK: 15f0: nop +# CHECK: 15f5: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_0: + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1600: nop +# CHECK: 1604: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1621: nop +# CHECK: 1624: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1642: nop +# CHECK: 1644: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1663: nop +# CHECK: 1664: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1684: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 16a5: nop +# CHECK: 16b0: nop +# CHECK: 16b4: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 16c6: nop +# CHECK: 16d0: nop +# CHECK: 16d4: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 16e7: nop +# CHECK: 16f0: nop +# CHECK: 16f4: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1708: nop +# CHECK: 1710: nop +# CHECK: 1714: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1729: nop +# CHECK: 1730: nop +# CHECK: 1734: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 174a: nop +# CHECK: 1750: nop +# CHECK: 1754: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 176b: nop +# CHECK: 1770: nop +# CHECK: 1774: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 178c: nop +# CHECK: 1790: nop +# CHECK: 1794: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 17ad: nop +# CHECK: 17b0: nop +# CHECK: 17b4: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 17ce: nop +# CHECK: 17d0: nop +# CHECK: 17d4: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 17ef: nop +# CHECK: 17f0: nop +# CHECK: 17f4: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_0: + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1800: nop +# CHECK: 1803: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1821: nop +# CHECK: 1823: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1842: nop +# CHECK: 1843: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1863: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1884: nop +# CHECK: 1890: nop +# CHECK: 1893: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 18a5: nop +# CHECK: 18b0: nop +# CHECK: 18b3: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 18c6: nop +# CHECK: 18d0: nop +# CHECK: 18d3: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 18e7: nop +# CHECK: 18f0: nop +# CHECK: 18f3: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1908: nop +# CHECK: 1910: nop +# CHECK: 1913: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1929: nop +# CHECK: 1930: nop +# CHECK: 1933: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 194a: nop +# CHECK: 1950: nop +# CHECK: 1953: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 196b: nop +# CHECK: 1970: nop +# CHECK: 1973: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 198c: nop +# CHECK: 1990: nop +# CHECK: 1993: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 19ad: nop +# CHECK: 19b0: nop +# CHECK: 19b3: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 19ce: nop +# CHECK: 19d0: nop +# CHECK: 19d3: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 19ef: nop +# CHECK: 19f0: nop +# CHECK: 19f3: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_0: + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a00: nop +# CHECK: 1a02: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a21: nop +# CHECK: 1a22: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a42: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a63: nop +# CHECK: 1a70: nop +# CHECK: 1a72: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a84: nop +# CHECK: 1a90: nop +# CHECK: 1a92: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1aa5: nop +# CHECK: 1ab0: nop +# CHECK: 1ab2: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ac6: nop +# CHECK: 1ad0: nop +# CHECK: 1ad2: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ae7: nop +# CHECK: 1af0: nop +# CHECK: 1af2: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b08: nop +# CHECK: 1b10: nop +# CHECK: 1b12: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b29: nop +# CHECK: 1b30: nop +# CHECK: 1b32: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b4a: nop +# CHECK: 1b50: nop +# CHECK: 1b52: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b6b: nop +# CHECK: 1b70: nop +# CHECK: 1b72: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b8c: nop +# CHECK: 1b90: nop +# CHECK: 1b92: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1bad: nop +# CHECK: 1bb0: nop +# CHECK: 1bb2: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1bce: nop +# CHECK: 1bd0: nop +# CHECK: 1bd2: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1bef: nop +# CHECK: 1bf0: nop +# CHECK: 1bf2: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_0: + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c00: nop +# CHECK: 1c01: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c21: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c42: nop +# CHECK: 1c50: nop +# CHECK: 1c51: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c63: nop +# CHECK: 1c70: nop +# CHECK: 1c71: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c84: nop +# CHECK: 1c90: nop +# CHECK: 1c91: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ca5: nop +# CHECK: 1cb0: nop +# CHECK: 1cb1: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1cc6: nop +# CHECK: 1cd0: nop +# CHECK: 1cd1: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ce7: nop +# CHECK: 1cf0: nop +# CHECK: 1cf1: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d08: nop +# CHECK: 1d10: nop +# CHECK: 1d11: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d29: nop +# CHECK: 1d30: nop +# CHECK: 1d31: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d4a: nop +# CHECK: 1d50: nop +# CHECK: 1d51: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d6b: nop +# CHECK: 1d70: nop +# CHECK: 1d71: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d8c: nop +# CHECK: 1d90: nop +# CHECK: 1d91: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1dad: nop +# CHECK: 1db0: nop +# CHECK: 1db1: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1dce: nop +# CHECK: 1dd0: nop +# CHECK: 1dd1: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1def: nop +# CHECK: 1df0: nop +# CHECK: 1df1: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_0: + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e00: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e21: nop +# CHECK: 1e30: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e42: nop +# CHECK: 1e50: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e63: nop +# CHECK: 1e70: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e84: nop +# CHECK: 1e90: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ea5: nop +# CHECK: 1eb0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ec6: nop +# CHECK: 1ed0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ee7: nop +# CHECK: 1ef0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f08: nop +# CHECK: 1f10: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f29: nop +# CHECK: 1f30: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f4a: nop +# CHECK: 1f50: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f6b: nop +# CHECK: 1f70: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f8c: nop +# CHECK: 1f90: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1fad: nop +# CHECK: 1fb0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1fce: nop +# CHECK: 1fd0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock align_to_end + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1fef: nop +# CHECK: 1ff0: incl + diff --git a/test/MC/X86/AlignedBundling/autogen-inst-offset-padding.s b/test/MC/X86/AlignedBundling/autogen-inst-offset-padding.s new file mode 100644 index 000000000000..12786b34af72 --- /dev/null +++ b/test/MC/X86/AlignedBundling/autogen-inst-offset-padding.s @@ -0,0 +1,2674 @@ +# RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -triple i386 -disassemble -no-show-raw-insn - | FileCheck %s + +# !!! This test is auto-generated from utils/testgen/mc-bundling-x86-gen.py !!! +# It tests that bundle-aligned grouping works correctly in MC. Read the +# source of the script for more details. + + .text + .bundle_align_mode 4 + + .align 32, 0x90 +INSTRLEN_1_OFFSET_0: + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 0: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 21: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 42: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 63: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 84: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: a5: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: c6: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: e7: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 108: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 129: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 14a: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 16b: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 18c: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ad: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ce: incl + + .align 32, 0x90 +INSTRLEN_1_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 1 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ef: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_0: + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 200: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 221: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 242: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 263: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 284: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 2a5: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 2c6: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 2e7: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 308: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 329: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 34a: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 36b: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 38c: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 3ad: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 3ce: incl + + .align 32, 0x90 +INSTRLEN_2_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 2 + inc %eax + .endr + .bundle_unlock +# CHECK: 3ef: nop +# CHECK: 3f0: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_0: + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 400: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 421: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 442: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 463: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 484: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 4a5: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 4c6: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 4e7: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 508: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 529: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 54a: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 56b: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 58c: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 5ad: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 5ce: nop +# CHECK: 5d0: incl + + .align 32, 0x90 +INSTRLEN_3_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 3 + inc %eax + .endr + .bundle_unlock +# CHECK: 5ef: nop +# CHECK: 5f0: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_0: + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 600: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 621: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 642: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 663: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 684: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 6a5: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 6c6: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 6e7: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 708: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 729: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 74a: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 76b: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 78c: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 7ad: nop +# CHECK: 7b0: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 7ce: nop +# CHECK: 7d0: incl + + .align 32, 0x90 +INSTRLEN_4_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 4 + inc %eax + .endr + .bundle_unlock +# CHECK: 7ef: nop +# CHECK: 7f0: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_0: + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 800: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 821: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 842: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 863: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 884: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 8a5: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 8c6: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 8e7: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 908: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 929: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 94a: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 96b: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 98c: nop +# CHECK: 990: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 9ad: nop +# CHECK: 9b0: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 9ce: nop +# CHECK: 9d0: incl + + .align 32, 0x90 +INSTRLEN_5_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 5 + inc %eax + .endr + .bundle_unlock +# CHECK: 9ef: nop +# CHECK: 9f0: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_0: + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a00: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a21: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a42: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a63: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: a84: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: aa5: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: ac6: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: ae7: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b08: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b29: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b4a: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b6b: nop +# CHECK: b70: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: b8c: nop +# CHECK: b90: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: bad: nop +# CHECK: bb0: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: bce: nop +# CHECK: bd0: incl + + .align 32, 0x90 +INSTRLEN_6_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 6 + inc %eax + .endr + .bundle_unlock +# CHECK: bef: nop +# CHECK: bf0: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_0: + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c00: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c21: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c42: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c63: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: c84: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: ca5: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: cc6: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: ce7: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d08: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d29: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d4a: nop +# CHECK: d50: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d6b: nop +# CHECK: d70: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: d8c: nop +# CHECK: d90: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: dad: nop +# CHECK: db0: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: dce: nop +# CHECK: dd0: incl + + .align 32, 0x90 +INSTRLEN_7_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 7 + inc %eax + .endr + .bundle_unlock +# CHECK: def: nop +# CHECK: df0: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_0: + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e00: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e21: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e42: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e63: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: e84: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: ea5: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: ec6: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: ee7: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f08: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f29: nop +# CHECK: f30: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f4a: nop +# CHECK: f50: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f6b: nop +# CHECK: f70: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: f8c: nop +# CHECK: f90: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: fad: nop +# CHECK: fb0: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: fce: nop +# CHECK: fd0: incl + + .align 32, 0x90 +INSTRLEN_8_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 8 + inc %eax + .endr + .bundle_unlock +# CHECK: fef: nop +# CHECK: ff0: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_0: + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1000: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1021: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1042: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1063: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1084: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 10a5: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 10c6: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 10e7: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1108: nop +# CHECK: 1110: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 1129: nop +# CHECK: 1130: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 114a: nop +# CHECK: 1150: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 116b: nop +# CHECK: 1170: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 118c: nop +# CHECK: 1190: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 11ad: nop +# CHECK: 11b0: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 11ce: nop +# CHECK: 11d0: incl + + .align 32, 0x90 +INSTRLEN_9_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 9 + inc %eax + .endr + .bundle_unlock +# CHECK: 11ef: nop +# CHECK: 11f0: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_0: + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1200: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1221: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1242: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1263: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1284: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 12a5: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 12c6: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 12e7: nop +# CHECK: 12f0: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1308: nop +# CHECK: 1310: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 1329: nop +# CHECK: 1330: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 134a: nop +# CHECK: 1350: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 136b: nop +# CHECK: 1370: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 138c: nop +# CHECK: 1390: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 13ad: nop +# CHECK: 13b0: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 13ce: nop +# CHECK: 13d0: incl + + .align 32, 0x90 +INSTRLEN_10_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 10 + inc %eax + .endr + .bundle_unlock +# CHECK: 13ef: nop +# CHECK: 13f0: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_0: + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1400: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1421: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1442: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1463: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1484: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 14a5: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 14c6: nop +# CHECK: 14d0: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 14e7: nop +# CHECK: 14f0: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1508: nop +# CHECK: 1510: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 1529: nop +# CHECK: 1530: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 154a: nop +# CHECK: 1550: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 156b: nop +# CHECK: 1570: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 158c: nop +# CHECK: 1590: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 15ad: nop +# CHECK: 15b0: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 15ce: nop +# CHECK: 15d0: incl + + .align 32, 0x90 +INSTRLEN_11_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 11 + inc %eax + .endr + .bundle_unlock +# CHECK: 15ef: nop +# CHECK: 15f0: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_0: + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1600: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1621: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1642: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1663: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1684: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 16a5: nop +# CHECK: 16b0: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 16c6: nop +# CHECK: 16d0: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 16e7: nop +# CHECK: 16f0: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1708: nop +# CHECK: 1710: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 1729: nop +# CHECK: 1730: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 174a: nop +# CHECK: 1750: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 176b: nop +# CHECK: 1770: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 178c: nop +# CHECK: 1790: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 17ad: nop +# CHECK: 17b0: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 17ce: nop +# CHECK: 17d0: incl + + .align 32, 0x90 +INSTRLEN_12_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 12 + inc %eax + .endr + .bundle_unlock +# CHECK: 17ef: nop +# CHECK: 17f0: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_0: + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1800: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1821: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1842: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1863: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1884: nop +# CHECK: 1890: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 18a5: nop +# CHECK: 18b0: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 18c6: nop +# CHECK: 18d0: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 18e7: nop +# CHECK: 18f0: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1908: nop +# CHECK: 1910: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 1929: nop +# CHECK: 1930: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 194a: nop +# CHECK: 1950: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 196b: nop +# CHECK: 1970: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 198c: nop +# CHECK: 1990: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 19ad: nop +# CHECK: 19b0: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 19ce: nop +# CHECK: 19d0: incl + + .align 32, 0x90 +INSTRLEN_13_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 13 + inc %eax + .endr + .bundle_unlock +# CHECK: 19ef: nop +# CHECK: 19f0: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_0: + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a00: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a21: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a42: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a63: nop +# CHECK: 1a70: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1a84: nop +# CHECK: 1a90: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1aa5: nop +# CHECK: 1ab0: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ac6: nop +# CHECK: 1ad0: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ae7: nop +# CHECK: 1af0: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b08: nop +# CHECK: 1b10: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b29: nop +# CHECK: 1b30: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b4a: nop +# CHECK: 1b50: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b6b: nop +# CHECK: 1b70: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1b8c: nop +# CHECK: 1b90: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1bad: nop +# CHECK: 1bb0: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1bce: nop +# CHECK: 1bd0: incl + + .align 32, 0x90 +INSTRLEN_14_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 14 + inc %eax + .endr + .bundle_unlock +# CHECK: 1bef: nop +# CHECK: 1bf0: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_0: + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c00: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c21: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c42: nop +# CHECK: 1c50: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c63: nop +# CHECK: 1c70: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1c84: nop +# CHECK: 1c90: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ca5: nop +# CHECK: 1cb0: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1cc6: nop +# CHECK: 1cd0: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ce7: nop +# CHECK: 1cf0: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d08: nop +# CHECK: 1d10: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d29: nop +# CHECK: 1d30: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d4a: nop +# CHECK: 1d50: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d6b: nop +# CHECK: 1d70: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1d8c: nop +# CHECK: 1d90: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1dad: nop +# CHECK: 1db0: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1dce: nop +# CHECK: 1dd0: incl + + .align 32, 0x90 +INSTRLEN_15_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 15 + inc %eax + .endr + .bundle_unlock +# CHECK: 1def: nop +# CHECK: 1df0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_0: + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e00: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_1: + .fill 1, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e21: nop +# CHECK: 1e30: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_2: + .fill 2, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e42: nop +# CHECK: 1e50: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_3: + .fill 3, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e63: nop +# CHECK: 1e70: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_4: + .fill 4, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1e84: nop +# CHECK: 1e90: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_5: + .fill 5, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ea5: nop +# CHECK: 1eb0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_6: + .fill 6, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ec6: nop +# CHECK: 1ed0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_7: + .fill 7, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1ee7: nop +# CHECK: 1ef0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_8: + .fill 8, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f08: nop +# CHECK: 1f10: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_9: + .fill 9, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f29: nop +# CHECK: 1f30: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_10: + .fill 10, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f4a: nop +# CHECK: 1f50: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_11: + .fill 11, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f6b: nop +# CHECK: 1f70: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_12: + .fill 12, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1f8c: nop +# CHECK: 1f90: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_13: + .fill 13, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1fad: nop +# CHECK: 1fb0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_14: + .fill 14, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1fce: nop +# CHECK: 1fd0: incl + + .align 32, 0x90 +INSTRLEN_16_OFFSET_15: + .fill 15, 1, 0x90 + .bundle_lock + .rept 16 + inc %eax + .endr + .bundle_unlock +# CHECK: 1fef: nop +# CHECK: 1ff0: incl + diff --git a/test/MC/X86/AlignedBundling/bundle-group-too-large-error.s b/test/MC/X86/AlignedBundling/bundle-group-too-large-error.s new file mode 100644 index 000000000000..722bf7b9227f --- /dev/null +++ b/test/MC/X86/AlignedBundling/bundle-group-too-large-error.s @@ -0,0 +1,17 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - 2>&1 | FileCheck %s + +# CHECK: ERROR: Fragment can't be larger than a bundle size + + .text +foo: + .bundle_align_mode 4 + pushq %rbp + + .bundle_lock + pushq %r14 + callq bar + callq bar + callq bar + callq bar + .bundle_unlock + diff --git a/test/MC/X86/AlignedBundling/bundle-lock-option-error.s b/test/MC/X86/AlignedBundling/bundle-lock-option-error.s new file mode 100644 index 000000000000..82c5d7cf0e7b --- /dev/null +++ b/test/MC/X86/AlignedBundling/bundle-lock-option-error.s @@ -0,0 +1,11 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - 2>&1 | FileCheck %s + +# Missing .bundle_align_mode argument +# CHECK: error: invalid option + + .bundle_align_mode 4 + .bundle_lock 5 + imull $17, %ebx, %ebp + .bundle_unlock + + diff --git a/test/MC/X86/AlignedBundling/different-sections.s b/test/MC/X86/AlignedBundling/different-sections.s new file mode 100644 index 000000000000..3e9fcf376d2d --- /dev/null +++ b/test/MC/X86/AlignedBundling/different-sections.s @@ -0,0 +1,25 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s + +# Test two different executable sections with bundling. + + .bundle_align_mode 3 + .section text1, "x" +# CHECK: section text1 + imull $17, %ebx, %ebp + imull $17, %ebx, %ebp + + imull $17, %ebx, %ebp +# CHECK: 6: nop +# CHECK-NEXT: 8: imull + + .section text2, "x" +# CHECK: section text2 + imull $17, %ebx, %ebp + imull $17, %ebx, %ebp + + imull $17, %ebx, %ebp +# CHECK: 6: nop +# CHECK-NEXT: 8: imull + + diff --git a/test/MC/X86/AlignedBundling/lit.local.cfg b/test/MC/X86/AlignedBundling/lit.local.cfg new file mode 100644 index 000000000000..6c49f08b7496 --- /dev/null +++ b/test/MC/X86/AlignedBundling/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.s'] + +targets = set(config.root.targets_to_build.split()) +if not 'X86' in targets: + config.unsupported = True + diff --git a/test/MC/X86/AlignedBundling/lock-without-bundle-mode-error.s b/test/MC/X86/AlignedBundling/lock-without-bundle-mode-error.s new file mode 100644 index 000000000000..d45a9b4a5dfb --- /dev/null +++ b/test/MC/X86/AlignedBundling/lock-without-bundle-mode-error.s @@ -0,0 +1,10 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - 2>&1 | FileCheck %s + +# .bundle_lock can't come without a .bundle_align_mode before it + +# CHECK: ERROR: .bundle_lock forbidden when bundling is disabled + + imull $17, %ebx, %ebp + .bundle_lock + + diff --git a/test/MC/X86/AlignedBundling/long-nop-pad.s b/test/MC/X86/AlignedBundling/long-nop-pad.s new file mode 100644 index 000000000000..ea33e2889b9e --- /dev/null +++ b/test/MC/X86/AlignedBundling/long-nop-pad.s @@ -0,0 +1,27 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s + +# Test that long nops are generated for padding where possible. + + .text +foo: + .bundle_align_mode 5 + +# This callq instruction is 5 bytes long + .bundle_lock align_to_end + callq bar + .bundle_unlock +# To align this group to a bundle end, we need a 15-byte NOP and a 12-byte NOP. +# CHECK: 0: nop +# CHECK-NEXT: f: nop +# CHECK-NEXT: 1b: callq + +# This push instruction is 1 byte long + .bundle_lock align_to_end + push %rax + .bundle_unlock +# To align this group to a bundle end, we need two 15-byte NOPs, and a 1-byte. +# CHECK: 20: nop +# CHECK-NEXT: 2f: nop +# CHECK-NEXT: 3e: nop +# CHECK-NEXT: 3f: pushq diff --git a/test/MC/X86/AlignedBundling/pad-align-to-bundle-end.s b/test/MC/X86/AlignedBundling/pad-align-to-bundle-end.s new file mode 100644 index 000000000000..6ca4046f0c7b --- /dev/null +++ b/test/MC/X86/AlignedBundling/pad-align-to-bundle-end.s @@ -0,0 +1,33 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s + +# Test some variations of padding to the end of a bundle. + + .text +foo: + .bundle_align_mode 4 + +# Each of these callq instructions is 5 bytes long + callq bar + callq bar + .bundle_lock align_to_end + callq bar + .bundle_unlock +# To align this group to a bundle end, we need a 1-byte NOP. +# CHECK: a: nop +# CHECK-NEXT: b: callq + + callq bar + callq bar + .bundle_lock align_to_end + callq bar + callq bar + .bundle_unlock +# Here we have to pad until the end of the *next* boundary because +# otherwise the group crosses a boundary. +# CHECK: 1a: nop +# The nop sequence may be implemented as one instruction or many, but if +# it's one instruction, that instruction cannot itself cross the boundary. +# CHECK: 20: nop +# CHECK-NEXT: 26: callq +# CHECK-NEXT: 2b: callq diff --git a/test/MC/X86/AlignedBundling/pad-bundle-groups.s b/test/MC/X86/AlignedBundling/pad-bundle-groups.s new file mode 100644 index 000000000000..b65ee7a5cc74 --- /dev/null +++ b/test/MC/X86/AlignedBundling/pad-bundle-groups.s @@ -0,0 +1,46 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s + +# Test some variations of padding for bundle-locked groups. + + .text +foo: + .bundle_align_mode 4 + +# Each of these callq instructions is 5 bytes long + callq bar + callq bar + + .bundle_lock + callq bar + callq bar + .bundle_unlock +# We'll need a 6-byte NOP before this group +# CHECK: a: nop +# CHECK-NEXT: 10: callq +# CHECK-NEXT: 15: callq + + .bundle_lock + callq bar + callq bar + .bundle_unlock +# Same here +# CHECK: 1a: nop +# CHECK-NEXT: 20: callq +# CHECK-NEXT: 25: callq + + .align 16, 0x90 + callq bar + .bundle_lock + callq bar + callq bar + callq bar + .bundle_unlock +# And here we'll need a 11-byte NOP +# CHECK: 30: callq +# CHECK: 35: nop +# CHECK-NEXT: 40: callq +# CHECK-NEXT: 45: callq + + + diff --git a/test/MC/X86/AlignedBundling/relax-at-bundle-end.s b/test/MC/X86/AlignedBundling/relax-at-bundle-end.s new file mode 100644 index 000000000000..ab4affbbeac8 --- /dev/null +++ b/test/MC/X86/AlignedBundling/relax-at-bundle-end.s @@ -0,0 +1,16 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s + +# Test that an instruction near a bundle end gets properly padded +# after it is relaxed. +.text +foo: + .bundle_align_mode 5 + .rept 29 + push %rax + .endr +# CHECK: 1c: push +# CHECK: 1d: nop +# CHECK: 20: jne + jne 0x100 + diff --git a/test/MC/X86/AlignedBundling/relax-in-bundle-group.s b/test/MC/X86/AlignedBundling/relax-in-bundle-group.s new file mode 100644 index 000000000000..0a99bb5ce563 --- /dev/null +++ b/test/MC/X86/AlignedBundling/relax-in-bundle-group.s @@ -0,0 +1,42 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -disassemble - | FileCheck %s + +# Test that instructions inside bundle-locked groups are relaxed even if their +# fixup is short enough not to warrant relaxation on its own. + + .text +foo: + .bundle_align_mode 4 + pushq %rbp + + movl %edi, %ebx + callq bar + movl %eax, %r14d + imull $17, %ebx, %ebp + movl %ebx, %edi + callq bar + cmpl %r14d, %ebp + .bundle_lock + + jle .L_ELSE +# This group would've started at 0x18 and is too long, so a chunky NOP padding +# is inserted to push it to 0x20. +# CHECK: 18: {{[a-f0-9 ]+}} nopl + +# The long encoding for JLE should be used here even though its target is close +# CHECK-NEXT: 20: 0f 8e + + addl %ebp, %eax + + jmp .L_RET +# Same for the JMP +# CHECK: 28: e9 + + .bundle_unlock + +.L_ELSE: + imull %ebx, %eax +.L_RET: + + popq %rbx + diff --git a/test/MC/X86/AlignedBundling/single-inst-bundling.s b/test/MC/X86/AlignedBundling/single-inst-bundling.s new file mode 100644 index 000000000000..c0275f4d1ecb --- /dev/null +++ b/test/MC/X86/AlignedBundling/single-inst-bundling.s @@ -0,0 +1,47 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s + +# Test simple NOP insertion for single instructions. + + .text +foo: + # Will be bundle-aligning to 16 byte boundaries + .bundle_align_mode 4 + pushq %rbp + pushq %r14 + pushq %rbx + + movl %edi, %ebx + callq bar + movl %eax, %r14d + + imull $17, %ebx, %ebp +# This imull is 3 bytes long and should have started at 0xe, so two bytes +# of nop padding are inserted instead and it starts at 0x10 +# CHECK: nop +# CHECK-NEXT: 10: imull + + movl %ebx, %edi + callq bar + cmpl %r14d, %ebp + jle .L_ELSE +# Due to the padding that's inserted before the addl, the jump target +# becomes farther by one byte. +# CHECK: jle 5 + + addl %ebp, %eax +# CHECK: nop +# CHECK-NEXT: 20: addl + + jmp .L_RET +.L_ELSE: + imull %ebx, %eax +.L_RET: + ret + +# Just sanity checking that data fills don't drive bundling crazy + .data + .byte 40 + .byte 98 + + diff --git a/test/MC/X86/AlignedBundling/switch-section-locked-error.s b/test/MC/X86/AlignedBundling/switch-section-locked-error.s new file mode 100644 index 000000000000..af41e1921252 --- /dev/null +++ b/test/MC/X86/AlignedBundling/switch-section-locked-error.s @@ -0,0 +1,16 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - 2>&1 | FileCheck %s + +# This test invokes .bundle_lock and then switches to a different section +# w/o the appropriate unlock. + +# CHECK: ERROR: Unterminated .bundle_lock + + .bundle_align_mode 3 + .section text1, "x" + imull $17, %ebx, %ebp + .bundle_lock + imull $17, %ebx, %ebp + + .section text2, "x" + imull $17, %ebx, %ebp + diff --git a/test/MC/X86/AlignedBundling/unlock-without-lock-error.s b/test/MC/X86/AlignedBundling/unlock-without-lock-error.s new file mode 100644 index 000000000000..699511d4e6b6 --- /dev/null +++ b/test/MC/X86/AlignedBundling/unlock-without-lock-error.s @@ -0,0 +1,11 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - 2>&1 | FileCheck %s + +# .bundle_unlock can't come without a .bundle_lock before it + +# CHECK: ERROR: .bundle_unlock without matching lock + + .bundle_align_mode 3 + imull $17, %ebx, %ebp + .bundle_unlock + + diff --git a/test/MC/X86/fde-reloc.s b/test/MC/X86/fde-reloc.s new file mode 100644 index 000000000000..63ac97662188 --- /dev/null +++ b/test/MC/X86/fde-reloc.s @@ -0,0 +1,11 @@ +// RUN: llvm-mc -filetype=obj %s -o - -triple x86_64-pc-linux | llvm-objdump -r - | FileCheck --check-prefix=X86-64 %s +// RUN: llvm-mc -filetype=obj %s -o - -triple i686-pc-linux | llvm-objdump -r - | FileCheck --check-prefix=I686 %s + +// PR15448 + +func: + .cfi_startproc + .cfi_endproc + +// X86-64: R_X86_64_PC32 +// I686: R_386_PC32 diff --git a/test/MC/X86/gnux32-dwarf-gen.s b/test/MC/X86/gnux32-dwarf-gen.s new file mode 100644 index 000000000000..6603125343d0 --- /dev/null +++ b/test/MC/X86/gnux32-dwarf-gen.s @@ -0,0 +1,24 @@ +# RUN: llvm-mc -g -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.64 +# RUN: llvm-dwarfdump -debug-dump=info %t.64 | FileCheck -check-prefix=DEFAULTABI %s + +# RUN: llvm-mc -g -filetype=obj -triple x86_64-pc-linux-gnux32 %s -o %t.32 +# RUN: llvm-dwarfdump -debug-dump=info %t.32 | FileCheck -check-prefix=X32ABI %s + +# This test checks the dwarf info section emitted to the output object by the +# assembler, looking at the difference between the x32 ABI and default x86-64 +# ABI. + +# DEFAULTABI: addr_size = 0x08 +# X32ABI: addr_size = 0x04 + +.globl _bar +_bar: + movl $0, %eax +L1: leave + ret +_foo: +_baz: + nop +.data +_x: .long 1 + diff --git a/test/MC/X86/intel-syntax-encoding.s b/test/MC/X86/intel-syntax-encoding.s index 03b05511649a..9806ac3802e7 100644 --- a/test/MC/X86/intel-syntax-encoding.s +++ b/test/MC/X86/intel-syntax-encoding.s @@ -31,6 +31,27 @@ // CHECK: encoding: [0x48,0x83,0xc0,0xf4] add rax, -12 +// CHECK: encoding: [0x66,0x83,0xd0,0xf4] + adc ax, -12 +// CHECK: encoding: [0x83,0xd0,0xf4] + adc eax, -12 +// CHECK: encoding: [0x48,0x83,0xd0,0xf4] + adc rax, -12 + +// CHECK: encoding: [0x66,0x83,0xd8,0xf4] + sbb ax, -12 +// CHECK: encoding: [0x83,0xd8,0xf4] + sbb eax, -12 +// CHECK: encoding: [0x48,0x83,0xd8,0xf4] + sbb rax, -12 + +// CHECK: encoding: [0x66,0x83,0xf8,0xf4] + cmp ax, -12 +// CHECK: encoding: [0x83,0xf8,0xf4] + cmp eax, -12 +// CHECK: encoding: [0x48,0x83,0xf8,0xf4] + cmp rax, -12 + LBB0_3: // CHECK: encoding: [0xeb,A] jmp LBB0_3 diff --git a/test/MC/X86/intel-syntax-hex.s b/test/MC/X86/intel-syntax-hex.s new file mode 100644 index 000000000000..b3a19fbaa345 --- /dev/null +++ b/test/MC/X86/intel-syntax-hex.s @@ -0,0 +1,26 @@ +// RUN: llvm-mc -triple x86_64-unknown-unknown -x86-asm-syntax=intel %s | FileCheck %s +// rdar://12470373 + +// Checks to make sure we parse the hexadecimal suffix properly. +// CHECK: movl $10, %eax + mov eax, 10 +// CHECK: movl $16, %eax + mov eax, 10h +// CHECK: movl $16, %eax + mov eax, 10H +// CHECK: movl $4294967295, %eax + mov eax, 0ffffffffh +// CHECK: movl $4294967295, %eax + mov eax, 0xffffffff +// CHECK: movl $4294967295, %eax + mov eax, 0xffffffffh +// CHECK: movl $15, %eax + mov eax, 0fh +// CHECK: movl $162, %eax + mov eax, 0a2h +// CHECK: movl $162, %eax + mov eax, 0xa2 +// CHECK: movl $162, %eax + mov eax, 0xa2h +// CHECK: movl $674, %eax + mov eax, 2a2h diff --git a/test/MC/X86/intel-syntax.s b/test/MC/X86/intel-syntax.s index 7edd26a1382f..8bfa58a4bed8 100644 --- a/test/MC/X86/intel-syntax.s +++ b/test/MC/X86/intel-syntax.s @@ -56,13 +56,195 @@ _main: // CHECK: fld %st(0) fld ST(0) // CHECK: movl %fs:(%rdi), %eax - mov EAX, DWORD PTR FS:[RDI] -// CHECK: leal (,%rdi,4), %r8d - lea R8D, DWORD PTR [4*RDI] -// CHECK: movl _fnan(,%ecx,4), %ecx - mov ECX, DWORD PTR [4*ECX + _fnan] -// CHECK: movq %fs:320, %rax - mov RAX, QWORD PTR FS:[320] -// CHECK: vpgatherdd %xmm8, (%r15,%xmm9,2), %xmm1 - vpgatherdd XMM10, DWORD PTR [R15 + 2*XMM9], XMM8 + mov EAX, DWORD PTR FS:[RDI] +// CHECK: leal (,%rdi,4), %r8d + lea R8D, DWORD PTR [4*RDI] +// CHECK: movl _fnan(,%ecx,4), %ecx + mov ECX, DWORD PTR [4*ECX + _fnan] +// CHECK: movq %fs:320, %rax + mov RAX, QWORD PTR FS:[320] +// CHECK: vpgatherdd %xmm8, (%r15,%xmm9,2), %xmm1 + vpgatherdd XMM10, DWORD PTR [R15 + 2*XMM9], XMM8 +// CHECK: movsd -8, %xmm5 + movsd XMM5, QWORD PTR [-8] +// CHECK: movl %ecx, (%eax) + mov [eax], ecx +// CHECK: movl %ecx, (,%ebx,4) + mov [4*ebx], ecx + // CHECK: movl %ecx, (,%ebx,4) + mov [ebx*4], ecx +// CHECK: movl %ecx, 1024 + mov [1024], ecx +// CHECK: movl %ecx, 4132 + mov [0x1024], ecx +// CHECK: movl %ecx, 32 + mov [16 + 16], ecx +// CHECK: movl %ecx, 0 + mov [16 - 16], ecx +// CHECK: movl %ecx, 32 + mov [16][16], ecx +// CHECK: movl %ecx, (%eax,%ebx,4) + mov [eax + 4*ebx], ecx +// CHECK: movl %ecx, (%eax,%ebx,4) + mov [eax + ebx*4], ecx +// CHECK: movl %ecx, (%eax,%ebx,4) + mov [4*ebx + eax], ecx +// CHECK: movl %ecx, (%eax,%ebx,4) + mov [ebx*4 + eax], ecx +// CHECK: movl %ecx, (%eax,%ebx,4) + mov [eax][4*ebx], ecx +// CHECK: movl %ecx, (%eax,%ebx,4) + mov [eax][ebx*4], ecx +// CHECK: movl %ecx, (%eax,%ebx,4) + mov [4*ebx][eax], ecx +// CHECK: movl %ecx, (%eax,%ebx,4) + mov [ebx*4][eax], ecx +// CHECK: movl %ecx, 12(%eax) + mov [eax + 12], ecx +// CHECK: movl %ecx, 12(%eax) + mov [12 + eax], ecx +// CHECK: movl %ecx, 32(%eax) + mov [eax + 16 + 16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [16 + eax + 16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [16 + 16 + eax], ecx +// CHECK: movl %ecx, 12(%eax) + mov [eax][12], ecx +// CHECK: movl %ecx, 12(%eax) + mov [12][eax], ecx +// CHECK: movl %ecx, 32(%eax) + mov [eax][16 + 16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [eax + 16][16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [eax][16][16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [16][eax + 16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [16 + eax][16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [16][16 + eax], ecx +// CHECK: movl %ecx, 32(%eax) + mov [16 + 16][eax], ecx +// CHECK: movl %ecx, 32(%eax) + mov [eax][16][16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [16][eax][16], ecx +// CHECK: movl %ecx, 32(%eax) + mov [16][16][eax], ecx +// CHECK: movl %ecx, 16(,%ebx,4) + mov [4*ebx + 16], ecx +// CHECK: movl %ecx, 16(,%ebx,4) + mov [ebx*4 + 16], ecx +// CHECK: movl %ecx, 16(,%ebx,4) + mov [4*ebx][16], ecx +// CHECK: movl %ecx, 16(,%ebx,4) + mov [ebx*4][16], ecx +// CHECK: movl %ecx, 16(,%ebx,4) + mov [16 + 4*ebx], ecx +// CHECK: movl %ecx, 16(,%ebx,4) + mov [16 + ebx*4], ecx +// CHECK: movl %ecx, 16(,%ebx,4) + mov [16][4*ebx], ecx +// CHECK: movl %ecx, 16(,%ebx,4) + mov [16][ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax + 4*ebx + 16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax + 16 + 4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [4*ebx + eax + 16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [4*ebx + 16 + eax], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16 + eax + 4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16 + eax + 4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax][4*ebx + 16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax][16 + 4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [4*ebx][eax + 16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [4*ebx][16 + eax], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16][eax + 4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16][eax + 4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax + 4*ebx][16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax + 16][4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [4*ebx + eax][16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [4*ebx + 16][eax], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16 + eax][4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16 + eax][4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax][4*ebx][16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax][16][4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [4*ebx][eax][16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [4*ebx][16][eax], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16][eax][4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16][eax][4*ebx], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax + ebx*4 + 16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax + 16 + ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [ebx*4 + eax + 16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [ebx*4 + 16 + eax], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16 + eax + ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16 + eax + ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax][ebx*4 + 16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax][16 + ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [ebx*4][eax + 16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [ebx*4][16 + eax], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16][eax + ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16][eax + ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax + ebx*4][16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax + 16][ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [ebx*4 + eax][16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [ebx*4 + 16][eax], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16 + eax][ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16 + eax][ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax][ebx*4][16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [eax][16][ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [ebx*4][eax][16], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [ebx*4][16][eax], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16][eax][ebx*4], ecx +// CHECK: movl %ecx, 16(%eax,%ebx,4) + mov [16][eax][ebx*4], ecx +// CHECK: movl %ecx, -16(%eax,%ebx,4) + mov [eax][ebx*4 - 16], ecx ret diff --git a/test/MC/X86/lit.local.cfg b/test/MC/X86/lit.local.cfg index eee568e8fdc2..ad280c7cf7de 100644 --- a/test/MC/X86/lit.local.cfg +++ b/test/MC/X86/lit.local.cfg @@ -1,12 +1,5 @@ config.suffixes = ['.ll', '.c', '.cpp', '.s'] -def getRoot(config): - if not config.parent: - return config - return getRoot(config.parent) - -root = getRoot(config) - -targets = set(root.targets_to_build.split()) +targets = set(config.root.targets_to_build.split()) if not 'X86' in targets: config.unsupported = True diff --git a/test/MC/X86/shuffle-comments.s b/test/MC/X86/shuffle-comments.s new file mode 100644 index 000000000000..20fd4ebae4dc --- /dev/null +++ b/test/MC/X86/shuffle-comments.s @@ -0,0 +1,271 @@ +# RUN: llvm-mc %s -triple=x86_64-unknown-unknown | FileCheck %s + +palignr $8, %xmm0, %xmm1 +# CHECK: xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] +palignr $8, (%rax), %xmm1 +# CHECK: xmm1 = mem[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] + +palignr $16, %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] +palignr $16, (%rax), %xmm1 +# CHECK: xmm1 = xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] + +palignr $0, %xmm0, %xmm1 +# CHECK: xmm1 = xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] +palignr $0, (%rax), %xmm1 +# CHECK: xmm1 = mem[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] + +vpalignr $8, %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] +vpalignr $8, (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = mem[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] + +vpalignr $16, %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] +vpalignr $16, (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] + +vpalignr $0, %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] +vpalignr $0, (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = mem[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] + +vpalignr $8, %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm0[8,9,10,11,12,13,14,15],ymm1[0,1,2,3,4,5,6,7],ymm0[24,25,26,27,28,29,30,31],ymm1[16,17,18,19,20,21,22,23] +vpalignr $8, (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = mem[8,9,10,11,12,13,14,15],ymm1[0,1,2,3,4,5,6,7],mem[24,25,26,27,28,29,30,31],ymm1[16,17,18,19,20,21,22,23] + +vpalignr $16, %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31] +vpalignr $16, (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31] + +vpalignr $0, %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31] +vpalignr $0, (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = mem[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31] + +pshufd $27, %xmm0, %xmm1 +# CHECK: xmm1 = xmm0[3,2,1,0] +pshufd $27, (%rax), %xmm1 +# CHECK: xmm1 = mem[3,2,1,0] + +vpshufd $27, %xmm0, %xmm1 +# CHECK: xmm1 = xmm0[3,2,1,0] +vpshufd $27, (%rax), %xmm1 +# CHECK: xmm1 = mem[3,2,1,0] + +vpshufd $27, %ymm0, %ymm1 +# CHECK: ymm1 = ymm0[3,2,1,0,7,6,5,4] +vpshufd $27, (%rax), %ymm1 +# CHECK: ymm1 = mem[3,2,1,0,7,6,5,4] + +punpcklbw %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] +punpcklbw (%rax), %xmm1 +# CHECK: xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3],xmm1[4],mem[4],xmm1[5],mem[5],xmm1[6],mem[6],xmm1[7],mem[7] + +vpunpcklbw %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] +vpunpcklbw (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3],xmm1[4],mem[4],xmm1[5],mem[5],xmm1[6],mem[6],xmm1[7],mem[7] + +vpunpcklbw %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23] +vpunpcklbw (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[2],mem[2],ymm1[3],mem[3],ymm1[4],mem[4],ymm1[5],mem[5],ymm1[6],mem[6],ymm1[7],mem[7],ymm1[16],mem[16],ymm1[17],mem[17],ymm1[18],mem[18],ymm1[19],mem[19],ymm1[20],mem[20],ymm1[21],mem[21],ymm1[22],mem[22],ymm1[23],mem[23] + +punpckhbw %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] +punpckhbw (%rax), %xmm1 +# CHECK: xmm1 = xmm1[8],mem[8],xmm1[9],mem[9],xmm1[10],mem[10],xmm1[11],mem[11],xmm1[12],mem[12],xmm1[13],mem[13],xmm1[14],mem[14],xmm1[15],mem[15] + +vpunpckhbw %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] +vpunpckhbw (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[8],mem[8],xmm1[9],mem[9],xmm1[10],mem[10],xmm1[11],mem[11],xmm1[12],mem[12],xmm1[13],mem[13],xmm1[14],mem[14],xmm1[15],mem[15] + +vpunpckhbw %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31] +vpunpckhbw (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[8],mem[8],ymm1[9],mem[9],ymm1[10],mem[10],ymm1[11],mem[11],ymm1[12],mem[12],ymm1[13],mem[13],ymm1[14],mem[14],ymm1[15],mem[15],ymm1[24],mem[24],ymm1[25],mem[25],ymm1[26],mem[26],ymm1[27],mem[27],ymm1[28],mem[28],ymm1[29],mem[29],ymm1[30],mem[30],ymm1[31],mem[31] + +punpcklwd %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] +punpcklwd (%rax), %xmm1 +# CHECK: xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3] + +vpunpcklwd %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] +vpunpcklwd (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3] + +vpunpcklwd %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11] +vpunpcklwd (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[2],mem[2],ymm1[3],mem[3],ymm1[8],mem[8],ymm1[9],mem[9],ymm1[10],mem[10],ymm1[11],mem[11] + +punpckhwd %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] +punpckhwd (%rax), %xmm1 +# CHECK: xmm1 = xmm1[4],mem[4],xmm1[5],mem[5],xmm1[6],mem[6],xmm1[7],mem[7] + +vpunpckhwd %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] +vpunpckhwd (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[4],mem[4],xmm1[5],mem[5],xmm1[6],mem[6],xmm1[7],mem[7] + +vpunpckhwd %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15] +vpunpckhwd (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[4],mem[4],ymm1[5],mem[5],ymm1[6],mem[6],ymm1[7],mem[7],ymm1[12],mem[12],ymm1[13],mem[13],ymm1[14],mem[14],ymm1[15],mem[15] + +punpckldq %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] +punpckldq (%rax), %xmm1 +# CHECK: xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] + +vpunpckldq %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] +vpunpckldq (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],mem[0],xmm1[1],mem[1] + +vpunpckldq %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5] +vpunpckldq (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5] + +punpckhdq %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[2],xmm0[2],xmm1[3],xmm0[3] +punpckhdq (%rax), %xmm1 +# CHECK: xmm1 = xmm1[2],mem[2],xmm1[3],mem[3] + +vpunpckhdq %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[2],xmm0[2],xmm1[3],xmm0[3] +vpunpckhdq (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[2],mem[2],xmm1[3],mem[3] + +vpunpckhdq %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7] +vpunpckhdq (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[2],mem[2],ymm1[3],mem[3],ymm1[6],mem[6],ymm1[7],mem[7] + +punpcklqdq %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[0],xmm0[0] +punpcklqdq (%rax), %xmm1 +# CHECK: xmm1 = xmm1[0],mem[0] + +vpunpcklqdq %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],xmm0[0] +vpunpcklqdq (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],mem[0] + +vpunpcklqdq %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],ymm0[0],ymm1[2],ymm0[2] +vpunpcklqdq (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],mem[0],ymm1[2],mem[2] + +punpckhqdq %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[1],xmm0[1] +punpckhqdq (%rax), %xmm1 +# CHECK: xmm1 = xmm1[1],mem[1] + +vpunpckhqdq %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[1],xmm0[1] +vpunpckhqdq (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[1],mem[1] + +vpunpckhqdq %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[1],ymm0[1],ymm1[3],ymm0[3] +vpunpckhqdq (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[1],mem[1],ymm1[3],mem[3] + +unpcklps %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] +unpcklps (%rax), %xmm1 +# CHECK: xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] + +vunpcklps %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] +vunpcklps (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],mem[0],xmm1[1],mem[1] + +vunpcklps %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5] +vunpcklps (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],mem[0],ymm1[1],mem[1],ymm1[4],mem[4],ymm1[5],mem[5] + +unpckhps %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[2],xmm0[2],xmm1[3],xmm0[3] +unpckhps (%rax), %xmm1 +# CHECK: xmm1 = xmm1[2],mem[2],xmm1[3],mem[3] + +vunpckhps %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[2],xmm0[2],xmm1[3],xmm0[3] +vunpckhps (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[2],mem[2],xmm1[3],mem[3] + +vunpckhps %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7] +vunpckhps (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[2],mem[2],ymm1[3],mem[3],ymm1[6],mem[6],ymm1[7],mem[7] + +unpcklpd %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[0],xmm0[0] +unpcklpd (%rax), %xmm1 +# CHECK: xmm1 = xmm1[0],mem[0] + +vunpcklpd %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],xmm0[0] +vunpcklpd (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[0],mem[0] + +vunpcklpd %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],ymm0[0],ymm1[2],ymm0[2] +vunpcklpd (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[0],mem[0],ymm1[2],mem[2] + +unpckhpd %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[1],xmm0[1] +unpckhpd (%rax), %xmm1 +# CHECK: xmm1 = xmm1[1],mem[1] + +vunpckhpd %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[1],xmm0[1] +vunpckhpd (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[1],mem[1] + +vunpckhpd %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[1],ymm0[1],ymm1[3],ymm0[3] +vunpckhpd (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[1],mem[1],ymm1[3],mem[3] + +shufps $27, %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[3,2],xmm0[1,0] +shufps $27, (%rax), %xmm1 +# CHECK: xmm1 = xmm1[3,2],mem[1,0] + +vshufps $27, %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[3,2],xmm0[1,0] +vshufps $27, (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[3,2],mem[1,0] + +vshufps $27, %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[3,2],ymm0[1,0],ymm1[7,6],ymm0[5,4] +vshufps $27, (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[3,2],mem[1,0],ymm1[7,6],mem[5,4] + +shufpd $3, %xmm0, %xmm1 +# CHECK: xmm1 = xmm1[1],xmm0[1] +shufpd $3, (%rax), %xmm1 +# CHECK: xmm1 = xmm1[1],mem[1] + +vshufpd $3, %xmm0, %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[1],xmm0[1] +vshufpd $3, (%rax), %xmm1, %xmm2 +# CHECK: xmm2 = xmm1[1],mem[1] + +vshufpd $11, %ymm0, %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[1],ymm0[1],ymm1[2],ymm0[3] +vshufpd $11, (%rax), %ymm1, %ymm2 +# CHECK: ymm2 = ymm1[1],mem[1],ymm1[2],mem[3] diff --git a/test/MC/X86/x86-32-avx.s b/test/MC/X86/x86-32-avx.s index 586f3fe73c57..ec4abdbb2a8b 100644 --- a/test/MC/X86/x86-32-avx.s +++ b/test/MC/X86/x86-32-avx.s @@ -655,14 +655,22 @@ // CHECK: encoding: [0xc5,0xfa,0x2c,0x01] vcvttss2si (%ecx), %eax -// CHECK: vcvtsi2ss (%eax), %xmm1, %xmm2 +// CHECK: vcvtsi2ssl (%eax), %xmm1, %xmm2 // CHECK: encoding: [0xc5,0xf2,0x2a,0x10] vcvtsi2ss (%eax), %xmm1, %xmm2 -// CHECK: vcvtsi2ss (%eax), %xmm1, %xmm2 +// CHECK: vcvtsi2ssl (%eax), %xmm1, %xmm2 // CHECK: encoding: [0xc5,0xf2,0x2a,0x10] vcvtsi2ss (%eax), %xmm1, %xmm2 +// CHECK: vcvtsi2ssl (%eax), %xmm1, %xmm2 +// CHECK: encoding: [0xc5,0xf2,0x2a,0x10] + vcvtsi2ssl (%eax), %xmm1, %xmm2 + +// CHECK: vcvtsi2ssl (%eax), %xmm1, %xmm2 +// CHECK: encoding: [0xc5,0xf2,0x2a,0x10] + vcvtsi2ssl (%eax), %xmm1, %xmm2 + // CHECK: vcvttsd2si %xmm1, %eax // CHECK: encoding: [0xc5,0xfb,0x2c,0xc1] vcvttsd2si %xmm1, %eax @@ -671,14 +679,22 @@ // CHECK: encoding: [0xc5,0xfb,0x2c,0x01] vcvttsd2si (%ecx), %eax -// CHECK: vcvtsi2sd (%eax), %xmm1, %xmm2 +// CHECK: vcvtsi2sdl (%eax), %xmm1, %xmm2 // CHECK: encoding: [0xc5,0xf3,0x2a,0x10] vcvtsi2sd (%eax), %xmm1, %xmm2 -// CHECK: vcvtsi2sd (%eax), %xmm1, %xmm2 +// CHECK: vcvtsi2sdl (%eax), %xmm1, %xmm2 // CHECK: encoding: [0xc5,0xf3,0x2a,0x10] vcvtsi2sd (%eax), %xmm1, %xmm2 +// CHECK: vcvtsi2sdl (%eax), %xmm1, %xmm2 +// CHECK: encoding: [0xc5,0xf3,0x2a,0x10] + vcvtsi2sdl (%eax), %xmm1, %xmm2 + +// CHECK: vcvtsi2sdl (%eax), %xmm1, %xmm2 +// CHECK: encoding: [0xc5,0xf3,0x2a,0x10] + vcvtsi2sdl (%eax), %xmm1, %xmm2 + // CHECK: vmovaps (%eax), %xmm2 // CHECK: encoding: [0xc5,0xf8,0x28,0x10] vmovaps (%eax), %xmm2 @@ -767,14 +783,22 @@ // CHECK: encoding: [0xc5,0xe8,0x12,0xd9] vmovhlps %xmm1, %xmm2, %xmm3 -// CHECK: vcvtss2sil %xmm1, %eax +// CHECK: vcvtss2si %xmm1, %eax // CHECK: encoding: [0xc5,0xfa,0x2d,0xc1] vcvtss2si %xmm1, %eax -// CHECK: vcvtss2sil (%eax), %ebx +// CHECK: vcvtss2si (%eax), %ebx // CHECK: encoding: [0xc5,0xfa,0x2d,0x18] vcvtss2si (%eax), %ebx +// CHECK: vcvtss2si %xmm1, %eax +// CHECK: encoding: [0xc5,0xfa,0x2d,0xc1] + vcvtss2sil %xmm1, %eax + +// CHECK: vcvtss2si (%eax), %ebx +// CHECK: encoding: [0xc5,0xfa,0x2d,0x18] + vcvtss2sil (%eax), %ebx + // CHECK: vcvtdq2ps %xmm5, %xmm6 // CHECK: encoding: [0xc5,0xf8,0x5b,0xf5] vcvtdq2ps %xmm5, %xmm6 @@ -3103,19 +3127,35 @@ // CHECK: encoding: [0xc5,0xf8,0x77] vzeroupper -// CHECK: vcvtsd2sil %xmm4, %ecx +// CHECK: vcvtsd2si %xmm4, %ecx // CHECK: encoding: [0xc5,0xfb,0x2d,0xcc] vcvtsd2sil %xmm4, %ecx -// CHECK: vcvtsd2sil (%ecx), %ecx +// CHECK: vcvtsd2si (%ecx), %ecx // CHECK: encoding: [0xc5,0xfb,0x2d,0x09] vcvtsd2sil (%ecx), %ecx -// CHECK: vcvtsi2sd (%ebp), %xmm0, %xmm7 +// CHECK: vcvtsd2si %xmm4, %ecx +// CHECK: encoding: [0xc5,0xfb,0x2d,0xcc] + vcvtsd2si %xmm4, %ecx + +// CHECK: vcvtsd2si (%ecx), %ecx +// CHECK: encoding: [0xc5,0xfb,0x2d,0x09] + vcvtsd2si (%ecx), %ecx + +// CHECK: vcvtsi2sdl (%ebp), %xmm0, %xmm7 +// CHECK: encoding: [0xc5,0xfb,0x2a,0x7d,0x00] + vcvtsi2sdl (%ebp), %xmm0, %xmm7 + +// CHECK: vcvtsi2sdl (%esp), %xmm0, %xmm7 +// CHECK: encoding: [0xc5,0xfb,0x2a,0x3c,0x24] + vcvtsi2sdl (%esp), %xmm0, %xmm7 + +// CHECK: vcvtsi2sdl (%ebp), %xmm0, %xmm7 // CHECK: encoding: [0xc5,0xfb,0x2a,0x7d,0x00] vcvtsi2sd (%ebp), %xmm0, %xmm7 -// CHECK: vcvtsi2sd (%esp), %xmm0, %xmm7 +// CHECK: vcvtsi2sdl (%esp), %xmm0, %xmm7 // CHECK: encoding: [0xc5,0xfb,0x2a,0x3c,0x24] vcvtsi2sd (%esp), %xmm0, %xmm7 diff --git a/test/MC/X86/x86-32-coverage.s b/test/MC/X86/x86-32-coverage.s index 082491651927..c348915d23ce 100644 --- a/test/MC/X86/x86-32-coverage.s +++ b/test/MC/X86/x86-32-coverage.s @@ -896,11 +896,11 @@ // CHECK: cvtps2pi %xmm5, %mm3 cvtps2pi %xmm5,%mm3 -// CHECK: cvtsi2ss %ecx, %xmm5 - cvtsi2ss %ecx,%xmm5 +// CHECK: cvtsi2ssl %ecx, %xmm5 + cvtsi2ssl %ecx,%xmm5 -// CHECK: cvtsi2ss 3735928559(%ebx,%ecx,8), %xmm5 - cvtsi2ss 0xdeadbeef(%ebx,%ecx,8),%xmm5 +// CHECK: cvtsi2ssl 3735928559(%ebx,%ecx,8), %xmm5 + cvtsi2ssl 0xdeadbeef(%ebx,%ecx,8),%xmm5 // CHECK: cvttps2pi 3735928559(%ebx,%ecx,8), %mm3 cvttps2pi 0xdeadbeef(%ebx,%ecx,8),%mm3 @@ -1157,11 +1157,11 @@ // CHECK: cvtpi2pd %mm3, %xmm5 cvtpi2pd %mm3,%xmm5 -// CHECK: cvtsi2sd %ecx, %xmm5 - cvtsi2sd %ecx,%xmm5 +// CHECK: cvtsi2sdl %ecx, %xmm5 + cvtsi2sdl %ecx,%xmm5 -// CHECK: cvtsi2sd 3735928559(%ebx,%ecx,8), %xmm5 - cvtsi2sd 0xdeadbeef(%ebx,%ecx,8),%xmm5 +// CHECK: cvtsi2sdl 3735928559(%ebx,%ecx,8), %xmm5 + cvtsi2sdl 0xdeadbeef(%ebx,%ecx,8),%xmm5 // CHECK: divpd %xmm5, %xmm5 divpd %xmm5,%xmm5 @@ -3948,6 +3948,10 @@ // CHECK: encoding: [0xd9,0xca] fxch %st(2) +// CHECK: fcom +// CHECK: encoding: [0xd8,0xd1] + fcom + // CHECK: fcom %st(2) // CHECK: encoding: [0xd8,0xd2] fcom %st(2) @@ -3968,6 +3972,10 @@ // CHECK: encoding: [0xda,0x15,0x78,0x56,0x34,0x12] ficoml 0x12345678 +// CHECK: fcomp +// CHECK: encoding: [0xd8,0xd9] + fcomp + // CHECK: fcomp %st(2) // CHECK: encoding: [0xd8,0xda] fcomp %st(2) @@ -7144,29 +7152,29 @@ // CHECK: encoding: [0x0f,0x2d,0xdd] cvtps2pi %xmm5,%mm3 -// CHECK: cvtsi2ss %ecx, %xmm5 +// CHECK: cvtsi2ssl %ecx, %xmm5 // CHECK: encoding: [0xf3,0x0f,0x2a,0xe9] - cvtsi2ss %ecx,%xmm5 + cvtsi2ssl %ecx,%xmm5 -// CHECK: cvtsi2ss 3735928559(%ebx,%ecx,8), %xmm5 +// CHECK: cvtsi2ssl 3735928559(%ebx,%ecx,8), %xmm5 // CHECK: encoding: [0xf3,0x0f,0x2a,0xac,0xcb,0xef,0xbe,0xad,0xde] - cvtsi2ss 0xdeadbeef(%ebx,%ecx,8),%xmm5 + cvtsi2ssl 0xdeadbeef(%ebx,%ecx,8),%xmm5 -// CHECK: cvtsi2ss 69, %xmm5 +// CHECK: cvtsi2ssl 69, %xmm5 // CHECK: encoding: [0xf3,0x0f,0x2a,0x2d,0x45,0x00,0x00,0x00] - cvtsi2ss 0x45,%xmm5 + cvtsi2ssl 0x45,%xmm5 -// CHECK: cvtsi2ss 32493, %xmm5 +// CHECK: cvtsi2ssl 32493, %xmm5 // CHECK: encoding: [0xf3,0x0f,0x2a,0x2d,0xed,0x7e,0x00,0x00] - cvtsi2ss 0x7eed,%xmm5 + cvtsi2ssl 0x7eed,%xmm5 -// CHECK: cvtsi2ss 3133065982, %xmm5 +// CHECK: cvtsi2ssl 3133065982, %xmm5 // CHECK: encoding: [0xf3,0x0f,0x2a,0x2d,0xfe,0xca,0xbe,0xba] - cvtsi2ss 0xbabecafe,%xmm5 + cvtsi2ssl 0xbabecafe,%xmm5 -// CHECK: cvtsi2ss 305419896, %xmm5 +// CHECK: cvtsi2ssl 305419896, %xmm5 // CHECK: encoding: [0xf3,0x0f,0x2a,0x2d,0x78,0x56,0x34,0x12] - cvtsi2ss 0x12345678,%xmm5 + cvtsi2ssl 0x12345678,%xmm5 // CHECK: cvttps2pi 3735928559(%ebx,%ecx,8), %mm3 // CHECK: encoding: [0x0f,0x2c,0x9c,0xcb,0xef,0xbe,0xad,0xde] @@ -8652,29 +8660,29 @@ // CHECK: encoding: [0x66,0x0f,0x2a,0xeb] cvtpi2pd %mm3,%xmm5 -// CHECK: cvtsi2sd %ecx, %xmm5 +// CHECK: cvtsi2sdl %ecx, %xmm5 // CHECK: encoding: [0xf2,0x0f,0x2a,0xe9] - cvtsi2sd %ecx,%xmm5 + cvtsi2sdl %ecx,%xmm5 -// CHECK: cvtsi2sd 3735928559(%ebx,%ecx,8), %xmm5 +// CHECK: cvtsi2sdl 3735928559(%ebx,%ecx,8), %xmm5 // CHECK: encoding: [0xf2,0x0f,0x2a,0xac,0xcb,0xef,0xbe,0xad,0xde] - cvtsi2sd 0xdeadbeef(%ebx,%ecx,8),%xmm5 + cvtsi2sdl 0xdeadbeef(%ebx,%ecx,8),%xmm5 -// CHECK: cvtsi2sd 69, %xmm5 +// CHECK: cvtsi2sdl 69, %xmm5 // CHECK: encoding: [0xf2,0x0f,0x2a,0x2d,0x45,0x00,0x00,0x00] - cvtsi2sd 0x45,%xmm5 + cvtsi2sdl 0x45,%xmm5 -// CHECK: cvtsi2sd 32493, %xmm5 +// CHECK: cvtsi2sdl 32493, %xmm5 // CHECK: encoding: [0xf2,0x0f,0x2a,0x2d,0xed,0x7e,0x00,0x00] - cvtsi2sd 0x7eed,%xmm5 + cvtsi2sdl 0x7eed,%xmm5 -// CHECK: cvtsi2sd 3133065982, %xmm5 +// CHECK: cvtsi2sdl 3133065982, %xmm5 // CHECK: encoding: [0xf2,0x0f,0x2a,0x2d,0xfe,0xca,0xbe,0xba] - cvtsi2sd 0xbabecafe,%xmm5 + cvtsi2sdl 0xbabecafe,%xmm5 -// CHECK: cvtsi2sd 305419896, %xmm5 +// CHECK: cvtsi2sdl 305419896, %xmm5 // CHECK: encoding: [0xf2,0x0f,0x2a,0x2d,0x78,0x56,0x34,0x12] - cvtsi2sd 0x12345678,%xmm5 + cvtsi2sdl 0x12345678,%xmm5 // CHECK: divpd 3735928559(%ebx,%ecx,8), %xmm5 // CHECK: encoding: [0x66,0x0f,0x5e,0xac,0xcb,0xef,0xbe,0xad,0xde] @@ -16200,23 +16208,23 @@ // CHECK: cvtps2pi %xmm5, %mm3 cvtps2pi %xmm5,%mm3 -// CHECK: cvtsi2ss %ecx, %xmm5 - cvtsi2ss %ecx,%xmm5 +// CHECK: cvtsi2ssl %ecx, %xmm5 + cvtsi2ssl %ecx,%xmm5 -// CHECK: cvtsi2ss 3735928559(%ebx,%ecx,8), %xmm5 - cvtsi2ss 0xdeadbeef(%ebx,%ecx,8),%xmm5 +// CHECK: cvtsi2ssl 3735928559(%ebx,%ecx,8), %xmm5 + cvtsi2ssl 0xdeadbeef(%ebx,%ecx,8),%xmm5 -// CHECK: cvtsi2ss 69, %xmm5 - cvtsi2ss 0x45,%xmm5 +// CHECK: cvtsi2ssl 69, %xmm5 + cvtsi2ssl 0x45,%xmm5 -// CHECK: cvtsi2ss 32493, %xmm5 - cvtsi2ss 0x7eed,%xmm5 +// CHECK: cvtsi2ssl 32493, %xmm5 + cvtsi2ssl 0x7eed,%xmm5 -// CHECK: cvtsi2ss 3133065982, %xmm5 - cvtsi2ss 0xbabecafe,%xmm5 +// CHECK: cvtsi2ssl 3133065982, %xmm5 + cvtsi2ssl 0xbabecafe,%xmm5 -// CHECK: cvtsi2ss 305419896, %xmm5 - cvtsi2ss 0x12345678,%xmm5 +// CHECK: cvtsi2ssl 305419896, %xmm5 + cvtsi2ssl 0x12345678,%xmm5 // CHECK: cvttps2pi 3735928559(%ebx,%ecx,8), %mm3 cvttps2pi 0xdeadbeef(%ebx,%ecx,8),%mm3 @@ -17334,23 +17342,23 @@ // CHECK: cvtpi2pd %mm3, %xmm5 cvtpi2pd %mm3,%xmm5 -// CHECK: cvtsi2sd %ecx, %xmm5 - cvtsi2sd %ecx,%xmm5 +// CHECK: cvtsi2sdl %ecx, %xmm5 + cvtsi2sdl %ecx,%xmm5 -// CHECK: cvtsi2sd 3735928559(%ebx,%ecx,8), %xmm5 - cvtsi2sd 0xdeadbeef(%ebx,%ecx,8),%xmm5 +// CHECK: cvtsi2sdl 3735928559(%ebx,%ecx,8), %xmm5 + cvtsi2sdl 0xdeadbeef(%ebx,%ecx,8),%xmm5 -// CHECK: cvtsi2sd 69, %xmm5 - cvtsi2sd 0x45,%xmm5 +// CHECK: cvtsi2sdl 69, %xmm5 + cvtsi2sdl 0x45,%xmm5 -// CHECK: cvtsi2sd 32493, %xmm5 - cvtsi2sd 0x7eed,%xmm5 +// CHECK: cvtsi2sdl 32493, %xmm5 + cvtsi2sdl 0x7eed,%xmm5 -// CHECK: cvtsi2sd 3133065982, %xmm5 - cvtsi2sd 0xbabecafe,%xmm5 +// CHECK: cvtsi2sdl 3133065982, %xmm5 + cvtsi2sdl 0xbabecafe,%xmm5 -// CHECK: cvtsi2sd 305419896, %xmm5 - cvtsi2sd 0x12345678,%xmm5 +// CHECK: cvtsi2sdl 305419896, %xmm5 + cvtsi2sdl 0x12345678,%xmm5 // CHECK: divpd 3735928559(%ebx,%ecx,8), %xmm5 divpd 0xdeadbeef(%ebx,%ecx,8),%xmm5 diff --git a/test/MC/X86/x86-32-ms-inline-asm.s b/test/MC/X86/x86-32-ms-inline-asm.s index 73d5878b41bc..d912915c585e 100644 --- a/test/MC/X86/x86-32-ms-inline-asm.s +++ b/test/MC/X86/x86-32-ms-inline-asm.s @@ -57,4 +57,37 @@ _t21: ## @t21 // CHECK: movl 4(%esi,%eax,2), %eax // CHECK: # encoding: [0x8b,0x44,0x46,0x04] + mov eax, 4[esi + 2*eax + 4] +// CHECK: movl 8(%esi,%eax,2), %eax +// CHECK: # encoding: [0x8b,0x44,0x46,0x08] + mov eax, 4[esi][2*eax + 4] +// CHECK: movl 8(%esi,%eax,2), %eax +// CHECK: # encoding: [0x8b,0x44,0x46,0x08] + mov eax, 4[esi + 2*eax][4] +// CHECK: movl 8(%esi,%eax,2), %eax +// CHECK: # encoding: [0x8b,0x44,0x46,0x08] + mov eax, 4[esi][2*eax][4] +// CHECK: movl 8(%esi,%eax,2), %eax +// CHECK: # encoding: [0x8b,0x44,0x46,0x08] + mov eax, 4[esi][2*eax][4][8] +// CHECK: movl 16(%esi,%eax,2), %eax +// CHECK: # encoding: [0x8b,0x44,0x46,0x10] + + prefetchnta 64[eax] +// CHECK: prefetchnta 64(%eax) +// CHECK: # encoding: [0x0f,0x18,0x40,0x40] + + pusha +// CHECK: pushal +// CHECK: # encoding: [0x60] + popa +// CHECK: popal +// CHECK: # encoding: [0x61] + pushad +// CHECK: pushal +// CHECK: # encoding: [0x60] + popad +// CHECK: popal +// CHECK: # encoding: [0x61] + ret diff --git a/test/MC/X86/x86-64.s b/test/MC/X86/x86-64.s index 03cb62e7cba3..c5f1d15f8ff0 100644 --- a/test/MC/X86/x86-64.s +++ b/test/MC/X86/x86-64.s @@ -507,15 +507,15 @@ fsave 32493 // rdar://8456382 - cvtsd2si support. cvtsd2si %xmm1, %rax -// CHECK: cvtsd2siq %xmm1, %rax +// CHECK: cvtsd2si %xmm1, %rax // CHECK: encoding: [0xf2,0x48,0x0f,0x2d,0xc1] cvtsd2si %xmm1, %eax -// CHECK: cvtsd2sil %xmm1, %eax +// CHECK: cvtsd2si %xmm1, %eax // CHECK: encoding: [0xf2,0x0f,0x2d,0xc1] -cvtsd2siq %xmm0, %rax // CHECK: cvtsd2siq %xmm0, %rax -cvtsd2sil %xmm0, %eax // CHECK: cvtsd2sil %xmm0, %eax -cvtsd2si %xmm0, %rax // CHECK: cvtsd2siq %xmm0, %rax +cvtsd2siq %xmm0, %rax // CHECK: cvtsd2si %xmm0, %rax +cvtsd2sil %xmm0, %eax // CHECK: cvtsd2si %xmm0, %eax +cvtsd2si %xmm0, %rax // CHECK: cvtsd2si %xmm0, %rax cvttpd2dq %xmm1, %xmm0 // CHECK: cvttpd2dq %xmm1, %xmm0 diff --git a/test/MC/X86/x86_64-avx-encoding.s b/test/MC/X86/x86_64-avx-encoding.s index 46ff9ead39bf..6da9e21fef66 100644 --- a/test/MC/X86/x86_64-avx-encoding.s +++ b/test/MC/X86/x86_64-avx-encoding.s @@ -1404,25 +1404,25 @@ vdivpd -4(%rcx,%rbx,8), %xmm10, %xmm11 // CHECK: encoding: [0xc5,0xfa,0x2c,0x01] vcvttss2si (%rcx), %eax -// CHECK: vcvtsi2ss (%rax), %xmm11, %xmm12 +// CHECK: vcvtsi2ssl (%rax), %xmm11, %xmm12 // CHECK: encoding: [0xc5,0x22,0x2a,0x20] - vcvtsi2ss (%rax), %xmm11, %xmm12 + vcvtsi2ssl (%rax), %xmm11, %xmm12 -// CHECK: vcvtsi2ss (%rax), %xmm11, %xmm12 +// CHECK: vcvtsi2ssl (%rax), %xmm11, %xmm12 // CHECK: encoding: [0xc5,0x22,0x2a,0x20] - vcvtsi2ss (%rax), %xmm11, %xmm12 + vcvtsi2ssl (%rax), %xmm11, %xmm12 // CHECK: vcvttsd2si (%rcx), %eax // CHECK: encoding: [0xc5,0xfb,0x2c,0x01] vcvttsd2si (%rcx), %eax -// CHECK: vcvtsi2sd (%rax), %xmm11, %xmm12 +// CHECK: vcvtsi2sdl (%rax), %xmm11, %xmm12 // CHECK: encoding: [0xc5,0x23,0x2a,0x20] - vcvtsi2sd (%rax), %xmm11, %xmm12 + vcvtsi2sdl (%rax), %xmm11, %xmm12 -// CHECK: vcvtsi2sd (%rax), %xmm11, %xmm12 +// CHECK: vcvtsi2sdl (%rax), %xmm11, %xmm12 // CHECK: encoding: [0xc5,0x23,0x2a,0x20] - vcvtsi2sd (%rax), %xmm11, %xmm12 + vcvtsi2sdl (%rax), %xmm11, %xmm12 // CHECK: vmovaps (%rax), %xmm12 // CHECK: encoding: [0xc5,0x78,0x28,0x20] @@ -1512,11 +1512,11 @@ vdivpd -4(%rcx,%rbx,8), %xmm10, %xmm11 // CHECK: encoding: [0xc4,0x41,0x18,0x12,0xeb] vmovhlps %xmm11, %xmm12, %xmm13 -// CHECK: vcvtss2sil %xmm11, %eax +// CHECK: vcvtss2si %xmm11, %eax // CHECK: encoding: [0xc4,0xc1,0x7a,0x2d,0xc3] vcvtss2si %xmm11, %eax -// CHECK: vcvtss2sil (%rax), %ebx +// CHECK: vcvtss2si (%rax), %ebx // CHECK: encoding: [0xc5,0xfa,0x2d,0x18] vcvtss2si (%rax), %ebx @@ -3860,29 +3860,29 @@ vdivpd -4(%rcx,%rbx,8), %xmm10, %xmm11 // CHECK: encoding: [0xc4,0x63,0x2d,0x06,0x18,0x07] vperm2f128 $7, (%rax), %ymm10, %ymm11 -// CHECK: vcvtsd2sil %xmm8, %r8d +// CHECK: vcvtsd2si %xmm8, %r8d // CHECK: encoding: [0xc4,0x41,0x7b,0x2d,0xc0] - vcvtsd2sil %xmm8, %r8d + vcvtsd2si %xmm8, %r8d -// CHECK: vcvtsd2sil (%rcx), %ecx +// CHECK: vcvtsd2si (%rcx), %ecx // CHECK: encoding: [0xc5,0xfb,0x2d,0x09] - vcvtsd2sil (%rcx), %ecx + vcvtsd2si (%rcx), %ecx -// CHECK: vcvtss2siq %xmm4, %rcx +// CHECK: vcvtss2si %xmm4, %rcx // CHECK: encoding: [0xc4,0xe1,0xfa,0x2d,0xcc] - vcvtss2siq %xmm4, %rcx + vcvtss2si %xmm4, %rcx -// CHECK: vcvtss2siq (%rcx), %r8 +// CHECK: vcvtss2si (%rcx), %r8 // CHECK: encoding: [0xc4,0x61,0xfa,0x2d,0x01] - vcvtss2siq (%rcx), %r8 + vcvtss2si (%rcx), %r8 -// CHECK: vcvtsi2sd %r8d, %xmm8, %xmm15 +// CHECK: vcvtsi2sdl %r8d, %xmm8, %xmm15 // CHECK: encoding: [0xc4,0x41,0x3b,0x2a,0xf8] - vcvtsi2sd %r8d, %xmm8, %xmm15 + vcvtsi2sdl %r8d, %xmm8, %xmm15 -// CHECK: vcvtsi2sd (%rbp), %xmm8, %xmm15 +// CHECK: vcvtsi2sdl (%rbp), %xmm8, %xmm15 // CHECK: encoding: [0xc5,0x3b,0x2a,0x7d,0x00] - vcvtsi2sd (%rbp), %xmm8, %xmm15 + vcvtsi2sdl (%rbp), %xmm8, %xmm15 // CHECK: vcvtsi2sdq %rcx, %xmm4, %xmm6 // CHECK: encoding: [0xc4,0xe1,0xdb,0x2a,0xf1] @@ -3900,21 +3900,21 @@ vdivpd -4(%rcx,%rbx,8), %xmm10, %xmm11 // CHECK: encoding: [0xc4,0xe1,0xda,0x2a,0x31] vcvtsi2ssq (%rcx), %xmm4, %xmm6 -// CHECK: vcvttsd2siq %xmm4, %rcx +// CHECK: vcvttsd2si %xmm4, %rcx // CHECK: encoding: [0xc4,0xe1,0xfb,0x2c,0xcc] - vcvttsd2siq %xmm4, %rcx + vcvttsd2si %xmm4, %rcx -// CHECK: vcvttsd2siq (%rcx), %rcx +// CHECK: vcvttsd2si (%rcx), %rcx // CHECK: encoding: [0xc4,0xe1,0xfb,0x2c,0x09] - vcvttsd2siq (%rcx), %rcx + vcvttsd2si (%rcx), %rcx -// CHECK: vcvttss2siq %xmm4, %rcx +// CHECK: vcvttss2si %xmm4, %rcx // CHECK: encoding: [0xc4,0xe1,0xfa,0x2c,0xcc] - vcvttss2siq %xmm4, %rcx + vcvttss2si %xmm4, %rcx -// CHECK: vcvttss2siq (%rcx), %rcx +// CHECK: vcvttss2si (%rcx), %rcx // CHECK: encoding: [0xc4,0xe1,0xfa,0x2c,0x09] - vcvttss2siq (%rcx), %rcx + vcvttss2si (%rcx), %rcx // CHECK: vlddqu (%rax), %ymm12 // CHECK: encoding: [0xc5,0x7f,0xf0,0x20] diff --git a/test/MC/X86/x86_64-fma4-encoding.s b/test/MC/X86/x86_64-fma4-encoding.s index 805fc23cf4cf..c9bd954e9049 100644 --- a/test/MC/X86/x86_64-fma4-encoding.s +++ b/test/MC/X86/x86_64-fma4-encoding.s @@ -25,6 +25,10 @@ // CHECK: encoding: [0xc4,0xe3,0xf9,0x6b,0xc2,0x10] vfmaddsd %xmm2, %xmm1, %xmm0, %xmm0 +// CHECK: vfmaddsd %xmm10, %xmm1, %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xc3,0xf9,0x6b,0xc2,0x10] + vfmaddsd %xmm10, %xmm1, %xmm0, %xmm0 + // CHECK: vfmaddps (%rcx), %xmm1, %xmm0, %xmm0 // CHECK: encoding: [0xc4,0xe3,0xf9,0x68,0x01,0x10] vfmaddps (%rcx), %xmm1, %xmm0, %xmm0 @@ -73,6 +77,67 @@ // CHECK: encoding: [0xc4,0xe3,0xfd,0x69,0xc2,0x10] vfmaddpd %ymm2, %ymm1, %ymm0, %ymm0 +// PR15040 +// CHECK: vfmaddss foo(%rip), %xmm1, %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xe3,0xf9,0x6a,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddss foo(%rip), %xmm1, %xmm0, %xmm0 + +// CHECK: vfmaddss %xmm1, foo(%rip), %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xe3,0x79,0x6a,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddss %xmm1, foo(%rip),%xmm0, %xmm0 + +// CHECK: vfmaddsd foo(%rip), %xmm1, %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xe3,0xf9,0x6b,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddsd foo(%rip), %xmm1, %xmm0, %xmm0 + +// CHECK: vfmaddsd %xmm1, foo(%rip), %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xe3,0x79,0x6b,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddsd %xmm1, foo(%rip),%xmm0, %xmm0 + +// CHECK: vfmaddps foo(%rip), %xmm1, %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xe3,0xf9,0x68,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddps foo(%rip), %xmm1, %xmm0, %xmm0 + +// CHECK: vfmaddps %xmm1, foo(%rip), %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xe3,0x79,0x68,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddps %xmm1, foo(%rip),%xmm0, %xmm0 + +// CHECK: vfmaddpd foo(%rip), %xmm1, %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xe3,0xf9,0x69,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddpd foo(%rip), %xmm1, %xmm0, %xmm0 + +// CHECK: vfmaddpd %xmm1, foo(%rip), %xmm0, %xmm0 +// CHECK: encoding: [0xc4,0xe3,0x79,0x69,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddpd %xmm1, foo(%rip),%xmm0, %xmm0 + +// CHECK: vfmaddps foo(%rip), %ymm1, %ymm0, %ymm0 +// CHECK: encoding: [0xc4,0xe3,0xfd,0x68,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddps foo(%rip), %ymm1, %ymm0, %ymm0 + +// CHECK: vfmaddps %ymm1, foo(%rip), %ymm0, %ymm0 +// CHECK: encoding: [0xc4,0xe3,0x7d,0x68,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddps %ymm1, foo(%rip),%ymm0, %ymm0 + +// CHECK: vfmaddpd foo(%rip), %ymm1, %ymm0, %ymm0 +// CHECK: encoding: [0xc4,0xe3,0xfd,0x69,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddpd foo(%rip), %ymm1, %ymm0, %ymm0 + +// CHECK: vfmaddpd %ymm1, foo(%rip), %ymm0, %ymm0 +// CHECK: encoding: [0xc4,0xe3,0x7d,0x69,0x05,A,A,A,A,0x10] +// CHECK: fixup A - offset: 5, value: foo-5, kind: reloc_riprel_4byte + vfmaddpd %ymm1, foo(%rip),%ymm0, %ymm0 + // vfmsub // CHECK: vfmsubss (%rcx), %xmm1, %xmm0, %xmm0 // CHECK: encoding: [0xc4,0xe3,0xf9,0x6e,0x01,0x10] diff --git a/test/MC/X86/x86_64-rand-encoding.s b/test/MC/X86/x86_64-rand-encoding.s new file mode 100644 index 000000000000..3a8cb817bc1a --- /dev/null +++ b/test/MC/X86/x86_64-rand-encoding.s @@ -0,0 +1,49 @@ +// RUN: llvm-mc -triple x86_64-unknown-unknown --show-encoding %s | FileCheck %s + +// CHECK: rdrandw %ax +// CHECK: encoding: [0x66,0x0f,0xc7,0xf0] + rdrand %ax + +// CHECK: rdrandl %eax +// CHECK: encoding: [0x0f,0xc7,0xf0] + rdrand %eax + +// CHECK: rdrandq %rax +// CHECK: encoding: [0x48,0x0f,0xc7,0xf0] + rdrand %rax + +// CHECK: rdrandw %r11w +// CHECK: encoding: [0x66,0x41,0x0f,0xc7,0xf3] + rdrand %r11w + +// CHECK: rdrandl %r11d +// CHECK: encoding: [0x41,0x0f,0xc7,0xf3] + rdrand %r11d + +// CHECK: rdrandq %r11 +// CHECK: encoding: [0x49,0x0f,0xc7,0xf3] + rdrand %r11 + +// CHECK: rdseedw %ax +// CHECK: encoding: [0x66,0x0f,0xc7,0xf8] + rdseed %ax + +// CHECK: rdseedl %eax +// CHECK: encoding: [0x0f,0xc7,0xf8] + rdseed %eax + +// CHECK: rdseedq %rax +// CHECK: encoding: [0x48,0x0f,0xc7,0xf8] + rdseed %rax + +// CHECK: rdseedw %r11w +// CHECK: encoding: [0x66,0x41,0x0f,0xc7,0xfb] + rdseed %r11w + +// CHECK: rdseedl %r11d +// CHECK: encoding: [0x41,0x0f,0xc7,0xfb] + rdseed %r11d + +// CHECK: rdseedq %r11 +// CHECK: encoding: [0x49,0x0f,0xc7,0xfb] + rdseed %r11 diff --git a/test/MC/X86/x86_64-rtm-encoding.s b/test/MC/X86/x86_64-rtm-encoding.s index 44d6bacb7f32..d9975d67b314 100644 --- a/test/MC/X86/x86_64-rtm-encoding.s +++ b/test/MC/X86/x86_64-rtm-encoding.s @@ -8,6 +8,10 @@ // CHECK: encoding: [0x0f,0x01,0xd5] xend +// CHECK: xtest +// CHECK: encoding: [0x0f,0x01,0xd6] + xtest + // CHECK: xabort // CHECK: encoding: [0xc6,0xf8,0x0d] xabort $13 diff --git a/test/MC/X86/x86_errors.s b/test/MC/X86/x86_errors.s index f161e06cb580..6e14d62fda4c 100644 --- a/test/MC/X86/x86_errors.s +++ b/test/MC/X86/x86_errors.s @@ -18,7 +18,7 @@ addl $0, 0(%rax) movl 0(%rax), 0(%edx) // error: invalid operand for instruction -// 32: error: instruction requires a CPU feature not currently enabled +// 32: error: instruction requires: 64-bit mode sysexitq // rdar://10710167 diff --git a/test/MC/X86/x86_long_nop.s b/test/MC/X86/x86_long_nop.s new file mode 100644 index 000000000000..ac1bc08ff38b --- /dev/null +++ b/test/MC/X86/x86_long_nop.s @@ -0,0 +1,15 @@ +# RUN: llvm-mc -filetype=obj -arch=x86 -triple=x86_64-pc-linux-gnu %s | llvm-objdump -d -no-show-raw-insn - | FileCheck %s +# RUN: llvm-mc -filetype=obj -arch=x86 -triple=i686-pc-linux-gnu %s | llvm-objdump -d -no-show-raw-insn - | FileCheck %s +# RUN: llvm-mc -filetype=obj -arch=x86 -triple=x86_64-apple-darwin10.0 %s | llvm-objdump -d -no-show-raw-insn - | FileCheck %s +# RUN: llvm-mc -filetype=obj -arch=x86 -triple=i686-apple-darwin8 %s | llvm-objdump -d -no-show-raw-insn - | FileCheck %s + +# Ensure alignment directives also emit sequences of 15-byte NOPs on processors +# capable of using long NOPs. +inc %eax +.p2align 5 +inc %eax +# CHECK: 0: inc +# CHECK-NEXT: 1: nop +# CHECK-NEXT: 10: nop +# CHECK-NEXT: 1f: nop +# CHECK-NEXT: 20: inc diff --git a/test/Makefile b/test/Makefile index 810fdded465a..b47695100a9e 100644 --- a/test/Makefile +++ b/test/Makefile @@ -78,21 +78,24 @@ else # !SunOS ifeq ($(HOST_OS),AuroraUX) ULIMIT=ulimit -t 600 ; ulimit -d 512000 ; ulimit -v 512000 ; else # !AuroraUX -# Fedora 13 x86-64 python fails with -v 76800 -ULIMIT=ulimit -t 600 ; ulimit -d 512000 ; ulimit -m 512000 ; ulimit -v 1024000 ; +# Newer versions of python try to allocate an insane amount of address space for +# its thread-local storage, don't set a limit here. +# When -v is not used, then -s has to be used to limit the stack size. +# FIXME: Those limits should be enforced by lit instead of globally. +ULIMIT=ulimit -t 600 ; ulimit -d 512000 ; ulimit -m 512000 ; ulimit -s 8192 ; endif # AuroraUX endif # SunOS check-local:: lit.site.cfg Unit/lit.site.cfg ( $(ULIMIT) \ - $(LLVM_SRC_ROOT)/utils/lit/lit.py $(LIT_ARGS) $(LIT_TESTSUITE) ) + $(PYTHON) $(LLVM_SRC_ROOT)/utils/lit/lit.py $(LIT_ARGS) $(LIT_TESTSUITE) ) # This is a legacy alias dating from when both DejaGNU and lit were in use. check-local-lit:: check-local check-local-all:: lit.site.cfg Unit/lit.site.cfg extra-site-cfgs ( $(ULIMIT) \ - $(LLVM_SRC_ROOT)/utils/lit/lit.py $(LIT_ARGS) $(LIT_ALL_TESTSUITES) ) + $(PYTHON) $(LLVM_SRC_ROOT)/utils/lit/lit.py $(LIT_ARGS) $(LIT_ALL_TESTSUITES) ) clean:: $(RM) -rf `find $(LLVM_OBJ_ROOT)/test -name Output -type d -print` @@ -129,13 +132,14 @@ endif lit.site.cfg: FORCE @echo "Making LLVM 'lit.site.cfg' file..." - @$(ECHOPATH) s=@TARGET_TRIPLE@=$(TARGET_TRIPLE)=g > lit.tmp + @$(ECHOPATH) s=@LLVM_HOSTTRIPLE@=$(HOST_TRIPLE)=g > lit.tmp + @$(ECHOPATH) s=@TARGET_TRIPLE@=$(TARGET_TRIPLE)=g >> lit.tmp @$(ECHOPATH) s=@LLVM_SOURCE_DIR@=$(LLVM_SRC_ROOT)=g >> lit.tmp @$(ECHOPATH) s=@LLVM_BINARY_DIR@=$(LLVM_OBJ_ROOT)=g >> lit.tmp @$(ECHOPATH) s=@LLVM_TOOLS_DIR@=$(ToolDir)=g >> lit.tmp @$(ECHOPATH) s=@SHLIBDIR@=$(SharedLibDir)=g >> lit.tmp @$(ECHOPATH) s=@SHLIBEXT@=$(SHLIBEXT)=g >> lit.tmp - @$(ECHOPATH) s=@PYTHON_EXECUTABLE@=python=g >> lit.tmp + @$(ECHOPATH) s=@PYTHON_EXECUTABLE@=$(PYTHON)=g >> lit.tmp @$(ECHOPATH) s=@OCAMLOPT@=$(OCAMLOPT) -cc $(subst *,'\\\"',*$(subst =,"\\=",$(CXX_FOR_OCAMLOPT))*) -I $(LibDir)/ocaml=g >> lit.tmp @$(ECHOPATH) s=@ENABLE_SHARED@=$(ENABLE_SHARED)=g >> lit.tmp @$(ECHOPATH) s=@ENABLE_ASSERTIONS@=$(ENABLE_ASSERTIONS)=g >> lit.tmp diff --git a/test/Object/ARM/symbol-addr.ll b/test/Object/ARM/symbol-addr.ll new file mode 100644 index 000000000000..6bcbde9f9f18 --- /dev/null +++ b/test/Object/ARM/symbol-addr.ll @@ -0,0 +1,12 @@ +; RUN: llc %s -mtriple=arm-unknown-unknown -filetype=obj -o - \ +; RUN: | llvm-objdump -t - | FileCheck %s +; RUN: llc %s -mtriple=thumb-unknown-unknown -filetype=obj -o - \ +; RUN: | llvm-objdump -t - | FileCheck %s + +; Check that the symbol address does not include the ARM/Thumb instruction +; indicator bit. +; CHECK: 00000000 g F .text {{[0-9]+}} test + +define i32 @test() { + ret i32 1 +} diff --git a/test/Object/Inputs/COFF/i386.yaml b/test/Object/Inputs/COFF/i386.yaml index ca902220c13b..aec7a5813cf9 100644 --- a/test/Object/Inputs/COFF/i386.yaml +++ b/test/Object/Inputs/COFF/i386.yaml @@ -1,5 +1,6 @@ header: !Header Machine: IMAGE_FILE_MACHINE_I386 # (0x14c) + Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ] sections: - !Section diff --git a/test/Object/Inputs/coff_archive.lib b/test/Object/Inputs/coff_archive.lib Binary files differnew file mode 100755 index 000000000000..e079991bfbac --- /dev/null +++ b/test/Object/Inputs/coff_archive.lib diff --git a/test/Object/Inputs/liblong_filenames.a b/test/Object/Inputs/liblong_filenames.a Binary files differnew file mode 100644 index 000000000000..368d665c94ee --- /dev/null +++ b/test/Object/Inputs/liblong_filenames.a diff --git a/test/Object/Inputs/libsimple_archive.a b/test/Object/Inputs/libsimple_archive.a Binary files differnew file mode 100644 index 000000000000..6e232e3e3cf8 --- /dev/null +++ b/test/Object/Inputs/libsimple_archive.a diff --git a/test/Object/Inputs/macho-text-sections.macho-x86_64 b/test/Object/Inputs/macho-text-sections.macho-x86_64 Binary files differnew file mode 100644 index 000000000000..cce203ba0d88 --- /dev/null +++ b/test/Object/Inputs/macho-text-sections.macho-x86_64 diff --git a/test/Object/Inputs/program-headers.elf-i386 b/test/Object/Inputs/program-headers.elf-i386 Binary files differnew file mode 100644 index 000000000000..eb92c71cee5a --- /dev/null +++ b/test/Object/Inputs/program-headers.elf-i386 diff --git a/test/Object/Inputs/program-headers.elf-x86-64 b/test/Object/Inputs/program-headers.elf-x86-64 Binary files differnew file mode 100644 index 000000000000..037bf14866a1 --- /dev/null +++ b/test/Object/Inputs/program-headers.elf-x86-64 diff --git a/test/Object/Inputs/trivial-object-test.elf-mips64el b/test/Object/Inputs/trivial-object-test.elf-mips64el Binary files differnew file mode 100644 index 000000000000..5ad9ba3a0bc0 --- /dev/null +++ b/test/Object/Inputs/trivial-object-test.elf-mips64el diff --git a/test/Object/Mips/feature.test b/test/Object/Mips/feature.test index e8da60974603..340301450a50 100644 --- a/test/Object/Mips/feature.test +++ b/test/Object/Mips/feature.test @@ -2,10 +2,12 @@ RUN: llvm-objdump -disassemble -triple mips64el -mattr +mips64r2 %p/../Inputs/de RUN: | FileCheck %s CHECK: Disassembly of section .text: -CHECK: .text: +CHECK: dext: CHECK: 0: 08 00 e0 03 jr $ra CHECK: 4: 43 49 82 7c dext $2, $4, 5, 10 +CHECK: dextu: CHECK: 8: 08 00 e0 03 jr $ra CHECK: c: 83 28 82 7c dext $2, $4, 2, 6 +CHECK: dextm: CHECK: 10: 08 00 e0 03 jr $ra CHECK: 14: 43 09 82 7c dext $2, $4, 5, 2 diff --git a/test/Object/X86/macho-text-sections.test b/test/Object/X86/macho-text-sections.test new file mode 100644 index 000000000000..1b697dcadad6 --- /dev/null +++ b/test/Object/X86/macho-text-sections.test @@ -0,0 +1,3 @@ +RUN: llvm-objdump -disassemble %p/../Inputs/macho-text-sections.macho-x86_64 | FileCheck %s + +CHECK: Disassembly of section __notext,__notext diff --git a/test/Object/archive-long-index.test b/test/Object/archive-long-index.test new file mode 100644 index 000000000000..bd530edbf418 --- /dev/null +++ b/test/Object/archive-long-index.test @@ -0,0 +1,40 @@ +# +# Check if the index is appearing properly in the output file +# +RUN: llvm-nm -s %p/Inputs/liblong_filenames.a | FileCheck -check-prefix=CHECKIDX %s + +CHECKIDX: Archive map +CHECKIDX: abcdefghijklmnopqrstuvwxyz12345678 in 1.o +CHECKIDX: main in 1.o +CHECKIDX: fn1 in 2.o +CHECKIDX: fn3 in 3.o +CHECKIDX: fn1 in 3.o +CHECKIDX: shankar in 4.o +CHECKIDX: a in 5.o +CHECKIDX: b in 6.o +CHECKIDX: a in abcdefghijklmnopqrstuvwxyz1.o +CHECKIDX: b in abcdefghijklmnopqrstuvwxyz2.o +CHECKIDX: bda in abcdefghijklmnopqrstuvwxyz2.o +CHECKIDX: b in abcdefghijklmnopq.o +CHECKIDX: 1.o: +CHECKIDX: 00000000 D abcdefghijklmnopqrstuvwxyz12345678 +CHECKIDX: U bda +CHECKIDX: 00000000 T main +CHECKIDX: 2.o: +CHECKIDX: 00000000 T fn1 +CHECKIDX: 3.o: +CHECKIDX: 0000000b T fn1 +CHECKIDX: 00000000 T fn3 +CHECKIDX: 4.o: +CHECKIDX: C shankar +CHECKIDX: 5.o: +CHECKIDX: C a +CHECKIDX: 6.o: +CHECKIDX: C b +CHECKIDX: abcdefghijklmnopqrstuvwxyz1.o: +CHECKIDX: C a +CHECKIDX: abcdefghijklmnopqrstuvwxyz2.o: +CHECKIDX: C b +CHECKIDX: 00000000 T bda +CHECKIDX: abcdefghijklmnopq.o: +CHECKIDX: C b diff --git a/test/Object/coff-archive.test b/test/Object/coff-archive.test new file mode 100644 index 000000000000..768fe1c4b129 --- /dev/null +++ b/test/Object/coff-archive.test @@ -0,0 +1,225 @@ +# +# Check if the index is appearing properly in the output file +# +RUN: llvm-nm --numeric-sort -s %p/Inputs/coff_archive.lib | FileCheck -check-prefix=CHECKIDX %s + +CHECKIDX: Archive map +CHECKIDX: ??0invalid_argument@std@@QAE@PBD@Z in Debug\mymath.obj +CHECKIDX: ??0logic_error@std@@QAE@PBD@Z in Debug\mymath.obj +CHECKIDX: ??1invalid_argument@std@@UAE@XZ in Debug\mymath.obj +CHECKIDX: ??1logic_error@std@@UAE@XZ in Debug\mymath.obj +CHECKIDX: ??_7invalid_argument@std@@6B@ in Debug\mymath.obj +CHECKIDX: ??_7logic_error@std@@6B@ in Debug\mymath.obj +CHECKIDX: ??_C@_0BC@IHENMCGI@b?5cannot?5be?5zero?$CB?$AA@ in Debug\mymath.obj +CHECKIDX: ??_Ginvalid_argument@std@@UAEPAXI@Z in Debug\mymath.obj +CHECKIDX: ??_Glogic_error@std@@UAEPAXI@Z in Debug\mymath.obj +CHECKIDX: ??_R0?AVexception@std@@@8 in Debug\mymath.obj +CHECKIDX: ??_R0?AVinvalid_argument@std@@@8 in Debug\mymath.obj +CHECKIDX: ??_R0?AVlogic_error@std@@@8 in Debug\mymath.obj +CHECKIDX: ??_R0PAVexception@std@@@8 in Debug\mymath.obj +CHECKIDX: ??_R0PAVinvalid_argument@std@@@8 in Debug\mymath.obj +CHECKIDX: ??_R0PAVlogic_error@std@@@8 in Debug\mymath.obj +CHECKIDX: ??_R0PAX@8 in Debug\mymath.obj +CHECKIDX: ??_R1A@?0A@EA@exception@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R1A@?0A@EA@invalid_argument@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R1A@?0A@EA@logic_error@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R2exception@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R2invalid_argument@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R2logic_error@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R3exception@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R3invalid_argument@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R3logic_error@std@@8 in Debug\mymath.obj +CHECKIDX: ??_R4invalid_argument@std@@6B@ in Debug\mymath.obj +CHECKIDX: ??_R4logic_error@std@@6B@ in Debug\mymath.obj +CHECKIDX: ?Add@MyMathFuncs@MathFuncs@@SANNN@Z in Debug\mymath.obj +CHECKIDX: ?Divide@MyMathFuncs@MathFuncs@@SANNN@Z in Debug\mymath.obj +CHECKIDX: ?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z in Debug\mymath.obj +CHECKIDX: ?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@C@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@D@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@E@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@F@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@G@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@H@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@I@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@J@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@K@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@M@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@N@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@O@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@_J@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@_K@std@@2HB in Debug\mymath.obj +CHECKIDX: ?_Rank@?$_Arithmetic_traits@_N@std@@2HB in Debug\mymath.obj +CHECKIDX: ?value@?$integral_constant@I$0A@@tr1@std@@2IB in Debug\mymath.obj +CHECKIDX: ?value@?$integral_constant@_N$00@tr1@std@@2_NB in Debug\mymath.obj +CHECKIDX: ?value@?$integral_constant@_N$0A@@tr1@std@@2_NB in Debug\mymath.obj +CHECKIDX: __CT??_R0PAVexception@std@@@84 in Debug\mymath.obj +CHECKIDX: __CT??_R0PAVinvalid_argument@std@@@84 in Debug\mymath.obj +CHECKIDX: __CT??_R0PAVlogic_error@std@@@84 in Debug\mymath.obj +CHECKIDX: __CT??_R0PAX@84 in Debug\mymath.obj +CHECKIDX: __CTA4PAVinvalid_argument@std@@ in Debug\mymath.obj +CHECKIDX: __TI4PAVinvalid_argument@std@@ in Debug\mymath.obj +CHECKIDX: __real@0000000000000000 in Debug\mymath.obj +CHECKIDX: Debug\stdafx.obj: +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$T +CHECKIDX: 00000000 i .drectve +CHECKIDX: 00000001 a @feat.00 +CHECKIDX: 00ab9d1b a @comp.id +CHECKIDX: Debug\mymath.obj: +CHECKIDX: 00000000 d .data +CHECKIDX: 00000000 d .data +CHECKIDX: 00000000 d .data +CHECKIDX: 00000000 d .data +CHECKIDX: 00000000 d .data +CHECKIDX: 00000000 d .data +CHECKIDX: 00000000 d .data +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$S +CHECKIDX: 00000000 N .debug$T +CHECKIDX: 00000000 i .drectve +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rdata$r +CHECKIDX: 00000000 r .rtc$IMZ +CHECKIDX: 00000000 r .rtc$TMZ +CHECKIDX: 00000000 N .sxdata +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text +CHECKIDX: 00000000 t .text$x +CHECKIDX: 00000000 r .xdata$x +CHECKIDX: 00000000 r .xdata$x +CHECKIDX: 00000000 r .xdata$x +CHECKIDX: 00000000 r .xdata$x +CHECKIDX: 00000000 r .xdata$x +CHECKIDX: 00000000 r .xdata$x +CHECKIDX: 00000000 r .xdata$x +CHECKIDX: 00000000 T ??0invalid_argument@std@@QAE@PBD@Z +CHECKIDX: 00000000 T ??0logic_error@std@@QAE@PBD@Z +CHECKIDX: 00000000 T ??1invalid_argument@std@@UAE@XZ +CHECKIDX: 00000000 T ??1logic_error@std@@UAE@XZ +CHECKIDX: 00000000 R ??_C@_0BC@IHENMCGI@b?5cannot?5be?5zero?$CB?$AA@ +CHECKIDX: 00000000 T ??_Ginvalid_argument@std@@UAEPAXI@Z +CHECKIDX: 00000000 T ??_Glogic_error@std@@UAEPAXI@Z +CHECKIDX: 00000000 D ??_R0?AVexception@std@@@8 +CHECKIDX: 00000000 D ??_R0?AVinvalid_argument@std@@@8 +CHECKIDX: 00000000 D ??_R0?AVlogic_error@std@@@8 +CHECKIDX: 00000000 D ??_R0PAVexception@std@@@8 +CHECKIDX: 00000000 D ??_R0PAVinvalid_argument@std@@@8 +CHECKIDX: 00000000 D ??_R0PAVlogic_error@std@@@8 +CHECKIDX: 00000000 D ??_R0PAX@8 +CHECKIDX: 00000000 R ??_R1A@?0A@EA@exception@std@@8 +CHECKIDX: 00000000 R ??_R1A@?0A@EA@invalid_argument@std@@8 +CHECKIDX: 00000000 R ??_R1A@?0A@EA@logic_error@std@@8 +CHECKIDX: 00000000 R ??_R2exception@std@@8 +CHECKIDX: 00000000 R ??_R2invalid_argument@std@@8 +CHECKIDX: 00000000 R ??_R2logic_error@std@@8 +CHECKIDX: 00000000 R ??_R3exception@std@@8 +CHECKIDX: 00000000 R ??_R3invalid_argument@std@@8 +CHECKIDX: 00000000 R ??_R3logic_error@std@@8 +CHECKIDX: 00000000 R ??_R4invalid_argument@std@@6B@ +CHECKIDX: 00000000 R ??_R4logic_error@std@@6B@ +CHECKIDX: 00000000 T ?Add@MyMathFuncs@MathFuncs@@SANNN@Z +CHECKIDX: 00000000 T ?Divide@MyMathFuncs@MathFuncs@@SANNN@Z +CHECKIDX: 00000000 T ?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z +CHECKIDX: 00000000 T ?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@C@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@D@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@E@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@F@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@G@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@H@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@I@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@J@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@K@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@M@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@N@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@O@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@_J@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@_K@std@@2HB +CHECKIDX: 00000000 R ?_Rank@?$_Arithmetic_traits@_N@std@@2HB +CHECKIDX: 00000000 R ?value@?$integral_constant@I$0A@@tr1@std@@2IB +CHECKIDX: 00000000 R ?value@?$integral_constant@_N$00@tr1@std@@2_NB +CHECKIDX: 00000000 R ?value@?$integral_constant@_N$0A@@tr1@std@@2_NB +CHECKIDX: 00000000 R __CT??_R0PAVexception@std@@@84 +CHECKIDX: 00000000 R __CT??_R0PAVinvalid_argument@std@@@84 +CHECKIDX: 00000000 R __CT??_R0PAVlogic_error@std@@@84 +CHECKIDX: 00000000 R __CT??_R0PAX@84 +CHECKIDX: 00000000 R __CTA4PAVinvalid_argument@std@@ +CHECKIDX: 00000000 r __RTC_InitBase.rtc$IMZ +CHECKIDX: 00000000 r __RTC_Shutdown.rtc$TMZ +CHECKIDX: 00000000 R __TI4PAVinvalid_argument@std@@ +CHECKIDX: 00000000 R __real@0000000000000000 +CHECKIDX: 00000000 t __unwindfunclet$?Divide@MyMathFuncs@MathFuncs@@SANNN@Z$0 +CHECKIDX: 00000000 r __unwindtable$?Divide@MyMathFuncs@MathFuncs@@SANNN@Z +CHECKIDX: 00000001 a @feat.00 +CHECKIDX: 00000004 R ??_7invalid_argument@std@@6B@ +CHECKIDX: 00000004 R ??_7logic_error@std@@6B@ +CHECKIDX: 00000008 r __ehfuncinfo$?Divide@MyMathFuncs@MathFuncs@@SANNN@Z +CHECKIDX: 0000000e t __ehhandler$?Divide@MyMathFuncs@MathFuncs@@SANNN@Z +CHECKIDX: 00ab9d1b a @comp.id +CHECKIDX: U ??2@YAPAXI@Z +CHECKIDX: U ??3@YAXPAX@Z +CHECKIDX: U ??_7type_info@@6B@ +CHECKIDX: w ??_Einvalid_argument@std@@UAEPAXI@Z +CHECKIDX: w ??_Elogic_error@std@@UAEPAXI@Z +CHECKIDX: U ??_Ginvalid_argument@std@@UAEPAXI@Z +CHECKIDX: U ??_Glogic_error@std@@UAEPAXI@Z +CHECKIDX: U ?what@exception@std@@UBEPBDXZ +CHECKIDX: U @__security_check_cookie@4 +CHECKIDX: U __CxxThrowException@8 +CHECKIDX: U __RTC_CheckEsp +CHECKIDX: U __RTC_InitBase +CHECKIDX: U __RTC_Shutdown +CHECKIDX: U ___CxxFrameHandler3 +CHECKIDX: U ___security_cookie +CHECKIDX: U __fltused +CHECKIDX: U __imp_??0exception@std@@QAE@ABQBD@Z +CHECKIDX: U __imp_??1exception@std@@UAE@XZ diff --git a/test/Object/obj2yaml.test b/test/Object/obj2yaml.test new file mode 100644 index 000000000000..0d96fd2bfd8e --- /dev/null +++ b/test/Object/obj2yaml.test @@ -0,0 +1,170 @@ +RUN: obj2yaml %p/Inputs/trivial-object-test.coff-i386 | FileCheck %s --check-prefix COFF-I386 +RUN: obj2yaml %p/Inputs/trivial-object-test.coff-x86-64 | FileCheck %s --check-prefix COFF-X86-64 + + +COFF-I386: header: !Header +COFF-I386-NEXT: Machine: IMAGE_FILE_MACHINE_I386 # (0x14c) + +COFF-I386: sections: +COFF-I386-NEXT: - !Section +COFF-I386-NEXT: Name: .text +COFF-I386-NEXT: Characteristics: [IMAGE_SCN_CNT_CODE, IMAGE_SCN_ALIGN_16BYTES, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, ] # 0x60500020 +COFF-I386-NEXT: SectionData: !hex "83EC0CC744240800000000C7042400000000E800000000E8000000008B44240883C40CC3" # |....D$.......$...............D$.....| + +COFF-I386: Relocations: +COFF-I386-NEXT: - !Relocation +COFF-I386-NEXT: VirtualAddress: 0xe +COFF-I386-NEXT: SymbolTableIndex: 5 +COFF-I386-NEXT: Type: IMAGE_REL_I386_DIR32 + +COFF-I386: - !Relocation +COFF-I386-NEXT: VirtualAddress: 0x13 +COFF-I386-NEXT: SymbolTableIndex: 6 +COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 + +COFF-I386: - !Relocation +COFF-I386-NEXT: VirtualAddress: 0x18 +COFF-I386-NEXT: SymbolTableIndex: 7 +COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 + +COFF-I386: - !Section +COFF-I386-NEXT: Name: .data +COFF-I386-NEXT: Characteristics: [IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_ALIGN_1BYTES, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE, ] # 0xc0100040 +COFF-I386-NEXT: SectionData: !hex "48656C6C6F20576F726C642100" # |Hello World!.| + +COFF-I386: symbols: +COFF-I386-NEXT: - !Symbol +COFF-I386-NEXT: Name: .text +COFF-I386-NEXT: Value: 0 +COFF-I386-NEXT: SectionNumber: 1 +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-I386-NEXT: NumberOfAuxSymbols: 1 +COFF-I386-NEXT: AuxillaryData: !hex "240000000300000000000000010000000000" # |$.................| + +COFF-I386: - !Symbol +COFF-I386-NEXT: Name: .data +COFF-I386-NEXT: Value: 0 +COFF-I386-NEXT: SectionNumber: 2 +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-I386-NEXT: NumberOfAuxSymbols: 1 +COFF-I386-NEXT: AuxillaryData: !hex "0D0000000000000000000000020000000000" # |..................| + +COFF-I386: - !Symbol +COFF-I386-NEXT: Name: _main +COFF-I386-NEXT: Value: 0 +COFF-I386-NEXT: SectionNumber: 1 +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_FUNCTION # (2) +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) + +COFF-I386: - !Symbol +COFF-I386-NEXT: Name: L_.str +COFF-I386-NEXT: Value: 0 +COFF-I386-NEXT: SectionNumber: 2 +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) + +COFF-I386: - !Symbol +COFF-I386-NEXT: Name: _puts +COFF-I386-NEXT: Value: 0 +COFF-I386-NEXT: SectionNumber: 0 +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) + +COFF-I386: - !Symbol +COFF-I386-NEXT: Name: _SomeOtherFunction +COFF-I386-NEXT: Value: 0 +COFF-I386-NEXT: SectionNumber: 0 +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) + + +COFF-X86-64: header: !Header +COFF-X86-64-NEXT: Machine: IMAGE_FILE_MACHINE_AMD64 # (0x8664) + +COFF-X86-64: sections: +COFF-X86-64-NEXT: - !Section +COFF-X86-64-NEXT: Name: .text +COFF-X86-64-NEXT: Characteristics: [IMAGE_SCN_CNT_CODE, IMAGE_SCN_ALIGN_16BYTES, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, ] # 0x60500020 +COFF-X86-64-NEXT: SectionData: !hex "4883EC28C744242400000000488D0D00000000E800000000E8000000008B4424244883C428C3" # |H..(.D$$....H.................D$$H..(.| + +COFF-X86-64: Relocations: +COFF-X86-64-NEXT: - !Relocation +COFF-X86-64-NEXT: VirtualAddress: 0xf +COFF-X86-64-NEXT: SymbolTableIndex: 5 +COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 + +COFF-X86-64: - !Relocation +COFF-X86-64-NEXT: VirtualAddress: 0x14 +COFF-X86-64-NEXT: SymbolTableIndex: 6 +COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 + +COFF-X86-64: - !Relocation +COFF-X86-64-NEXT: VirtualAddress: 0x19 +COFF-X86-64-NEXT: SymbolTableIndex: 7 +COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 + +COFF-X86-64: - !Section +COFF-X86-64-NEXT: Name: .data +COFF-X86-64-NEXT: Characteristics: [IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_ALIGN_1BYTES, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE, ] # 0xc0100040 +COFF-X86-64-NEXT: SectionData: !hex "48656C6C6F20576F726C642100" # |Hello World!.| + +COFF-X86-64: symbols: +COFF-X86-64-NEXT: - !Symbol +COFF-X86-64-NEXT: Name: .text +COFF-X86-64-NEXT: Value: 0 +COFF-X86-64-NEXT: SectionNumber: 1 +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-X86-64-NEXT: NumberOfAuxSymbols: 1 +COFF-X86-64-NEXT: AuxillaryData: !hex "260000000300000000000000010000000000" # |&.................| + +COFF-X86-64: - !Symbol +COFF-X86-64-NEXT: Name: .data +COFF-X86-64-NEXT: Value: 0 +COFF-X86-64-NEXT: SectionNumber: 2 +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-X86-64-NEXT: NumberOfAuxSymbols: 1 +COFF-X86-64-NEXT: AuxillaryData: !hex "0D0000000000000000000000020000000000" # |..................| + +COFF-X86-64: - !Symbol +COFF-X86-64-NEXT: Name: main +COFF-X86-64-NEXT: Value: 0 +COFF-X86-64-NEXT: SectionNumber: 1 +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) + +COFF-X86-64: - !Symbol +COFF-X86-64-NEXT: Name: L.str +COFF-X86-64-NEXT: Value: 0 +COFF-X86-64-NEXT: SectionNumber: 2 +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) + +COFF-X86-64: - !Symbol +COFF-X86-64-NEXT: Name: puts +COFF-X86-64-NEXT: Value: 0 +COFF-X86-64-NEXT: SectionNumber: 0 +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) + +COFF-X86-64: - !Symbol +COFF-X86-64-NEXT: Name: SomeOtherFunction +COFF-X86-64-NEXT: Value: 0 +COFF-X86-64-NEXT: SectionNumber: 0 +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) diff --git a/test/Object/objdump-private-headers.test b/test/Object/objdump-private-headers.test new file mode 100644 index 000000000000..c562044b3c4e --- /dev/null +++ b/test/Object/objdump-private-headers.test @@ -0,0 +1,18 @@ +RUN: llvm-objdump -p %p/Inputs/program-headers.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF-i386 +RUN: llvm-objdump -p %p/Inputs/program-headers.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF-x86-64 + +ELF-i386: Program Header: +ELF-i386: LOAD off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12 +ELF-i386: filesz 0x00000134 memsz 0x00000134 flags r-x +ELF-i386: STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2 +ELF-i386: filesz 0x00000000 memsz 0x00000000 flags rw- + +ELF-x86-64: Program Header: +ELF-x86-64: LOAD off 0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21 +ELF-x86-64: filesz 0x0000000000000138 memsz 0x0000000000000138 flags r-x +ELF-x86-64: EH_FRAME off 0x00000000000000f4 vaddr 0x00000000004000f4 paddr 0x00000000004000f4 align 2**2 +ELF-x86-64: filesz 0x0000000000000014 memsz 0x0000000000000014 flags r-- +ELF-x86-64: STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**3 +ELF-x86-64: filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw- diff --git a/test/Object/objdump-relocations.test b/test/Object/objdump-relocations.test index 6d35a2651d7a..95c4c4dcaedf 100644 --- a/test/Object/objdump-relocations.test +++ b/test/Object/objdump-relocations.test @@ -8,6 +8,8 @@ RUN: llvm-objdump -r %p/Inputs/trivial-object-test.elf-x86-64 \ RUN: | FileCheck %s -check-prefix ELF-x86-64 RUN: llvm-objdump -r %p/Inputs/trivial-object-test.elf-hexagon \ RUN: | FileCheck %s -check-prefix ELF-hexagon +RUN: llvm-objdump -r %p/Inputs/trivial-object-test.elf-mips64el \ +RUN: | FileCheck %s -check-prefix ELF-MIPS64EL RUN: llvm-objdump -r %p/Inputs/relocations.elf-x86-64 \ RUN: | FileCheck %s -check-prefix ELF-complex-x86-64 @@ -40,6 +42,11 @@ ELF-hexagon: R_HEX_LO16 puts ELF-hexagon: R_HEX_B15_PCREL testf ELF-hexagon: R_HEX_B22_PCREL puts +// Note: this file was produced with gas to make sure we don't end up in a +// situation where LLVM produces and accepts a broken file. +ELF-MIPS64EL: .data +ELF-MIPS64EL: R_MIPS_64 + ELF-complex-x86-64: .text ELF-complex-x86-64-NEXT: R_X86_64_8 .data-4 ELF-complex-x86-64-NEXT: R_X86_64_16 .data-4 diff --git a/test/Object/objdump-sectionheaders.test b/test/Object/objdump-sectionheaders.test index a417d07a81cc..bc2478cea2fb 100644 --- a/test/Object/objdump-sectionheaders.test +++ b/test/Object/objdump-sectionheaders.test @@ -6,11 +6,11 @@ ; CHECK: Sections: ; CHECK: Idx Name Size Address Type -; CHECK: 0 000000000 00000000000000000 -; CHECK: 1 .text 000000026 00000000000000000 TEXT DATA -; CHECK: 2 .rodata.str1.1 00000000d 00000000000000026 DATA -; CHECK: 3 .note.GNU-stack 000000000 00000000000000033 -; CHECK: 4 .rela.text 000000048 00000000000000038 -; CHECK: 5 .symtab 0000000c0 00000000000000080 -; CHECK: 6 .strtab 000000033 00000000000000140 -; CHECK: 7 .shstrtab 00000004b 00000000000000173 +; CHECK: 0 00000000 0000000000000000 +; CHECK: 1 .text 00000026 0000000000000000 TEXT DATA +; CHECK: 2 .rodata.str1.1 0000000d 0000000000000026 DATA +; CHECK: 3 .note.GNU-stack 00000000 0000000000000033 +; CHECK: 4 .rela.text 00000048 0000000000000038 +; CHECK: 5 .symtab 000000c0 0000000000000080 +; CHECK: 6 .strtab 00000033 0000000000000140 +; CHECK: 7 .shstrtab 0000004b 0000000000000173 diff --git a/test/Object/readobj-elf-versioning.test b/test/Object/readobj-elf-versioning.test index 0906f344e2c5..1f09ef32a11a 100644 --- a/test/Object/readobj-elf-versioning.test +++ b/test/Object/readobj-elf-versioning.test @@ -1,15 +1,46 @@ -RUN: llvm-readobj %p/Inputs/elf-versioning-test.i386 \ +RUN: llvm-readobj -dt %p/Inputs/elf-versioning-test.i386 \ RUN: | FileCheck %s -check-prefix ELF -RUN: llvm-readobj %p/Inputs/elf-versioning-test.i386 \ +RUN: llvm-readobj -dt %p/Inputs/elf-versioning-test.i386 \ RUN: | FileCheck %s -check-prefix ELF32 -RUN: llvm-readobj %p/Inputs/elf-versioning-test.x86_64 \ +RUN: llvm-readobj -dt %p/Inputs/elf-versioning-test.x86_64 \ RUN: | FileCheck %s -check-prefix ELF -RUN: llvm-readobj %p/Inputs/elf-versioning-test.x86_64 \ +RUN: llvm-readobj -dt %p/Inputs/elf-versioning-test.x86_64 \ RUN: | FileCheck %s -check-prefix ELF64 -ELF: foo@@VER2 FUNC {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global -ELF: foo@VER1 FUNC {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global -ELF: unversioned_define FUNC {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global +ELF: DynamicSymbols [ +ELF: Symbol { +ELF: Name: foo@@VER2 +ELF: Binding: Global +ELF: Type: Function +ELF: Section: .text +ELF: } +ELF: Symbol { +ELF: Name: foo@VER1 +ELF: Binding: Global +ELF: Type: Function +ELF: Section: .text +ELF: } +ELF: Symbol { +ELF: Name: unversioned_define +ELF: Binding: Global +ELF: Type: Function +ELF: Section: .text +ELF: } +ELF: ] -ELF32: puts@GLIBC_2.0 FUNC {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} undef,global -ELF64: puts@GLIBC_2.2.5 FUNC {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} undef,global +ELF32: DynamicSymbols [ +ELF32: Symbol { +ELF32: Name: puts@GLIBC_2.0 +ELF32: Binding: Global +ELF32: Type: Function +ELF32: Section: (0x0) +ELF32: } +ELF32: ] +ELF64: DynamicSymbols [ +ELF64: Symbol { +ELF64: Name: puts@GLIBC_2.2.5 +ELF64: Binding: Global +ELF64: Type: Function +ELF64: Section: (0x0) +ELF64: } +ELF64: ] diff --git a/test/Object/readobj-shared-object.test b/test/Object/readobj-shared-object.test index 3b5457ce0737..72dbd32ea9d5 100644 --- a/test/Object/readobj-shared-object.test +++ b/test/Object/readobj-shared-object.test @@ -1,59 +1,319 @@ -RUN: llvm-readobj %p/Inputs/shared-object-test.elf-i386 \ +RUN: llvm-readobj -s -t -dt -dynamic-table -needed-libs \ +RUN: %p/Inputs/shared-object-test.elf-i386 \ RUN: | FileCheck %s -check-prefix ELF -RUN: llvm-readobj %p/Inputs/shared-object-test.elf-i386 \ +RUN: llvm-readobj -s -t -dt -dynamic-table -needed-libs \ +RUN: %p/Inputs/shared-object-test.elf-i386 \ RUN: | FileCheck %s -check-prefix ELF32 -RUN: llvm-readobj %p/Inputs/shared-object-test.elf-x86-64 \ +RUN: llvm-readobj -s -t -dt -dynamic-table -needed-libs \ +RUN: %p/Inputs/shared-object-test.elf-x86-64 \ RUN: | FileCheck %s -check-prefix ELF -RUN: llvm-readobj %p/Inputs/shared-object-test.elf-x86-64 \ +RUN: llvm-readobj -s -t -dt -dynamic-table -needed-libs \ +RUN: %p/Inputs/shared-object-test.elf-x86-64 \ RUN: | FileCheck %s -check-prefix ELF64 -ELF64:File Format : ELF64-x86-64 -ELF64:Arch : x86_64 -ELF64:Address Size: 64 bits -ELF64:Load Name : libfoo.so - -ELF32:File Format : ELF32-i386 -ELF32:Arch : i386 -ELF32:Address Size: 32 bits -ELF32:Load Name : libfoo.so - -ELF:Symbols: -ELF: .dynsym DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: .dynstr DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: .text DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: .eh_frame DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: .tdata DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: .dynamic DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: .got.plt DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: .data DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: .bss DBG {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} formatspecific -ELF: shared.ll FILE {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} absolute,formatspecific -ELF: local_func FUNC {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} -ELF: _GLOBAL_OFFSET_TABLE_ DATA {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} absolute -ELF: _DYNAMIC DATA {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} absolute -ELF: common_sym DATA {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global -ELF: tls_sym DATA {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global,threadlocal -ELF: defined_sym DATA {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global -ELF: __bss_start ? {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global,absolute -ELF: _end ? {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global,absolute -ELF: global_func FUNC {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global -ELF: _edata ? {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global,absolute -ELF: Total: 21 - -ELF:Dynamic Symbols: -ELF: common_sym DATA {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global -ELF: tls_sym DATA {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global,threadlocal -ELF: defined_sym DATA {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global -ELF: __bss_start ? {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global,absolute -ELF: _end ? {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global,absolute -ELF: global_func FUNC {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global -ELF: _edata ? {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} global,absolute -ELF: Total: {{[0-9a-f]+}} - -ELF:Libraries needed: -ELF: libc.so.6 -ELF: libm.so.6 -ELF: Total: 2 +ELF64: Format: ELF64-x86-64 +ELF64: Arch: x86_64 +ELF64: AddressSize: 64bit +ELF64: LoadName: libfoo.so +ELF32: Format: ELF32-i386 +ELF32: Arch: i386 +ELF32: AddressSize: 32bit +ELF32: LoadName: libfoo.so +ELF: Sections [ +ELF: Section { +ELF: Name: (0) +ELF: Type: SHT_NULL +ELF: Flags [ (0x0) +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .hash +ELF: Type: SHT_HASH +ELF: Flags [ (0x2) +ELF: SHF_ALLOC +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .dynsym +ELF: Type: SHT_DYNSYM +ELF: Flags [ (0x2) +ELF: SHF_ALLOC +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .dynstr +ELF: Type: SHT_STRTAB +ELF: Flags [ (0x2) +ELF: SHF_ALLOC +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .text +ELF: Type: SHT_PROGBITS +ELF: Flags [ (0x6) +ELF: SHF_ALLOC +ELF: SHF_EXECINSTR +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .eh_frame +ELF: Type: SHT_PROGBITS +ELF: Flags [ (0x2) +ELF: SHF_ALLOC +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .tdata +ELF: Type: SHT_PROGBITS +ELF: Flags [ (0x403) +ELF: SHF_ALLOC +ELF: SHF_TLS +ELF: SHF_WRITE +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .dynamic +ELF: Type: SHT_DYNAMIC +ELF: Flags [ (0x3) +ELF: SHF_ALLOC +ELF: SHF_WRITE +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .got.plt +ELF: Type: SHT_PROGBITS +ELF: Flags [ (0x3) +ELF: SHF_ALLOC +ELF: SHF_WRITE +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .data +ELF: Type: SHT_PROGBITS +ELF: Flags [ (0x3) +ELF: SHF_ALLOC +ELF: SHF_WRITE +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .bss +ELF: Type: SHT_NOBITS +ELF: Flags [ (0x3) +ELF: SHF_ALLOC +ELF: SHF_WRITE +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .shstrtab +ELF: Type: SHT_STRTAB +ELF: Flags [ (0x0) +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .symtab +ELF: Type: SHT_SYMTAB +ELF: Flags [ (0x0) +ELF: ] +ELF: } +ELF: Section { +ELF: Name: .strtab +ELF: Type: SHT_STRTAB +ELF: Flags [ (0x0) +ELF: ] +ELF: } +ELF: ] + +ELF: Symbols [ +ELF: Symbol { +ELF: Name: .hash +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .hash +ELF: } +ELF: Symbol { +ELF: Name: .dynsym +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .dynsym +ELF: } +ELF: Symbol { +ELF: Name: .dynstr +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .dynstr +ELF: } +ELF: Symbol { +ELF: Name: .text +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .text +ELF: } +ELF: Symbol { +ELF: Name: .eh_frame +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .eh_frame +ELF: } +ELF: Symbol { +ELF: Name: .tdata +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .tdata +ELF: } +ELF: Symbol { +ELF: Name: .dynamic +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .dynamic +ELF: } +ELF: Symbol { +ELF: Name: .got.plt +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .got.plt +ELF: } +ELF: Symbol { +ELF: Name: .data +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .data +ELF: } +ELF: Symbol { +ELF: Name: .bss +ELF: Binding: Local +ELF: Type: Section +ELF: Section: .bss +ELF: } +ELF: Symbol { +ELF: Name: shared.ll +ELF: Binding: Local +ELF: Type: File +ELF: Section: (0xFFF1) +ELF: } +ELF: Symbol { +ELF: Name: local_func +ELF: Binding: Local +ELF: Type: Function +ELF: Section: .text +ELF: } +ELF: Symbol { +ELF: Name: _GLOBAL_OFFSET_TABLE_ +ELF: Binding: Local +ELF: Type: Object +ELF: Section: (0xFFF1) +ELF: } +ELF: Symbol { +ELF: Name: _DYNAMIC +ELF: Binding: Local +ELF: Type: Object +ELF: Section: (0xFFF1) +ELF: } +ELF: Symbol { +ELF: Name: common_sym +ELF: Binding: Global +ELF: Type: Object +ELF: Section: .bss +ELF: } +ELF: Symbol { +ELF: Name: tls_sym +ELF: Binding: Global +ELF: Type: TLS +ELF: Section: .tdata +ELF: } +ELF: Symbol { +ELF: Name: defined_sym +ELF: Binding: Global +ELF: Type: Object +ELF: Section: .data +ELF: } +ELF: Symbol { +ELF: Name: __bss_start +ELF: Binding: Global +ELF: Type: None +ELF: Section: (0xFFF1) +ELF: } +ELF: Symbol { +ELF: Name: _end +ELF: Binding: Global +ELF: Type: None +ELF: Section: (0xFFF1) +ELF: } +ELF: Symbol { +ELF: Name: global_func +ELF: Binding: Global +ELF: Type: Function +ELF: Section: .text +ELF: } +ELF: Symbol { +ELF: Name: _edata +ELF: Binding: Global +ELF: Type: None +ELF: Section: (0xFFF1) +ELF: } +ELF: ] + +ELF: DynamicSymbols [ +ELF: Symbol { +ELF: Name: common_sym +ELF: Binding: Global +ELF: Type: Object +ELF: Section: .bss +ELF: } +ELF: Symbol { +ELF: Name: tls_sym +ELF: Binding: Global +ELF: Type: TLS +ELF: Section: .tdata +ELF: } +ELF: Symbol { +ELF: Name: defined_sym +ELF: Binding: Global +ELF: Type: Object +ELF: Section: .data +ELF: } +ELF: Symbol { +ELF: Name: __bss_start +ELF: Binding: Global +ELF: Type: None +ELF: Section: (0xFFF1) +ELF: } +ELF: Symbol { +ELF: Name: _end +ELF: Binding: Global +ELF: Type: None +ELF: Section: (0xFFF1) +ELF: } +ELF: Symbol { +ELF: Name: global_func +ELF: Binding: Global +ELF: Type: Function +ELF: Section: .text +ELF: } +ELF: Symbol { +ELF: Name: _edata +ELF: Binding: Global +ELF: Type: None +ELF: Section: (0xFFF1) +ELF: } +ELF: ] + +ELF: DynamicSection [ (9 entries) +ELF: Tag Type Name/Value +ELF: 00000001 NEEDED SharedLibrary (libc.so.6) +ELF: 00000001 NEEDED SharedLibrary (libm.so.6) +ELF: 0000000E SONAME LibrarySoname (libfoo.so) +ELF: 00000004 HASH {{[0-9a-f]+}} +ELF: 00000005 STRTAB {{[0-9a-f]+}} +ELF: 00000006 SYMTAB {{[0-9a-f]+}} +ELF: 0000000A STRSZ {{[0-9]+}} (bytes) +ELF: 0000000B SYMENT {{[0-9]+}} (bytes) +ELF: 00000000 NULL 0x0 +ELF: ] + +ELF: NeededLibraries [ +ELF-NEXT: libc.so.6 +ELF-NEXT: libm.so.6 +ELF-NEXT: ] diff --git a/test/Object/readobj.test b/test/Object/readobj.test new file mode 100644 index 000000000000..e29f40492d77 --- /dev/null +++ b/test/Object/readobj.test @@ -0,0 +1,2 @@ +// Don't crash while reading non-dynamic files. +RUN: llvm-readobj %p/Inputs/trivial-object-test.elf-x86-64 diff --git a/test/Object/simple-archive.test b/test/Object/simple-archive.test new file mode 100644 index 000000000000..3e6760ed97a4 --- /dev/null +++ b/test/Object/simple-archive.test @@ -0,0 +1,12 @@ +# +# Check if the index is appearing properly in the output file +# +RUN: llvm-nm -s %p/Inputs/libsimple_archive.a | FileCheck -check-prefix=CHECKIDX %s + +CHECKIDX: Archive map +CHECKIDX: abcdefghijklmnopqrstuvwxyz12345678 in 1.o +CHECKIDX: main in 1.o +CHECKIDX: 1.o: +CHECKIDX: 00000000 D abcdefghijklmnopqrstuvwxyz12345678 +CHECKIDX: U fn1 +CHECKIDX: 00000000 T main diff --git a/test/Object/yaml2obj-readobj.test b/test/Object/yaml2obj-readobj.test new file mode 100644 index 000000000000..545ccc48aa4c --- /dev/null +++ b/test/Object/yaml2obj-readobj.test @@ -0,0 +1,5 @@ +RUN: yaml2obj %p/Inputs/COFF/i386.yaml | llvm-readobj -file-headers - | FileCheck %s --check-prefix COFF-I386 + +// COFF-I386: Characteristics [ (0x200) +// COFF-I386-NEXT: IMAGE_FILE_DEBUG_STRIPPED (0x200) +// COFF-I386-NEXT: ] diff --git a/test/Other/2008-10-15-MissingSpace.ll b/test/Other/2008-10-15-MissingSpace.ll index cac696ed6ff2..bc78e84a0afc 100644 --- a/test/Other/2008-10-15-MissingSpace.ll +++ b/test/Other/2008-10-15-MissingSpace.ll @@ -1,8 +1,12 @@ -; RUN: llvm-as < %s | llvm-dis | not grep "void@" +; RUN: llvm-as < %s | llvm-dis | FileCheck %s ; PR2894 declare void @g() define void @f() { - invoke void @g() to label %c unwind label %c +; CHECK: invoke void @g() +; CHECK: to label %d unwind label %c + invoke void @g() to label %d unwind label %c +d: + ret void c: %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 cleanup diff --git a/test/Other/close-stderr.ll b/test/Other/close-stderr.ll index 1d207c75c62b..6e180cd1d898 100644 --- a/test/Other/close-stderr.ll +++ b/test/Other/close-stderr.ll @@ -1,9 +1,16 @@ ; RUN: sh -c 'opt --reject-this-option 2>&-; echo $?; opt -o /dev/null /dev/null 2>&-; echo $?;' \ ; RUN: | FileCheck %s + ; CHECK: {{^1$}} +; On valgrind, we got 127 here. +; XFAIL: valgrind + ; CHECK: {{^0$}} ; XFAIL: vg_leak ; REQUIRES: shell +; opt will fail to open /dev/null on native win32. +; XFAIL: win32 + ; Test that the error handling when writing to stderr fails exits the ; program cleanly rather than aborting. diff --git a/test/Other/constant-fold-gep.ll b/test/Other/constant-fold-gep.ll index eafb16e23e9e..44b66284dd73 100644 --- a/test/Other/constant-fold-gep.ll +++ b/test/Other/constant-fold-gep.ll @@ -118,64 +118,64 @@ ; Duplicate all of the above as function return values rather than ; global initializers. -; PLAIN: define i8* @goo8() nounwind { +; PLAIN: define i8* @goo8() #0 { ; PLAIN: %t = bitcast i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -1) to i8* ; PLAIN: ret i8* %t ; PLAIN: } -; PLAIN: define i1* @goo1() nounwind { +; PLAIN: define i1* @goo1() #0 { ; PLAIN: %t = bitcast i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -1) to i1* ; PLAIN: ret i1* %t ; PLAIN: } -; PLAIN: define i8* @foo8() nounwind { +; PLAIN: define i8* @foo8() #0 { ; PLAIN: %t = bitcast i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -2) to i8* ; PLAIN: ret i8* %t ; PLAIN: } -; PLAIN: define i1* @foo1() nounwind { +; PLAIN: define i1* @foo1() #0 { ; PLAIN: %t = bitcast i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -2) to i1* ; PLAIN: ret i1* %t ; PLAIN: } -; PLAIN: define i8* @hoo8() nounwind { +; PLAIN: define i8* @hoo8() #0 { ; PLAIN: %t = bitcast i8* getelementptr (i8* null, i32 -1) to i8* ; PLAIN: ret i8* %t ; PLAIN: } -; PLAIN: define i1* @hoo1() nounwind { +; PLAIN: define i1* @hoo1() #0 { ; PLAIN: %t = bitcast i1* getelementptr (i1* null, i32 -1) to i1* ; PLAIN: ret i1* %t ; PLAIN: } -; OPT: define i8* @goo8() nounwind { +; OPT: define i8* @goo8() #0 { ; OPT: ret i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -1) ; OPT: } -; OPT: define i1* @goo1() nounwind { +; OPT: define i1* @goo1() #0 { ; OPT: ret i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -1) ; OPT: } -; OPT: define i8* @foo8() nounwind { +; OPT: define i8* @foo8() #0 { ; OPT: ret i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -2) ; OPT: } -; OPT: define i1* @foo1() nounwind { +; OPT: define i1* @foo1() #0 { ; OPT: ret i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -2) ; OPT: } -; OPT: define i8* @hoo8() nounwind { +; OPT: define i8* @hoo8() #0 { ; OPT: ret i8* getelementptr (i8* null, i32 -1) ; OPT: } -; OPT: define i1* @hoo1() nounwind { +; OPT: define i1* @hoo1() #0 { ; OPT: ret i1* getelementptr (i1* null, i32 -1) ; OPT: } -; TO: define i8* @goo8() nounwind { +; TO: define i8* @goo8() #0 { ; TO: ret i8* null ; TO: } -; TO: define i1* @goo1() nounwind { +; TO: define i1* @goo1() #0 { ; TO: ret i1* null ; TO: } -; TO: define i8* @foo8() nounwind { +; TO: define i8* @foo8() #0 { ; TO: ret i8* inttoptr (i64 -1 to i8*) ; TO: } -; TO: define i1* @foo1() nounwind { +; TO: define i1* @foo1() #0 { ; TO: ret i1* inttoptr (i64 -1 to i1*) ; TO: } -; TO: define i8* @hoo8() nounwind { +; TO: define i8* @hoo8() #0 { ; TO: ret i8* inttoptr (i64 -1 to i8*) ; TO: } -; TO: define i1* @hoo1() nounwind { +; TO: define i1* @hoo1() #0 { ; TO: ret i1* inttoptr (i64 -1 to i1*) ; TO: } ; SCEV: Classifying expressions for: @goo8 @@ -220,94 +220,94 @@ define i1* @hoo1() nounwind { ret i1* %t } -; PLAIN: define i64 @fa() nounwind { +; PLAIN: define i64 @fa() #0 { ; PLAIN: %t = bitcast i64 mul (i64 ptrtoint (double* getelementptr (double* null, i32 1) to i64), i64 2310) to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; PLAIN: define i64 @fb() nounwind { +; PLAIN: define i64 @fb() #0 { ; PLAIN: %t = bitcast i64 ptrtoint (double* getelementptr ({ i1, double }* null, i64 0, i32 1) to i64) to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; PLAIN: define i64 @fc() nounwind { +; PLAIN: define i64 @fc() #0 { ; PLAIN: %t = bitcast i64 mul nuw (i64 ptrtoint (double* getelementptr (double* null, i32 1) to i64), i64 2) to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; PLAIN: define i64 @fd() nounwind { +; PLAIN: define i64 @fd() #0 { ; PLAIN: %t = bitcast i64 mul nuw (i64 ptrtoint (double* getelementptr (double* null, i32 1) to i64), i64 11) to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; PLAIN: define i64 @fe() nounwind { +; PLAIN: define i64 @fe() #0 { ; PLAIN: %t = bitcast i64 ptrtoint (double* getelementptr ({ double, float, double, double }* null, i64 0, i32 2) to i64) to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; PLAIN: define i64 @ff() nounwind { +; PLAIN: define i64 @ff() #0 { ; PLAIN: %t = bitcast i64 1 to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; PLAIN: define i64 @fg() nounwind { +; PLAIN: define i64 @fg() #0 { ; PLAIN: %t = bitcast i64 ptrtoint (double* getelementptr ({ i1, double }* null, i64 0, i32 1) to i64) to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; PLAIN: define i64 @fh() nounwind { +; PLAIN: define i64 @fh() #0 { ; PLAIN: %t = bitcast i64 ptrtoint (i1** getelementptr (i1** null, i32 1) to i64) to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; PLAIN: define i64 @fi() nounwind { +; PLAIN: define i64 @fi() #0 { ; PLAIN: %t = bitcast i64 ptrtoint (i1** getelementptr ({ i1, i1* }* null, i64 0, i32 1) to i64) to i64 ; PLAIN: ret i64 %t ; PLAIN: } -; OPT: define i64 @fa() nounwind { +; OPT: define i64 @fa() #0 { ; OPT: ret i64 mul (i64 ptrtoint (double* getelementptr (double* null, i32 1) to i64), i64 2310) ; OPT: } -; OPT: define i64 @fb() nounwind { +; OPT: define i64 @fb() #0 { ; OPT: ret i64 ptrtoint (double* getelementptr ({ i1, double }* null, i64 0, i32 1) to i64) ; OPT: } -; OPT: define i64 @fc() nounwind { +; OPT: define i64 @fc() #0 { ; OPT: ret i64 mul (i64 ptrtoint (double* getelementptr (double* null, i32 1) to i64), i64 2) ; OPT: } -; OPT: define i64 @fd() nounwind { +; OPT: define i64 @fd() #0 { ; OPT: ret i64 mul (i64 ptrtoint (double* getelementptr (double* null, i32 1) to i64), i64 11) ; OPT: } -; OPT: define i64 @fe() nounwind { +; OPT: define i64 @fe() #0 { ; OPT: ret i64 ptrtoint (double* getelementptr ({ double, float, double, double }* null, i64 0, i32 2) to i64) ; OPT: } -; OPT: define i64 @ff() nounwind { +; OPT: define i64 @ff() #0 { ; OPT: ret i64 1 ; OPT: } -; OPT: define i64 @fg() nounwind { +; OPT: define i64 @fg() #0 { ; OPT: ret i64 ptrtoint (double* getelementptr ({ i1, double }* null, i64 0, i32 1) to i64) ; OPT: } -; OPT: define i64 @fh() nounwind { +; OPT: define i64 @fh() #0 { ; OPT: ret i64 ptrtoint (i1** getelementptr (i1** null, i32 1) to i64) ; OPT: } -; OPT: define i64 @fi() nounwind { +; OPT: define i64 @fi() #0 { ; OPT: ret i64 ptrtoint (i1** getelementptr ({ i1, i1* }* null, i64 0, i32 1) to i64) ; OPT: } -; TO: define i64 @fa() nounwind { +; TO: define i64 @fa() #0 { ; TO: ret i64 18480 ; TO: } -; TO: define i64 @fb() nounwind { +; TO: define i64 @fb() #0 { ; TO: ret i64 8 ; TO: } -; TO: define i64 @fc() nounwind { +; TO: define i64 @fc() #0 { ; TO: ret i64 16 ; TO: } -; TO: define i64 @fd() nounwind { +; TO: define i64 @fd() #0 { ; TO: ret i64 88 ; TO: } -; TO: define i64 @fe() nounwind { +; TO: define i64 @fe() #0 { ; TO: ret i64 16 ; TO: } -; TO: define i64 @ff() nounwind { +; TO: define i64 @ff() #0 { ; TO: ret i64 1 ; TO: } -; TO: define i64 @fg() nounwind { +; TO: define i64 @fg() #0 { ; TO: ret i64 8 ; TO: } -; TO: define i64 @fh() nounwind { +; TO: define i64 @fh() #0 { ; TO: ret i64 8 ; TO: } -; TO: define i64 @fi() nounwind { +; TO: define i64 @fi() #0 { ; TO: ret i64 8 ; TO: } ; SCEV: Classifying expressions for: @fa @@ -375,34 +375,34 @@ define i64 @fi() nounwind { ret i64 %t } -; PLAIN: define i64* @fM() nounwind { +; PLAIN: define i64* @fM() #0 { ; PLAIN: %t = bitcast i64* getelementptr (i64* null, i32 1) to i64* ; PLAIN: ret i64* %t ; PLAIN: } -; PLAIN: define i64* @fN() nounwind { +; PLAIN: define i64* @fN() #0 { ; PLAIN: %t = bitcast i64* getelementptr ({ i64, i64 }* null, i32 0, i32 1) to i64* ; PLAIN: ret i64* %t ; PLAIN: } -; PLAIN: define i64* @fO() nounwind { +; PLAIN: define i64* @fO() #0 { ; PLAIN: %t = bitcast i64* getelementptr ([2 x i64]* null, i32 0, i32 1) to i64* ; PLAIN: ret i64* %t ; PLAIN: } -; OPT: define i64* @fM() nounwind { +; OPT: define i64* @fM() #0 { ; OPT: ret i64* getelementptr (i64* null, i32 1) ; OPT: } -; OPT: define i64* @fN() nounwind { +; OPT: define i64* @fN() #0 { ; OPT: ret i64* getelementptr ({ i64, i64 }* null, i32 0, i32 1) ; OPT: } -; OPT: define i64* @fO() nounwind { +; OPT: define i64* @fO() #0 { ; OPT: ret i64* getelementptr ([2 x i64]* null, i32 0, i32 1) ; OPT: } -; TO: define i64* @fM() nounwind { +; TO: define i64* @fM() #0 { ; TO: ret i64* inttoptr (i64 8 to i64*) ; TO: } -; TO: define i64* @fN() nounwind { +; TO: define i64* @fN() #0 { ; TO: ret i64* inttoptr (i64 8 to i64*) ; TO: } -; TO: define i64* @fO() nounwind { +; TO: define i64* @fO() #0 { ; TO: ret i64* inttoptr (i64 8 to i64*) ; TO: } ; SCEV: Classifying expressions for: @fM @@ -428,14 +428,14 @@ define i64* @fO() nounwind { ret i64* %t } -; PLAIN: define i32* @fZ() nounwind { +; PLAIN: define i32* @fZ() #0 { ; PLAIN: %t = bitcast i32* getelementptr inbounds (i32* getelementptr inbounds ([3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) to i32* ; PLAIN: ret i32* %t ; PLAIN: } -; OPT: define i32* @fZ() nounwind { +; OPT: define i32* @fZ() #0 { ; OPT: ret i32* getelementptr (i32* getelementptr inbounds ([3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) ; OPT: } -; TO: define i32* @fZ() nounwind { +; TO: define i32* @fZ() #0 { ; TO: ret i32* getelementptr inbounds ([3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 1) ; TO: } ; SCEV: Classifying expressions for: @fZ @@ -446,3 +446,25 @@ define i32* @fZ() nounwind { %t = bitcast i32* getelementptr inbounds (i32* getelementptr inbounds ([3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) to i32* ret i32* %t } + +; PR15262 - Check GEP folding with casts between address spaces. + +@p0 = global [4 x i8] zeroinitializer, align 1 +@p12 = addrspace(12) global [4 x i8] zeroinitializer, align 1 + +define i8* @different_addrspace() nounwind noinline { +; OPT: different_addrspace + %p = getelementptr inbounds i8* bitcast ([4 x i8] addrspace(12)* @p12 to i8*), + i32 2 + ret i8* %p +; OPT: ret i8* getelementptr (i8* bitcast ([4 x i8] addrspace(12)* @p12 to i8*), i32 2) +} + +define i8* @same_addrspace() nounwind noinline { +; OPT: same_addrspace + %p = getelementptr inbounds i8* bitcast ([4 x i8] * @p0 to i8*), i32 2 + ret i8* %p +; OPT: ret i8* getelementptr inbounds ([4 x i8]* @p0, i32 0, i32 2) +} + +; CHECK: attributes #0 = { nounwind } diff --git a/test/Other/extract-linkonce.ll b/test/Other/extract-linkonce.ll new file mode 100644 index 000000000000..31fbf3ac4632 --- /dev/null +++ b/test/Other/extract-linkonce.ll @@ -0,0 +1,23 @@ +; RUN: llvm-extract -func foo -S < %s | FileCheck %s +; RUN: llvm-extract -delete -func foo -S < %s | FileCheck --check-prefix=DELETE %s + +; Test that we don't convert weak_odr to external definitions. + +; CHECK: @bar = external hidden global i32 +; CHECK: define hidden i32* @foo() { +; CHECK-NEXT: ret i32* @bar +; CHECK-NEXT: } + +; DELETE: @bar = hidden global i32 42 +; DELETE: declare hidden i32* @foo() + +@bar = linkonce global i32 42 + +define linkonce i32* @foo() { + ret i32* @bar +} + +define void @g() { + call i32* @foo() + ret void +} diff --git a/test/Scripts/elf-dump b/test/Scripts/elf-dump index 69cdacde4523..61342d8f98e5 100755 --- a/test/Scripts/elf-dump +++ b/test/Scripts/elf-dump @@ -52,6 +52,31 @@ class StringTable: end = self.string_table.index('\x00', index) return self.string_table[index:end] +class ProgramHeader: + def __init__(self, f): + self.p_type = f.read32() + if f.is64Bit: + self.p_flags = f.read32() + self.p_offset = f.readWord() + self.p_vaddr = f.readWord() + self.p_paddr = f.readWord() + self.p_filesz = f.readWord() + self.p_memsz = f.readWord() + if not f.is64Bit: + self.p_flags = f.read32() + self.p_align = f.readWord() + + def dump(self): + print " (('p_type', %s)" % common_dump.HexDump(self.p_type) + print " ('p_flags', %s)" % common_dump.HexDump(self.p_flags) + print " ('p_offset', %s)" % common_dump.HexDump(self.p_offset) + print " ('p_vaddr', %s)" % common_dump.HexDump(self.p_vaddr) + print " ('p_paddr', %s)" % common_dump.HexDump(self.p_paddr) + print " ('p_filesz', %s)" % common_dump.HexDump(self.p_filesz) + print " ('p_memsz', %s)" % common_dump.HexDump(self.p_memsz) + print " ('p_align', %s)" % common_dump.HexDump(self.p_align) + print " )," + class Section: def __init__(self, f): self.sh_name = f.read32() @@ -189,19 +214,23 @@ def dumpELF(path, opts): print "('e_machine', %s)" % common_dump.HexDump(e_machine) print "('e_version', %s)" % common_dump.HexDump(f.read32()) print "('e_entry', %s)" % common_dump.HexDump(f.readWord()) - print "('e_phoff', %s)" % common_dump.HexDump(f.readWord()) + e_phoff = f.readWord() + print "('e_phoff', %s)" % common_dump.HexDump(e_phoff) e_shoff = f.readWord() print "('e_shoff', %s)" % common_dump.HexDump(e_shoff) print "('e_flags', %s)" % common_dump.HexDump(f.read32()) print "('e_ehsize', %s)" % common_dump.HexDump(f.read16()) - print "('e_phentsize', %s)" % common_dump.HexDump(f.read16()) - print "('e_phnum', %s)" % common_dump.HexDump(f.read16()) + e_phentsize = f.read16() + print "('e_phentsize', %s)" % common_dump.HexDump(e_phentsize) + e_phnum = f.read16() + print "('e_phnum', %s)" % common_dump.HexDump(e_phnum) e_shentsize = f.read16() print "('e_shentsize', %s)" % common_dump.HexDump(e_shentsize) e_shnum = f.read16() print "('e_shnum', %s)" % common_dump.HexDump(e_shnum) e_shstrndx = f.read16() print "('e_shstrndx', %s)" % common_dump.HexDump(e_shstrndx) + # Read all section headers sections = [] @@ -228,6 +257,19 @@ def dumpELF(path, opts): sections[index].dump(shstrtab, f, strtab, opts.dumpSectionData) print "])" + # Read all program headers + headers = [] + for index in range(e_phnum[0]): + f.seek(e_phoff[0] + index * e_phentsize[0]) + h = ProgramHeader(f) + headers.append(h) + + print "('_ProgramHeaders', [" + for index in range(e_phnum[0]): + print " # Program Header %s" % index + headers[index].dump() + print "])" + if __name__ == "__main__": from optparse import OptionParser, OptionGroup parser = OptionParser("usage: %prog [options] {files}") diff --git a/test/TableGen/2006-09-18-LargeInt.td b/test/TableGen/2006-09-18-LargeInt.td index f7ae4eecceb4..94cd1ec30710 100644 --- a/test/TableGen/2006-09-18-LargeInt.td +++ b/test/TableGen/2006-09-18-LargeInt.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep -- 4294901760 -// XFAIL: vg_leak def X { int Y = 0xFFFF0000; diff --git a/test/TableGen/2010-03-24-PrematureDefaults.td b/test/TableGen/2010-03-24-PrematureDefaults.td index 24f6c93b3e17..716a1d59008c 100644 --- a/test/TableGen/2010-03-24-PrematureDefaults.td +++ b/test/TableGen/2010-03-24-PrematureDefaults.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class A<int k, bits<2> x = 1> { int K = k; diff --git a/test/TableGen/Dag.td b/test/TableGen/Dag.td index 7ceb4e74b2ff..14d616b52173 100644 --- a/test/TableGen/Dag.td +++ b/test/TableGen/Dag.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak //===----------------------------------------------------------------------===// // Substitution of an int. @@ -71,3 +70,15 @@ def VAL4 : bar<foo2, somedef2>; // CHECK-NEXT: dag Dag3 = (somedef2 2); // CHECK-NEXT: NAME = ? // CHECK-NEXT: } + +def VAL5 : bar<foo2, somedef2> { + // Named operands. + let Dag1 = (somedef1 1:$name1); + + // Name, no node. + let Dag2 = (somedef2 $name2, $name3); +} + +// CHECK: def VAL5 { +// CHECK-NEXT: dag Dag1 = (somedef1 1:$name1); +// CHECK-NEXT: dag Dag2 = (somedef2 ?:$name2, ?:$name3); diff --git a/test/TableGen/DefmInherit.td b/test/TableGen/DefmInherit.td index 46d3f62c6d04..b52a709731e1 100644 --- a/test/TableGen/DefmInherit.td +++ b/test/TableGen/DefmInherit.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep "zing = 4" | count 4 -// XFAIL: vg_leak class C1<int A, string B> { int bar = A; diff --git a/test/TableGen/DefmInsideMultiClass.td b/test/TableGen/DefmInsideMultiClass.td index e6fc019b1e3e..0aea21280da0 100644 --- a/test/TableGen/DefmInsideMultiClass.td +++ b/test/TableGen/DefmInsideMultiClass.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep ADDPSrr | count 1 -// XFAIL: vg_leak class Instruction<bits<4> opc, string Name> { bits<4> opcode = opc; diff --git a/test/TableGen/ForeachList.td b/test/TableGen/ForeachList.td index 99b7e14c2d5f..9bc76e0f0cf8 100644 --- a/test/TableGen/ForeachList.td +++ b/test/TableGen/ForeachList.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Register<string name, int idx> { string Name = name; diff --git a/test/TableGen/ForeachLoop.td b/test/TableGen/ForeachLoop.td index 4aacc74d8aa2..a49a60bf2692 100644 --- a/test/TableGen/ForeachLoop.td +++ b/test/TableGen/ForeachLoop.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Register<string name, int idx> { string Name = name; diff --git a/test/TableGen/LazyChange.td b/test/TableGen/LazyChange.td index 306959ebb6a2..919a1a7e9a32 100644 --- a/test/TableGen/LazyChange.td +++ b/test/TableGen/LazyChange.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep "int Y = 3" -// XFAIL: vg_leak class C { int X = 4; diff --git a/test/TableGen/LetInsideMultiClasses.td b/test/TableGen/LetInsideMultiClasses.td index cb13508e5117..72f48b6d8066 100644 --- a/test/TableGen/LetInsideMultiClasses.td +++ b/test/TableGen/LetInsideMultiClasses.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep "bit IsDouble = 1;" | count 3 -// XFAIL: vg_leak class Instruction<bits<4> opc, string Name> { bits<4> opcode = opc; diff --git a/test/TableGen/ListOfList.td b/test/TableGen/ListOfList.td index 864401ec3cd3..adf9fe483eb4 100644 --- a/test/TableGen/ListOfList.td +++ b/test/TableGen/ListOfList.td @@ -1,7 +1,6 @@ // RUN llvm-tblgen %s | FileCheck %s // RUN: llvm-tblgen %s | grep "foo" | count 1 -// XFAIL: vg_leak class Base<string t> { string text = t; diff --git a/test/TableGen/LoLoL.td b/test/TableGen/LoLoL.td index 778c9609d1a2..f758e1b60476 100644 --- a/test/TableGen/LoLoL.td +++ b/test/TableGen/LoLoL.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Base<list<int> v> { list<int> values = v; diff --git a/test/TableGen/MultiClass.td b/test/TableGen/MultiClass.td index 449c5d6c0403..ef320cf79f16 100644 --- a/test/TableGen/MultiClass.td +++ b/test/TableGen/MultiClass.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep "zing = 4" | count 2 -// XFAIL: vg_leak class C1<int A, string B> { int bar = A; diff --git a/test/TableGen/MultiClassDefName.td b/test/TableGen/MultiClassDefName.td index 296e30c7c788..75d6af5b42b9 100644 --- a/test/TableGen/MultiClassDefName.td +++ b/test/TableGen/MultiClassDefName.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep WorldHelloCC | count 1 -// XFAIL: vg_leak class C<string n> { string name = n; diff --git a/test/TableGen/MultiClassInherit.td b/test/TableGen/MultiClassInherit.td index c768fff0b670..9d1470a6616b 100644 --- a/test/TableGen/MultiClassInherit.td +++ b/test/TableGen/MultiClassInherit.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep "zing = 4" | count 28 -// XFAIL: vg_leak class C1<int A, string B> { int bar = A; diff --git a/test/TableGen/MultiPat.td b/test/TableGen/MultiPat.td index b3792777b6b5..b49b06c24caf 100644 --- a/test/TableGen/MultiPat.td +++ b/test/TableGen/MultiPat.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class ValueType<int size, int value> { int Size = size; diff --git a/test/TableGen/NestedForeach.td b/test/TableGen/NestedForeach.td index e8c16f720d0e..5b63175b192a 100644 --- a/test/TableGen/NestedForeach.td +++ b/test/TableGen/NestedForeach.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Droid<string series, int release, string model, int patchlevel> { string Series = series; diff --git a/test/TableGen/Paste.td b/test/TableGen/Paste.td index a7e2a5b318ba..33d61ccde128 100644 --- a/test/TableGen/Paste.td +++ b/test/TableGen/Paste.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Instr<int i> { int index = i; diff --git a/test/TableGen/SetTheory.td b/test/TableGen/SetTheory.td index 761332312b0f..f26b9e65ac0d 100644 --- a/test/TableGen/SetTheory.td +++ b/test/TableGen/SetTheory.td @@ -1,6 +1,5 @@ // Test evaluation of set operations in dags. // RUN: llvm-tblgen -print-sets %s | FileCheck %s -// XFAIL: vg_leak // // The -print-sets driver configures a primitive SetTheory instance that // understands these sets: diff --git a/test/TableGen/SiblingForeach.td b/test/TableGen/SiblingForeach.td index a11f6f87b427..e4c4704a5e39 100644 --- a/test/TableGen/SiblingForeach.td +++ b/test/TableGen/SiblingForeach.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Set<int i = 0, int j = 0, int k = 0> { int I = i; diff --git a/test/TableGen/Slice.td b/test/TableGen/Slice.td index 6d051d77c8a3..7a35d315c5d8 100644 --- a/test/TableGen/Slice.td +++ b/test/TableGen/Slice.td @@ -1,6 +1,4 @@ -// RUN: llvm-tblgen %s | grep "\[(set" | count 2 -// RUN: llvm-tblgen %s | grep "\[\]" | count 2 -// XFAIL: vg_leak +// RUN: llvm-tblgen %s | FileCheck %s class ValueType<int size, int value> { int Size = size; @@ -86,3 +84,8 @@ multiclass myscalar<bits<8> opcode, string asmstr = "", list<list<dag>> patterns vscalar<opcode, asmstr, patterns>; defm NOT : myscalar<0x10, "not", [[], [(set FR32:$dst, (f32 (not FR32:$src)))]]>; + +// CHECK: Pattern = [(set FR32:$dst, (f32 (not FR32:$src)))]; +// CHECK: Pattern = []; +// CHECK: Pattern = [(set FR32:$dst, (f32 (not FR32:$src)))]; +// CHECK: Pattern = []; diff --git a/test/TableGen/TargetInstrSpec.td b/test/TableGen/TargetInstrSpec.td index 64b706dc6a10..bf2d257c5d01 100644 --- a/test/TableGen/TargetInstrSpec.td +++ b/test/TableGen/TargetInstrSpec.td @@ -1,6 +1,5 @@ // RUN: llvm-tblgen %s | grep '\[(set VR128:$dst, (int_x86_sse2_add_pd VR128:$src1, VR128:$src2))\]' | count 1 // RUN: llvm-tblgen %s | grep '\[(set VR128:$dst, (int_x86_sse2_add_ps VR128:$src1, VR128:$src2))\]' | count 1 -// XFAIL: vg_leak class ValueType<int size, int value> { int Size = size; diff --git a/test/TableGen/TwoLevelName.td b/test/TableGen/TwoLevelName.td index 9c502f475507..e88696217f70 100644 --- a/test/TableGen/TwoLevelName.td +++ b/test/TableGen/TwoLevelName.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Type<string name, int length, int width> { string Name = name; diff --git a/test/TableGen/cast.td b/test/TableGen/cast.td index 7948aff79528..b9e4b375359b 100644 --- a/test/TableGen/cast.td +++ b/test/TableGen/cast.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep "add_ps" | count 3 -// XFAIL: vg_leak class ValueType<int size, int value> { int Size = size; diff --git a/test/TableGen/defmclass.td b/test/TableGen/defmclass.td index 80f03b319426..6198c000fddc 100644 --- a/test/TableGen/defmclass.td +++ b/test/TableGen/defmclass.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class XD { bits<4> Prefix = 11; } // CHECK: Prefix = { 1, 1, 0, 0 }; diff --git a/test/TableGen/eq.td b/test/TableGen/eq.td index f8daf880b9ed..fc3ad424e2f7 100644 --- a/test/TableGen/eq.td +++ b/test/TableGen/eq.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak // CHECK: Value = 0 // CHECK: Value = 1 diff --git a/test/TableGen/eqbit.td b/test/TableGen/eqbit.td index 1d58fa0c1916..b77b1a26dfe1 100644 --- a/test/TableGen/eqbit.td +++ b/test/TableGen/eqbit.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak // CHECK: a = 6 // CHECK: a = 5 diff --git a/test/TableGen/foreach.td b/test/TableGen/foreach.td index 902af25237e9..7b7c19972884 100644 --- a/test/TableGen/foreach.td +++ b/test/TableGen/foreach.td @@ -1,7 +1,6 @@ // RUN: llvm-tblgen %s | grep 'Jr' | count 2 // RUN: llvm-tblgen %s | grep 'Sr' | count 2 // RUN: llvm-tblgen %s | grep '"NAME"' | count 1 -// XFAIL: vg_leak // Variables for foreach class decls { diff --git a/test/TableGen/if.td b/test/TableGen/if.td index 1d8d62329ae3..e4df74f36860 100644 --- a/test/TableGen/if.td +++ b/test/TableGen/if.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak // Support for an `!if' operator as part of a `let' statement. // CHECK: class C diff --git a/test/TableGen/ifbit.td b/test/TableGen/ifbit.td index 88f575e9acfc..e3341219ffe8 100644 --- a/test/TableGen/ifbit.td +++ b/test/TableGen/ifbit.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak // CHECK: a = 6 // CHECK: a = 5 diff --git a/test/TableGen/lisp.td b/test/TableGen/lisp.td index dd85ddc67c94..efe00022f51d 100644 --- a/test/TableGen/lisp.td +++ b/test/TableGen/lisp.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep "" -// XFAIL: vg_leak class List<list<string> n> { list<string> names = n; diff --git a/test/TableGen/list-element-bitref.td b/test/TableGen/list-element-bitref.td index 5f3e3dabf4d4..7db3d31167fd 100644 --- a/test/TableGen/list-element-bitref.td +++ b/test/TableGen/list-element-bitref.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class C<list<bits<8>> L> { bits<2> V0 = L[0]{1-0}; @@ -10,6 +9,6 @@ class C<list<bits<8>> L> { def c0 : C<[0b0101, 0b1010]>; // CHECK: def c0 -// CHECk-NEXT: bits<2> V0 = { 0, 1 }; -// CHECk-NEXT: bits<2> V1 = { 1, 0 }; -// CHECk-NEXT: string V2 = "Odd"; +// CHECK-NEXT: bits<2> V0 = { 0, 1 }; +// CHECK-NEXT: bits<2> V1 = { 1, 0 }; +// CHECK-NEXT: string V2 = "Odd"; diff --git a/test/TableGen/math.td b/test/TableGen/math.td new file mode 100644 index 000000000000..bde267a652dc --- /dev/null +++ b/test/TableGen/math.td @@ -0,0 +1,18 @@ +// RUN: llvm-tblgen %s | FileCheck %s + +class Int<int value> { + int Value = value; +} + +def v1024 : Int<1024>; +// CHECK: def v1024 +// CHECK: Value = 1024 + +def v1025 : Int<!add(v1024.Value, 1)>; +// CHECK: def v1025 +// CHECK: Value = 1025 + +def v2048 : Int<!add(v1024.Value, v1024.Value)>; +// CHECK: def v2048 +// CHECK: Value = 2048 + diff --git a/test/TableGen/pr8330.td b/test/TableGen/pr8330.td index 7779b635e33c..e6720147890b 100644 --- a/test/TableGen/pr8330.td +++ b/test/TableGen/pr8330.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Or4<bits<8> Val> { bits<8> V = {Val{7}, Val{6}, Val{5}, Val{4}, Val{3}, 1, Val{1}, Val{0} }; diff --git a/test/TableGen/strconcat.td b/test/TableGen/strconcat.td index 85ee831b4dae..0173c49365cc 100644 --- a/test/TableGen/strconcat.td +++ b/test/TableGen/strconcat.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | grep fufoo -// XFAIL: vg_leak class Y<string S> { string T = !strconcat(S, "foo"); diff --git a/test/TableGen/subst.td b/test/TableGen/subst.td index 850ac38465c3..e265b44cf328 100644 --- a/test/TableGen/subst.td +++ b/test/TableGen/subst.td @@ -4,7 +4,6 @@ // RUN: llvm-tblgen %s | grep "LAST" | count 1 // RUN: llvm-tblgen %s | grep "TVAR" | count 2 // RUN: llvm-tblgen %s | grep "Bogus" | count 1 -// XFAIL: vg_leak class Honorific<string t> { string honorific = t; diff --git a/test/TableGen/subst2.td b/test/TableGen/subst2.td index 7c007f7db12e..ce7307703dcc 100644 --- a/test/TableGen/subst2.td +++ b/test/TableGen/subst2.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak // CHECK: No subst // CHECK: No foo // CHECK: RECURSE foo diff --git a/test/TableGen/usevalname.td b/test/TableGen/usevalname.td index d85b98ac33e6..a80ba12869e0 100644 --- a/test/TableGen/usevalname.td +++ b/test/TableGen/usevalname.td @@ -1,5 +1,4 @@ // RUN: llvm-tblgen %s | FileCheck %s -// XFAIL: vg_leak class Instr<list<dag> pat> { list<dag> Pattern = pat; diff --git a/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll b/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll index e740b29f9288..1226b98a998e 100644 --- a/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll +++ b/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll @@ -1,15 +1,19 @@ -; RUN: opt < %s -argpromotion -S | grep nounwind | count 2 +; RUN: opt < %s -argpromotion -S | FileCheck %s +; CHECK: define internal i32 @deref(i32 %x.val) #0 { define internal i32 @deref(i32* %x) nounwind { entry: - %tmp2 = load i32* %x, align 4 ; <i32> [#uses=1] - ret i32 %tmp2 + %tmp2 = load i32* %x, align 4 + ret i32 %tmp2 } define i32 @f(i32 %x) { entry: - %x_addr = alloca i32 ; <i32*> [#uses=2] - store i32 %x, i32* %x_addr, align 4 - %tmp1 = call i32 @deref( i32* %x_addr ) nounwind ; <i32> [#uses=1] - ret i32 %tmp1 + %x_addr = alloca i32 + store i32 %x, i32* %x_addr, align 4 +; CHECK: %tmp1 = call i32 @deref(i32 %x_addr.val) [[NUW:#[0-9]+]] + %tmp1 = call i32 @deref( i32* %x_addr ) nounwind + ret i32 %tmp1 } + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ArgumentPromotion/crash.ll b/test/Transforms/ArgumentPromotion/crash.ll index fed002aa98a9..5e1a0370dbb1 100644 --- a/test/Transforms/ArgumentPromotion/crash.ll +++ b/test/Transforms/ArgumentPromotion/crash.ll @@ -1,7 +1,5 @@ +; RUN: opt -inline -argpromotion < %s ; rdar://7879828 -; RUN: opt -inline -argpromotion %s -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" -target triple = "x86_64-apple-darwin10.0.0" define void @foo() { invoke void @foo2() @@ -11,6 +9,8 @@ if.end432: unreachable for.end520: + %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup unreachable } @@ -57,3 +57,5 @@ init: %4 = call i32 @"clay_assign(Chain, Chain)"(%0* %3, %0* %1) ret i32 0 } + +declare i32 @__gxx_personality_v0(...) diff --git a/test/Transforms/BBVectorize/X86/pr15289.ll b/test/Transforms/BBVectorize/X86/pr15289.ll new file mode 100644 index 000000000000..07cc5d8b96b7 --- /dev/null +++ b/test/Transforms/BBVectorize/X86/pr15289.ll @@ -0,0 +1,98 @@ +; RUN: opt < %s -basicaa -bb-vectorize -disable-output +; This is a bugpoint-reduced test case. It did not always assert, but does reproduce the bug +; and running under valgrind (or some similar tool) will catch the error. + +target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-apple-darwin12.2.0" + +%0 = type { [10 x { float, float }], [10 x { float, float }], [10 x { float, float }], [10 x { float, float }], [10 x { float, float }] } +%1 = type { [10 x [8 x i8]] } +%2 = type { i64, i64 } +%3 = type { [10 x i64], i64, i64, i64, i64, i64 } +%4 = type { i64, i64, i64, i64, i64, i64 } +%5 = type { [10 x i64] } +%6 = type { [10 x float], [10 x float], [10 x float], [10 x float] } +%struct.__st_parameter_dt.1.3.5.7 = type { %struct.__st_parameter_common.0.2.4.6, i64, i64*, i64*, i8*, i8*, i32, i32, i8*, i8*, i32, i32, i8*, [256 x i8], i32*, i64, i8*, i32, i32, i8*, i8*, i32, i32, i8*, i8*, i32, i32, i8*, i8*, i32, [4 x i8] } +%struct.__st_parameter_common.0.2.4.6 = type { i32, i32, i8*, i32, i32, i8*, i32* } + +@cctenso_ = external unnamed_addr global %0, align 32 +@ctenso_ = external unnamed_addr global %1, align 32 +@i_dim_ = external unnamed_addr global %2, align 16 +@itenso1_ = external unnamed_addr global %3, align 32 +@itenso2_ = external unnamed_addr global %4, align 32 +@ltenso_ = external unnamed_addr global %5, align 32 +@rtenso_ = external unnamed_addr global %6, align 32 +@.cst = external unnamed_addr constant [8 x i8], align 8 +@.cst1 = external unnamed_addr constant [3 x i8], align 8 +@.cst2 = external unnamed_addr constant [29 x i8], align 8 +@.cst3 = external unnamed_addr constant [32 x i8], align 64 + +define void @cart_to_dc2y_(double* noalias nocapture %xx, double* noalias nocapture %yy, double* noalias nocapture %zz, [5 x { double, double }]* noalias nocapture %c2ten) nounwind uwtable { +entry: + %0 = fmul double undef, undef + %1 = fmul double undef, undef + %2 = fadd double undef, undef + %3 = fmul double undef, 0x3FE8B8B76E3E9919 + %4 = fsub double %0, %1 + %5 = fsub double -0.000000e+00, undef + %6 = fmul double undef, undef + %7 = fmul double %4, %6 + %8 = fmul double undef, 2.000000e+00 + %9 = fmul double %8, undef + %10 = fmul double undef, %9 + %11 = fmul double %10, undef + %12 = fsub double undef, %7 + %13 = fmul double %3, %12 + %14 = fmul double %3, undef + %15 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 0, i32 0 + store double %13, double* %15, align 8, !tbaa !0 + %16 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 0, i32 1 + %17 = fmul double undef, %8 + %18 = fmul double %17, undef + %19 = fmul double undef, %18 + %20 = fadd double undef, undef + %21 = fmul double %3, %19 + %22 = fsub double -0.000000e+00, %21 + %23 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 1, i32 0 + store double %22, double* %23, align 8, !tbaa !0 + %24 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 1, i32 1 + %25 = fmul double undef, 0x3FE42F601A8C6794 + %26 = fmul double undef, 2.000000e+00 + %27 = fsub double %26, %0 + %28 = fmul double %6, undef + %29 = fsub double undef, %28 + %30 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 2, i32 0 + store double undef, double* %30, align 8, !tbaa !0 + %31 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 2, i32 1 + %32 = fmul double undef, %17 + %33 = fmul double undef, %17 + %34 = fmul double undef, %32 + %35 = fmul double undef, %33 + %36 = fsub double undef, %35 + %37 = fmul double %3, %34 + %38 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 3, i32 0 + store double %37, double* %38, align 8, !tbaa !0 + %39 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 3, i32 1 + %40 = fmul double undef, %8 + %41 = fmul double undef, %40 + %42 = fmul double undef, %41 + %43 = fsub double undef, %42 + %44 = fmul double %3, %43 + %45 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 4, i32 0 + store double %13, double* %45, align 8, !tbaa !0 + %46 = getelementptr inbounds [5 x { double, double }]* %c2ten, i64 0, i64 4, i32 1 + %47 = fsub double -0.000000e+00, %14 + store double %47, double* %16, align 8, !tbaa !0 + store double undef, double* %24, align 8, !tbaa !0 + store double -0.000000e+00, double* %31, align 8, !tbaa !0 + store double undef, double* %39, align 8, !tbaa !0 + store double undef, double* %46, align 8, !tbaa !0 + ret void +} + +attributes #0 = { nounwind uwtable } +attributes #1 = { nounwind readnone } +attributes #2 = { nounwind } + +!0 = metadata !{metadata !"alias set 17: real(kind=8)", metadata !1} +!1 = metadata !{metadata !1} diff --git a/test/Transforms/BBVectorize/X86/simple-int.ll b/test/Transforms/BBVectorize/X86/simple-int.ll new file mode 100644 index 000000000000..f5dbe46b1480 --- /dev/null +++ b/test/Transforms/BBVectorize/X86/simple-int.ll @@ -0,0 +1,79 @@ +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" +; RUN: opt < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s + +declare double @llvm.fma.f64(double, double, double) +declare double @llvm.fmuladd.f64(double, double, double) +declare double @llvm.cos.f64(double) +declare double @llvm.powi.f64(double, i32) + +; Basic depth-3 chain with fma +define double @test1(double %A1, double %A2, double %B1, double %B2, double %C1, double %C2) { + %X1 = fsub double %A1, %B1 + %X2 = fsub double %A2, %B2 + %Y1 = call double @llvm.fma.f64(double %X1, double %A1, double %C1) + %Y2 = call double @llvm.fma.f64(double %X2, double %A2, double %C2) + %Z1 = fadd double %Y1, %B1 + %Z2 = fadd double %Y2, %B2 + %R = fmul double %Z1, %Z2 + ret double %R +; CHECK: @test1 +; CHECK: ret double %R +} + +; Basic depth-3 chain with fmuladd +define double @test1a(double %A1, double %A2, double %B1, double %B2, double %C1, double %C2) { + %X1 = fsub double %A1, %B1 + %X2 = fsub double %A2, %B2 + %Y1 = call double @llvm.fmuladd.f64(double %X1, double %A1, double %C1) + %Y2 = call double @llvm.fmuladd.f64(double %X2, double %A2, double %C2) + %Z1 = fadd double %Y1, %B1 + %Z2 = fadd double %Y2, %B2 + %R = fmul double %Z1, %Z2 + ret double %R +; CHECK: @test1a +; CHECK: ret double %R +} + +; Basic depth-3 chain with cos +define double @test2(double %A1, double %A2, double %B1, double %B2) { + %X1 = fsub double %A1, %B1 + %X2 = fsub double %A2, %B2 + %Y1 = call double @llvm.cos.f64(double %X1) + %Y2 = call double @llvm.cos.f64(double %X2) + %Z1 = fadd double %Y1, %B1 + %Z2 = fadd double %Y2, %B2 + %R = fmul double %Z1, %Z2 + ret double %R +; CHECK: @test2 +; CHECK: ret double %R +} + +; Basic depth-3 chain with powi +define double @test3(double %A1, double %A2, double %B1, double %B2, i32 %P) { + %X1 = fsub double %A1, %B1 + %X2 = fsub double %A2, %B2 + %Y1 = call double @llvm.powi.f64(double %X1, i32 %P) + %Y2 = call double @llvm.powi.f64(double %X2, i32 %P) + %Z1 = fadd double %Y1, %B1 + %Z2 = fadd double %Y2, %B2 + %R = fmul double %Z1, %Z2 + ret double %R +; CHECK: @test3 +; CHECK: ret double %R +} + +; Basic depth-3 chain with powi (different powers: should not vectorize) +define double @test4(double %A1, double %A2, double %B1, double %B2, i32 %P) { + %X1 = fsub double %A1, %B1 + %X2 = fsub double %A2, %B2 + %P2 = add i32 %P, 1 + %Y1 = call double @llvm.powi.f64(double %X1, i32 %P) + %Y2 = call double @llvm.powi.f64(double %X2, i32 %P2) + %Z1 = fadd double %Y1, %B1 + %Z2 = fadd double %Y2, %B2 + %R = fmul double %Z1, %Z2 + ret double %R +; CHECK: @test4 +; CHECK: ret double %R +} + diff --git a/test/Transforms/BBVectorize/cycle.ll b/test/Transforms/BBVectorize/cycle.ll index e8e82ce02479..bdcb30da887f 100644 --- a/test/Transforms/BBVectorize/cycle.ll +++ b/test/Transforms/BBVectorize/cycle.ll @@ -1,5 +1,5 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s ; This test checks the non-trivial pairing-induced cycle avoidance. Without this cycle avoidance, the algorithm would otherwise ; want to select the pairs: diff --git a/test/Transforms/BBVectorize/ld1.ll b/test/Transforms/BBVectorize/ld1.ll index cea225d076e1..ea5cb5dd93f7 100644 --- a/test/Transforms/BBVectorize/ld1.ll +++ b/test/Transforms/BBVectorize/ld1.ll @@ -1,5 +1,5 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s define double @test1(double* %a, double* %b, double* %c) nounwind uwtable readonly { entry: diff --git a/test/Transforms/BBVectorize/loop1.ll b/test/Transforms/BBVectorize/loop1.ll index c22ea5852a1b..e592edb44a02 100644 --- a/test/Transforms/BBVectorize/loop1.ll +++ b/test/Transforms/BBVectorize/loop1.ll @@ -1,7 +1,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s -; RUN: opt < %s -basicaa -loop-unroll -unroll-threshold=45 -unroll-allow-partial -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-UNRL +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -basicaa -loop-unroll -unroll-threshold=45 -unroll-allow-partial -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-UNRL ; The second check covers the use of alias analysis (with loop unrolling). define void @test1(double* noalias %out, double* noalias %in1, double* noalias %in2) nounwind uwtable { diff --git a/test/Transforms/BBVectorize/req-depth.ll b/test/Transforms/BBVectorize/req-depth.ll index 8c9cc3c188e3..e0120059b952 100644 --- a/test/Transforms/BBVectorize/req-depth.ll +++ b/test/Transforms/BBVectorize/req-depth.ll @@ -1,6 +1,6 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth 3 -S | FileCheck %s -check-prefix=CHECK-RD3 -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth 2 -S | FileCheck %s -check-prefix=CHECK-RD2 +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth 3 -bb-vectorize-ignore-target-info -S | FileCheck %s -check-prefix=CHECK-RD3 +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth 2 -bb-vectorize-ignore-target-info -S | FileCheck %s -check-prefix=CHECK-RD2 define double @test1(double %A1, double %A2, double %B1, double %B2) { %X1 = fsub double %A1, %B1 diff --git a/test/Transforms/BBVectorize/search-limit.ll b/test/Transforms/BBVectorize/search-limit.ll index aeaf98865bc9..a694e45bc181 100644 --- a/test/Transforms/BBVectorize/search-limit.ll +++ b/test/Transforms/BBVectorize/search-limit.ll @@ -1,6 +1,6 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-search-limit=4 -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-SL4 +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-search-limit=4 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-SL4 define double @test1(double %A1, double %A2, double %B1, double %B2) { ; CHECK: @test1 diff --git a/test/Transforms/BBVectorize/simple-int.ll b/test/Transforms/BBVectorize/simple-int.ll index ae1d63bfd852..e4d51526ca11 100644 --- a/test/Transforms/BBVectorize/simple-int.ll +++ b/test/Transforms/BBVectorize/simple-int.ll @@ -1,7 +1,8 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s declare double @llvm.fma.f64(double, double, double) +declare double @llvm.fmuladd.f64(double, double, double) declare double @llvm.cos.f64(double) declare double @llvm.powi.f64(double, i32) @@ -31,6 +32,32 @@ define double @test1(double %A1, double %A2, double %B1, double %B2, double %C1, ; CHECK: ret double %R } +; Basic depth-3 chain with fmuladd +define double @test1a(double %A1, double %A2, double %B1, double %B2, double %C1, double %C2) { + %X1 = fsub double %A1, %B1 + %X2 = fsub double %A2, %B2 + %Y1 = call double @llvm.fmuladd.f64(double %X1, double %A1, double %C1) + %Y2 = call double @llvm.fmuladd.f64(double %X2, double %A2, double %C2) + %Z1 = fadd double %Y1, %B1 + %Z2 = fadd double %Y2, %B2 + %R = fmul double %Z1, %Z2 + ret double %R +; CHECK: @test1a +; CHECK: %X1.v.i1.1 = insertelement <2 x double> undef, double %B1, i32 0 +; CHECK: %X1.v.i1.2 = insertelement <2 x double> %X1.v.i1.1, double %B2, i32 1 +; CHECK: %X1.v.i0.1 = insertelement <2 x double> undef, double %A1, i32 0 +; CHECK: %X1.v.i0.2 = insertelement <2 x double> %X1.v.i0.1, double %A2, i32 1 +; CHECK: %X1 = fsub <2 x double> %X1.v.i0.2, %X1.v.i1.2 +; CHECK: %Y1.v.i2.1 = insertelement <2 x double> undef, double %C1, i32 0 +; CHECK: %Y1.v.i2.2 = insertelement <2 x double> %Y1.v.i2.1, double %C2, i32 1 +; CHECK: %Y1 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %X1, <2 x double> %X1.v.i0.2, <2 x double> %Y1.v.i2.2) +; CHECK: %Z1 = fadd <2 x double> %Y1, %X1.v.i1.2 +; CHECK: %Z1.v.r1 = extractelement <2 x double> %Z1, i32 0 +; CHECK: %Z1.v.r2 = extractelement <2 x double> %Z1, i32 1 +; CHECK: %R = fmul double %Z1.v.r1, %Z1.v.r2 +; CHECK: ret double %R +} + ; Basic depth-3 chain with cos define double @test2(double %A1, double %A2, double %B1, double %B2) { %X1 = fsub double %A1, %B1 @@ -97,7 +124,10 @@ define double @test4(double %A1, double %A2, double %B1, double %B2, i32 %P) { ; CHECK: ret double %R } -; CHECK: declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>) nounwind readnone -; CHECK: declare <2 x double> @llvm.cos.v2f64(<2 x double>) nounwind readonly -; CHECK: declare <2 x double> @llvm.powi.v2f64(<2 x double>, i32) nounwind readonly +; CHECK: declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>) #0 +; CHECK: declare <2 x double> @llvm.fmuladd.v2f64(<2 x double>, <2 x double>, <2 x double>) #0 +; CHECK: declare <2 x double> @llvm.cos.v2f64(<2 x double>) #1 +; CHECK: declare <2 x double> @llvm.powi.v2f64(<2 x double>, i32) #1 +; CHECK: attributes #0 = { nounwind readnone } +; CHECK: attributes #1 = { nounwind readonly } diff --git a/test/Transforms/BBVectorize/simple-ldstr.ll b/test/Transforms/BBVectorize/simple-ldstr.ll index 7dd77c933f6d..8e51d297e8ec 100644 --- a/test/Transforms/BBVectorize/simple-ldstr.ll +++ b/test/Transforms/BBVectorize/simple-ldstr.ll @@ -1,6 +1,6 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-aligned-only -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-AO +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-aligned-only -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-AO ; Simple 3-pair chain with loads and stores define void @test1(double* %a, double* %b, double* %c) nounwind uwtable readonly { diff --git a/test/Transforms/BBVectorize/simple-sel.ll b/test/Transforms/BBVectorize/simple-sel.ll index 15ecb597025a..8caccfd32c34 100644 --- a/test/Transforms/BBVectorize/simple-sel.ll +++ b/test/Transforms/BBVectorize/simple-sel.ll @@ -1,6 +1,6 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-no-bools -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-NB +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-no-bools -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s -check-prefix=CHECK-NB ; Basic depth-3 chain with select define double @test1(double %A1, double %A2, double %B1, double %B2, i1 %C1, i1 %C2) { diff --git a/test/Transforms/BBVectorize/simple.ll b/test/Transforms/BBVectorize/simple.ll index 3527ae75b457..a447908d16cc 100644 --- a/test/Transforms/BBVectorize/simple.ll +++ b/test/Transforms/BBVectorize/simple.ll @@ -1,5 +1,5 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s ; Basic depth-3 chain define double @test1(double %A1, double %A2, double %B1, double %B2) { diff --git a/test/Transforms/BBVectorize/simple3.ll b/test/Transforms/BBVectorize/simple3.ll index 153be73f832f..78bcc9f83080 100644 --- a/test/Transforms/BBVectorize/simple3.ll +++ b/test/Transforms/BBVectorize/simple3.ll @@ -1,5 +1,5 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-vector-bits=192 -instcombine -gvn -S | FileCheck %s +; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-vector-bits=192 -bb-vectorize-ignore-target-info -instcombine -gvn -S | FileCheck %s ; Basic depth-3 chain define double @test1(double %A1, double %A2, double %A3, double %B1, double %B2, double %B3) { diff --git a/test/Transforms/CodeGenPrepare/basic.ll b/test/Transforms/CodeGenPrepare/basic.ll index c68e77eb555a..d617e43be865 100644 --- a/test/Transforms/CodeGenPrepare/basic.ll +++ b/test/Transforms/CodeGenPrepare/basic.ll @@ -1,4 +1,4 @@ -; RUN: opt -codegenprepare %s -S -o - | FileCheck %s +; RUN: opt -codegenprepare -S < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" diff --git a/test/Transforms/ConstProp/2007-11-23-cttz.ll b/test/Transforms/ConstProp/2007-11-23-cttz.ll index 6d34cb17fffd..c5ee70c2ff12 100644 --- a/test/Transforms/ConstProp/2007-11-23-cttz.ll +++ b/test/Transforms/ConstProp/2007-11-23-cttz.ll @@ -3,6 +3,6 @@ declare i13 @llvm.cttz.i13(i13, i1) define i13 @test() { - %X = call i13 @llvm.cttz.i13(i13 0, i1 true) + %X = call i13 @llvm.cttz.i13(i13 0, i1 false) ret i13 %X } diff --git a/test/Transforms/ConstantMerge/2003-10-28-MergeExternalConstants.ll b/test/Transforms/ConstantMerge/2003-10-28-MergeExternalConstants.ll index ce79e3b2964a..a415995070e5 100644 --- a/test/Transforms/ConstantMerge/2003-10-28-MergeExternalConstants.ll +++ b/test/Transforms/ConstantMerge/2003-10-28-MergeExternalConstants.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -constmerge %s | FileCheck %s +; RUN: opt -S -constmerge < %s | FileCheck %s ; CHECK: @foo = constant i32 6 ; CHECK: @bar = constant i32 6 diff --git a/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll b/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll index f561daf66781..5aafcfe3d4fb 100644 --- a/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll +++ b/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll @@ -1,4 +1,4 @@ -; RUN: opt -constmerge %s -S -o - | FileCheck %s +; RUN: opt -constmerge -S < %s | FileCheck %s ; PR8978 declare i32 @zed(%struct.foobar*, %struct.foobar*) diff --git a/test/Transforms/ConstantMerge/merge-both.ll b/test/Transforms/ConstantMerge/merge-both.ll index b71eb437dbc3..b00345557c83 100644 --- a/test/Transforms/ConstantMerge/merge-both.ll +++ b/test/Transforms/ConstantMerge/merge-both.ll @@ -1,4 +1,4 @@ -; RUN: opt -constmerge %s -S -o - | FileCheck %s +; RUN: opt -constmerge -S < %s | FileCheck %s ; Test that in one run var3 is merged into var2 and var1 into var4. ; Test that we merge @var5 and @var6 into one with the higher alignment, and ; don't merge var7/var8 into var5/var6. diff --git a/test/Transforms/ConstantMerge/unnamed-addr.ll b/test/Transforms/ConstantMerge/unnamed-addr.ll index 24100837aabd..aff8540f2cb1 100644 --- a/test/Transforms/ConstantMerge/unnamed-addr.ll +++ b/test/Transforms/ConstantMerge/unnamed-addr.ll @@ -1,4 +1,4 @@ -; RUN: opt -constmerge %s -S -o - | FileCheck %s +; RUN: opt -constmerge -S < %s | FileCheck %s ; Test which corresponding x and y are merged and that unnamed_addr ; is correctly set. diff --git a/test/Transforms/CorrelatedValuePropagation/basic.ll b/test/Transforms/CorrelatedValuePropagation/basic.ll index 475cd8d772e6..39c437ccfae9 100644 --- a/test/Transforms/CorrelatedValuePropagation/basic.ll +++ b/test/Transforms/CorrelatedValuePropagation/basic.ll @@ -81,6 +81,26 @@ LessThanOrEqualToTwo: ret i32 0 } +declare i32* @f(i32*) +define void @test5(i32* %x, i32* %y) { +; CHECK: @test5 +entry: + %pre = icmp eq i32* %x, null + br i1 %pre, label %return, label %loop + +loop: + %phi = phi i32* [ %sel, %loop ], [ %x, %entry ] +; CHECK: %phi = phi i32* [ %f, %loop ], [ %x, %entry ] + %f = tail call i32* @f(i32* %phi) + %cmp1 = icmp ne i32* %f, %y + %sel = select i1 %cmp1, i32* %f, i32* null + %cmp2 = icmp eq i32* %sel, null + br i1 %cmp2, label %return, label %loop + +return: + ret void +} + define i32 @switch1(i32 %s) { ; CHECK: @switch1 entry: @@ -105,7 +125,7 @@ negative: ] out: - %p = phi i32 [ 1, %entry ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ] + %p = phi i32 [ 1, %entry ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ] ret i32 %p next: diff --git a/test/Transforms/DeadArgElim/2007-12-20-ParamAttrs.ll b/test/Transforms/DeadArgElim/2007-12-20-ParamAttrs.ll index 7c6c575ea80f..f049265ce4ea 100644 --- a/test/Transforms/DeadArgElim/2007-12-20-ParamAttrs.ll +++ b/test/Transforms/DeadArgElim/2007-12-20-ParamAttrs.ll @@ -1,20 +1,20 @@ -; RUN: opt < %s -deadargelim -S > %t -; RUN: cat %t | grep nounwind | count 2 -; RUN: cat %t | grep signext | count 2 -; RUN: cat %t | not grep inreg -; RUN: cat %t | not grep zeroext -; RUN: cat %t | not grep byval +; RUN: opt < %s -deadargelim -S | FileCheck %s - %struct = type { } +%struct = type { } @g = global i8 0 +; CHECK: define internal void @foo(i8 signext %y) [[NUW:#[0-9]+]] + define internal zeroext i8 @foo(i8* inreg %p, i8 signext %y, ... ) nounwind { - store i8 %y, i8* @g - ret i8 0 + store i8 %y, i8* @g + ret i8 0 } define i32 @bar() { - %A = call zeroext i8(i8*, i8, ...)* @foo(i8* inreg null, i8 signext 1, %struct* byval null ) nounwind - ret i32 0 +; CHECK: call void @foo(i8 signext 1) [[NUW]] + %A = call zeroext i8(i8*, i8, ...)* @foo(i8* inreg null, i8 signext 1, %struct* byval null ) nounwind + ret i32 0 } + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/DeadArgElim/2010-04-30-DbgInfo.ll b/test/Transforms/DeadArgElim/2010-04-30-DbgInfo.ll index 2f820bad8474..f5d2588dd059 100644 --- a/test/Transforms/DeadArgElim/2010-04-30-DbgInfo.ll +++ b/test/Transforms/DeadArgElim/2010-04-30-DbgInfo.ll @@ -8,14 +8,14 @@ entry: call void @llvm.dbg.value(metadata !{i32 %len}, i64 0, metadata !10) call void @llvm.dbg.value(metadata !{i32 %hash}, i64 0, metadata !11) call void @llvm.dbg.value(metadata !{i32 %flags}, i64 0, metadata !12) -; CHECK: call fastcc i8* @add_name_internal(i8* %name, i32 %hash) nounwind, !dbg !13 +; CHECK: call fastcc i8* @add_name_internal(i8* %name, i32 %hash) [[NUW:#[0-9]+]], !dbg !13 %0 = call fastcc i8* @add_name_internal(i8* %name, i32 %len, i32 %hash, i8 zeroext 0, i32 %flags) nounwind, !dbg !13 ; <i8*> [#uses=1] ret i8* %0, !dbg !13 } declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone -define internal fastcc i8* @add_name_internal(i8* %name, i32 %len, i32 %hash, i8 zeroext %extra, i32 %flags) nounwind noinline ssp { +define internal fastcc i8* @add_name_internal(i8* %name, i32 %len, i32 %hash, i8 zeroext %extra, i32 %flags) noinline nounwind ssp { entry: call void @llvm.dbg.value(metadata !{i8* %name}, i64 0, metadata !15) call void @llvm.dbg.value(metadata !{i32 %len}, i64 0, metadata !20) @@ -38,6 +38,11 @@ bb2: ; preds = %bb1, %bb declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone +; CHECK: attributes #0 = { nounwind ssp } +; CHECK: attributes #1 = { nounwind readnone } +; CHECK: attributes #2 = { noinline nounwind ssp } +; CHECK: attributes [[NUW]] = { nounwind } + !0 = metadata !{i32 524545, metadata !1, metadata !"name", metadata !2, i32 8, metadata !6} ; [ DW_TAG_arg_variable ] !1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"vfs_addname", metadata !"vfs_addname", metadata !"vfs_addname", metadata !2, i32 12, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] !2 = metadata !{i32 524329, metadata !"tail.c", metadata !"/Users/echeng/LLVM/radars/r7927803/", metadata !3} ; [ DW_TAG_file_type ] diff --git a/test/Transforms/DeadArgElim/dbginfo.ll b/test/Transforms/DeadArgElim/dbginfo.ll index dcbfaaa3d77b..24448b7009ed 100644 --- a/test/Transforms/DeadArgElim/dbginfo.ll +++ b/test/Transforms/DeadArgElim/dbginfo.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -deadargelim -S | FileCheck %s +; RUN: opt -deadargelim -S < %s | FileCheck %s ; PR14016 ; Check that debug info metadata for subprograms stores pointers to @@ -36,19 +36,17 @@ entry: !llvm.dbg.cu = !{!0} -!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"test.cc", metadata !"/home/samsonov/tmp/clang-di", metadata !"clang version 3.2 (trunk 165305)", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] [/home/samsonov/tmp/clang-di/test.cc] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !2} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !5, metadata !8, metadata !9} -!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"run", metadata !"run", metadata !"", metadata !6, i32 8, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3runv, null, null, metadata !1, i32 8} ; [ DW_TAG_subprogram ] [line 8] [def] [run] -!6 = metadata !{i32 786473, metadata !"test.cc", metadata !"/home/samsonov/tmp/clang-di", null} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!8 = metadata !{i32 786478, i32 0, metadata !6, metadata !"dead_vararg", metadata !"dead_vararg", metadata !"", metadata !6, i32 5, metadata !7, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (...)* @_ZN12_GLOBAL__N_111dead_varargEz, null, null, metadata !1, i32 5} ; [ DW_TAG_subprogram ] [line 5] [local] [def] [dead_vararg] +!0 = metadata !{i32 786449, i32 4, metadata !6, metadata !"clang version 3.2 (trunk 165305)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/samsonov/tmp/clang-di/test.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 0} +!3 = metadata !{metadata !5, metadata !8, metadata !9} +!5 = metadata !{i32 786478, metadata !6, metadata !"run", metadata !"run", metadata !"", metadata !6, i32 8, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3runv, null, null, metadata !1, i32 8} ; [ DW_TAG_subprogram ] [line 8] [def] [run] +!6 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !1, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{i32 786478, metadata !6, metadata !"dead_vararg", metadata !"dead_vararg", metadata !"", metadata !6, i32 5, metadata !7, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (...)* @_ZN12_GLOBAL__N_111dead_varargEz, null, null, metadata !1, i32 5} ; [ DW_TAG_subprogram ] [line 5] [local] [def] [dead_vararg] ; CHECK: metadata !"dead_vararg"{{.*}}void ()* @_ZN12_GLOBAL__N_111dead_varargEz -!9 = metadata !{i32 786478, i32 0, metadata !6, metadata !"dead_arg", metadata !"dead_arg", metadata !"", metadata !6, i32 4, metadata !7, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*)* @_ZN12_GLOBAL__N_18dead_argEPv, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] [line 4] [local] [def] [dead_arg] +!9 = metadata !{i32 786478, metadata !6, metadata !"dead_arg", metadata !"dead_arg", metadata !"", metadata !6, i32 4, metadata !7, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*)* @_ZN12_GLOBAL__N_18dead_argEPv, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] [line 4] [local] [def] [dead_arg] ; CHECK: metadata !"dead_arg"{{.*}}void ()* @_ZN12_GLOBAL__N_18dead_argEPv @@ -62,3 +60,4 @@ entry: !17 = metadata !{i32 5, i32 25, metadata !18, null} !18 = metadata !{i32 786443, metadata !8, i32 5, i32 23, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] [/home/samsonov/tmp/clang-di/test.cc] !19 = metadata !{i32 5, i32 30, metadata !18, null} +!20 = metadata !{metadata !"test.cc", metadata !"/home/samsonov/tmp/clang-di"} diff --git a/test/Transforms/DeadArgElim/deadexternal.ll b/test/Transforms/DeadArgElim/deadexternal.ll index e3fe1bbb548b..cca58721e532 100644 --- a/test/Transforms/DeadArgElim/deadexternal.ll +++ b/test/Transforms/DeadArgElim/deadexternal.ll @@ -1,4 +1,4 @@ -; RUN: opt -deadargelim -S %s | FileCheck %s +; RUN: opt -deadargelim -S < %s | FileCheck %s define void @test(i32) { ret void diff --git a/test/Transforms/DeadArgElim/keepalive.ll b/test/Transforms/DeadArgElim/keepalive.ll index dc92dc9f171a..e41110c96ef4 100644 --- a/test/Transforms/DeadArgElim/keepalive.ll +++ b/test/Transforms/DeadArgElim/keepalive.ll @@ -1,6 +1,4 @@ -; RUN: opt < %s -deadargelim -S > %t -; RUN: grep "define internal zeroext i32 @test1() nounwind" %t -; RUN: grep "define internal <{ i32, i32 }> @test2" %t +; RUN: opt < %s -deadargelim -S | FileCheck %s %Ty = type <{ i32, i32 }> @@ -9,11 +7,13 @@ ; the function and then changing too much. ; This checks if the return value attributes are not removed +; CHECK: define internal zeroext i32 @test1() #0 define internal zeroext i32 @test1(i32 %DEADARG1) nounwind { ret i32 1 } ; This checks if the struct doesn't get non-packed +; CHECK: define internal <{ i32, i32 }> @test2 define internal <{ i32, i32 }> @test2(i32 %DEADARG1) { ret <{ i32, i32 }> <{ i32 1, i32 2 }> } @@ -28,3 +28,4 @@ define void @caller() { ret void } +; CHECK: attributes #0 = { nounwind } diff --git a/test/Transforms/DeadStoreElimination/const-pointers.ll b/test/Transforms/DeadStoreElimination/const-pointers.ll index 7d57804631da..15976f9f10d4 100644 --- a/test/Transforms/DeadStoreElimination/const-pointers.ll +++ b/test/Transforms/DeadStoreElimination/const-pointers.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -basicaa -dse -S | FileCheck %s +; RUN: opt -basicaa -dse -S < %s | FileCheck %s %t = type { i32 } diff --git a/test/Transforms/DeadStoreElimination/dominate.ll b/test/Transforms/DeadStoreElimination/dominate.ll index 284fea4234fc..38cf1a066dae 100644 --- a/test/Transforms/DeadStoreElimination/dominate.ll +++ b/test/Transforms/DeadStoreElimination/dominate.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -dse -disable-output +; RUN: opt -dse -disable-output < %s ; test that we don't crash declare void @bar() diff --git a/test/Transforms/DeadStoreElimination/no-targetdata.ll b/test/Transforms/DeadStoreElimination/no-targetdata.ll index 6c7f940316a0..4022d76dcb52 100644 --- a/test/Transforms/DeadStoreElimination/no-targetdata.ll +++ b/test/Transforms/DeadStoreElimination/no-targetdata.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -basicaa -dse -S | FileCheck %s +; RUN: opt -basicaa -dse -S < %s | FileCheck %s declare void @test1f() diff --git a/test/Transforms/DeadStoreElimination/pr11390.ll b/test/Transforms/DeadStoreElimination/pr11390.ll index 2ce6eea365aa..f63aa1eb8aae 100644 --- a/test/Transforms/DeadStoreElimination/pr11390.ll +++ b/test/Transforms/DeadStoreElimination/pr11390.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -dse -S -o - %s | FileCheck %s +; RUN: opt -basicaa -dse -S < %s | FileCheck %s ; PR11390 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/Transforms/EarlyCSE/commute.ll b/test/Transforms/EarlyCSE/commute.ll index f84a7dd1aae9..8cf04d1765b9 100644 --- a/test/Transforms/EarlyCSE/commute.ll +++ b/test/Transforms/EarlyCSE/commute.ll @@ -19,9 +19,9 @@ define void @test2(float %A, float %B, i1* %PA, i1* %PB) { ; CHECK-NEXT: store ; CHECK-NEXT: store ; CHECK-NEXT: ret - %C = fcmp eq float %A, %B + %C = fcmp oeq float %A, %B store i1 %C, i1* %PA - %D = fcmp eq float %B, %A + %D = fcmp oeq float %B, %A store i1 %D, i1* %PB ret void } diff --git a/test/Transforms/EarlyCSE/floatingpoint.ll b/test/Transforms/EarlyCSE/floatingpoint.ll new file mode 100644 index 000000000000..2abecd74b63a --- /dev/null +++ b/test/Transforms/EarlyCSE/floatingpoint.ll @@ -0,0 +1,14 @@ +; RUN: opt < %s -S -early-cse | FileCheck %s + +; Ensure we don't simplify away additions vectors of +0.0's (same as scalars). +define <4 x float> @fV( <4 x float> %a) { + ; CHECK: %b = fadd <4 x float> %a, zeroinitializer + %b = fadd <4 x float> %a, <float 0.0,float 0.0,float 0.0,float 0.0> + ret <4 x float> %b +} + +define <4 x float> @fW( <4 x float> %a) { + ; CHECK: ret <4 x float> %a + %b = fadd <4 x float> %a, <float -0.0,float -0.0,float -0.0,float -0.0> + ret <4 x float> %b +} diff --git a/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll b/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll index 946453f586ed..36a765873487 100644 --- a/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll +++ b/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll @@ -1,18 +1,24 @@ -; RUN: opt < %s -basicaa -functionattrs -S | grep readnone | count 4 +; RUN: opt < %s -basicaa -functionattrs -S | FileCheck %s @x = global i32 0 +; CHECK: declare i32 @e() #0 declare i32 @e() readnone +; CHECK: define i32 @f() #0 define i32 @f() { %tmp = call i32 @e( ) ; <i32> [#uses=1] ret i32 %tmp } +; CHECK: define i32 @g() #0 define i32 @g() readonly { ret i32 0 } +; CHECK: define i32 @h() #0 define i32 @h() readnone { %tmp = load i32* @x ; <i32> [#uses=1] ret i32 %tmp } + +; CHECK: attributes #0 = { readnone } diff --git a/test/Transforms/FunctionAttrs/2008-09-03-ReadOnly.ll b/test/Transforms/FunctionAttrs/2008-09-03-ReadOnly.ll index 22eca1320415..d8256ae8e647 100644 --- a/test/Transforms/FunctionAttrs/2008-09-03-ReadOnly.ll +++ b/test/Transforms/FunctionAttrs/2008-09-03-ReadOnly.ll @@ -1,9 +1,13 @@ -; RUN: opt < %s -basicaa -functionattrs -S | grep readonly | count 2 +; RUN: opt < %s -basicaa -functionattrs -S | FileCheck %s +; CHECK: define i32 @f() #0 define i32 @f() { entry: - %tmp = call i32 @e( ) ; <i32> [#uses=1] - ret i32 %tmp + %tmp = call i32 @e( ) + ret i32 %tmp } +; CHECK: declare i32 @e() #0 declare i32 @e() readonly + +; CHECK: attributes #0 = { readonly } diff --git a/test/Transforms/FunctionAttrs/2009-01-04-Annotate.ll b/test/Transforms/FunctionAttrs/2009-01-04-Annotate.ll new file mode 100644 index 000000000000..d414b73524fd --- /dev/null +++ b/test/Transforms/FunctionAttrs/2009-01-04-Annotate.ll @@ -0,0 +1,21 @@ +; RUN: opt < %s -functionattrs -S | FileCheck %s + +; CHECK: declare noalias i8* @fopen(i8* nocapture, i8* nocapture) #0 +declare i8* @fopen(i8*, i8*) + +; CHECK: declare i8 @strlen(i8* nocapture) #1 +declare i8 @strlen(i8*) + +; CHECK: declare noalias i32* @realloc(i32* nocapture, i32) #0 +declare i32* @realloc(i32*, i32) + +; Test deliberately wrong declaration +declare i32 @strcpy(...) + +; CHECK-NOT: strcpy{{.*}}noalias +; CHECK-NOT: strcpy{{.*}}nocapture +; CHECK-NOT: strcpy{{.*}}nounwind +; CHECK-NOT: strcpy{{.*}}readonly + +; CHECK: attributes #0 = { nounwind } +; CHECK: attributes #1 = { nounwind readonly } diff --git a/test/Transforms/FunctionAttrs/annotate-1.ll b/test/Transforms/FunctionAttrs/annotate-1.ll new file mode 100644 index 000000000000..ae77380acc4a --- /dev/null +++ b/test/Transforms/FunctionAttrs/annotate-1.ll @@ -0,0 +1,18 @@ +; RUN: opt < %s -functionattrs -S | FileCheck %s + +declare i8* @fopen(i8*, i8*) +; CHECK: declare noalias i8* @fopen(i8* nocapture, i8* nocapture) [[G0:#[0-9]]] + +declare i8 @strlen(i8*) +; CHECK: declare i8 @strlen(i8* nocapture) [[G1:#[0-9]]] + +declare i32* @realloc(i32*, i32) +; CHECK: declare noalias i32* @realloc(i32* nocapture, i32) [[G0]] + +; Test deliberately wrong declaration + +declare i32 @strcpy(...) +; CHECK: declare i32 @strcpy(...) + +; CHECK: attributes [[G0]] = { nounwind } +; CHECK: attributes [[G1]] = { nounwind readonly } diff --git a/test/Transforms/FunctionAttrs/atomic.ll b/test/Transforms/FunctionAttrs/atomic.ll index 7c2bff7a05f7..027ee0fd06a2 100644 --- a/test/Transforms/FunctionAttrs/atomic.ll +++ b/test/Transforms/FunctionAttrs/atomic.ll @@ -3,7 +3,7 @@ ; Atomic load/store to local doesn't affect whether a function is ; readnone/readonly. define i32 @test1(i32 %x) uwtable ssp { -; CHECK: define i32 @test1(i32 %x) uwtable readnone ssp { +; CHECK: define i32 @test1(i32 %x) #0 { entry: %x.addr = alloca i32, align 4 store atomic i32 %x, i32* %x.addr seq_cst, align 4 @@ -13,9 +13,11 @@ entry: ; A function with an Acquire load is not readonly. define i32 @test2(i32* %x) uwtable ssp { -; CHECK: define i32 @test2(i32* nocapture %x) uwtable ssp { +; CHECK: define i32 @test2(i32* nocapture %x) #1 { entry: %r = load atomic i32* %x seq_cst, align 4 ret i32 %r } +; CHECK: attributes #0 = { readnone ssp uwtable } +; CHECK: attributes #1 = { ssp uwtable } diff --git a/test/Transforms/FunctionAttrs/noreturn.ll b/test/Transforms/FunctionAttrs/noreturn.ll new file mode 100644 index 000000000000..470ebcb1d3cd --- /dev/null +++ b/test/Transforms/FunctionAttrs/noreturn.ll @@ -0,0 +1,18 @@ +; RUN: opt < %s -functionattrs -instcombine -S | FileCheck %s + +define void @endless_loop() noreturn nounwind readnone ssp uwtable { +entry: + br label %while.body + +while.body: + br label %while.body +} +;CHECK: @main +;CHECK: endless_loop +;CHECK: ret +define i32 @main() noreturn nounwind ssp uwtable { +entry: + tail call void @endless_loop() + unreachable +} + diff --git a/test/Transforms/GCOVProfiling/linkagename.ll b/test/Transforms/GCOVProfiling/linkagename.ll new file mode 100644 index 000000000000..d1bce728e08c --- /dev/null +++ b/test/Transforms/GCOVProfiling/linkagename.ll @@ -0,0 +1,27 @@ +; RUN: echo '!9 = metadata !{metadata !"%T/linkagename.ll", metadata !0}' > %t1 +; RUN: cat %s %t1 > %t2 +; RUN: opt -insert-gcov-profiling -disable-output < %t2 +; RUN: grep _Z3foov %T/linkagename.gcno +; RUN: rm %T/linkagename.gcno + +; REQUIRES: shell + +define void @_Z3foov() { +entry: + ret void, !dbg !8 +} + +!llvm.dbg.cu = !{!0} +!llvm.gcov = !{!9} + +!0 = metadata !{i32 786449, i32 4, metadata !1, metadata !"clang version 3.3 (trunk 177323)", i1 false, metadata !"", i32 0, metadata !3, metadata !3, metadata !4, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/home/nlewycky/hello.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{i32 786473, metadata !2} ; [ DW_TAG_file_type ] [/home/nlewycky/hello.cc] +!2 = metadata !{metadata !"hello.cc", metadata !"/home/nlewycky"} +!3 = metadata !{i32 0} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"foo", metadata !"foo", metadata !"_Z3foov", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3foov, null, null, metadata !3, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!6 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{i32 1, i32 0, metadata !5, null} + + diff --git a/test/Transforms/GCOVProfiling/lit.local.cfg b/test/Transforms/GCOVProfiling/lit.local.cfg new file mode 100644 index 000000000000..19eebc0ac7ac --- /dev/null +++ b/test/Transforms/GCOVProfiling/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.ll', '.c', '.cpp'] diff --git a/test/Transforms/GCOVProfiling/version.ll b/test/Transforms/GCOVProfiling/version.ll new file mode 100644 index 000000000000..d6d0f3314c26 --- /dev/null +++ b/test/Transforms/GCOVProfiling/version.ll @@ -0,0 +1,29 @@ +; RUN: echo '!9 = metadata !{metadata !"%T/version.ll", metadata !0}' > %t1 +; RUN: cat %s %t1 > %t2 +; RUN: opt -insert-gcov-profiling -disable-output < %t2 +; RUN: head -c12 %T/version.gcno | grep '^oncg\*204MVLL$' +; RUN: rm %T/version.gcno +; RUN: not opt -insert-gcov-profiling -default-gcov-version=asdfasdf -disable-output < %t2 +; RUN: opt -insert-gcov-profiling -default-gcov-version=407* -disable-output < %t2 +; RUN: head -c12 %T/version.gcno | grep '^oncg\*704MVLL$' +; RUN: rm %T/version.gcno + +define void @test() { + ret void, !dbg !8 +} + +; REQUIRES: shell + +!llvm.gcov = !{!9} +!llvm.dbg.cu = !{!0} + +!0 = metadata !{metadata !"./version", metadata !1} +!1 = metadata !{i32 786449, i32 0, i32 4, metadata !2, metadata !"clang version 3.3 (trunk 176994)", i1 false, metadata !"", i32 0, metadata !3, metadata !3, metadata !4, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [./version] [DW_LANG_C_plus_plus] +!2 = metadata !{i32 786473, metadata !"version", metadata !"/usr/local/google/home/nlewycky"} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 0} +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"test", metadata !"test", metadata !"", metadata !6, i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @test, null, null, metadata !3, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [test] +!6 = metadata !{i32 786473, metadata !"<stdin>", metadata !"."} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !3, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{i32 1, i32 0, metadata !5, null} +;; !9 is added through the echo line at the top. diff --git a/test/Transforms/GVN/2011-04-27-phioperands.ll b/test/Transforms/GVN/2011-04-27-phioperands.ll index 6e5075db7c8e..42c46500c483 100644 --- a/test/Transforms/GVN/2011-04-27-phioperands.ll +++ b/test/Transforms/GVN/2011-04-27-phioperands.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -gvn -disable-output +; RUN: opt -gvn -disable-output < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-f128:128:128-n8:16:32:64" diff --git a/test/Transforms/GVN/MemdepMiscompile.ll b/test/Transforms/GVN/MemdepMiscompile.ll new file mode 100644 index 000000000000..d42016961575 --- /dev/null +++ b/test/Transforms/GVN/MemdepMiscompile.ll @@ -0,0 +1,54 @@ +; RUN: opt < %s -basicaa -gvn -S | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-apple-macosx10.7.0" + +; rdar://12801584 +; Value of %shouldExit can be changed by RunInMode. +; Make sure we do not replace load %shouldExit in while.cond.backedge +; with a phi node where the value from while.body is 0. +define i32 @test() nounwind ssp { +entry: +; CHECK: test() +; CHECK: while.body: +; CHECK: call void @RunInMode +; CHECK: br i1 %tobool, label %while.cond.backedge, label %if.then +; CHECK: while.cond.backedge: +; CHECK: load i32* %shouldExit +; CHECK: br i1 %cmp, label %while.body + %shouldExit = alloca i32, align 4 + %tasksIdle = alloca i32, align 4 + store i32 0, i32* %shouldExit, align 4 + store i32 0, i32* %tasksIdle, align 4 + call void @CTestInitialize(i32* %tasksIdle) nounwind + %0 = load i32* %shouldExit, align 4 + %cmp1 = icmp eq i32 %0, 0 + br i1 %cmp1, label %while.body.lr.ph, label %while.end + +while.body.lr.ph: + br label %while.body + +while.body: + call void @RunInMode(i32 100) nounwind + %1 = load i32* %tasksIdle, align 4 + %tobool = icmp eq i32 %1, 0 + br i1 %tobool, label %while.cond.backedge, label %if.then + +if.then: + store i32 0, i32* %tasksIdle, align 4 + call void @TimerCreate(i32* %shouldExit) nounwind + br label %while.cond.backedge + +while.cond.backedge: + %2 = load i32* %shouldExit, align 4 + %cmp = icmp eq i32 %2, 0 + br i1 %cmp, label %while.body, label %while.cond.while.end_crit_edge + +while.cond.while.end_crit_edge: + br label %while.end + +while.end: + ret i32 0 +} +declare void @CTestInitialize(i32*) +declare void @RunInMode(i32) +declare void @TimerCreate(i32*) diff --git a/test/Transforms/GVN/crash-no-aa.ll b/test/Transforms/GVN/crash-no-aa.ll index dae65ddb2fe7..9ad63a7350c2 100644 --- a/test/Transforms/GVN/crash-no-aa.ll +++ b/test/Transforms/GVN/crash-no-aa.ll @@ -1,7 +1,6 @@ -; RUN: opt -no-aa -gvn -S %s +; RUN: opt -no-aa -gvn -S < %s -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v1 -28:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-freebsd8.0" ; PR5744 diff --git a/test/Transforms/GVN/crash.ll b/test/Transforms/GVN/crash.ll index 4a8c8e4589c8..9fb612fcae13 100644 --- a/test/Transforms/GVN/crash.ll +++ b/test/Transforms/GVN/crash.ll @@ -1,4 +1,4 @@ -; RUN: opt -gvn %s -disable-output +; RUN: opt -gvn -disable-output < %s ; PR5631 diff --git a/test/Transforms/GVN/edge.ll b/test/Transforms/GVN/edge.ll index 32392f3ab0c8..3a102b6c3539 100644 --- a/test/Transforms/GVN/edge.ll +++ b/test/Transforms/GVN/edge.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -gvn -S -o - | FileCheck %s +; RUN: opt -gvn -S < %s | FileCheck %s define i32 @f1(i32 %x) { ; CHECK: define i32 @f1( diff --git a/test/Transforms/GVN/fpmath.ll b/test/Transforms/GVN/fpmath.ll index 8ab285448fbb..403df5c9008a 100644 --- a/test/Transforms/GVN/fpmath.ll +++ b/test/Transforms/GVN/fpmath.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -gvn -S -o - | FileCheck %s +; RUN: opt -gvn -S < %s | FileCheck %s define double @test1(double %x, double %y) { ; CHECK: @test1(double %x, double %y) diff --git a/test/Transforms/GVN/lpre-call-wrap-2.ll b/test/Transforms/GVN/lpre-call-wrap-2.ll index e39f3ed87d1c..35e3534a9c89 100644 --- a/test/Transforms/GVN/lpre-call-wrap-2.ll +++ b/test/Transforms/GVN/lpre-call-wrap-2.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -basicaa -gvn -enable-load-pre %s | FileCheck %s +; RUN: opt -S -basicaa -gvn -enable-load-pre < %s | FileCheck %s ; ; The partially redundant load in bb1 should be hoisted to "bb". This comes ; from this C code (GCC PR 23455): diff --git a/test/Transforms/GVN/lpre-call-wrap.ll b/test/Transforms/GVN/lpre-call-wrap.ll index 40462798b534..0646f3fe0aad 100644 --- a/test/Transforms/GVN/lpre-call-wrap.ll +++ b/test/Transforms/GVN/lpre-call-wrap.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -gvn -enable-load-pre %s | FileCheck %s +; RUN: opt -S -gvn -enable-load-pre < %s | FileCheck %s ; ; Make sure the load in bb3.backedge is removed and moved into bb1 after the ; call. This makes the non-call case faster. diff --git a/test/Transforms/GVN/nonescaping-malloc.ll b/test/Transforms/GVN/nonescaping-malloc.ll index afcb7fe3bb0f..c2eeed56ffc1 100644 --- a/test/Transforms/GVN/nonescaping-malloc.ll +++ b/test/Transforms/GVN/nonescaping-malloc.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -basicaa -gvn -stats -disable-output 2>&1 | grep "Number of loads deleted" ; rdar://7363102 diff --git a/test/Transforms/GVN/null-aliases-nothing.ll b/test/Transforms/GVN/null-aliases-nothing.ll index 9e4ae18c710c..37bf09d7f3ff 100644 --- a/test/Transforms/GVN/null-aliases-nothing.ll +++ b/test/Transforms/GVN/null-aliases-nothing.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -basicaa -gvn -S | FileCheck %s +; RUN: opt < %s -basicaa -gvn -S | FileCheck %s %t = type { i32 } declare void @test1f(i8*) diff --git a/test/Transforms/GVN/pr12979.ll b/test/Transforms/GVN/pr12979.ll index 669da9127d0b..0198a56513ea 100644 --- a/test/Transforms/GVN/pr12979.ll +++ b/test/Transforms/GVN/pr12979.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -gvn -S -o - | FileCheck %s +; RUN: opt -gvn -S < %s | FileCheck %s define i32 @test1(i32 %x, i32 %y) { ; CHECK: @test1(i32 %x, i32 %y) diff --git a/test/Transforms/GVN/range.ll b/test/Transforms/GVN/range.ll index 3759c415dabc..2115fe85661e 100644 --- a/test/Transforms/GVN/range.ll +++ b/test/Transforms/GVN/range.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -basicaa -gvn -S -o - | FileCheck %s +; RUN: opt -basicaa -gvn -S < %s | FileCheck %s define i32 @test1(i32* %p) { ; CHECK: @test1(i32* %p) diff --git a/test/Transforms/GVN/rle.ll b/test/Transforms/GVN/rle.ll index 72fa819d1c73..f470ed88bb9c 100644 --- a/test/Transforms/GVN/rle.ll +++ b/test/Transforms/GVN/rle.ll @@ -254,14 +254,11 @@ Cont: %A = load i8* %P3 ret i8 %A -;; FIXME: This is disabled because this caused a miscompile in the llvm-gcc -;; bootstrap, see r82411 -; -; HECK: @coerce_mustalias_nonlocal1 -; HECK: Cont: -; HECK: %A = phi i8 [ -; HECK-NOT: load -; HECK: ret i8 %A +; CHECK: @coerce_mustalias_nonlocal1 +; CHECK: Cont: +; CHECK: %A = phi i8 [ +; CHECK-NOT: load +; CHECK: ret i8 %A } diff --git a/test/Transforms/GVN/tbaa.ll b/test/Transforms/GVN/tbaa.ll index 90661c62507b..85fe39a93b01 100644 --- a/test/Transforms/GVN/tbaa.ll +++ b/test/Transforms/GVN/tbaa.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -basicaa -gvn -S -o - | FileCheck %s +; RUN: opt -basicaa -gvn -S < %s | FileCheck %s define i32 @test1(i8* %p, i8* %q) { ; CHECK: @test1(i8* %p, i8* %q) diff --git a/test/Transforms/GlobalOpt/2009-03-05-dbg.ll b/test/Transforms/GlobalOpt/2009-03-05-dbg.ll index 0f3efa09a1da..e71aed9e05ff 100644 --- a/test/Transforms/GlobalOpt/2009-03-05-dbg.ll +++ b/test/Transforms/GlobalOpt/2009-03-05-dbg.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -globalopt -stats -disable-output 2>&1 | grep "1 globalopt - Number of global vars shrunk to booleans" @Stop = internal global i32 0 ; <i32*> [#uses=3] diff --git a/test/Transforms/GlobalOpt/2010-02-25-MallocPromote.ll b/test/Transforms/GlobalOpt/2010-02-25-MallocPromote.ll index 27352fa29066..629d57c88424 100644 --- a/test/Transforms/GlobalOpt/2010-02-25-MallocPromote.ll +++ b/test/Transforms/GlobalOpt/2010-02-25-MallocPromote.ll @@ -1,5 +1,5 @@ ; PR6422 -; RUN: opt -globalopt -S %s +; RUN: opt -globalopt -S < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/Transforms/GlobalOpt/2010-02-26-MallocSROA.ll b/test/Transforms/GlobalOpt/2010-02-26-MallocSROA.ll index 6f1996a867e3..ab7721fd9720 100644 --- a/test/Transforms/GlobalOpt/2010-02-26-MallocSROA.ll +++ b/test/Transforms/GlobalOpt/2010-02-26-MallocSROA.ll @@ -1,4 +1,4 @@ -; RUN: opt -globalopt -S %s +; RUN: opt -globalopt -S < %s ; PR6435 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/Transforms/GlobalOpt/crash-2.ll b/test/Transforms/GlobalOpt/crash-2.ll new file mode 100644 index 000000000000..684f6cee180b --- /dev/null +++ b/test/Transforms/GlobalOpt/crash-2.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -globalopt -disable-output +; NOTE: This needs to run through 'llvm-as' first to reproduce the error! +; PR15440 + +%union.U5.0.6.12 = type { i32 } +%struct.S0.1.7.13 = type { i8, i8, i8, i8, i16, [2 x i8] } +%struct.S1.2.8.14 = type { i32, i16, i8, i8 } + +@.str = external unnamed_addr constant [2 x i8], align 1 +@g_25 = external global i8, align 1 +@g_71 = internal global %struct.S0.1.7.13 { i8 1, i8 -93, i8 58, i8 -1, i16 -5, [2 x i8] undef }, align 4 +@g_114 = external global i8, align 1 +@g_30 = external global { i32, i8, i32, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 }, align 4 +@g_271 = internal global [7 x [6 x [5 x i8*]]] [[6 x [5 x i8*]] [[5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* null], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_114, i8* @g_114, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* null, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* null, i8* null], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* null, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25, i8* @g_114, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)]], [6 x [5 x i8*]] [[5 x i8*] [i8* @g_25, i8* null, i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* @g_25, i8* @g_114, i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_114], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25], [5 x i8*] [i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_114, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* @g_25, i8* @g_25, i8* @g_25], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)]], [6 x [5 x i8*]] [[5 x i8*] [i8* null, i8* @g_25, i8* @g_25, i8* @g_25, i8* null], [5 x i8*] [i8* @g_25, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1)], [5 x i8*] [i8* null, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* null, i8* @g_25], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_114, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1)], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* null, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* null], [5 x i8*] [i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)]], [6 x [5 x i8*]] [[5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* null, i8* @g_25], [5 x i8*] [i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* @g_25, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* @g_25], [5 x i8*] [i8* @g_114, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_114], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* @g_114, i8* @g_25, i8* @g_25, i8* @g_114, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)]], [6 x [5 x i8*]] [[5 x i8*] [i8* @g_25, i8* null, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* @g_25], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1)], [5 x i8*] [i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1)], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_114], [5 x i8*] [i8* @g_25, i8* null, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* null], [5 x i8*] [i8* @g_114, i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_114, i8* @g_25]], [6 x [5 x i8*]] [[5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* null, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* null, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1)], [5 x i8*] [i8* @g_114, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0)], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25]], [6 x [5 x i8*]] [[5 x i8*] [i8* @g_25, i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* null], [5 x i8*] [i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_114, i8* @g_25, i8* @g_25, i8* @g_114], [5 x i8*] [i8* null, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_25, i8* null, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1)], [5 x i8*] [i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_114, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* @g_114, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1)], [5 x i8*] [i8* @g_25, i8* @g_25, i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25], [5 x i8*] [i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25, i8* @g_25, i8* getelementptr (i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), i64 1), i8* @g_25]]], align 4 + +define i32 @func() { + %tmp = load i8* getelementptr inbounds (%struct.S0.1.7.13* @g_71, i32 0, i32 0), align 1 + ret i32 0 +} diff --git a/test/Transforms/GlobalOpt/crash.ll b/test/Transforms/GlobalOpt/crash.ll index 366a874f7352..80c777ccabc1 100644 --- a/test/Transforms/GlobalOpt/crash.ll +++ b/test/Transforms/GlobalOpt/crash.ll @@ -1,4 +1,4 @@ -; RUN: opt -globalopt -disable-output %s +; RUN: opt -globalopt -disable-output < %s target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" target triple = "i386-apple-darwin9.8" diff --git a/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll b/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll index e3bc473f52ad..c9076109443d 100644 --- a/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll +++ b/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll @@ -1,4 +1,4 @@ -; RUN: opt -globalopt %s -S | FileCheck %s +; RUN: opt -globalopt -S < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" diff --git a/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll b/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll new file mode 100644 index 000000000000..9295c2025a2a --- /dev/null +++ b/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll @@ -0,0 +1,35 @@ +; RUN: opt < %s -globalopt -S | FileCheck %s +; rdar://12580965. +; ObjC++ test case. + +%struct.ButtonInitData = type { i8* } + +@_ZL14buttonInitData = internal global [1 x %struct.ButtonInitData] zeroinitializer, align 4 + +@"\01L_OBJC_METH_VAR_NAME_40" = internal global [7 x i8] c"print:\00", section "__TEXT,__objc_methname,cstring_literals", align 1 +@"\01L_OBJC_SELECTOR_REFERENCES_41" = internal externally_initialized global i8* getelementptr inbounds ([7 x i8]* @"\01L_OBJC_METH_VAR_NAME_40", i32 0, i32 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip" + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] +@llvm.used = appending global [2 x i8*] [i8* getelementptr inbounds ([7 x i8]* @"\01L_OBJC_METH_VAR_NAME_40", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_41" to i8*)] + +define internal void @__cxx_global_var_init() section "__TEXT,__StaticInit,regular,pure_instructions" { + %1 = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_41", !invariant.load !2009 + store i8* %1, i8** getelementptr inbounds ([1 x %struct.ButtonInitData]* @_ZL14buttonInitData, i32 0, i32 0, i32 0), align 4 + ret void +} + +define internal void @_GLOBAL__I_a() section "__TEXT,__StaticInit,regular,pure_instructions" { + call void @__cxx_global_var_init() + ret void +} + +declare void @test(i8*) + +define void @print() { +; CHECK: %1 = load i8** getelementptr inbounds ([1 x %struct.ButtonInitData]* @_ZL14buttonInitData, i32 0, i32 0, i32 0), align 4 + %1 = load i8** getelementptr inbounds ([1 x %struct.ButtonInitData]* @_ZL14buttonInitData, i32 0, i32 0, i32 0), align 4 + call void @test(i8* %1) + ret void +} + +!2009 = metadata !{} diff --git a/test/Transforms/GlobalOpt/integer-bool.ll b/test/Transforms/GlobalOpt/integer-bool.ll index 5a34a9c4dabd..51858069ac5b 100644 --- a/test/Transforms/GlobalOpt/integer-bool.ll +++ b/test/Transforms/GlobalOpt/integer-bool.ll @@ -1,23 +1,28 @@ -; RUN: opt < %s -globalopt -instcombine | \ -; RUN: llvm-dis | grep "ret i1 true" - +; RUN: opt < %s -S -globalopt -instcombine | FileCheck %s ;; check that global opt turns integers that only hold 0 or 1 into bools. -@G = internal global i32 0 ; <i32*> [#uses=3] +@G = internal addrspace(1) global i32 0 +; CHECK: @G +; CHECK: addrspace(1) +; CHECK: global i1 false define void @set1() { - store i32 0, i32* @G - ret void + store i32 0, i32 addrspace(1)* @G +; CHECK: store i1 false + ret void } define void @set2() { - store i32 1, i32* @G - ret void + store i32 1, i32 addrspace(1)* @G +; CHECK: store i1 true + ret void } define i1 @get() { - %A = load i32* @G ; <i32> [#uses=1] - %C = icmp slt i32 %A, 2 ; <i1> [#uses=1] - ret i1 %C +; CHECK: @get + %A = load i32 addrspace(1) * @G + %C = icmp slt i32 %A, 2 + ret i1 %C +; CHECK: ret i1 true } diff --git a/test/Transforms/GlobalOpt/memset-null.ll b/test/Transforms/GlobalOpt/memset-null.ll index 01534025faa3..53ec7551130e 100644 --- a/test/Transforms/GlobalOpt/memset-null.ll +++ b/test/Transforms/GlobalOpt/memset-null.ll @@ -1,4 +1,4 @@ -; RUN: opt -globalopt %s -S -o - | FileCheck %s +; RUN: opt -globalopt -S < %s | FileCheck %s ; PR10047 %0 = type { i32, void ()* } diff --git a/test/Transforms/GlobalOpt/unnamed-addr.ll b/test/Transforms/GlobalOpt/unnamed-addr.ll index ee7505873126..2ca91e50da2a 100644 --- a/test/Transforms/GlobalOpt/unnamed-addr.ll +++ b/test/Transforms/GlobalOpt/unnamed-addr.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -globalopt -S | FileCheck %s +; RUN: opt -globalopt -S < %s | FileCheck %s @a = internal global i32 0, align 4 @b = internal global i32 0, align 4 diff --git a/test/Transforms/IPConstantProp/user-with-multiple-uses.ll b/test/Transforms/IPConstantProp/user-with-multiple-uses.ll index 402ea41167ce..968718084e42 100644 --- a/test/Transforms/IPConstantProp/user-with-multiple-uses.ll +++ b/test/Transforms/IPConstantProp/user-with-multiple-uses.ll @@ -4,9 +4,9 @@ ; IPSCCP should propagate the 0 argument, eliminate the switch, and propagate ; the result. -; CHECK: define i32 @main() noreturn nounwind { +; CHECK: define i32 @main() #0 { ; CHECK-NEXT: entry: -; CHECK-NEXT: %call2 = tail call i32 @wwrite(i64 0) nounwind +; CHECK-NEXT: %call2 = tail call i32 @wwrite(i64 0) [[NUW:#[0-9]+]] ; CHECK-NEXT: ret i32 123 define i32 @main() noreturn nounwind { @@ -28,3 +28,7 @@ sw.default: return: ret i32 0 } + +; CHECK: attributes #0 = { noreturn nounwind } +; CHECK: attributes #1 = { nounwind readnone } +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/IndVarSimplify/2003-09-23-NotAtTop.ll b/test/Transforms/IndVarSimplify/2003-09-23-NotAtTop.ll index 150ae70a8262..e3de75e36fd8 100644 --- a/test/Transforms/IndVarSimplify/2003-09-23-NotAtTop.ll +++ b/test/Transforms/IndVarSimplify/2003-09-23-NotAtTop.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -indvars %s | FileCheck %s +; RUN: opt -S -indvars < %s | FileCheck %s ; The indvar simplification code should ensure that the first PHI in the block ; is the canonical one! diff --git a/test/Transforms/IndVarSimplify/crash.ll b/test/Transforms/IndVarSimplify/crash.ll index 1b702a3b1a3c..aa6a2ee16521 100644 --- a/test/Transforms/IndVarSimplify/crash.ll +++ b/test/Transforms/IndVarSimplify/crash.ll @@ -1,4 +1,4 @@ -; RUN: opt -indvars %s -disable-output +; RUN: opt -indvars -disable-output < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" declare i32 @putchar(i8) nounwind diff --git a/test/Transforms/IndVarSimplify/dont-recompute.ll b/test/Transforms/IndVarSimplify/dont-recompute.ll new file mode 100644 index 000000000000..d37b0e21f826 --- /dev/null +++ b/test/Transforms/IndVarSimplify/dont-recompute.ll @@ -0,0 +1,69 @@ +; RUN: opt < %s -indvars -S | FileCheck %s + +; This tests that the IV is not recomputed outside of the loop when it is known +; to be computed by the loop and used in the loop any way. In the example below +; although a's value can be computed outside of the loop, there is no benefit +; in doing so as it has to be computed by the loop anyway. +; +; extern void func(unsigned val); +; +; void test(unsigned m) +; { +; unsigned a = 0; +; +; for (int i=0; i<186; i++) { +; a += m; +; func(a); +; } +; +; func(a); +; } + +declare void @func(i32) + +; CHECK: @test +define void @test(i32 %m) nounwind uwtable { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %a.05 = phi i32 [ 0, %entry ], [ %add, %for.body ] + %add = add i32 %a.05, %m +; CHECK: tail call void @func(i32 %add) + tail call void @func(i32 %add) + %inc = add nsw i32 %i.06, 1 + %exitcond = icmp eq i32 %inc, 186 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body +; CHECK: for.end: +; CHECK-NOT: mul i32 %m, 186 +; CHECK:%add.lcssa = phi i32 [ %add, %for.body ] +; CHECK-NEXT: tail call void @func(i32 %add.lcssa) + tail call void @func(i32 %add) + ret void +} + +; CHECK: @test2 +define i32 @test2(i32 %m) nounwind uwtable { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %a.05 = phi i32 [ 0, %entry ], [ %add, %for.body ] + %add = add i32 %a.05, %m +; CHECK: tail call void @func(i32 %add) + tail call void @func(i32 %add) + %inc = add nsw i32 %i.06, 1 + %exitcond = icmp eq i32 %inc, 186 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body +; CHECK: for.end: +; CHECK-NOT: mul i32 %m, 186 +; CHECK:%add.lcssa = phi i32 [ %add, %for.body ] +; CHECK-NEXT: ret i32 %add.lcssa + ret i32 %add +} diff --git a/test/Transforms/IndVarSimplify/iv-zext.ll b/test/Transforms/IndVarSimplify/iv-zext.ll index 2e0f70ce461a..ed0514b08e33 100644 --- a/test/Transforms/IndVarSimplify/iv-zext.ll +++ b/test/Transforms/IndVarSimplify/iv-zext.ll @@ -2,7 +2,7 @@ ; CHECK-NOT: and ; CHECK-NOT: zext -target datalayout = "-p:64:64:64-n32:64" +target datalayout = "p:64:64:64-n32:64" define void @foo(double* %d, i64 %n) nounwind { entry: diff --git a/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll b/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll index 52c9e5c3ffc9..dc36b9948254 100644 --- a/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll +++ b/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -indvars -disable-output -stats -info-output-file - | FileCheck %s ; Check that IndVarSimplify is not creating unnecessary canonical IVs ; that will never be used. diff --git a/test/Transforms/Inline/2003-09-22-PHINodeInlineFail.ll b/test/Transforms/Inline/2003-09-22-PHINodeInlineFail.ll index 5ced3b8e8da9..b8ca56050dca 100644 --- a/test/Transforms/Inline/2003-09-22-PHINodeInlineFail.ll +++ b/test/Transforms/Inline/2003-09-22-PHINodeInlineFail.ll @@ -3,10 +3,15 @@ define i32 @main() { entry: invoke void @__main( ) - to label %LongJmpBlkPre unwind label %LongJmpBlkPre + to label %LongJmpBlkPost unwind label %LongJmpBlkPre -LongJmpBlkPre: ; preds = %entry, %entry +LongJmpBlkPost: + ret i32 0 + +LongJmpBlkPre: %i.3 = phi i32 [ 0, %entry ], [ 0, %entry ] ; <i32> [#uses=0] + %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup ret i32 0 } @@ -14,3 +19,4 @@ define void @__main() { ret void } +declare i32 @__gxx_personality_v0(...) diff --git a/test/Transforms/Inline/2003-09-22-PHINodesInNormalInvokeDest.ll b/test/Transforms/Inline/2003-09-22-PHINodesInNormalInvokeDest.ll index 1bd55299a901..43bdd309c987 100644 --- a/test/Transforms/Inline/2003-09-22-PHINodesInNormalInvokeDest.ll +++ b/test/Transforms/Inline/2003-09-22-PHINodesInNormalInvokeDest.ll @@ -13,6 +13,8 @@ LJDecisionBB: ; preds = %else br label %else RethrowExcept: ; preds = %entry + %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup ret i32 0 } @@ -20,4 +22,4 @@ define void @__main() { ret void } - +declare i32 @__gxx_personality_v0(...) diff --git a/test/Transforms/Inline/2006-11-09-InlineCGUpdate-2.ll b/test/Transforms/Inline/2006-11-09-InlineCGUpdate-2.ll index b4380d01e483..ee5a378b1876 100644 --- a/test/Transforms/Inline/2006-11-09-InlineCGUpdate-2.ll +++ b/test/Transforms/Inline/2006-11-09-InlineCGUpdate-2.ll @@ -2,7 +2,6 @@ ; PR993 target datalayout = "e-p:32:32" target triple = "i386-unknown-openbsd3.9" -deplibs = [ "stdc++", "c", "crtend" ] %"struct.__gnu_cxx::__normal_iterator<char*,std::basic_string<char, std::char_traits<char>, std::allocator<char> > >" = type { i8* } %"struct.__gnu_cxx::char_producer<char>" = type { i32 (...)** } %struct.__sFILE = type { i8*, i32, i32, i16, i16, %struct.__sbuf, i32, i8*, i32 (i8*)*, i32 (i8*, i8*, i32)*, i64 (i8*, i64, i32)*, i32 (i8*, i8*, i32)*, %struct.__sbuf, i8*, i32, [3 x i8], [1 x i8], %struct.__sbuf, i32, i64 } diff --git a/test/Transforms/Inline/2006-11-09-InlineCGUpdate.ll b/test/Transforms/Inline/2006-11-09-InlineCGUpdate.ll index b754d9f9f5d9..fb5a4b512b9c 100644 --- a/test/Transforms/Inline/2006-11-09-InlineCGUpdate.ll +++ b/test/Transforms/Inline/2006-11-09-InlineCGUpdate.ll @@ -2,7 +2,6 @@ ; PR992 target datalayout = "e-p:32:32" target triple = "i686-pc-linux-gnu" -deplibs = [ "stdc++", "c", "crtend" ] %struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i32, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i32, [52 x i8] } %struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } %"struct.__cxxabiv1::__array_type_info" = type { %"struct.std::type_info" } diff --git a/test/Transforms/Inline/2010-05-12-ValueMap.ll b/test/Transforms/Inline/2010-05-12-ValueMap.ll index f9cc13f499b3..f452907efd07 100644 --- a/test/Transforms/Inline/2010-05-12-ValueMap.ll +++ b/test/Transforms/Inline/2010-05-12-ValueMap.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -inline -mergefunc -disable-output +; RUN: opt -inline -mergefunc -disable-output < %s ; This tests for a bug where the inliner kept the functions in a ValueMap after ; it had completed and a ModulePass started to run. LLVM would crash deleting diff --git a/test/Transforms/Inline/alloca_test.ll b/test/Transforms/Inline/alloca_test.ll index e5791d5d2553..8464259ce1f8 100644 --- a/test/Transforms/Inline/alloca_test.ll +++ b/test/Transforms/Inline/alloca_test.ll @@ -1,7 +1,7 @@ ; This test ensures that alloca instructions in the entry block for an inlined ; function are moved to the top of the function they are inlined into. ; -; RUN: opt -S -inline %s | FileCheck %s +; RUN: opt -S -inline < %s | FileCheck %s define i32 @func(i32 %i) { %X = alloca i32 ; <i32*> [#uses=1] diff --git a/test/Transforms/Inline/basictest.ll b/test/Transforms/Inline/basictest.ll index 609a3d4e153e..39e25cb5d627 100644 --- a/test/Transforms/Inline/basictest.ll +++ b/test/Transforms/Inline/basictest.ll @@ -45,3 +45,48 @@ define i32 @test2(i1 %cond) { ; CHECK-NOT: = alloca ; CHECK: ret i32 } + +declare void @barrier() noduplicate + +define internal i32 @f() { + call void @barrier() noduplicate + ret i32 1 +} + +define i32 @g() { + call void @barrier() noduplicate + ret i32 2 +} + +define internal i32 @h() { + call void @barrier() noduplicate + ret i32 3 +} + +define i32 @test3() { + %b = call i32 @f() + ret i32 %b +} + +; The call to @f cannot be inlined as there is another callsite +; calling @f, and @f contains a noduplicate call. +; +; The call to @g cannot be inlined as it has external linkage. +; +; The call to @h *can* be inlined. + +; CHECK: @test +define i32 @test() { +; CHECK: call i32 @f() + %a = call i32 @f() +; CHECK: call i32 @g() + %b = call i32 @g() +; CHECK-NOT: call i32 @h() + %c = call i32 @h() + + %d = add i32 %a, %b + %e = add i32 %d, %c + + ret i32 %e +; CHECK: } +} diff --git a/test/Transforms/Inline/crash2.ll b/test/Transforms/Inline/crash2.ll index cb1f44d5cca7..be634f625633 100644 --- a/test/Transforms/Inline/crash2.ll +++ b/test/Transforms/Inline/crash2.ll @@ -1,4 +1,4 @@ -; RUN: opt -inline -scalarrepl -max-cg-scc-iterations=1 %s -disable-output +; RUN: opt -inline -scalarrepl -max-cg-scc-iterations=1 -disable-output < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.3" diff --git a/test/Transforms/Inline/delete-call.ll b/test/Transforms/Inline/delete-call.ll index 7716d6a47bec..97c52af9e0d5 100644 --- a/test/Transforms/Inline/delete-call.ll +++ b/test/Transforms/Inline/delete-call.ll @@ -1,5 +1,9 @@ -; RUN: opt %s -S -inline -functionattrs -stats 2>&1 | grep "Number of call sites deleted, not inlined" -; RUN: opt %s -S -inline -stats 2>&1 | grep "Number of functions inlined" +; REQUIRES: asserts +; RUN: opt -S -inline -stats < %s 2>&1 | FileCheck %s +; CHECK: Number of functions inlined + +; RUN: opt -S -inline -functionattrs -stats < %s 2>&1 | FileCheck -check-prefix=FUNCTIONATTRS %s +; CHECK-FUNCTIONATTRS: Number of call sites deleted, not inlined target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" target triple = "i386-apple-darwin9.8" diff --git a/test/Transforms/Inline/devirtualize-3.ll b/test/Transforms/Inline/devirtualize-3.ll index c32be4e024a3..3f019676e4a4 100644 --- a/test/Transforms/Inline/devirtualize-3.ll +++ b/test/Transforms/Inline/devirtualize-3.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -inline -S -scalarrepl -gvn -instcombine %s | FileCheck %s +; RUN: opt -basicaa -inline -S -scalarrepl -gvn -instcombine < %s | FileCheck %s ; PR5009 ; CHECK: define i32 @main() diff --git a/test/Transforms/Inline/devirtualize.ll b/test/Transforms/Inline/devirtualize.ll index 51ea4baa3866..d46154ef6a98 100644 --- a/test/Transforms/Inline/devirtualize.ll +++ b/test/Transforms/Inline/devirtualize.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -basicaa -inline -scalarrepl -instcombine -simplifycfg -instcombine -gvn -globaldce %s | FileCheck %s +; RUN: opt -S -Os < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" diff --git a/test/Transforms/Inline/gvn-inline-iteration.ll b/test/Transforms/Inline/gvn-inline-iteration.ll index e502fd5777d5..526ed79e7b48 100644 --- a/test/Transforms/Inline/gvn-inline-iteration.ll +++ b/test/Transforms/Inline/gvn-inline-iteration.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -inline -gvn %s -S -max-cg-scc-iterations=1 | FileCheck %s +; RUN: opt -basicaa -inline -gvn -S -max-cg-scc-iterations=1 < %s | FileCheck %s ; rdar://6295824 and PR6724 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/test/Transforms/Inline/inline-optsize.ll b/test/Transforms/Inline/inline-optsize.ll index 20d7426abd13..3ad573a04e42 100644 --- a/test/Transforms/Inline/inline-optsize.ll +++ b/test/Transforms/Inline/inline-optsize.ll @@ -1,5 +1,5 @@ -; RUN: opt -S -Oz %s | FileCheck %s -check-prefix=OZ -; RUN: opt -S -O2 %s | FileCheck %s -check-prefix=O2 +; RUN: opt -S -Oz < %s | FileCheck %s -check-prefix=OZ +; RUN: opt -S -O2 < %s | FileCheck %s -check-prefix=O2 ; The inline threshold for a function with the optsize attribute is currently ; the same as the global inline threshold for -Os. Check that the optsize diff --git a/test/Transforms/Inline/inline_constprop.ll b/test/Transforms/Inline/inline_constprop.ll index 0b48a7282f45..77bc3784acb4 100644 --- a/test/Transforms/Inline/inline_constprop.ll +++ b/test/Transforms/Inline/inline_constprop.ll @@ -111,6 +111,82 @@ bb.false: ret i32 %sub } +declare {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a, i8 %b) + +define i8 @caller4(i8 %z) { +; Check that we can constant fold through intrinsics such as the +; overflow-detecting arithmetic instrinsics. These are particularly important +; as they are used heavily in standard library code and generic C++ code where +; the arguments are oftent constant but complete generality is required. +; +; CHECK: @caller4 +; CHECK-NOT: call +; CHECK: ret i8 -1 + +entry: + %x = call i8 @callee4(i8 254, i8 14, i8 %z) + ret i8 %x +} + +define i8 @callee4(i8 %x, i8 %y, i8 %z) { + %uadd = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %x, i8 %y) + %o = extractvalue {i8, i1} %uadd, 1 + br i1 %o, label %bb.true, label %bb.false + +bb.true: + ret i8 -1 + +bb.false: + ; This block musn't be counted in the inline cost. + %z1 = add i8 %z, 1 + %z2 = add i8 %z1, 1 + %z3 = add i8 %z2, 1 + %z4 = add i8 %z3, 1 + %z5 = add i8 %z4, 1 + %z6 = add i8 %z5, 1 + %z7 = add i8 %z6, 1 + %z8 = add i8 %z7, 1 + ret i8 %z8 +} + +define i64 @caller5(i64 %y) { +; Check that we can round trip constants through various kinds of casts etc w/o +; losing track of the constant prop in the inline cost analysis. +; +; CHECK: @caller5 +; CHECK-NOT: call +; CHECK: ret i64 -1 + +entry: + %x = call i64 @callee5(i64 42, i64 %y) + ret i64 %x +} + +define i64 @callee5(i64 %x, i64 %y) { + %inttoptr = inttoptr i64 %x to i8* + %bitcast = bitcast i8* %inttoptr to i32* + %ptrtoint = ptrtoint i32* %bitcast to i64 + %trunc = trunc i64 %ptrtoint to i32 + %zext = zext i32 %trunc to i64 + %cmp = icmp eq i64 %zext, 42 + br i1 %cmp, label %bb.true, label %bb.false + +bb.true: + ret i64 -1 + +bb.false: + ; This block musn't be counted in the inline cost. + %y1 = add i64 %y, 1 + %y2 = add i64 %y1, 1 + %y3 = add i64 %y2, 1 + %y4 = add i64 %y3, 1 + %y5 = add i64 %y4, 1 + %y6 = add i64 %y5, 1 + %y7 = add i64 %y6, 1 + %y8 = add i64 %y7, 1 + ret i64 %y8 +} + define i32 @PR13412.main() { ; This is a somewhat complicated three layer subprogram that was reported to diff --git a/test/Transforms/Inline/inline_invoke.ll b/test/Transforms/Inline/inline_invoke.ll index 9f5f670b859b..c3941388f937 100644 --- a/test/Transforms/Inline/inline_invoke.ll +++ b/test/Transforms/Inline/inline_invoke.ll @@ -96,6 +96,7 @@ eh.resume: ; CHECK: landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 ; CHECK-NEXT: cleanup ; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) +; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) ; CHECK-NEXT: invoke void @_ZN1AD1Ev(%struct.A* [[A]]) ; CHECK-NEXT: to label %[[LBL:[^\s]+]] unwind ; CHECK: [[LBL]]: @@ -166,6 +167,7 @@ eh.resume: ; CHECK-NEXT: [[LPADVAL1:%.*]] = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 ; CHECK-NEXT: cleanup ; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) +; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) ; CHECK-NEXT: invoke void @_ZN1AD1Ev(%struct.A* [[A1]]) ; CHECK-NEXT: to label %[[RESUME1:[^\s]+]] unwind ; CHECK: [[RESUME1]]: @@ -185,6 +187,7 @@ eh.resume: ; CHECK-NEXT: [[LPADVAL2:%.*]] = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 ; CHECK-NEXT: cleanup ; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) +; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) ; CHECK-NEXT: invoke void @_ZN1AD1Ev(%struct.A* [[A2]]) ; CHECK-NEXT: to label %[[RESUME2:[^\s]+]] unwind ; CHECK: [[RESUME2]]: @@ -272,6 +275,7 @@ lpad.cont: ; CHECK: landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 ; CHECK-NEXT: cleanup ; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) +; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) ; CHECK-NEXT: invoke void @_ZN1AD1Ev( ; CHECK-NEXT: to label %[[L:[^\s]+]] unwind ; CHECK: [[L]]: @@ -318,6 +322,7 @@ terminate: ; CHECK: landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 ; CHECK-NEXT: cleanup ; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) +; CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) ; CHECK-NEXT: invoke void @_ZN1AD1Ev( ; CHECK-NEXT: to label %[[L:[^\s]+]] unwind ; CHECK: [[L]]: @@ -330,7 +335,7 @@ terminate: ; CHECK-NEXT: br label %[[JOIN]] ; CHECK: [[JOIN]]: ; CHECK-NEXT: phi { i8*, i32 } -; CHECK-NEXT: call void @opaque() nounwind +; CHECK-NEXT: call void @opaque() [[NUW:#[0-9]+]] ; CHECK-NEXT: br label %[[FIX:[^\s]+]] ; CHECK: lpad: ; CHECK-NEXT: landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 @@ -340,3 +345,8 @@ terminate: ; CHECK-NEXT: [[T1:%.*]] = phi i32 [ 0, %[[JOIN]] ], [ 1, %lpad ] ; CHECK-NEXT: call void @use(i32 [[T1]]) ; CHECK-NEXT: call void @_ZSt9terminatev() + +; CHECK: attributes [[NUW]] = { nounwind } +; CHECK: attributes #1 = { nounwind readnone } +; CHECK: attributes #2 = { ssp uwtable } +; CHECK: attributes #3 = { noreturn nounwind } diff --git a/test/Transforms/Inline/inline_minisize.ll b/test/Transforms/Inline/inline_minisize.ll new file mode 100644 index 000000000000..3dddbcf3303d --- /dev/null +++ b/test/Transforms/Inline/inline_minisize.ll @@ -0,0 +1,232 @@ +; RUN: opt -O2 -S < %s | FileCheck %s + +@data = common global i32* null, align 8 + +define i32 @fct1(i32 %a) nounwind uwtable ssp { +entry: + %a.addr = alloca i32, align 4 + %res = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + %tmp = load i32* %a.addr, align 4 + %idxprom = sext i32 %tmp to i64 + %tmp1 = load i32** @data, align 8 + %arrayidx = getelementptr inbounds i32* %tmp1, i64 %idxprom + %tmp2 = load i32* %arrayidx, align 4 + %tmp3 = load i32* %a.addr, align 4 + %add = add nsw i32 %tmp3, 1 + %idxprom1 = sext i32 %add to i64 + %tmp4 = load i32** @data, align 8 + %arrayidx2 = getelementptr inbounds i32* %tmp4, i64 %idxprom1 + %tmp5 = load i32* %arrayidx2, align 4 + %mul = mul nsw i32 %tmp2, %tmp5 + store i32 %mul, i32* %res, align 4 + store i32 0, i32* %i, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %tmp6 = load i32* %i, align 4 + %tmp7 = load i32* %res, align 4 + %cmp = icmp slt i32 %tmp6, %tmp7 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %tmp8 = load i32* %i, align 4 + %idxprom3 = sext i32 %tmp8 to i64 + %tmp9 = load i32** @data, align 8 + %arrayidx4 = getelementptr inbounds i32* %tmp9, i64 %idxprom3 + call void @fct0(i32* %arrayidx4) + br label %for.inc + +for.inc: ; preds = %for.body + %tmp10 = load i32* %i, align 4 + %inc = add nsw i32 %tmp10, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + store i32 0, i32* %i, align 4 + br label %for.cond5 + +for.cond5: ; preds = %for.inc10, %for.end + %tmp11 = load i32* %i, align 4 + %tmp12 = load i32* %res, align 4 + %cmp6 = icmp slt i32 %tmp11, %tmp12 + br i1 %cmp6, label %for.body7, label %for.end12 + +for.body7: ; preds = %for.cond5 + %tmp13 = load i32* %i, align 4 + %idxprom8 = sext i32 %tmp13 to i64 + %tmp14 = load i32** @data, align 8 + %arrayidx9 = getelementptr inbounds i32* %tmp14, i64 %idxprom8 + call void @fct0(i32* %arrayidx9) + br label %for.inc10 + +for.inc10: ; preds = %for.body7 + %tmp15 = load i32* %i, align 4 + %inc11 = add nsw i32 %tmp15, 1 + store i32 %inc11, i32* %i, align 4 + br label %for.cond5 + +for.end12: ; preds = %for.cond5 + store i32 0, i32* %i, align 4 + br label %for.cond13 + +for.cond13: ; preds = %for.inc18, %for.end12 + %tmp16 = load i32* %i, align 4 + %tmp17 = load i32* %res, align 4 + %cmp14 = icmp slt i32 %tmp16, %tmp17 + br i1 %cmp14, label %for.body15, label %for.end20 + +for.body15: ; preds = %for.cond13 + %tmp18 = load i32* %i, align 4 + %idxprom16 = sext i32 %tmp18 to i64 + %tmp19 = load i32** @data, align 8 + %arrayidx17 = getelementptr inbounds i32* %tmp19, i64 %idxprom16 + call void @fct0(i32* %arrayidx17) + br label %for.inc18 + +for.inc18: ; preds = %for.body15 + %tmp20 = load i32* %i, align 4 + %inc19 = add nsw i32 %tmp20, 1 + store i32 %inc19, i32* %i, align 4 + br label %for.cond13 + +for.end20: ; preds = %for.cond13 + %tmp21 = load i32* %res, align 4 + ret i32 %tmp21 +} + +declare void @fct0(i32*) + +define i32 @fct2(i32 %a) nounwind uwtable inlinehint ssp { +entry: + %a.addr = alloca i32, align 4 + %res = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + %tmp = load i32* %a.addr, align 4 + %shl = shl i32 %tmp, 1 + %idxprom = sext i32 %shl to i64 + %tmp1 = load i32** @data, align 8 + %arrayidx = getelementptr inbounds i32* %tmp1, i64 %idxprom + %tmp2 = load i32* %arrayidx, align 4 + %tmp3 = load i32* %a.addr, align 4 + %shl1 = shl i32 %tmp3, 1 + %add = add nsw i32 %shl1, 13 + %idxprom2 = sext i32 %add to i64 + %tmp4 = load i32** @data, align 8 + %arrayidx3 = getelementptr inbounds i32* %tmp4, i64 %idxprom2 + %tmp5 = load i32* %arrayidx3, align 4 + %mul = mul nsw i32 %tmp2, %tmp5 + store i32 %mul, i32* %res, align 4 + store i32 0, i32* %i, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %tmp6 = load i32* %i, align 4 + %tmp7 = load i32* %res, align 4 + %cmp = icmp slt i32 %tmp6, %tmp7 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %tmp8 = load i32* %i, align 4 + %idxprom4 = sext i32 %tmp8 to i64 + %tmp9 = load i32** @data, align 8 + %arrayidx5 = getelementptr inbounds i32* %tmp9, i64 %idxprom4 + call void @fct0(i32* %arrayidx5) + br label %for.inc + +for.inc: ; preds = %for.body + %tmp10 = load i32* %i, align 4 + %inc = add nsw i32 %tmp10, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + store i32 0, i32* %i, align 4 + br label %for.cond6 + +for.cond6: ; preds = %for.inc11, %for.end + %tmp11 = load i32* %i, align 4 + %tmp12 = load i32* %res, align 4 + %cmp7 = icmp slt i32 %tmp11, %tmp12 + br i1 %cmp7, label %for.body8, label %for.end13 + +for.body8: ; preds = %for.cond6 + %tmp13 = load i32* %i, align 4 + %idxprom9 = sext i32 %tmp13 to i64 + %tmp14 = load i32** @data, align 8 + %arrayidx10 = getelementptr inbounds i32* %tmp14, i64 %idxprom9 + call void @fct0(i32* %arrayidx10) + br label %for.inc11 + +for.inc11: ; preds = %for.body8 + %tmp15 = load i32* %i, align 4 + %inc12 = add nsw i32 %tmp15, 1 + store i32 %inc12, i32* %i, align 4 + br label %for.cond6 + +for.end13: ; preds = %for.cond6 + store i32 0, i32* %i, align 4 + br label %for.cond14 + +for.cond14: ; preds = %for.inc19, %for.end13 + %tmp16 = load i32* %i, align 4 + %tmp17 = load i32* %res, align 4 + %cmp15 = icmp slt i32 %tmp16, %tmp17 + br i1 %cmp15, label %for.body16, label %for.end21 + +for.body16: ; preds = %for.cond14 + %tmp18 = load i32* %i, align 4 + %idxprom17 = sext i32 %tmp18 to i64 + %tmp19 = load i32** @data, align 8 + %arrayidx18 = getelementptr inbounds i32* %tmp19, i64 %idxprom17 + call void @fct0(i32* %arrayidx18) + br label %for.inc19 + +for.inc19: ; preds = %for.body16 + %tmp20 = load i32* %i, align 4 + %inc20 = add nsw i32 %tmp20, 1 + store i32 %inc20, i32* %i, align 4 + br label %for.cond14 + +for.end21: ; preds = %for.cond14 + %tmp21 = load i32* %res, align 4 + ret i32 %tmp21 +} + +define i32 @fct3(i32 %c) nounwind uwtable ssp { +entry: + ;CHECK: @fct3 + ;CHECK: call i32 @fct1 + ; The inline keyword gives a sufficient benefits to inline fct2 + ;CHECK-NOT: call i32 @fct2 + %c.addr = alloca i32, align 4 + store i32 %c, i32* %c.addr, align 4 + %tmp = load i32* %c.addr, align 4 + %call = call i32 @fct1(i32 %tmp) + %tmp1 = load i32* %c.addr, align 4 + %call1 = call i32 @fct2(i32 %tmp1) + %add = add nsw i32 %call, %call1 + ret i32 %add +} + +define i32 @fct4(i32 %c) minsize nounwind uwtable ssp { +entry: + ;CHECK: @fct4 + ;CHECK: call i32 @fct1 + ; With Oz (minsize attribute), the benefit of inlining fct2 + ; is the same as fct1, thus no inlining for fct2 + ;CHECK: call i32 @fct2 + %c.addr = alloca i32, align 4 + store i32 %c, i32* %c.addr, align 4 + %tmp = load i32* %c.addr, align 4 + %call = call i32 @fct1(i32 %tmp) + %tmp1 = load i32* %c.addr, align 4 + %call1 = call i32 @fct2(i32 %tmp1) + %add = add nsw i32 %call, %call1 + ret i32 %add +} diff --git a/test/Transforms/Inline/inline_ssp.ll b/test/Transforms/Inline/inline_ssp.ll new file mode 100644 index 000000000000..a4b43a77bad2 --- /dev/null +++ b/test/Transforms/Inline/inline_ssp.ll @@ -0,0 +1,160 @@ +; RUN: opt -inline %s -S | FileCheck %s +; Ensure SSP attributes are propagated correctly when inlining. + +@.str = private unnamed_addr constant [11 x i8] c"fun_nossp\0A\00", align 1 +@.str1 = private unnamed_addr constant [9 x i8] c"fun_ssp\0A\00", align 1 +@.str2 = private unnamed_addr constant [15 x i8] c"fun_sspstrong\0A\00", align 1 +@.str3 = private unnamed_addr constant [12 x i8] c"fun_sspreq\0A\00", align 1 + +; These first four functions (@fun_sspreq, @fun_sspstrong, @fun_ssp, @fun_nossp) +; are used by the remaining functions to ensure that the SSP attributes are +; propagated correctly. The caller should have its SSP attribute set as: +; strictest(caller-ssp-attr, callee-ssp-attr), where strictness is ordered as: +; sspreq > sspstrong > ssp > [no ssp] +define internal void @fun_sspreq() nounwind sspreq uwtable { +entry: + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([12 x i8]* @.str3, i32 0, i32 0)) + ret void +} + +define internal void @fun_sspstrong() nounwind sspstrong uwtable { +entry: + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str2, i32 0, i32 0)) + ret void +} + +define internal void @fun_ssp() nounwind ssp uwtable { +entry: + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str1, i32 0, i32 0)) + ret void +} + +define internal void @fun_nossp() nounwind uwtable { +entry: + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11 x i8]* @.str, i32 0, i32 0)) + ret void +} + +; Tests start below + +define void @inline_req_req() nounwind sspreq uwtable { +entry: +; CHECK: @inline_req_req() #0 + call void @fun_sspreq() + ret void +} + +define void @inline_req_strong() nounwind sspstrong uwtable { +entry: +; CHECK: @inline_req_strong() #0 + call void @fun_sspreq() + ret void +} + +define void @inline_req_ssp() nounwind ssp uwtable { +entry: +; CHECK: @inline_req_ssp() #0 + call void @fun_sspreq() + ret void +} + +define void @inline_req_nossp() nounwind uwtable { +entry: +; CHECK: @inline_req_nossp() #0 + call void @fun_sspreq() + ret void +} + +define void @inline_strong_req() nounwind sspreq uwtable { +entry: +; CHECK: @inline_strong_req() #0 + call void @fun_sspstrong() + ret void +} + + +define void @inline_strong_strong() nounwind sspstrong uwtable { +entry: +; CHECK: @inline_strong_strong() #1 + call void @fun_sspstrong() + ret void +} + +define void @inline_strong_ssp() nounwind ssp uwtable { +entry: +; CHECK: @inline_strong_ssp() #1 + call void @fun_sspstrong() + ret void +} + +define void @inline_strong_nossp() nounwind uwtable { +entry: +; CHECK: @inline_strong_nossp() #1 + call void @fun_sspstrong() + ret void +} + +define void @inline_ssp_req() nounwind sspreq uwtable { +entry: +; CHECK: @inline_ssp_req() #0 + call void @fun_ssp() + ret void +} + + +define void @inline_ssp_strong() nounwind sspstrong uwtable { +entry: +; CHECK: @inline_ssp_strong() #1 + call void @fun_ssp() + ret void +} + +define void @inline_ssp_ssp() nounwind ssp uwtable { +entry: +; CHECK: @inline_ssp_ssp() #2 + call void @fun_ssp() + ret void +} + +define void @inline_ssp_nossp() nounwind uwtable { +entry: +; CHECK: @inline_ssp_nossp() #2 + call void @fun_ssp() + ret void +} + +define void @inline_nossp_req() nounwind uwtable sspreq { +entry: +; CHECK: @inline_nossp_req() #0 + call void @fun_nossp() + ret void +} + + +define void @inline_nossp_strong() nounwind sspstrong uwtable { +entry: +; CHECK: @inline_nossp_strong() #1 + call void @fun_nossp() + ret void +} + +define void @inline_nossp_ssp() nounwind ssp uwtable { +entry: +; CHECK: @inline_nossp_ssp() #2 + call void @fun_nossp() + ret void +} + +define void @inline_nossp_nossp() nounwind uwtable { +entry: +; CHECK: @inline_nossp_nossp() #3 + call void @fun_nossp() + ret void +} + +declare i32 @printf(i8*, ...) + +; CHECK: attributes #0 = { nounwind sspreq uwtable } +; CHECK: attributes #1 = { nounwind sspstrong uwtable } +; CHECK: attributes #2 = { nounwind ssp uwtable } +; CHECK: attributes #3 = { nounwind uwtable } diff --git a/test/Transforms/Inline/lifetime-no-datalayout.ll b/test/Transforms/Inline/lifetime-no-datalayout.ll new file mode 100644 index 000000000000..f4ffef3850f1 --- /dev/null +++ b/test/Transforms/Inline/lifetime-no-datalayout.ll @@ -0,0 +1,23 @@ +; RUN: opt -inline -S < %s | FileCheck %s + +declare void @use(i8* %a) + +define void @helper() { + %a = alloca i8 + call void @use(i8* %a) + ret void +} + +; Size in llvm.lifetime.X should be -1 (unknown). +define void @test() { +; CHECK: @test +; CHECK-NOT: lifetime +; CHECK: llvm.lifetime.start(i64 -1 +; CHECK-NOT: lifetime +; CHECK: llvm.lifetime.end(i64 -1 + call void @helper() +; CHECK-NOT: lifetime +; CHECK: ret void + ret void +} + diff --git a/test/Transforms/Inline/lifetime.ll b/test/Transforms/Inline/lifetime.ll index a95c836b77de..fc73385295ed 100644 --- a/test/Transforms/Inline/lifetime.ll +++ b/test/Transforms/Inline/lifetime.ll @@ -1,22 +1,25 @@ -; RUN: opt -inline %s -S -o - | FileCheck %s +; RUN: opt -inline -S < %s | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" declare void @llvm.lifetime.start(i64, i8*) declare void @llvm.lifetime.end(i64, i8*) define void @helper_both_markers() { %a = alloca i8 - call void @llvm.lifetime.start(i64 1, i8* %a) - call void @llvm.lifetime.end(i64 1, i8* %a) + ; Size in llvm.lifetime.start / llvm.lifetime.end differs from + ; allocation size. We should use the former. + call void @llvm.lifetime.start(i64 2, i8* %a) + call void @llvm.lifetime.end(i64 2, i8* %a) ret void } define void @test_both_markers() { ; CHECK: @test_both_markers -; CHECK: llvm.lifetime.start(i64 1 -; CHECK-NEXT: llvm.lifetime.end(i64 1 +; CHECK: llvm.lifetime.start(i64 2 +; CHECK-NEXT: llvm.lifetime.end(i64 2 call void @helper_both_markers() -; CHECK-NEXT: llvm.lifetime.start(i64 1 -; CHECK-NEXT: llvm.lifetime.end(i64 1 +; CHECK-NEXT: llvm.lifetime.start(i64 2 +; CHECK-NEXT: llvm.lifetime.end(i64 2 call void @helper_both_markers() ; CHECK-NEXT: ret void ret void @@ -27,7 +30,7 @@ define void @test_both_markers() { declare void @use(i8* %a) define void @helper_no_markers() { - %a = alloca i8 + %a = alloca i8 ; Allocation size is 1 byte. call void @use(i8* %a) ret void } @@ -37,14 +40,14 @@ define void @helper_no_markers() { define void @test_no_marker() { ; CHECK: @test_no_marker ; CHECK-NOT: lifetime -; CHECK: llvm.lifetime.start(i64 -1 +; CHECK: llvm.lifetime.start(i64 1 ; CHECK-NOT: lifetime -; CHECK: llvm.lifetime.end(i64 -1 +; CHECK: llvm.lifetime.end(i64 1 call void @helper_no_markers() ; CHECK-NOT: lifetime -; CHECK: llvm.lifetime.start(i64 -1 +; CHECK: llvm.lifetime.start(i64 1 ; CHECK-NOT: lifetime -; CHECK: llvm.lifetime.end(i64 -1 +; CHECK: llvm.lifetime.end(i64 1 call void @helper_no_markers() ; CHECK-NOT: lifetime ; CHECK: ret void @@ -76,3 +79,22 @@ define void @test_two_casts() { ; CHECK: ret void ret void } + +define void @helper_arrays_alloca() { + %a = alloca [10 x i32], align 16 + %1 = bitcast [10 x i32]* %a to i8* + call void @use(i8* %1) + ret void +} + +define void @test_arrays_alloca() { +; CHECK: @test_arrays_alloca +; CHECK-NOT: lifetime +; CHECK: llvm.lifetime.start(i64 40, +; CHECK-NOT: lifetime +; CHECK: llvm.lifetime.end(i64 40, + call void @helper_arrays_alloca() +; CHECK-NOT: lifetime +; CHECK: ret void + ret void +} diff --git a/test/Transforms/Inline/noinline-recursive-fn.ll b/test/Transforms/Inline/noinline-recursive-fn.ll index 6cde0e27fd1e..5520093ee457 100644 --- a/test/Transforms/Inline/noinline-recursive-fn.ll +++ b/test/Transforms/Inline/noinline-recursive-fn.ll @@ -2,7 +2,7 @@ ; This effectively is just peeling off the first iteration of a loop, and the ; inliner heuristics are not set up for this. -; RUN: opt -inline %s -S | FileCheck %s +; RUN: opt -inline -S < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.3" diff --git a/test/Transforms/Inline/noinline.ll b/test/Transforms/Inline/noinline.ll index dc3f6e003094..7667114b68e6 100644 --- a/test/Transforms/Inline/noinline.ll +++ b/test/Transforms/Inline/noinline.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -inline -S | FileCheck %s +; RUN: opt -inline -S < %s | FileCheck %s ; PR6682 declare void @foo() nounwind diff --git a/test/Transforms/Inline/recursive.ll b/test/Transforms/Inline/recursive.ll index 5fe8d1639ca3..fe1c041af9a8 100644 --- a/test/Transforms/Inline/recursive.ll +++ b/test/Transforms/Inline/recursive.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -inline -S | FileCheck %s +; RUN: opt -inline -S < %s | FileCheck %s target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" target triple = "i386-apple-darwin10.0" diff --git a/test/Transforms/InstCombine/2008-05-08-StrLenSink.ll b/test/Transforms/InstCombine/2008-05-08-StrLenSink.ll index 1da28562aae4..d266164fd870 100644 --- a/test/Transforms/InstCombine/2008-05-08-StrLenSink.ll +++ b/test/Transforms/InstCombine/2008-05-08-StrLenSink.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -instcombine %s | FileCheck %s +; RUN: opt -S -instcombine < %s | FileCheck %s ; PR2297 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" target triple = "i386-apple-darwin8" diff --git a/test/Transforms/InstCombine/2009-02-11-NotInitialized.ll b/test/Transforms/InstCombine/2009-02-11-NotInitialized.ll new file mode 100644 index 000000000000..b66495d9cbaa --- /dev/null +++ b/test/Transforms/InstCombine/2009-02-11-NotInitialized.ll @@ -0,0 +1,14 @@ +; RUN: opt < %s -inline -instcombine -functionattrs | llvm-dis +; +; Check that nocapture attributes are added when run after an SCC pass. +; PR3520 + +define i32 @use(i8* %x) nounwind readonly { +; CHECK: @use(i8* nocapture %x) + %1 = tail call i64 @strlen(i8* %x) nounwind readonly + %2 = trunc i64 %1 to i32 + ret i32 %2 +} + +declare i64 @strlen(i8*) nounwind readonly +; CHECK: declare i64 @strlen(i8* nocapture) nounwind readonly diff --git a/test/Transforms/InstCombine/2010-03-03-ExtElim.ll b/test/Transforms/InstCombine/2010-03-03-ExtElim.ll index 2df12d670adb..bb3159e1e6fa 100644 --- a/test/Transforms/InstCombine/2010-03-03-ExtElim.ll +++ b/test/Transforms/InstCombine/2010-03-03-ExtElim.ll @@ -1,4 +1,4 @@ -; RUN: opt -instcombine -S %s | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s ; PR6486 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32" diff --git a/test/Transforms/SimplifyLibCalls/2010-05-30-memcpy-Struct.ll b/test/Transforms/InstCombine/2010-05-30-memcpy-Struct.ll index f67bae74f503..09a96749f260 100644 --- a/test/Transforms/SimplifyLibCalls/2010-05-30-memcpy-Struct.ll +++ b/test/Transforms/InstCombine/2010-05-30-memcpy-Struct.ll @@ -1,4 +1,4 @@ -; RUN: opt -simplify-libcalls %s -S -o - | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s ; PR7265 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" @@ -6,11 +6,11 @@ target triple = "x86_64-unknown-linux-gnu" %union.anon = type { i32, [4 x i8] } -@.str = private constant [3 x i8] c"%s\00" ; <[3 x i8]*> [#uses=2] +@.str = private constant [3 x i8] c"%s\00" define void @CopyEventArg(%union.anon* %ev) nounwind { entry: - %call = call i32 (i8*, i8*, ...)* @sprintf(i8* undef, i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), %union.anon* %ev) nounwind ; <i32> [#uses=0] + %call = call i32 (i8*, i8*, ...)* @sprintf(i8* undef, i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), %union.anon* %ev) nounwind ; CHECK: bitcast %union.anon* %ev to i8* ; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 ret void diff --git a/test/Transforms/InstCombine/2010-11-01-lshr-mask.ll b/test/Transforms/InstCombine/2010-11-01-lshr-mask.ll index eb2899475695..800162197919 100644 --- a/test/Transforms/InstCombine/2010-11-01-lshr-mask.ll +++ b/test/Transforms/InstCombine/2010-11-01-lshr-mask.ll @@ -5,8 +5,8 @@ define i32 @main(i32 %argc) nounwind ssp { entry: %tmp3151 = trunc i32 %argc to i8 -; CHECK: %tmp3163 = shl i8 %tmp3162, 6 -; CHECK: and i8 %tmp3163, 64 +; CHECK: %0 = shl i8 %tmp3151, 5 +; CHECK: and i8 %0, 64 ; CHECK-NOT: shl ; CHECK-NOT: shr %tmp3161 = or i8 %tmp3151, -17 diff --git a/test/Transforms/InstCombine/2012-04-23-Neon-Intrinsics.ll b/test/Transforms/InstCombine/2012-04-23-Neon-Intrinsics.ll index 0907c490bb35..2dedd44e2be1 100644 --- a/test/Transforms/InstCombine/2012-04-23-Neon-Intrinsics.ll +++ b/test/Transforms/InstCombine/2012-04-23-Neon-Intrinsics.ll @@ -50,7 +50,7 @@ entry: %b = add <4 x i32> zeroinitializer, %a ret <4 x i32> %b ; CHECK: entry: -; CHECK-NEXT: %a = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> <i16 2, i16 2, i16 2, i16 2>, <4 x i16> %x) nounwind +; CHECK-NEXT: %a = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> <i16 2, i16 2, i16 2, i16 2>, <4 x i16> %x) [[NUW:#[0-9]+]] ; CHECK-NEXT: ret <4 x i32> %a } @@ -66,3 +66,7 @@ entry: declare <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16>, <4 x i16>) nounwind readnone declare <4 x i32> @llvm.arm.neon.vmullu.v4i32(<4 x i16>, <4 x i16>) nounwind readnone + +; CHECK: attributes #0 = { nounwind readnone ssp } +; CHECK: attributes #1 = { nounwind readnone } +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/InstCombine/2012-12-14-simp-vgep.ll b/test/Transforms/InstCombine/2012-12-14-simp-vgep.ll new file mode 100644 index 000000000000..fc29b095e5ce --- /dev/null +++ b/test/Transforms/InstCombine/2012-12-14-simp-vgep.ll @@ -0,0 +1,10 @@ +; RUN: opt < %s -instcombine -S + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +define <4 x i32> @foo(<4 x i32*>* %in) { + %t17 = load <4 x i32*>* %in, align 8 + %t18 = icmp eq <4 x i32*> %t17, zeroinitializer + %t19 = zext <4 x i1> %t18 to <4 x i32> + ret <4 x i32> %t19 +} diff --git a/test/Transforms/InstCombine/2013-03-05-Combine-BitcastTy-Into-Alloca.ll b/test/Transforms/InstCombine/2013-03-05-Combine-BitcastTy-Into-Alloca.ll new file mode 100644 index 000000000000..b20c3a07c0ac --- /dev/null +++ b/test/Transforms/InstCombine/2013-03-05-Combine-BitcastTy-Into-Alloca.ll @@ -0,0 +1,45 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +%struct._my_struct = type <{ [12 x i8], [4 x i8] }> + +@initval = common global %struct._my_struct zeroinitializer, align 1 + +; InstCombine will try to change the %struct._my_struct alloca into an +; allocation of an i96 because of the bitcast to create %2. That's not valid, +; as the other 32 bits of the structure still feed into the return value +define { i64, i64 } @function(i32 %x, i32 %y, i32 %z) nounwind { +; CHECK: @function +; CHECK-NEXT: entry: +; CHECK-NEXT: %retval = alloca %struct._my_struct, align 8 +; CHECK-NOT: bitcast i96* %retval to %struct._my_struct* +entry: + %retval = alloca %struct._my_struct, align 8 + %k.sroa.0.0.copyload = load i96* bitcast (%struct._my_struct* @initval to i96*), align 1 + %k.sroa.1.12.copyload = load i32* bitcast ([4 x i8]* getelementptr inbounds (%struct._my_struct* @initval, i64 0, i32 1) to i32*), align 1 + %0 = zext i32 %x to i96 + %bf.value = shl nuw nsw i96 %0, 6 + %bf.clear = and i96 %k.sroa.0.0.copyload, -288230376151711744 + %1 = zext i32 %y to i96 + %bf.value2 = shl nuw nsw i96 %1, 32 + %bf.shl3 = and i96 %bf.value2, 288230371856744448 + %bf.value.masked = and i96 %bf.value, 4294967232 + %2 = zext i32 %z to i96 + %bf.value8 = and i96 %2, 63 + %bf.clear4 = or i96 %bf.shl3, %bf.value.masked + %bf.set5 = or i96 %bf.clear4, %bf.value8 + %bf.set10 = or i96 %bf.set5, %bf.clear + %retval.0.cast7 = bitcast %struct._my_struct* %retval to i96* + store i96 %bf.set10, i96* %retval.0.cast7, align 8 + %retval.12.idx8 = getelementptr inbounds %struct._my_struct* %retval, i64 0, i32 1 + %retval.12.cast9 = bitcast [4 x i8]* %retval.12.idx8 to i32* + store i32 %k.sroa.1.12.copyload, i32* %retval.12.cast9, align 4 + %trunc = trunc i96 %bf.set10 to i64 + %.fca.0.insert = insertvalue { i64, i64 } undef, i64 %trunc, 0 + %retval.8.idx12 = getelementptr inbounds %struct._my_struct* %retval, i64 0, i32 0, i64 8 + %retval.8.cast13 = bitcast i8* %retval.8.idx12 to i64* + %retval.8.load14 = load i64* %retval.8.cast13, align 8 + %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %retval.8.load14, 1 + ret { i64, i64 } %.fca.1.insert +} diff --git a/test/Transforms/InstCombine/abs-1.ll b/test/Transforms/InstCombine/abs-1.ll new file mode 100644 index 000000000000..807f238755b5 --- /dev/null +++ b/test/Transforms/InstCombine/abs-1.ll @@ -0,0 +1,41 @@ +; Test that the abs library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +declare i32 @abs(i32) +declare i64 @labs(i64) +declare i64 @llabs(i64) + +; Check abs(x) -> x >s -1 ? x : -x. + +define i32 @test_simplify1(i32 %x) { +; CHECK: @test_simplify1 + %ret = call i32 @abs(i32 %x) +; CHECK-NEXT: [[ISPOS:%[a-z0-9]+]] = icmp sgt i32 %x, -1 +; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub i32 0, %x +; CHECK-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[ISPOS]], i32 %x, i32 [[NEG]] + ret i32 %ret +; CHECK-NEXT: ret i32 [[RET]] +} + +define i64 @test_simplify2(i64 %x) { +; CHECK: @test_simplify2 + %ret = call i64 @labs(i64 %x) +; CHECK-NEXT: [[ISPOS:%[a-z0-9]+]] = icmp sgt i64 %x, -1 +; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub i64 0, %x +; CHECK-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[ISPOS]], i64 %x, i64 [[NEG]] + ret i64 %ret +; CHECK-NEXT: ret i64 [[RET]] +} + +define i64 @test_simplify3(i64 %x) { +; CHECK: @test_simplify3 + %ret = call i64 @llabs(i64 %x) +; CHECK-NEXT: [[ISPOS:%[a-z0-9]+]] = icmp sgt i64 %x, -1 +; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub i64 0, %x +; CHECK-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[ISPOS]], i64 %x, i64 [[NEG]] + ret i64 %ret +; CHECK-NEXT: ret i64 [[RET]] +} diff --git a/test/Transforms/InstCombine/align-external.ll b/test/Transforms/InstCombine/align-external.ll index d4a5d429912b..c3ef2dbb70f0 100644 --- a/test/Transforms/InstCombine/align-external.ll +++ b/test/Transforms/InstCombine/align-external.ll @@ -8,7 +8,7 @@ ; CHECK: %q = add i64 %r, 1 ; CHECK: ret i64 %q -target datalayout = "-i32:8:32" +target datalayout = "i32:8:32" @A = external global i32 @B = weak_odr global i32 0 diff --git a/test/Transforms/InstCombine/bitcast-bigendian.ll b/test/Transforms/InstCombine/bitcast-bigendian.ll new file mode 100644 index 000000000000..4ded581a14c6 --- /dev/null +++ b/test/Transforms/InstCombine/bitcast-bigendian.ll @@ -0,0 +1,50 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +; These tests are extracted from bitcast.ll. +; Verify that they also work correctly on big-endian targets. + +define float @test2(<2 x float> %A, <2 x i32> %B) { + %tmp28 = bitcast <2 x float> %A to i64 ; <i64> [#uses=2] + %tmp23 = trunc i64 %tmp28 to i32 ; <i32> [#uses=1] + %tmp24 = bitcast i32 %tmp23 to float ; <float> [#uses=1] + + %tmp = bitcast <2 x i32> %B to i64 + %tmp2 = trunc i64 %tmp to i32 ; <i32> [#uses=1] + %tmp4 = bitcast i32 %tmp2 to float ; <float> [#uses=1] + + %add = fadd float %tmp24, %tmp4 + ret float %add + +; CHECK: @test2 +; CHECK-NEXT: %tmp24 = extractelement <2 x float> %A, i32 1 +; CHECK-NEXT: bitcast <2 x i32> %B to <2 x float> +; CHECK-NEXT: %tmp4 = extractelement <2 x float> {{.*}}, i32 1 +; CHECK-NEXT: %add = fadd float %tmp24, %tmp4 +; CHECK-NEXT: ret float %add +} + +define float @test3(<2 x float> %A, <2 x i64> %B) { + %tmp28 = bitcast <2 x float> %A to i64 + %tmp29 = lshr i64 %tmp28, 32 + %tmp23 = trunc i64 %tmp29 to i32 + %tmp24 = bitcast i32 %tmp23 to float + + %tmp = bitcast <2 x i64> %B to i128 + %tmp1 = lshr i128 %tmp, 64 + %tmp2 = trunc i128 %tmp1 to i32 + %tmp4 = bitcast i32 %tmp2 to float + + %add = fadd float %tmp24, %tmp4 + ret float %add + +; CHECK: @test3 +; CHECK-NEXT: %tmp24 = extractelement <2 x float> %A, i32 0 +; CHECK-NEXT: bitcast <2 x i64> %B to <4 x float> +; CHECK-NEXT: %tmp4 = extractelement <4 x float> {{.*}}, i32 1 +; CHECK-NEXT: %add = fadd float %tmp24, %tmp4 +; CHECK-NEXT: ret float %add +} + diff --git a/test/Transforms/InstCombine/bitcast-vector-fold.ll b/test/Transforms/InstCombine/bitcast-vector-fold.ll index 8feec229171a..8fd7f35b7bb7 100644 --- a/test/Transforms/InstCombine/bitcast-vector-fold.ll +++ b/test/Transforms/InstCombine/bitcast-vector-fold.ll @@ -31,3 +31,8 @@ define <4 x i32> @test6() { %tmp3 = bitcast <2 x double> <double 0.5, double 1.0> to <4 x i32> ret <4 x i32> %tmp3 } + +define i32 @test7() { + %tmp3 = bitcast <2 x half> <half 0xH1100, half 0xH0011> to i32 + ret i32 %tmp3 +}
\ No newline at end of file diff --git a/test/Transforms/InstCombine/bitcast.ll b/test/Transforms/InstCombine/bitcast.ll index 8f6ae7d83527..1e6113256bf3 100644 --- a/test/Transforms/InstCombine/bitcast.ll +++ b/test/Transforms/InstCombine/bitcast.ll @@ -11,7 +11,7 @@ define i32 @test1(i64 %a) { %t3 = xor <2 x i32> %t1, %t2 %t4 = extractelement <2 x i32> %t3, i32 0 ret i32 %t4 - + ; CHECK: @test1 ; CHECK: ret i32 0 } @@ -30,7 +30,7 @@ define float @test2(<2 x float> %A, <2 x i32> %B) { %add = fadd float %tmp24, %tmp4 ret float %add - + ; CHECK: @test2 ; CHECK-NEXT: %tmp24 = extractelement <2 x float> %A, i32 0 ; CHECK-NEXT: bitcast <2 x i32> %B to <2 x float> @@ -55,7 +55,7 @@ define float @test3(<2 x float> %A, <2 x i64> %B) { %add = fadd float %tmp24, %tmp4 ret float %add - + ; CHECK: @test3 ; CHECK-NEXT: %tmp24 = extractelement <2 x float> %A, i32 1 ; CHECK-NEXT: bitcast <2 x i64> %B to <4 x float> @@ -75,7 +75,7 @@ define <2 x i32> @test4(i32 %A, i32 %B){ ; CHECK: @test4 ; CHECK-NEXT: insertelement <2 x i32> undef, i32 %A, i32 0 ; CHECK-NEXT: insertelement <2 x i32> {{.*}}, i32 %B, i32 1 - ; CHECK-NEXT: ret <2 x i32> + ; CHECK-NEXT: ret <2 x i32> } @@ -92,7 +92,7 @@ define <2 x float> @test5(float %A, float %B) { ; CHECK: @test5 ; CHECK-NEXT: insertelement <2 x float> undef, float %A, i32 0 ; CHECK-NEXT: insertelement <2 x float> {{.*}}, float %B, i32 1 - ; CHECK-NEXT: ret <2 x float> + ; CHECK-NEXT: ret <2 x float> } define <2 x float> @test6(float %A){ @@ -123,7 +123,7 @@ define i64 @Vec2(i64 %in) { } define i64 @All11(i64 %in) { - %out = and i64 %in, xor (i64 bitcast (<2 x float> bitcast (i64 -1 to <2 x float>) to i64), i64 -1) + %out = and i64 %in, xor (i64 bitcast (<2 x float> bitcast (i64 -1 to <2 x float>) to i64), i64 -1) ret i64 %out ; CHECK: @All11 ; CHECK: ret i64 0 @@ -131,9 +131,16 @@ define i64 @All11(i64 %in) { define i32 @All111(i32 %in) { - %out = and i32 %in, xor (i32 bitcast (<1 x float> bitcast (i32 -1 to <1 x float>) to i32), i32 -1) + %out = and i32 %in, xor (i32 bitcast (<1 x float> bitcast (i32 -1 to <1 x float>) to i32), i32 -1) ret i32 %out ; CHECK: @All111 ; CHECK: ret i32 0 } +define <2 x i16> @BitcastInsert(i32 %a) { + %v = insertelement <1 x i32> undef, i32 %a, i32 0 + %r = bitcast <1 x i32> %v to <2 x i16> + ret <2 x i16> %r +; CHECK: @BitcastInsert +; CHECK: bitcast i32 %a to <2 x i16> +} diff --git a/test/Transforms/InstCombine/cast.ll b/test/Transforms/InstCombine/cast.ll index b4eb69d4363d..de738bb7c06d 100644 --- a/test/Transforms/InstCombine/cast.ll +++ b/test/Transforms/InstCombine/cast.ll @@ -473,14 +473,12 @@ define i64 @test51(i64 %A, i1 %cond) { %F = sext i32 %E to i64 ret i64 %F ; CHECK: @test51 - -; FIXME: disabled, see PR5997 -; HECK-NEXT: %C = and i64 %A, 4294967294 -; HECK-NEXT: %D = or i64 %A, 1 -; HECK-NEXT: %E = select i1 %cond, i64 %C, i64 %D -; HECK-NEXT: %sext = shl i64 %E, 32 -; HECK-NEXT: %F = ashr i64 %sext, 32 -; HECK-NEXT: ret i64 %F +; CHECK-NEXT: %C = and i64 %A, 4294967294 +; CHECK-NEXT: %D = or i64 %A, 1 +; CHECK-NEXT: %E = select i1 %cond, i64 %C, i64 %D +; CHECK-NEXT: %sext = shl i64 %E, 32 +; CHECK-NEXT: %F = ashr exact i64 %sext, 32 +; CHECK-NEXT: ret i64 %F } define i32 @test52(i64 %A) { diff --git a/test/Transforms/InstCombine/compare-signs.ll b/test/Transforms/InstCombine/compare-signs.ll index f8e49110610a..72db66e3ab0f 100644 --- a/test/Transforms/InstCombine/compare-signs.ll +++ b/test/Transforms/InstCombine/compare-signs.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -instcombine -S | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s ; PR5438 ; TODO: This should also optimize down. diff --git a/test/Transforms/InstCombine/constant-expr-datalayout.ll b/test/Transforms/InstCombine/constant-expr-datalayout.ll new file mode 100644 index 000000000000..9a72c77afdb0 --- /dev/null +++ b/test/Transforms/InstCombine/constant-expr-datalayout.ll @@ -0,0 +1,12 @@ +; RUN: opt -instcombine %s -S -o - | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%test1.struct = type { i32, i32 } +@test1.aligned_glbl = global %test1.struct zeroinitializer, align 4 +define void @test1(i64 *%ptr) { + store i64 and (i64 ptrtoint (i32* getelementptr (%test1.struct* @test1.aligned_glbl, i32 0, i32 1) to i64), i64 3), i64* %ptr +; CHECK: store i64 0, i64* %ptr + ret void +} diff --git a/test/Transforms/InstCombine/cos-1.ll b/test/Transforms/InstCombine/cos-1.ll new file mode 100644 index 000000000000..b92e448abd9f --- /dev/null +++ b/test/Transforms/InstCombine/cos-1.ll @@ -0,0 +1,38 @@ +; Test that the cos library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s -check-prefix=NO-FLOAT-SHRINK +; RUN: opt < %s -instcombine -enable-double-float-shrink -S | FileCheck %s -check-prefix=DO-FLOAT-SHRINK + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" + +declare double @cos(double) + +; Check cos(-x) -> cos(x); + +define double @test_simplify1(double %d) { +; NO-FLOAT-SHRINK: @test_simplify1 + %neg = fsub double -0.000000e+00, %d + %cos = call double @cos(double %neg) +; NO-FLOAT-SHRINK: call double @cos(double %d) + ret double %cos +} + +define float @test_simplify2(float %f) { +; DO-FLOAT-SHRINK: @test_simplify2 + %conv1 = fpext float %f to double + %neg = fsub double -0.000000e+00, %conv1 + %cos = call double @cos(double %neg) + %conv2 = fptrunc double %cos to float +; DO-FLOAT-SHRINK: call float @cosf(float %f) + ret float %conv2 +} + +define float @test_simplify3(float %f) { +; NO-FLOAT-SHRINK: @test_simplify3 + %conv1 = fpext float %f to double + %neg = fsub double -0.000000e+00, %conv1 + %cos = call double @cos(double %neg) +; NO-FLOAT-SHRINK: call double @cos(double %conv1) + %conv2 = fptrunc double %cos to float + ret float %conv2 +} diff --git a/test/Transforms/InstCombine/cos-2.ll b/test/Transforms/InstCombine/cos-2.ll new file mode 100644 index 000000000000..2f2dfafe484d --- /dev/null +++ b/test/Transforms/InstCombine/cos-2.ll @@ -0,0 +1,17 @@ +; Test that the cos library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" + +declare float @cos(double) + +; Check that cos functions with the wrong prototype aren't simplified. + +define float @test_no_simplify1(double %d) { +; CHECK: @test_no_simplify1 + %neg = fsub double -0.000000e+00, %d + %cos = call float @cos(double %neg) +; CHECK: call float @cos(double %neg) + ret float %cos +} diff --git a/test/Transforms/SimplifyLibCalls/debug-line.ll b/test/Transforms/InstCombine/debug-line.ll index b668e4b9d342..084efdc989f9 100644 --- a/test/Transforms/SimplifyLibCalls/debug-line.ll +++ b/test/Transforms/InstCombine/debug-line.ll @@ -1,4 +1,4 @@ -; RUN: opt -simplify-libcalls -S < %s | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s @.str = private constant [3 x i8] c"%c\00" diff --git a/test/Transforms/InstCombine/debuginfo.ll b/test/Transforms/InstCombine/debuginfo.ll index f6892fc3e1f9..cdbcd865117c 100644 --- a/test/Transforms/InstCombine/debuginfo.ll +++ b/test/Transforms/InstCombine/debuginfo.ll @@ -28,22 +28,21 @@ entry: ret i8* %call, !dbg !21 } -!llvm.dbg.lv.foobar = !{!0, !7, !9} -!llvm.dbg.sp = !{!1} +!llvm.dbg.cu = !{!3} -!0 = metadata !{i32 590081, metadata !1, metadata !"__dest", metadata !2, i32 16777294, metadata !6, i32 0} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"foobar", metadata !"foobar", metadata !"", metadata !2, i32 79, metadata !4, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i8* (i8*, i32, i64)* @foobar} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"string.h", metadata !"Game", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589841, i32 0, i32 12, metadata !"bits.c", metadata !"Game", metadata !"clang version 3.0 (trunk 127710)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 589845, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !5, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786689, metadata !1, metadata !"__dest", metadata !2, i32 16777294, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"foobar", metadata !"foobar", metadata !"", metadata !2, i32 79, metadata !4, i1 true, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, i8* (i8*, i32, i64)* @foobar, null, null, metadata !25, i32 79} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !27} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 0, i32 12, metadata !26, metadata !"clang version 3.0 (trunk 127710)", i1 true, metadata !"", i32 0, null, null, metadata !24, null, null} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !5, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6} -!6 = metadata !{i32 589839, metadata !3, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] -!7 = metadata !{i32 590081, metadata !1, metadata !"__val", metadata !2, i32 33554510, metadata !8, i32 0} ; [ DW_TAG_arg_variable ] -!8 = metadata !{i32 589860, metadata !3, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!9 = metadata !{i32 590081, metadata !1, metadata !"__len", metadata !2, i32 50331726, metadata !10, i32 0} ; [ DW_TAG_arg_variable ] +!6 = metadata !{i32 786447, metadata !3, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!7 = metadata !{i32 786689, metadata !1, metadata !"__val", metadata !2, i32 33554510, metadata !8, i32 0, null} ; [ DW_TAG_arg_variable ] +!8 = metadata !{i32 786468, metadata !3, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!9 = metadata !{i32 786689, metadata !1, metadata !"__len", metadata !2, i32 50331726, metadata !10, i32 0, null} ; [ DW_TAG_arg_variable ] !10 = metadata !{i32 589846, metadata !3, metadata !"size_t", metadata !2, i32 80, i64 0, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_typedef ] !11 = metadata !{i32 589846, metadata !3, metadata !"__darwin_size_t", metadata !2, i32 90, i64 0, i64 0, i64 0, i32 0, metadata !12} ; [ DW_TAG_typedef ] -!12 = metadata !{i32 589860, metadata !3, metadata !"long unsigned int", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] +!12 = metadata !{i32 786468, metadata !3, metadata !"long unsigned int", null, i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] !13 = metadata !{metadata !"any pointer", metadata !14} !14 = metadata !{metadata !"omnipotent char", metadata !15} !15 = metadata !{metadata !"Simple C/C++ TBAA", null} @@ -53,5 +52,10 @@ entry: !19 = metadata !{metadata !"long", metadata !14} !20 = metadata !{i32 78, i32 54, metadata !1, null} !21 = metadata !{i32 80, i32 3, metadata !22, null} -!22 = metadata !{i32 589835, metadata !23, i32 80, i32 3, metadata !2, i32 7} ; [ DW_TAG_lexical_block ] -!23 = metadata !{i32 589835, metadata !1, i32 79, i32 1, metadata !2, i32 6} ; [ DW_TAG_lexical_block ] +!22 = metadata !{i32 786443, metadata !23, i32 80, i32 3, metadata !2, i32 7} ; [ DW_TAG_lexical_block ] +!23 = metadata !{i32 786443, metadata !1, i32 79, i32 1, metadata !2, i32 6} ; [ DW_TAG_lexical_block ] +!24 = metadata !{metadata !1} +!25 = metadata !{metadata !0, metadata !7, metadata !9} +!26 = metadata !{i32 786473, metadata !28} ; [ DW_TAG_file_type ] +!27 = metadata !{metadata !"string.h", metadata !"Game"} +!28 = metadata !{metadata !"bits.c", metadata !"Game"} diff --git a/test/Transforms/InstCombine/devirt.ll b/test/Transforms/InstCombine/devirt.ll index 6189dc2af4f9..9c7cf5d697e8 100644 --- a/test/Transforms/InstCombine/devirt.ll +++ b/test/Transforms/InstCombine/devirt.ll @@ -1,4 +1,4 @@ -; RUN: opt -instcombine -S -o - %s | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s ; CHECK-NOT: getelementptr ; CHECK-NOT: ptrtoint diff --git a/test/Transforms/InstCombine/disable-simplify-libcalls.ll b/test/Transforms/InstCombine/disable-simplify-libcalls.ll index d81e9ae5bd73..c2c29368b1a8 100644 --- a/test/Transforms/InstCombine/disable-simplify-libcalls.ll +++ b/test/Transforms/InstCombine/disable-simplify-libcalls.ll @@ -37,6 +37,18 @@ declare i64 @strtoll(i8*, i8**, i32) declare i64 @strtoul(i8*, i8**, i32) declare i64 @strtoull(i8*, i8**, i32) declare i64 @strcspn(i8*, i8*) +declare i32 @abs(i32) +declare i32 @ffs(i32) +declare i32 @ffsl(i64) +declare i32 @ffsll(i64) +declare i32 @fprintf(i8*, i8*) +declare i32 @isascii(i32) +declare i32 @isdigit(i32) +declare i32 @toascii(i32) +declare i64 @labs(i64) +declare i64 @llabs(i64) +declare i32 @printf(i8*) +declare i32 @sprintf(i8*, i8*) define double @t1(double %x) { ; CHECK: @t1 @@ -234,3 +246,90 @@ define i64 @t25(i8* %y) { ret i64 %ret ; CHECK: call i64 @strcspn } + +define i32 @t26(i32 %y) { +; CHECK: @t26 + %ret = call i32 @abs(i32 %y) + ret i32 %ret +; CHECK: call i32 @abs +} + +define i32 @t27(i32 %y) { +; CHECK: @t27 + %ret = call i32 @ffs(i32 %y) + ret i32 %ret +; CHECK: call i32 @ffs +} + +define i32 @t28(i64 %y) { +; CHECK: @t28 + %ret = call i32 @ffsl(i64 %y) + ret i32 %ret +; CHECK: call i32 @ffsl +} + +define i32 @t29(i64 %y) { +; CHECK: @t29 + %ret = call i32 @ffsll(i64 %y) + ret i32 %ret +; CHECK: call i32 @ffsll +} + +define void @t30() { +; CHECK: @t30 + %x = getelementptr inbounds [13 x i8]* @.str1, i32 0, i32 0 + call i32 @fprintf(i8* null, i8* %x) + ret void +; CHECK: call i32 @fprintf +} + +define i32 @t31(i32 %y) { +; CHECK: @t31 + %ret = call i32 @isascii(i32 %y) + ret i32 %ret +; CHECK: call i32 @isascii +} + +define i32 @t32(i32 %y) { +; CHECK: @t32 + %ret = call i32 @isdigit(i32 %y) + ret i32 %ret +; CHECK: call i32 @isdigit +} + +define i32 @t33(i32 %y) { +; CHECK: @t33 + %ret = call i32 @toascii(i32 %y) + ret i32 %ret +; CHECK: call i32 @toascii +} + +define i64 @t34(i64 %y) { +; CHECK: @t34 + %ret = call i64 @labs(i64 %y) + ret i64 %ret +; CHECK: call i64 @labs +} + +define i64 @t35(i64 %y) { +; CHECK: @t35 + %ret = call i64 @llabs(i64 %y) + ret i64 %ret +; CHECK: call i64 @llabs +} + +define void @t36() { +; CHECK: @t36 + %x = getelementptr inbounds [1 x i8]* @empty, i32 0, i32 0 + call i32 @printf(i8* %x) + ret void +; CHECK: call i32 @printf +} + +define void @t37(i8* %x) { +; CHECK: @t37 + %y = getelementptr inbounds [13 x i8]* @.str1, i32 0, i32 0 + call i32 @sprintf(i8* %x, i8* %y) + ret void +; CHECK: call i32 @sprintf +} diff --git a/test/Transforms/SimplifyLibCalls/double-float-shrink.ll b/test/Transforms/InstCombine/double-float-shrink-1.ll index b4ab8b4ceb9d..e5448ee00765 100644 --- a/test/Transforms/SimplifyLibCalls/double-float-shrink.ll +++ b/test/Transforms/InstCombine/double-float-shrink-1.ll @@ -1,98 +1,98 @@ -; RUN: opt < %s -simplify-libcalls -enable-double-float-shrink -S | FileCheck %s +; RUN: opt < %s -instcombine -enable-double-float-shrink -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" define float @acos_test(float %f) nounwind readnone { ; CHECK: acos_test - %conv = fpext float %f to double - %call = call double @acos(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @acos(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @acosf(float %f) } define double @acos_test2(float %f) nounwind readnone { ; CHECK: acos_test2 - %conv = fpext float %f to double - %call = call double @acos(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @acos(double %conv) + ret double %call ; CHECK: call double @acos(double %conv) } define float @acosh_test(float %f) nounwind readnone { ; CHECK: acosh_test - %conv = fpext float %f to double - %call = call double @acosh(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @acosh(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @acoshf(float %f) } define double @acosh_test2(float %f) nounwind readnone { ; CHECK: acosh_test2 - %conv = fpext float %f to double - %call = call double @acosh(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @acosh(double %conv) + ret double %call ; CHECK: call double @acosh(double %conv) } define float @asin_test(float %f) nounwind readnone { ; CHECK: asin_test - %conv = fpext float %f to double - %call = call double @asin(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @asin(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @asinf(float %f) } define double @asin_test2(float %f) nounwind readnone { ; CHECK: asin_test2 - %conv = fpext float %f to double - %call = call double @asin(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @asin(double %conv) + ret double %call ; CHECK: call double @asin(double %conv) } define float @asinh_test(float %f) nounwind readnone { ; CHECK: asinh_test - %conv = fpext float %f to double - %call = call double @asinh(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @asinh(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @asinhf(float %f) } define double @asinh_test2(float %f) nounwind readnone { ; CHECK: asinh_test2 - %conv = fpext float %f to double - %call = call double @asinh(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @asinh(double %conv) + ret double %call ; CHECK: call double @asinh(double %conv) } define float @atan_test(float %f) nounwind readnone { ; CHECK: atan_test - %conv = fpext float %f to double - %call = call double @atan(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @atan(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @atanf(float %f) } define double @atan_test2(float %f) nounwind readnone { ; CHECK: atan_test2 - %conv = fpext float %f to double - %call = call double @atan(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @atan(double %conv) + ret double %call ; CHECK: call double @atan(double %conv) } define float @atanh_test(float %f) nounwind readnone { ; CHECK: atanh_test - %conv = fpext float %f to double - %call = call double @atanh(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @atanh(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @atanhf(float %f) } @@ -105,210 +105,210 @@ define double @atanh_test2(float %f) nounwind readnone { } define float @cbrt_test(float %f) nounwind readnone { ; CHECK: cbrt_test - %conv = fpext float %f to double - %call = call double @cbrt(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @cbrt(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @cbrtf(float %f) } define double @cbrt_test2(float %f) nounwind readnone { ; CHECK: cbrt_test2 - %conv = fpext float %f to double - %call = call double @cbrt(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @cbrt(double %conv) + ret double %call ; CHECK: call double @cbrt(double %conv) } define float @exp_test(float %f) nounwind readnone { ; CHECK: exp_test - %conv = fpext float %f to double - %call = call double @exp(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @exp(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @expf(float %f) } define double @exp_test2(float %f) nounwind readnone { ; CHECK: exp_test2 - %conv = fpext float %f to double - %call = call double @exp(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @exp(double %conv) + ret double %call ; CHECK: call double @exp(double %conv) } define float @expm1_test(float %f) nounwind readnone { ; CHECK: expm1_test - %conv = fpext float %f to double - %call = call double @expm1(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @expm1(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @expm1f(float %f) } define double @expm1_test2(float %f) nounwind readnone { ; CHECK: expm1_test2 - %conv = fpext float %f to double - %call = call double @expm1(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @expm1(double %conv) + ret double %call ; CHECK: call double @expm1(double %conv) } define float @exp10_test(float %f) nounwind readnone { ; CHECK: exp10_test - %conv = fpext float %f to double - %call = call double @exp10(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @exp10(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @exp10f(float %f) } define double @exp10_test2(float %f) nounwind readnone { ; CHECK: exp10_test2 - %conv = fpext float %f to double - %call = call double @exp10(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @exp10(double %conv) + ret double %call ; CHECK: call double @exp10(double %conv) } define float @log_test(float %f) nounwind readnone { ; CHECK: log_test - %conv = fpext float %f to double - %call = call double @log(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @log(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @logf(float %f) } define double @log_test2(float %f) nounwind readnone { ; CHECK: log_test2 - %conv = fpext float %f to double - %call = call double @log(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @log(double %conv) + ret double %call ; CHECK: call double @log(double %conv) } define float @log10_test(float %f) nounwind readnone { ; CHECK: log10_test - %conv = fpext float %f to double - %call = call double @log10(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @log10(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @log10f(float %f) } define double @log10_test2(float %f) nounwind readnone { ; CHECK: log10_test2 - %conv = fpext float %f to double - %call = call double @log10(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @log10(double %conv) + ret double %call ; CHECK: call double @log10(double %conv) } define float @log1p_test(float %f) nounwind readnone { ; CHECK: log1p_test - %conv = fpext float %f to double - %call = call double @log1p(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @log1p(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @log1pf(float %f) } define double @log1p_test2(float %f) nounwind readnone { ; CHECK: log1p_test2 - %conv = fpext float %f to double - %call = call double @log1p(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @log1p(double %conv) + ret double %call ; CHECK: call double @log1p(double %conv) } define float @log2_test(float %f) nounwind readnone { ; CHECK: log2_test - %conv = fpext float %f to double - %call = call double @log2(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @log2(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @log2f(float %f) } define double @log2_test2(float %f) nounwind readnone { ; CHECK: log2_test2 - %conv = fpext float %f to double - %call = call double @log2(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @log2(double %conv) + ret double %call ; CHECK: call double @log2(double %conv) } define float @logb_test(float %f) nounwind readnone { ; CHECK: logb_test - %conv = fpext float %f to double - %call = call double @logb(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @logb(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @logbf(float %f) } define double @logb_test2(float %f) nounwind readnone { ; CHECK: logb_test2 - %conv = fpext float %f to double - %call = call double @logb(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @logb(double %conv) + ret double %call ; CHECK: call double @logb(double %conv) } define float @sin_test(float %f) nounwind readnone { ; CHECK: sin_test - %conv = fpext float %f to double - %call = call double @sin(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @sin(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @sinf(float %f) } define double @sin_test2(float %f) nounwind readnone { ; CHECK: sin_test2 - %conv = fpext float %f to double - %call = call double @sin(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @sin(double %conv) + ret double %call ; CHECK: call double @sin(double %conv) } define float @sqrt_test(float %f) nounwind readnone { ; CHECK: sqrt_test - %conv = fpext float %f to double - %call = call double @sqrt(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @sqrt(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @sqrtf(float %f) } define double @sqrt_test2(float %f) nounwind readnone { ; CHECK: sqrt_test2 - %conv = fpext float %f to double - %call = call double @sqrt(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @sqrt(double %conv) + ret double %call ; CHECK: call double @sqrt(double %conv) } define float @tan_test(float %f) nounwind readnone { ; CHECK: tan_test - %conv = fpext float %f to double - %call = call double @tan(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @tan(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @tanf(float %f) } define double @tan_test2(float %f) nounwind readnone { ; CHECK: tan_test2 - %conv = fpext float %f to double - %call = call double @tan(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @tan(double %conv) + ret double %call ; CHECK: call double @tan(double %conv) } define float @tanh_test(float %f) nounwind readnone { ; CHECK: tanh_test - %conv = fpext float %f to double - %call = call double @tanh(double %conv) - %conv1 = fptrunc double %call to float - ret float %conv1 + %conv = fpext float %f to double + %call = call double @tanh(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 ; CHECK: call float @tanhf(float %f) } define double @tanh_test2(float %f) nounwind readnone { ; CHECK: tanh_test2 - %conv = fpext float %f to double - %call = call double @tanh(double %conv) - ret double %call + %conv = fpext float %f to double + %call = call double @tanh(double %conv) + ret double %call ; CHECK: call double @tanh(double %conv) } diff --git a/test/Transforms/InstCombine/double-float-shrink-2.ll b/test/Transforms/InstCombine/double-float-shrink-2.ll new file mode 100644 index 000000000000..7f6df92c96c5 --- /dev/null +++ b/test/Transforms/InstCombine/double-float-shrink-2.ll @@ -0,0 +1,80 @@ +; RUN: opt < %s -instcombine -S -mtriple "i386-pc-linux" | FileCheck -check-prefix=DO-SIMPLIFY %s +; RUN: opt < %s -instcombine -S -mtriple "i386-pc-win32" | FileCheck -check-prefix=DONT-SIMPLIFY %s +; RUN: opt < %s -instcombine -S -mtriple "x86_64-pc-win32" | FileCheck -check-prefix=C89-SIMPLIFY %s +; RUN: opt < %s -instcombine -S -mtriple "i386-pc-mingw32" | FileCheck -check-prefix=DO-SIMPLIFY %s +; RUN: opt < %s -instcombine -S -mtriple "x86_64-pc-mingw32" | FileCheck -check-prefix=DO-SIMPLIFY %s +; RUN: opt < %s -instcombine -S -mtriple "sparc-sun-solaris" | FileCheck -check-prefix=DO-SIMPLIFY %s + +; DO-SIMPLIFY: call float @floorf( +; DO-SIMPLIFY: call float @ceilf( +; DO-SIMPLIFY: call float @roundf( +; DO-SIMPLIFY: call float @nearbyintf( +; DO-SIMPLIFY: call float @truncf( +; DO-SIMPLIFY: call float @fabsf( + +; C89-SIMPLIFY: call float @floorf( +; C89-SIMPLIFY: call float @ceilf( +; C89-SIMPLIFY: call double @round( +; C89-SIMPLIFY: call double @nearbyint( + +; DONT-SIMPLIFY: call double @floor( +; DONT-SIMPLIFY: call double @ceil( +; DONT-SIMPLIFY: call double @round( +; DONT-SIMPLIFY: call double @nearbyint( +; DONT-SIMPLIFY: call double @trunc( +; DONT-SIMPLIFY: call double @fabs( + +declare double @floor(double) +declare double @ceil(double) +declare double @round(double) +declare double @nearbyint(double) +declare double @trunc(double) +declare double @fabs(double) + +define float @test_floor(float %C) { + %D = fpext float %C to double + ; --> floorf + %E = call double @floor(double %D) + %F = fptrunc double %E to float + ret float %F +} + +define float @test_ceil(float %C) { + %D = fpext float %C to double + ; --> ceilf + %E = call double @ceil(double %D) + %F = fptrunc double %E to float + ret float %F +} + +define float @test_round(float %C) { + %D = fpext float %C to double + ; --> roundf + %E = call double @round(double %D) + %F = fptrunc double %E to float + ret float %F +} + +define float @test_nearbyint(float %C) { + %D = fpext float %C to double + ; --> nearbyintf + %E = call double @nearbyint(double %D) + %F = fptrunc double %E to float + ret float %F +} + +define float @test_trunc(float %C) { + %D = fpext float %C to double + ; --> truncf + %E = call double @trunc(double %D) + %F = fptrunc double %E to float + ret float %F +} + +define float @test_fabs(float %C) { + %D = fpext float %C to double + ; --> fabsf + %E = call double @fabs(double %D) + %F = fptrunc double %E to float + ret float %F +} diff --git a/test/Transforms/InstCombine/exact.ll b/test/Transforms/InstCombine/exact.ll index 14741e3c1c33..88ca88c3b927 100644 --- a/test/Transforms/InstCombine/exact.ll +++ b/test/Transforms/InstCombine/exact.ll @@ -99,9 +99,9 @@ define i1 @ashr_icmp2(i64 %X) nounwind { ; PR9998 ; Make sure we don't transform the ashr here into an sdiv ; CHECK: @pr9998 -; CHECK: = and i32 %V, 1 -; CHECK: %Z = icmp ne -; CHECK: ret i1 %Z +; CHECK: [[BIT:%[A-Za-z0-9.]+]] = and i32 %V, 1 +; CHECK-NEXT: [[CMP:%[A-Za-z0-9.]+]] = icmp ne i32 [[BIT]], 0 +; CHECK-NEXT: ret i1 [[CMP]] define i1 @pr9998(i32 %V) nounwind { entry: %W = shl i32 %V, 31 @@ -112,6 +112,7 @@ entry: } + ; CHECK: @udiv_icmp1 ; CHECK: icmp ne i64 %X, 0 define i1 @udiv_icmp1(i64 %X) nounwind { diff --git a/test/Transforms/InstCombine/exp2-1.ll b/test/Transforms/InstCombine/exp2-1.ll new file mode 100644 index 000000000000..1b0ad5000412 --- /dev/null +++ b/test/Transforms/InstCombine/exp2-1.ll @@ -0,0 +1,76 @@ +; Test that the exp2 library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +declare double @exp2(double) +declare float @exp2f(float) + +; Check exp2(sitofp(x)) -> ldexp(1.0, sext(x)). + +define double @test_simplify1(i32 %x) { +; CHECK: @test_simplify1 + %conv = sitofp i32 %x to double + %ret = call double @exp2(double %conv) +; CHECK: call double @ldexp + ret double %ret +} + +define double @test_simplify2(i16 signext %x) { +; CHECK: @test_simplify2 + %conv = sitofp i16 %x to double + %ret = call double @exp2(double %conv) +; CHECK: call double @ldexp + ret double %ret +} + +define double @test_simplify3(i8 signext %x) { +; CHECK: @test_simplify3 + %conv = sitofp i8 %x to double + %ret = call double @exp2(double %conv) +; CHECK: call double @ldexp + ret double %ret +} + +define float @test_simplify4(i32 %x) { +; CHECK: @test_simplify4 + %conv = sitofp i32 %x to float + %ret = call float @exp2f(float %conv) +; CHECK: call float @ldexpf + ret float %ret +} + +; Check exp2(uitofp(x)) -> ldexp(1.0, zext(x)). + +define double @test_no_simplify1(i32 %x) { +; CHECK: @test_no_simplify1 + %conv = uitofp i32 %x to double + %ret = call double @exp2(double %conv) +; CHECK: call double @exp2 + ret double %ret +} + +define double @test_simplify6(i16 zeroext %x) { +; CHECK: @test_simplify6 + %conv = uitofp i16 %x to double + %ret = call double @exp2(double %conv) +; CHECK: call double @ldexp + ret double %ret +} + +define double @test_simplify7(i8 zeroext %x) { +; CHECK: @test_simplify7 + %conv = uitofp i8 %x to double + %ret = call double @exp2(double %conv) +; CHECK: call double @ldexp + ret double %ret +} + +define float @test_simplify8(i8 zeroext %x) { +; CHECK: @test_simplify8 + %conv = uitofp i8 %x to float + %ret = call float @exp2f(float %conv) +; CHECK: call float @ldexpf + ret float %ret +} diff --git a/test/Transforms/InstCombine/exp2-2.ll b/test/Transforms/InstCombine/exp2-2.ll new file mode 100644 index 000000000000..bed063798e29 --- /dev/null +++ b/test/Transforms/InstCombine/exp2-2.ll @@ -0,0 +1,17 @@ +; Test that the exp2 library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +declare float @exp2(double) + +; Check that exp2 functions with the wrong prototype aren't simplified. + +define float @test_no_simplify1(i32 %x) { +; CHECK: @test_no_simplify1 + %conv = sitofp i32 %x to double + %ret = call float @exp2(double %conv) +; CHECK: call float @exp2(double %conv) + ret float %ret +} diff --git a/test/Transforms/InstCombine/fast-math.ll b/test/Transforms/InstCombine/fast-math.ll new file mode 100644 index 000000000000..edcbcc71dfb4 --- /dev/null +++ b/test/Transforms/InstCombine/fast-math.ll @@ -0,0 +1,467 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +; testing-case "float fold(float a) { return 1.2f * a * 2.3f; }" +; 1.2f and 2.3f is supposed to be fold. +define float @fold(float %a) { + %mul = fmul fast float %a, 0x3FF3333340000000 + %mul1 = fmul fast float %mul, 0x4002666660000000 + ret float %mul1 +; CHECK: @fold +; CHECK: fmul fast float %a, 0x4006147AE0000000 +} + +; Same testing-case as the one used in fold() except that the operators have +; fixed FP mode. +define float @notfold(float %a) { +; CHECK: @notfold +; CHECK: %mul = fmul fast float %a, 0x3FF3333340000000 + %mul = fmul fast float %a, 0x3FF3333340000000 + %mul1 = fmul float %mul, 0x4002666660000000 + ret float %mul1 +} + +define float @fold2(float %a) { +; CHECK: @fold2 +; CHECK: fmul fast float %a, 0x4006147AE0000000 + %mul = fmul float %a, 0x3FF3333340000000 + %mul1 = fmul fast float %mul, 0x4002666660000000 + ret float %mul1 +} + +; C * f1 + f1 = (C+1) * f1 +define double @fold3(double %f1) { + %t1 = fmul fast double 2.000000e+00, %f1 + %t2 = fadd fast double %f1, %t1 + ret double %t2 +; CHECK: @fold3 +; CHECK: fmul fast double %f1, 3.000000e+00 +} + +; (C1 - X) + (C2 - Y) => (C1+C2) - (X + Y) +define float @fold4(float %f1, float %f2) { + %sub = fsub float 4.000000e+00, %f1 + %sub1 = fsub float 5.000000e+00, %f2 + %add = fadd fast float %sub, %sub1 + ret float %add +; CHECK: @fold4 +; CHECK: %1 = fadd fast float %f1, %f2 +; CHECK: fsub fast float 9.000000e+00, %1 +} + +; (X + C1) + C2 => X + (C1 + C2) +define float @fold5(float %f1, float %f2) { + %add = fadd float %f1, 4.000000e+00 + %add1 = fadd fast float %add, 5.000000e+00 + ret float %add1 +; CHECK: @fold5 +; CHECK: fadd fast float %f1, 9.000000e+00 +} + +; (X + X) + X => 3.0 * X +define float @fold6(float %f1) { + %t1 = fadd fast float %f1, %f1 + %t2 = fadd fast float %f1, %t1 + ret float %t2 +; CHECK: @fold6 +; CHECK: fmul fast float %f1, 3.000000e+00 +} + +; C1 * X + (X + X) = (C1 + 2) * X +define float @fold7(float %f1) { + %t1 = fmul fast float %f1, 5.000000e+00 + %t2 = fadd fast float %f1, %f1 + %t3 = fadd fast float %t1, %t2 + ret float %t3 +; CHECK: @fold7 +; CHECK: fmul fast float %f1, 7.000000e+00 +} + +; (X + X) + (X + X) => 4.0 * X +define float @fold8(float %f1) { + %t1 = fadd fast float %f1, %f1 + %t2 = fadd fast float %f1, %f1 + %t3 = fadd fast float %t1, %t2 + ret float %t3 +; CHECK: fold8 +; CHECK: fmul fast float %f1, 4.000000e+00 +} + +; X - (X + Y) => 0 - Y +define float @fold9(float %f1, float %f2) { + %t1 = fadd float %f1, %f2 + %t3 = fsub fast float %f1, %t1 + ret float %t3 + +; CHECK: @fold9 +; CHECK: fsub fast float 0.000000e+00, %f2 +} + +; Let C3 = C1 + C2. (f1 + C1) + (f2 + C2) => (f1 + f2) + C3 instead of +; "(f1 + C3) + f2" or "(f2 + C3) + f1". Placing constant-addend at the +; top of resulting simplified expression tree may potentially reveal some +; optimization opportunities in the super-expression trees. +; +define float @fold10(float %f1, float %f2) { + %t1 = fadd fast float 2.000000e+00, %f1 + %t2 = fsub fast float %f2, 3.000000e+00 + %t3 = fadd fast float %t1, %t2 + ret float %t3 +; CHECK: @fold10 +; CHECK: %t3 = fadd fast float %t2, -1.000000e+00 +; CHECK: ret float %t3 +} + +; once cause Crash/miscompilation +define float @fail1(float %f1, float %f2) { + %conv3 = fadd fast float %f1, -1.000000e+00 + %add = fadd fast float %conv3, %conv3 + %add2 = fadd fast float %add, %conv3 + ret float %add2 +; CHECK: @fail1 +; CHECK: ret +} + +define double @fail2(double %f1, double %f2) { + %t1 = fsub fast double %f1, %f2 + %t2 = fadd fast double %f1, %f2 + %t3 = fsub fast double %t1, %t2 + ret double %t3 +; CHECK: @fail2 +; CHECK: ret +} + +; c1 * x - x => (c1 - 1.0) * x +define float @fold13(float %x) { + %mul = fmul fast float %x, 7.000000e+00 + %sub = fsub fast float %mul, %x + ret float %sub +; CHECK: fold13 +; CHECK: fmul fast float %x, 6.000000e+00 +; CHECK: ret +} + +; ========================================================================= +; +; Testing-cases about fmul begin +; +; ========================================================================= + +; ((X*C1) + C2) * C3 => (X * (C1*C3)) + (C2*C3) (i.e. distribution) +define float @fmul_distribute1(float %f1) { + %t1 = fmul float %f1, 6.0e+3 + %t2 = fadd float %t1, 2.0e+3 + %t3 = fmul fast float %t2, 5.0e+3 + ret float %t3 +; CHECK: @fmul_distribute1 +; CHECK: %1 = fmul fast float %f1, 3.000000e+07 +; CHECK: %t3 = fadd fast float %1, 1.000000e+07 +} + +; (X/C1 + C2) * C3 => X/(C1/C3) + C2*C3 +define double @fmul_distribute2(double %f1, double %f2) { + %t1 = fdiv double %f1, 3.0e+0 + %t2 = fadd double %t1, 5.0e+1 + ; 0x10000000000000 = DBL_MIN + %t3 = fmul fast double %t2, 0x10000000000000 + ret double %t3 + +; CHECK: @fmul_distribute2 +; CHECK: %1 = fdiv fast double %f1, 0x7FE8000000000000 +; CHECK: fadd fast double %1, 0x69000000000000 +} + +; 5.0e-1 * DBL_MIN yields denormal, so "(f1*3.0 + 5.0e-1) * DBL_MIN" cannot +; be simplified into f1 * (3.0*DBL_MIN) + (5.0e-1*DBL_MIN) +define double @fmul_distribute3(double %f1) { + %t1 = fdiv double %f1, 3.0e+0 + %t2 = fadd double %t1, 5.0e-1 + %t3 = fmul fast double %t2, 0x10000000000000 + ret double %t3 + +; CHECK: @fmul_distribute3 +; CHECK: fmul fast double %t2, 0x10000000000000 +} + +; ((X*C1) + C2) * C3 => (X * (C1*C3)) + (C2*C3) (i.e. distribution) +define float @fmul_distribute4(float %f1) { + %t1 = fmul float %f1, 6.0e+3 + %t2 = fsub float 2.0e+3, %t1 + %t3 = fmul fast float %t2, 5.0e+3 + ret float %t3 +; CHECK: @fmul_distribute4 +; CHECK: %1 = fmul fast float %f1, 3.000000e+07 +; CHECK: %t3 = fsub fast float 1.000000e+07, %1 +} + +; C1/X * C2 => (C1*C2) / X +define float @fmul2(float %f1) { + %t1 = fdiv float 2.0e+3, %f1 + %t3 = fmul fast float %t1, 6.0e+3 + ret float %t3 +; CHECK: @fmul2 +; CHECK: fdiv fast float 1.200000e+07, %f1 +} + +; X/C1 * C2 => X * (C2/C1) (if C2/C1 is normal Fp) +define float @fmul3(float %f1, float %f2) { + %t1 = fdiv float %f1, 2.0e+3 + %t3 = fmul fast float %t1, 6.0e+3 + ret float %t3 +; CHECK: @fmul3 +; CHECK: fmul fast float %f1, 3.000000e+00 +} + +; Rule "X/C1 * C2 => X * (C2/C1) is not applicable if C2/C1 is either a special +; value of a denormal. The 0x3810000000000000 here take value FLT_MIN +; +define float @fmul4(float %f1, float %f2) { + %t1 = fdiv float %f1, 2.0e+3 + %t3 = fmul fast float %t1, 0x3810000000000000 + ret float %t3 +; CHECK: @fmul4 +; CHECK: fmul fast float %t1, 0x3810000000000000 +} + +; X / C1 * C2 => X / (C2/C1) if C1/C2 is either a special value of a denormal, +; and C2/C1 is a normal value. +; +define float @fmul5(float %f1, float %f2) { + %t1 = fdiv float %f1, 3.0e+0 + %t3 = fmul fast float %t1, 0x3810000000000000 + ret float %t3 +; CHECK: @fmul5 +; CHECK: fdiv fast float %f1, 0x47E8000000000000 +} + +; (X*Y) * X => (X*X) * Y +define float @fmul6(float %f1, float %f2) { + %mul = fmul float %f1, %f2 + %mul1 = fmul fast float %mul, %f1 + ret float %mul1 +; CHECK: @fmul6 +; CHECK: fmul fast float %f1, %f1 +} + +; "(X*Y) * X => (X*X) * Y" is disabled if "X*Y" has multiple uses +define float @fmul7(float %f1, float %f2) { + %mul = fmul float %f1, %f2 + %mul1 = fmul fast float %mul, %f1 + %add = fadd float %mul1, %mul + ret float %add +; CHECK: @fmul7 +; CHECK: fmul fast float %mul, %f1 +} + +; ========================================================================= +; +; Testing-cases about negation +; +; ========================================================================= +define float @fneg1(float %f1, float %f2) { + %sub = fsub float -0.000000e+00, %f1 + %sub1 = fsub nsz float 0.000000e+00, %f2 + %mul = fmul float %sub, %sub1 + ret float %mul +; CHECK: @fneg1 +; CHECK: fmul float %f1, %f2 +} + +; ========================================================================= +; +; Testing-cases about div +; +; ========================================================================= + +; X/C1 / C2 => X * (1/(C2*C1)) +define float @fdiv1(float %x) { + %div = fdiv float %x, 0x3FF3333340000000 + %div1 = fdiv fast float %div, 0x4002666660000000 + ret float %div1 +; 0x3FF3333340000000 = 1.2f +; 0x4002666660000000 = 2.3f +; 0x3FD7303B60000000 = 0.36231884057971014492 +; CHECK: @fdiv1 +; CHECK: fmul fast float %x, 0x3FD7303B60000000 +} + +; X*C1 / C2 => X * (C1/C2) +define float @fdiv2(float %x) { + %mul = fmul float %x, 0x3FF3333340000000 + %div1 = fdiv fast float %mul, 0x4002666660000000 + ret float %div1 + +; 0x3FF3333340000000 = 1.2f +; 0x4002666660000000 = 2.3f +; 0x3FE0B21660000000 = 0.52173918485641479492 +; CHECK: @fdiv2 +; CHECK: fmul fast float %x, 0x3FE0B21660000000 +} + +; "X/C1 / C2 => X * (1/(C2*C1))" is disabled (for now) is C2/C1 is a denormal +; +define float @fdiv3(float %x) { + %div = fdiv float %x, 0x47EFFFFFE0000000 + %div1 = fdiv fast float %div, 0x4002666660000000 + ret float %div1 +; CHECK: @fdiv3 +; CHECK: fdiv float %x, 0x47EFFFFFE0000000 +} + +; "X*C1 / C2 => X * (C1/C2)" is disabled if C1/C2 is a denormal +define float @fdiv4(float %x) { + %mul = fmul float %x, 0x47EFFFFFE0000000 + %div = fdiv float %mul, 0x3FC99999A0000000 + ret float %div +; CHECK: @fdiv4 +; CHECK: fmul float %x, 0x47EFFFFFE0000000 +} + +; (X/Y)/Z = > X/(Y*Z) +define float @fdiv5(float %f1, float %f2, float %f3) { + %t1 = fdiv float %f1, %f2 + %t2 = fdiv fast float %t1, %f3 + ret float %t2 +; CHECK: @fdiv5 +; CHECK: fmul float %f2, %f3 +} + +; Z/(X/Y) = > (Z*Y)/X +define float @fdiv6(float %f1, float %f2, float %f3) { + %t1 = fdiv float %f1, %f2 + %t2 = fdiv fast float %f3, %t1 + ret float %t2 +; CHECK: @fdiv6 +; CHECK: fmul float %f3, %f2 +} + +; C1/(X*C2) => (C1/C2) / X +define float @fdiv7(float %x) { + %t1 = fmul float %x, 3.0e0 + %t2 = fdiv fast float 15.0e0, %t1 + ret float %t2 +; CHECK: @fdiv7 +; CHECK: fdiv fast float 5.000000e+00, %x +} + +; C1/(X/C2) => (C1*C2) / X +define float @fdiv8(float %x) { + %t1 = fdiv float %x, 3.0e0 + %t2 = fdiv fast float 15.0e0, %t1 + ret float %t2 +; CHECK: @fdiv8 +; CHECK: fdiv fast float 4.500000e+01, %x +} + +; C1/(C2/X) => (C1/C2) * X +define float @fdiv9(float %x) { + %t1 = fdiv float 3.0e0, %x + %t2 = fdiv fast float 15.0e0, %t1 + ret float %t2 +; CHECK: @fdiv9 +; CHECK: fmul fast float %x, 5.000000e+00 +} + +; ========================================================================= +; +; Testing-cases about factorization +; +; ========================================================================= +; x*z + y*z => (x+y) * z +define float @fact_mul1(float %x, float %y, float %z) { + %t1 = fmul fast float %x, %z + %t2 = fmul fast float %y, %z + %t3 = fadd fast float %t1, %t2 + ret float %t3 +; CHECK: @fact_mul1 +; CHECK: fmul fast float %1, %z +} + +; z*x + y*z => (x+y) * z +define float @fact_mul2(float %x, float %y, float %z) { + %t1 = fmul fast float %z, %x + %t2 = fmul fast float %y, %z + %t3 = fsub fast float %t1, %t2 + ret float %t3 +; CHECK: @fact_mul2 +; CHECK: fmul fast float %1, %z +} + +; z*x - z*y => (x-y) * z +define float @fact_mul3(float %x, float %y, float %z) { + %t2 = fmul fast float %z, %y + %t1 = fmul fast float %z, %x + %t3 = fsub fast float %t1, %t2 + ret float %t3 +; CHECK: @fact_mul3 +; CHECK: fmul fast float %1, %z +} + +; x*z - z*y => (x-y) * z +define float @fact_mul4(float %x, float %y, float %z) { + %t1 = fmul fast float %x, %z + %t2 = fmul fast float %z, %y + %t3 = fsub fast float %t1, %t2 + ret float %t3 +; CHECK: @fact_mul4 +; CHECK: fmul fast float %1, %z +} + +; x/y + x/z, no xform +define float @fact_div1(float %x, float %y, float %z) { + %t1 = fdiv fast float %x, %y + %t2 = fdiv fast float %x, %z + %t3 = fadd fast float %t1, %t2 + ret float %t3 +; CHECK: fact_div1 +; CHECK: fadd fast float %t1, %t2 +} + +; x/y + z/x; no xform +define float @fact_div2(float %x, float %y, float %z) { + %t1 = fdiv fast float %x, %y + %t2 = fdiv fast float %z, %x + %t3 = fadd fast float %t1, %t2 + ret float %t3 +; CHECK: fact_div2 +; CHECK: fadd fast float %t1, %t2 +} + +; y/x + z/x => (y+z)/x +define float @fact_div3(float %x, float %y, float %z) { + %t1 = fdiv fast float %y, %x + %t2 = fdiv fast float %z, %x + %t3 = fadd fast float %t1, %t2 + ret float %t3 +; CHECK: fact_div3 +; CHECK: fdiv fast float %1, %x +} + +; y/x - z/x => (y-z)/x +define float @fact_div4(float %x, float %y, float %z) { + %t1 = fdiv fast float %y, %x + %t2 = fdiv fast float %z, %x + %t3 = fsub fast float %t1, %t2 + ret float %t3 +; CHECK: fact_div4 +; CHECK: fdiv fast float %1, %x +} + +; y/x - z/x => (y-z)/x is disabled if y-z is denormal. +define float @fact_div5(float %x) { + %t1 = fdiv fast float 0x3810000000000000, %x + %t2 = fdiv fast float 0x3800000000000000, %x + %t3 = fadd fast float %t1, %t2 + ret float %t3 +; CHECK: fact_div5 +; CHECK: fdiv fast float 0x3818000000000000, %x +} + +; y/x - z/x => (y-z)/x is disabled if y-z is denormal. +define float @fact_div6(float %x) { + %t1 = fdiv fast float 0x3810000000000000, %x + %t2 = fdiv fast float 0x3800000000000000, %x + %t3 = fsub fast float %t1, %t2 + ret float %t3 +; CHECK: fact_div6 +; CHECK: %t3 = fsub fast float %t1, %t2 +} diff --git a/test/Transforms/InstCombine/ffs-1.ll b/test/Transforms/InstCombine/ffs-1.ll new file mode 100644 index 000000000000..0510df3d24b9 --- /dev/null +++ b/test/Transforms/InstCombine/ffs-1.ll @@ -0,0 +1,134 @@ +; Test that the ffs* library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s +; RUN: opt < %s -mtriple i386-pc-linux -instcombine -S | FileCheck %s -check-prefix=LINUX + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +declare i32 @ffs(i32) +declare i32 @ffsl(i32) +declare i32 @ffsll(i64) + +; Check ffs(0) -> 0. + +define i32 @test_simplify1() { +; CHECK: @test_simplify1 + %ret = call i32 @ffs(i32 0) + ret i32 %ret +; CHECK-NEXT: ret i32 0 +} + +define i32 @test_simplify2() { +; CHECK-LINUX: @test_simplify2 + %ret = call i32 @ffsl(i32 0) + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 0 +} + +define i32 @test_simplify3() { +; CHECK-LINUX: @test_simplify3 + %ret = call i32 @ffsll(i64 0) + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 0 +} + +; Check ffs(c) -> cttz(c) + 1, where 'c' is a constant. + +define i32 @test_simplify4() { +; CHECK: @test_simplify4 + %ret = call i32 @ffs(i32 1) + ret i32 %ret +; CHECK-NEXT: ret i32 1 +} + +define i32 @test_simplify5() { +; CHECK: @test_simplify5 + %ret = call i32 @ffs(i32 2048) + ret i32 %ret +; CHECK-NEXT: ret i32 12 +} + +define i32 @test_simplify6() { +; CHECK: @test_simplify6 + %ret = call i32 @ffs(i32 65536) + ret i32 %ret +; CHECK-NEXT: ret i32 17 +} + +define i32 @test_simplify7() { +; CHECK-LINUX: @test_simplify7 + %ret = call i32 @ffsl(i32 65536) + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 17 +} + +define i32 @test_simplify8() { +; CHECK-LINUX: @test_simplify8 + %ret = call i32 @ffsll(i64 1024) + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 11 +} + +define i32 @test_simplify9() { +; CHECK-LINUX: @test_simplify9 + %ret = call i32 @ffsll(i64 65536) + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 17 +} + +define i32 @test_simplify10() { +; CHECK-LINUX: @test_simplify10 + %ret = call i32 @ffsll(i64 17179869184) + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 35 +} + +define i32 @test_simplify11() { +; CHECK-LINUX: @test_simplify11 + %ret = call i32 @ffsll(i64 281474976710656) + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 49 +} + +define i32 @test_simplify12() { +; CHECK-LINUX: @test_simplify12 + %ret = call i32 @ffsll(i64 1152921504606846976) + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 61 +} + +; Check ffs(x) -> x != 0 ? (i32)llvm.cttz(x) + 1 : 0. + +define i32 @test_simplify13(i32 %x) { +; CHECK: @test_simplify13 + %ret = call i32 @ffs(i32 %x) +; CHECK-NEXT: [[CTTZ:%[a-z0-9]+]] = call i32 @llvm.cttz.i32(i32 %x, i1 false) +; CHECK-NEXT: [[INC:%[a-z0-9]+]] = add i32 [[CTTZ]], 1 +; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %x, 0 +; CHECK-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[INC]], i32 0 + ret i32 %ret +; CHECK-NEXT: ret i32 [[RET]] +} + +define i32 @test_simplify14(i32 %x) { +; CHECK-LINUX: @test_simplify14 + %ret = call i32 @ffsl(i32 %x) +; CHECK-LINUX-NEXT: [[CTTZ:%[a-z0-9]+]] = call i32 @llvm.cttz.i32(i32 %x, i1 false) +; CHECK-LINUX-NEXT: [[INC:%[a-z0-9]+]] = add i32 [[CTTZ]], 1 +; CHECK-LINUX-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %x, 0 +; CHECK-LINUX-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[INC]], i32 0 + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 [[RET]] +} + +define i32 @test_simplify15(i64 %x) { +; CHECK-LINUX: @test_simplify15 + %ret = call i32 @ffsll(i64 %x) +; CHECK-LINUX-NEXT: [[CTTZ:%[a-z0-9]+]] = call i64 @llvm.cttz.i64(i64 %x, i1 false) +; CHECK-LINUX-NEXT: [[INC:%[a-z0-9]+]] = add i64 [[CTTZ]], 1 +; CHECK-LINUX-NEXT: [[TRUNC:%[a-z0-9]+]] = trunc i64 [[INC]] to i32 +; CHECK-LINUX-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i64 %x, 0 +; CHECK-LINUX-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[TRUNC]], i32 0 + ret i32 %ret +; CHECK-LINUX-NEXT: ret i32 [[RET]] +} diff --git a/test/Transforms/InstCombine/fmul.ll b/test/Transforms/InstCombine/fmul.ll new file mode 100644 index 000000000000..3671b4c6991c --- /dev/null +++ b/test/Transforms/InstCombine/fmul.ll @@ -0,0 +1,72 @@ +; RUN: opt -S -instcombine < %s | FileCheck %s + +; (-0.0 - X) * C => X * -C +define float @test1(float %x) { + %sub = fsub float -0.000000e+00, %x + %mul = fmul float %sub, 2.0e+1 + ret float %mul + +; CHECK: @test1 +; CHECK: fmul float %x, -2.000000e+01 +} + +; (0.0 - X) * C => X * -C +define float @test2(float %x) { + %sub = fsub nsz float 0.000000e+00, %x + %mul = fmul float %sub, 2.0e+1 + ret float %mul + +; CHECK: @test2 +; CHECK: fmul float %x, -2.000000e+01 +} + +; (-0.0 - X) * (-0.0 - Y) => X * Y +define float @test3(float %x, float %y) { + %sub1 = fsub float -0.000000e+00, %x + %sub2 = fsub float -0.000000e+00, %y + %mul = fmul float %sub1, %sub2 + ret float %mul +; CHECK: @test3 +; CHECK: fmul float %x, %y +} + +; (0.0 - X) * (0.0 - Y) => X * Y +define float @test4(float %x, float %y) { + %sub1 = fsub nsz float 0.000000e+00, %x + %sub2 = fsub nsz float 0.000000e+00, %y + %mul = fmul float %sub1, %sub2 + ret float %mul +; CHECK: @test4 +; CHECK: fmul float %x, %y +} + +; (-0.0 - X) * Y => -0.0 - (X * Y) +define float @test5(float %x, float %y) { + %sub1 = fsub float -0.000000e+00, %x + %mul = fmul float %sub1, %y + ret float %mul +; CHECK: @test5 +; CHECK: %1 = fmul float %x, %y +; CHECK: %mul = fsub float -0.000000e+00, %1 +} + +; (0.0 - X) * Y => 0.0 - (X * Y) +define float @test6(float %x, float %y) { + %sub1 = fsub nsz float 0.000000e+00, %x + %mul = fmul float %sub1, %y + ret float %mul +; CHECK: @test6 +; CHECK: %1 = fmul float %x, %y +; CHECK: %mul = fsub float -0.000000e+00, %1 +} + +; "(-0.0 - X) * Y => -0.0 - (X * Y)" is disabled if expression "-0.0 - X" +; has multiple uses. +define float @test7(float %x, float %y) { + %sub1 = fsub float -0.000000e+00, %x + %mul = fmul float %sub1, %y + %mul2 = fmul float %mul, %sub1 + ret float %mul2 +; CHECK: @test7 +; CHECK: fsub float -0.000000e+00, %x +} diff --git a/test/Transforms/InstCombine/fold-phi.ll b/test/Transforms/InstCombine/fold-phi.ll new file mode 100644 index 000000000000..bd01d58aa586 --- /dev/null +++ b/test/Transforms/InstCombine/fold-phi.ll @@ -0,0 +1,39 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +; CHECK: no_crash +define float @no_crash(float %a) nounwind { +entry: + br label %for.body + +for.body: + %sum.057 = phi float [ 0.000000e+00, %entry ], [ %add5, %bb0 ] + %add5 = fadd float %sum.057, %a ; PR14592 + br i1 undef, label %bb0, label %end + +bb0: + br label %for.body + +end: + ret float %add5 +} + +; CHECK: fold_phi +define float @fold_phi(float %a) nounwind { +entry: + br label %for.body + +for.body: +; CHECK: phi float +; CHECK-NEXT: br i1 undef + %sum.057 = phi float [ 0.000000e+00, %entry ], [ %add5, %bb0 ] + %add5 = fadd float %sum.057, 1.0 ;; Should be moved to the latch! + br i1 undef, label %bb0, label %end + +; CHECK: bb0: +bb0: +; CHECK: fadd float + br label %for.body + +end: + ret float %add5 +} diff --git a/test/Transforms/InstCombine/fpcast.ll b/test/Transforms/InstCombine/fpcast.ll index bc6aa0a6891f..09f053289dc1 100644 --- a/test/Transforms/InstCombine/fpcast.ll +++ b/test/Transforms/InstCombine/fpcast.ll @@ -13,3 +13,22 @@ define i8 @test2() { ; CHECK: ret i8 -1 } +; CHECK: test3 +define half @test3(float %a) { +; CHECK: fptrunc +; CHECK: llvm.fabs.f16 + %b = call float @llvm.fabs.f32(float %a) + %c = fptrunc float %b to half + ret half %c +} + +; CHECK: test4 +define half @test4(float %a) { +; CHECK: fptrunc +; CHECK: fsub + %b = fsub float -0.0, %a + %c = fptrunc float %b to half + ret half %c +} + +declare float @llvm.fabs.f32(float) nounwind readonly diff --git a/test/Transforms/InstCombine/fprintf-1.ll b/test/Transforms/InstCombine/fprintf-1.ll new file mode 100644 index 000000000000..39d86b4588cc --- /dev/null +++ b/test/Transforms/InstCombine/fprintf-1.ll @@ -0,0 +1,80 @@ +; Test that the fprintf library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s +; RUN: opt < %s -mtriple xcore-xmos-elf -instcombine -S | FileCheck %s -check-prefix=IPRINTF + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +%FILE = type { } + +@hello_world = constant [13 x i8] c"hello world\0A\00" +@percent_c = constant [3 x i8] c"%c\00" +@percent_d = constant [3 x i8] c"%d\00" +@percent_f = constant [3 x i8] c"%f\00" +@percent_s = constant [3 x i8] c"%s\00" + +declare i32 @fprintf(%FILE*, i8*, ...) + +; Check fprintf(fp, "foo") -> fwrite("foo", 3, 1, fp). + +define void @test_simplify1(%FILE* %fp) { +; CHECK: @test_simplify1 + %fmt = getelementptr [13 x i8]* @hello_world, i32 0, i32 0 + call i32 (%FILE*, i8*, ...)* @fprintf(%FILE* %fp, i8* %fmt) +; CHECK-NEXT: call i32 @fwrite(i8* getelementptr inbounds ([13 x i8]* @hello_world, i32 0, i32 0), i32 12, i32 1, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} + +; Check fprintf(fp, "%c", chr) -> fputc(chr, fp). + +define void @test_simplify2(%FILE* %fp) { +; CHECK: @test_simplify2 + %fmt = getelementptr [3 x i8]* @percent_c, i32 0, i32 0 + call i32 (%FILE*, i8*, ...)* @fprintf(%FILE* %fp, i8* %fmt, i8 104) +; CHECK-NEXT: call i32 @fputc(i32 104, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} + +; Check fprintf(fp, "%s", str) -> fputs(str, fp). +; NOTE: The fputs simplifier simplifies this further to fwrite. + +define void @test_simplify3(%FILE* %fp) { +; CHECK: @test_simplify3 + %fmt = getelementptr [3 x i8]* @percent_s, i32 0, i32 0 + %str = getelementptr [13 x i8]* @hello_world, i32 0, i32 0 + call i32 (%FILE*, i8*, ...)* @fprintf(%FILE* %fp, i8* %fmt, i8* %str) +; CHECK-NEXT: call i32 @fwrite(i8* getelementptr inbounds ([13 x i8]* @hello_world, i32 0, i32 0), i32 12, i32 1, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} + +; Check fprintf(fp, fmt, ...) -> fiprintf(fp, fmt, ...) if no floating point. + +define void @test_simplify4(%FILE* %fp) { +; CHECK-IPRINTF: @test_simplify4 + %fmt = getelementptr [3 x i8]* @percent_d, i32 0, i32 0 + call i32 (%FILE*, i8*, ...)* @fprintf(%FILE* %fp, i8* %fmt, i32 187) +; CHECK-NEXT-IPRINTF: call i32 (%FILE*, i8*, ...)* @fiprintf(%FILE* %fp, i8* getelementptr inbounds ([3 x i8]* @percent_d, i32 0, i32 0), i32 187) + ret void +; CHECK-NEXT-IPRINTF: ret void +} + +define void @test_no_simplify1(%FILE* %fp) { +; CHECK-IPRINTF: @test_no_simplify1 + %fmt = getelementptr [3 x i8]* @percent_f, i32 0, i32 0 + call i32 (%FILE*, i8*, ...)* @fprintf(%FILE* %fp, i8* %fmt, double 1.87) +; CHECK-NEXT-IPRINTF: call i32 (%FILE*, i8*, ...)* @fprintf(%FILE* %fp, i8* getelementptr inbounds ([3 x i8]* @percent_f, i32 0, i32 0), double 1.870000e+00) + ret void +; CHECK-NEXT-IPRINTF: ret void +} + +define void @test_no_simplify2(%FILE* %fp, double %d) { +; CHECK: @test_no_simplify2 + %fmt = getelementptr [3 x i8]* @percent_f, i32 0, i32 0 + call i32 (%FILE*, i8*, ...)* @fprintf(%FILE* %fp, i8* %fmt, double %d) +; CHECK-NEXT: call i32 (%FILE*, i8*, ...)* @fprintf(%FILE* %fp, i8* getelementptr inbounds ([3 x i8]* @percent_f, i32 0, i32 0), double %d) + ret void +; CHECK-NEXT: ret void +} diff --git a/test/Transforms/InstCombine/fputs-1.ll b/test/Transforms/InstCombine/fputs-1.ll new file mode 100644 index 000000000000..c7c5becfd038 --- /dev/null +++ b/test/Transforms/InstCombine/fputs-1.ll @@ -0,0 +1,43 @@ +; Test that the fputs library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +%FILE = type { } + +@empty = constant [1 x i8] zeroinitializer +@A = constant [2 x i8] c"A\00" +@hello = constant [7 x i8] c"hello\0A\00" + +declare i32 @fputs(i8*, %FILE*) + +; Check fputs(str, fp) --> fwrite(str, 1, strlen(s), fp). + +define void @test_simplify1(%FILE* %fp) { +; CHECK: @test_simplify1 + %str = getelementptr [1 x i8]* @empty, i32 0, i32 0 + call i32 @fputs(i8* %str, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} + +; NOTE: The fwrite simplifier simplifies this further to fputc. + +define void @test_simplify2(%FILE* %fp) { +; CHECK: @test_simplify2 + %str = getelementptr [2 x i8]* @A, i32 0, i32 0 + call i32 @fputs(i8* %str, %FILE* %fp) +; CHECK-NEXT: call i32 @fputc(i32 65, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} + +define void @test_simplify3(%FILE* %fp) { +; CHECK: @test_simplify3 + %str = getelementptr [7 x i8]* @hello, i32 0, i32 0 + call i32 @fputs(i8* %str, %FILE* %fp) +; CHECK-NEXT: call i32 @fwrite(i8* getelementptr inbounds ([7 x i8]* @hello, i32 0, i32 0), i32 6, i32 1, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} diff --git a/test/Transforms/InstCombine/fwrite-1.ll b/test/Transforms/InstCombine/fwrite-1.ll new file mode 100644 index 000000000000..528cdec217f7 --- /dev/null +++ b/test/Transforms/InstCombine/fwrite-1.ll @@ -0,0 +1,57 @@ +; Test that the fwrite library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +%FILE = type { } + +@str = constant [1 x i8] zeroinitializer +@empty = constant [0 x i8] zeroinitializer + +declare i64 @fwrite(i8*, i64, i64, %FILE *) + +; Check fwrite(S, 1, 1, fp) -> fputc(S[0], fp). + +define void @test_simplify1(%FILE* %fp) { +; CHECK: @test_simplify1 + %str = getelementptr inbounds [1 x i8]* @str, i64 0, i64 0 + call i64 @fwrite(i8* %str, i64 1, i64 1, %FILE* %fp) +; CHECK-NEXT: call i32 @fputc(i32 0, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} + +define void @test_simplify2(%FILE* %fp) { +; CHECK: @test_simplify2 + %str = getelementptr inbounds [0 x i8]* @empty, i64 0, i64 0 + call i64 @fwrite(i8* %str, i64 1, i64 0, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} + +define void @test_simplify3(%FILE* %fp) { +; CHECK: @test_simplify3 + %str = getelementptr inbounds [0 x i8]* @empty, i64 0, i64 0 + call i64 @fwrite(i8* %str, i64 0, i64 1, %FILE* %fp) + ret void +; CHECK-NEXT: ret void +} + +define i64 @test_no_simplify1(%FILE* %fp) { +; CHECK: @test_no_simplify1 + %str = getelementptr inbounds [1 x i8]* @str, i64 0, i64 0 + %ret = call i64 @fwrite(i8* %str, i64 1, i64 1, %FILE* %fp) +; CHECK-NEXT: call i64 @fwrite + ret i64 %ret +; CHECK-NEXT: ret i64 %ret +} + +define void @test_no_simplify2(%FILE* %fp, i64 %size) { +; CHECK: @test_no_simplify2 + %str = getelementptr inbounds [1 x i8]* @str, i64 0, i64 0 + call i64 @fwrite(i8* %str, i64 %size, i64 1, %FILE* %fp) +; CHECK-NEXT: call i64 @fwrite + ret void +; CHECK-NEXT: ret void +} diff --git a/test/Transforms/InstCombine/getelementptr.ll b/test/Transforms/InstCombine/getelementptr.ll index 1c120ecbe9eb..bb07736ef803 100644 --- a/test/Transforms/InstCombine/getelementptr.ll +++ b/test/Transforms/InstCombine/getelementptr.ll @@ -424,7 +424,7 @@ define i32 @test35() nounwind { i8* getelementptr (%t1* bitcast (%t0* @s to %t1*), i32 0, i32 1, i32 0)) nounwind ret i32 0 ; CHECK: @test35 -; CHECK: call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([17 x i8]* @"\01LC8", i64 0, i64 0), i8* getelementptr inbounds (%t0* @s, i64 0, i32 1, i64 0)) nounwind +; CHECK: call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([17 x i8]* @"\01LC8", i64 0, i64 0), i8* getelementptr inbounds (%t0* @s, i64 0, i32 1, i64 0)) [[NUW:#[0-9]+]] } ; Instcombine should constant-fold the GEP so that indices that have @@ -492,3 +492,21 @@ define void @three_gep_f(%three_gep_t2* %x) { declare void @three_gep_g(i32*) declare void @three_gep_h(%three_gep_t2*) + +%struct.ham = type { i32, %struct.zot*, %struct.zot*, %struct.zot* } +%struct.zot = type { i64, i8 } + +define void @test39(%struct.ham* %arg, i8 %arg1) nounwind { + %tmp = getelementptr inbounds %struct.ham* %arg, i64 0, i32 2 + %tmp2 = load %struct.zot** %tmp, align 8 + %tmp3 = bitcast %struct.zot* %tmp2 to i8* + %tmp4 = getelementptr inbounds i8* %tmp3, i64 -8 + store i8 %arg1, i8* %tmp4, align 8 + ret void + +; CHECK: @test39 +; CHECK: getelementptr inbounds %struct.ham* %arg, i64 0, i32 2 +; CHECK: getelementptr inbounds i8* %tmp3, i64 -8 +} + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index 8e064a4f2fc9..446c0e01dcaa 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -677,3 +677,212 @@ define i1 @test66(i64 %A, i64 %B) { ; CHECK-NEXT: ret i1 true ret i1 %cmp } + +; CHECK: @test67 +; CHECK: %and = and i32 %x, 96 +; CHECK: %cmp = icmp ne i32 %and, 0 +define i1 @test67(i32 %x) nounwind uwtable { + %and = and i32 %x, 127 + %cmp = icmp sgt i32 %and, 31 + ret i1 %cmp +} + +; CHECK: @test68 +; CHECK: %cmp = icmp ugt i32 %and, 30 +define i1 @test68(i32 %x) nounwind uwtable { + %and = and i32 %x, 127 + %cmp = icmp sgt i32 %and, 30 + ret i1 %cmp +} + +; PR14708 +; CHECK: @test69 +; CHECK: %1 = and i32 %c, -33 +; CHECK: %2 = icmp eq i32 %1, 65 +; CHECK: ret i1 %2 +define i1 @test69(i32 %c) nounwind uwtable { + %1 = icmp eq i32 %c, 97 + %2 = icmp eq i32 %c, 65 + %3 = or i1 %1, %2 + ret i1 %3 +} + +; CHECK: @icmp_sext16trunc +; CHECK-NEXT: %1 = trunc i32 %x to i16 +; CHECK-NEXT: %cmp = icmp slt i16 %1, 36 +define i1 @icmp_sext16trunc(i32 %x) { + %trunc = trunc i32 %x to i16 + %sext = sext i16 %trunc to i32 + %cmp = icmp slt i32 %sext, 36 + ret i1 %cmp +} + +; CHECK: @icmp_sext8trunc +; CHECK-NEXT: %1 = trunc i32 %x to i8 +; CHECK-NEXT: %cmp = icmp slt i8 %1, 36 +define i1 @icmp_sext8trunc(i32 %x) { + %trunc = trunc i32 %x to i8 + %sext = sext i8 %trunc to i32 + %cmp = icmp slt i32 %sext, 36 + ret i1 %cmp +} + +; CHECK: @icmp_shl16 +; CHECK-NEXT: %1 = trunc i32 %x to i16 +; CHECK-NEXT: %cmp = icmp slt i16 %1, 36 +define i1 @icmp_shl16(i32 %x) { + %shl = shl i32 %x, 16 + %cmp = icmp slt i32 %shl, 2359296 + ret i1 %cmp +} + +; CHECK: @icmp_shl24 +; CHECK-NEXT: %1 = trunc i32 %x to i8 +; CHECK-NEXT: %cmp = icmp slt i8 %1, 36 +define i1 @icmp_shl24(i32 %x) { + %shl = shl i32 %x, 24 + %cmp = icmp slt i32 %shl, 603979776 + ret i1 %cmp +} + +; If the (shl x, C) preserved the sign and this is a sign test, +; compare the LHS operand instead +; CHECK: @icmp_shl_nsw_sgt +; CHECK-NEXT: icmp sgt i32 %x, 0 +define i1 @icmp_shl_nsw_sgt(i32 %x) { + %shl = shl nsw i32 %x, 21 + %cmp = icmp sgt i32 %shl, 0 + ret i1 %cmp +} + +; CHECK: @icmp_shl_nsw_sge0 +; CHECK-NEXT: icmp sgt i32 %x, -1 +define i1 @icmp_shl_nsw_sge0(i32 %x) { + %shl = shl nsw i32 %x, 21 + %cmp = icmp sge i32 %shl, 0 + ret i1 %cmp +} + +; CHECK: @icmp_shl_nsw_sge1 +; CHECK-NEXT: icmp sgt i32 %x, 0 +define i1 @icmp_shl_nsw_sge1(i32 %x) { + %shl = shl nsw i32 %x, 21 + %cmp = icmp sge i32 %shl, 1 + ret i1 %cmp +} + +; Checks for icmp (eq|ne) (shl x, C), 0 +; CHECK: @icmp_shl_nsw_eq +; CHECK-NEXT: icmp eq i32 %x, 0 +define i1 @icmp_shl_nsw_eq(i32 %x) { + %mul = shl nsw i32 %x, 5 + %cmp = icmp eq i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_shl_eq +; CHECK-NOT: icmp eq i32 %mul, 0 +define i1 @icmp_shl_eq(i32 %x) { + %mul = shl i32 %x, 5 + %cmp = icmp eq i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_shl_nsw_ne +; CHECK-NEXT: icmp ne i32 %x, 0 +define i1 @icmp_shl_nsw_ne(i32 %x) { + %mul = shl nsw i32 %x, 7 + %cmp = icmp ne i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_shl_ne +; CHECK-NOT: icmp ne i32 %x, 0 +define i1 @icmp_shl_ne(i32 %x) { + %mul = shl i32 %x, 7 + %cmp = icmp ne i32 %mul, 0 + ret i1 %cmp +} + +; If the (mul x, C) preserved the sign and this is sign test, +; compare the LHS operand instead +; CHECK: @icmp_mul_nsw +; CHECK-NEXT: icmp sgt i32 %x, 0 +define i1 @icmp_mul_nsw(i32 %x) { + %mul = mul nsw i32 %x, 12 + %cmp = icmp sgt i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_mul_nsw1 +; CHECK-NEXT: icmp slt i32 %x, 0 +define i1 @icmp_mul_nsw1(i32 %x) { + %mul = mul nsw i32 %x, 12 + %cmp = icmp sle i32 %mul, -1 + ret i1 %cmp +} + +; CHECK: @icmp_mul_nsw_neg +; CHECK-NEXT: icmp slt i32 %x, 1 +define i1 @icmp_mul_nsw_neg(i32 %x) { + %mul = mul nsw i32 %x, -12 + %cmp = icmp sge i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_mul_nsw_neg1 +; CHECK-NEXT: icmp slt i32 %x, 0 +define i1 @icmp_mul_nsw_neg1(i32 %x) { + %mul = mul nsw i32 %x, -12 + %cmp = icmp sge i32 %mul, 1 + ret i1 %cmp +} + +; CHECK: @icmp_mul_nsw_0 +; CHECK-NOT: icmp sgt i32 %x, 0 +define i1 @icmp_mul_nsw_0(i32 %x) { + %mul = mul nsw i32 %x, 0 + %cmp = icmp sgt i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_mul +; CHECK-NEXT: %mul = mul i32 %x, -12 +define i1 @icmp_mul(i32 %x) { + %mul = mul i32 %x, -12 + %cmp = icmp sge i32 %mul, 0 + ret i1 %cmp +} + +; Checks for icmp (eq|ne) (mul x, C), 0 +; CHECK: @icmp_mul_neq0 +; CHECK-NEXT: icmp ne i32 %x, 0 +define i1 @icmp_mul_neq0(i32 %x) { + %mul = mul nsw i32 %x, -12 + %cmp = icmp ne i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_mul_eq0 +; CHECK-NEXT: icmp eq i32 %x, 0 +define i1 @icmp_mul_eq0(i32 %x) { + %mul = mul nsw i32 %x, 12 + %cmp = icmp eq i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_mul0_eq0 +; CHECK-NEXT: ret i1 true +define i1 @icmp_mul0_eq0(i32 %x) { + %mul = mul i32 %x, 0 + %cmp = icmp eq i32 %mul, 0 + ret i1 %cmp +} + +; CHECK: @icmp_mul0_ne0 +; CHECK-NEXT: ret i1 false +define i1 @icmp_mul0_ne0(i32 %x) { + %mul = mul i32 %x, 0 + %cmp = icmp ne i32 %mul, 0 + ret i1 %cmp +} diff --git a/test/Transforms/InstCombine/idioms.ll b/test/Transforms/InstCombine/idioms.ll index 6b3567fc6e8d..1a211668c3bf 100644 --- a/test/Transforms/InstCombine/idioms.ll +++ b/test/Transforms/InstCombine/idioms.ll @@ -1,4 +1,4 @@ -; RUN: opt -instcombine %s -S | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s ; Check that code corresponding to the following C function is ; simplified into a single ASR operation: diff --git a/test/Transforms/InstCombine/intrinsics.ll b/test/Transforms/InstCombine/intrinsics.ll index 382e6b38574d..f334b3b1e935 100644 --- a/test/Transforms/InstCombine/intrinsics.ll +++ b/test/Transforms/InstCombine/intrinsics.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -instcombine -S | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s %overflow.result = type {i8, i1} @@ -220,3 +220,39 @@ define i32 @cttz_simplify1b(i32 %x) nounwind readnone ssp { ; CHECK: @cttz_simplify1b ; CHECK-NEXT: ret i32 0 } + +define i32 @ctlz_undef(i32 %Value) nounwind { + %ctlz = call i32 @llvm.ctlz.i32(i32 0, i1 true) + ret i32 %ctlz + +; CHECK: @ctlz_undef +; CHECK-NEXT: ret i32 undef +} + +define i32 @cttz_undef(i32 %Value) nounwind { + %cttz = call i32 @llvm.cttz.i32(i32 0, i1 true) + ret i32 %cttz + +; CHECK: @cttz_undef +; CHECK-NEXT: ret i32 undef +} + +define i32 @ctlz_select(i32 %Value) nounwind { + %tobool = icmp ne i32 %Value, 0 + %ctlz = call i32 @llvm.ctlz.i32(i32 %Value, i1 true) + %s = select i1 %tobool, i32 %ctlz, i32 32 + ret i32 %s + +; CHECK: @ctlz_select +; CHECK: select i1 %tobool, i32 %ctlz, i32 32 +} + +define i32 @cttz_select(i32 %Value) nounwind { + %tobool = icmp ne i32 %Value, 0 + %cttz = call i32 @llvm.cttz.i32(i32 %Value, i1 true) + %s = select i1 %tobool, i32 %cttz, i32 32 + ret i32 %s + +; CHECK: @cttz_select +; CHECK: select i1 %tobool, i32 %cttz, i32 32 +} diff --git a/test/Transforms/InstCombine/isascii-1.ll b/test/Transforms/InstCombine/isascii-1.ll new file mode 100644 index 000000000000..2a413d89b492 --- /dev/null +++ b/test/Transforms/InstCombine/isascii-1.ll @@ -0,0 +1,32 @@ +; Test that the isascii library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +declare i32 @isascii(i32) + +; Check isascii(c) -> c <u 128. + +define i32 @test_simplify1() { +; CHECK: @test_simplify1 + %ret = call i32 @isascii(i32 127) + ret i32 %ret +; CHECK-NEXT: ret i32 1 +} + +define i32 @test_simplify2() { +; CHECK: @test_simplify2 + %ret = call i32 @isascii(i32 128) + ret i32 %ret +; CHECK-NEXT: ret i32 0 +} + +define i32 @test_simplify3(i32 %x) { +; CHECK: @test_simplify3 + %ret = call i32 @isascii(i32 %x) +; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %x, 128 +; CHECK-NEXT: [[ZEXT:%[a-z0-9]+]] = zext i1 [[CMP]] to i32 + ret i32 %ret +; CHECK-NEXT: ret i32 [[ZEXT]] +} diff --git a/test/Transforms/InstCombine/isdigit-1.ll b/test/Transforms/InstCombine/isdigit-1.ll new file mode 100644 index 000000000000..f291296c8826 --- /dev/null +++ b/test/Transforms/InstCombine/isdigit-1.ll @@ -0,0 +1,48 @@ +; Test that the isdigit library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +declare i32 @isdigit(i32) + +; Check isdigit(c) -> (c - '0') <u 10; + +define i32 @test_simplify1() { +; CHECK: @test_simplify1 + %ret = call i32 @isdigit(i32 47) + ret i32 %ret +; CHECK-NEXT: ret i32 0 +} + +define i32 @test_simplify2() { +; CHECK: @test_simplify2 + %ret = call i32 @isdigit(i32 48) + ret i32 %ret +; CHECK-NEXT: ret i32 1 +} + +define i32 @test_simplify3() { +; CHECK: @test_simplify3 + %ret = call i32 @isdigit(i32 57) + ret i32 %ret +; CHECK-NEXT: ret i32 1 +} + +define i32 @test_simplify4() { +; CHECK: @test_simplify4 + %ret = call i32 @isdigit(i32 58) + ret i32 %ret +; CHECK-NEXT: ret i32 0 +} + +define i32 @test_simplify5(i32 %x) { +; CHECK: @test_simplify5 + + %ret = call i32 @isdigit(i32 %x) +; CHECK-NEXT: [[ADD:%[a-z0-9]+]] = add i32 %x, -48 +; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 [[ADD]], 10 +; CHECK-NEXT: [[ZEXT:%[a-z0-9]+]] = zext i1 [[CMP]] to i32 + ret i32 %ret +; CHECK-NEXT: ret i32 [[ZEXT]] +} diff --git a/test/Transforms/InstCombine/load-cmp.ll b/test/Transforms/InstCombine/load-cmp.ll index 5cafb7787e36..d88188e4109c 100644 --- a/test/Transforms/InstCombine/load-cmp.ll +++ b/test/Transforms/InstCombine/load-cmp.ll @@ -47,6 +47,18 @@ define i1 @test4(i32 %X) { ; CHECK-NEXT: ret i1 %R } +define i1 @test4_i16(i16 %X) { + %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i16 %X + %Q = load i16* %P + %R = icmp sle i16 %Q, 73 + ret i1 %R +; CHECK: @test4_i16 +; CHECK-NEXT: lshr i16 933, %X +; CHECK-NEXT: and i16 {{.*}}, 1 +; CHECK-NEXT: %R = icmp ne i16 {{.*}}, 0 +; CHECK-NEXT: ret i1 %R +} + define i1 @test5(i32 %X) { %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i32 %X %Q = load i16* %P diff --git a/test/Transforms/InstCombine/load3.ll b/test/Transforms/InstCombine/load3.ll index 35398e17db8c..db74426783c1 100644 --- a/test/Transforms/InstCombine/load3.ll +++ b/test/Transforms/InstCombine/load3.ll @@ -1,6 +1,6 @@ ; RUN: opt < %s -instcombine -S | FileCheck %s -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" -target triple = "x86_64-apple-darwin10.0.0" +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32-S128" +target triple = "i386-apple-macosx10.0.0" ; Instcombine should be able to do trivial CSE of loads. @@ -24,4 +24,23 @@ define float @test2() { ; CHECK: @test2 ; CHECK: ret float 0x3806965600000000 -}
\ No newline at end of file +} + +@rslts32 = global [36 x i32] zeroinitializer, align 4 + +@expect32 = internal constant [36 x i32][ i32 1, i32 2, i32 0, i32 100, i32 3, +i32 4, i32 0, i32 -7, i32 4, i32 4, i32 8, i32 8, i32 1, i32 3, i32 8, i32 3, +i32 4, i32 -2, i32 2, i32 8, i32 83, i32 77, i32 8, i32 17, i32 77, i32 88, i32 +22, i32 33, i32 44, i32 88, i32 77, i32 4, i32 4, i32 7, i32 -7, i32 -8] , +align 4 + +; PR14986 +define void @test3() nounwind { +; This is a weird way of computing zero. + %l = load i32* getelementptr ([36 x i32]* @expect32, i32 29826161, i32 28), align 4 + store i32 %l, i32* getelementptr ([36 x i32]* @rslts32, i32 29826161, i32 28), align 4 + ret void + +; CHECK: @test3 +; CHECK: store i32 1, i32* getelementptr inbounds ([36 x i32]* @rslts32, i32 0, i32 0) +} diff --git a/test/Transforms/InstCombine/logical-select.ll b/test/Transforms/InstCombine/logical-select.ll index bb59817a4f69..f8c06768453d 100644 --- a/test/Transforms/InstCombine/logical-select.ll +++ b/test/Transforms/InstCombine/logical-select.ll @@ -10,8 +10,8 @@ define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { %j = or i32 %g, %i ret i32 %j ; CHECK: %e = icmp slt i32 %a, %b -; CHECK: %j = select i1 %e, i32 %c, i32 %d -; CHECK: ret i32 %j +; CHECK-NEXT: [[result:%.*]] = select i1 %e, i32 %c, i32 %d +; CHECK-NEXT: ret i32 [[result]] } define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { %e = icmp slt i32 %a, %b @@ -22,8 +22,8 @@ define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { %j = or i32 %i, %g ret i32 %j ; CHECK: %e = icmp slt i32 %a, %b -; CHECK: %j = select i1 %e, i32 %c, i32 %d -; CHECK: ret i32 %j +; CHECK-NEXT: [[result:%.*]] = select i1 %e, i32 %c, i32 %d +; CHECK-NEXT: ret i32 [[result]] } define i32 @goo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { @@ -36,8 +36,8 @@ entry: %3 = or i32 %1, %2 ret i32 %3 ; CHECK: %0 = icmp slt i32 %a, %b -; CHECK: %1 = select i1 %0, i32 %c, i32 %d -; CHECK: ret i32 %1 +; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d +; CHECK-NEXT: ret i32 [[result]] } define i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { entry: @@ -49,8 +49,8 @@ entry: %3 = or i32 %1, %2 ret i32 %3 ; CHECK: %0 = icmp slt i32 %a, %b -; CHECK: %1 = select i1 %0, i32 %c, i32 %d -; CHECK: ret i32 %1 +; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d +; CHECK-NEXT: ret i32 [[result]] } define i32 @par(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { @@ -63,6 +63,6 @@ entry: %3 = or i32 %1, %2 ret i32 %3 ; CHECK: %0 = icmp slt i32 %a, %b -; CHECK: %1 = select i1 %0, i32 %c, i32 %d -; CHECK: ret i32 %1 +; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d +; CHECK-NEXT: ret i32 [[result]] } diff --git a/test/Transforms/InstCombine/malloc-free-delete.ll b/test/Transforms/InstCombine/malloc-free-delete.ll index 4e3217dc2d96..cd12b29b1186 100644 --- a/test/Transforms/InstCombine/malloc-free-delete.ll +++ b/test/Transforms/InstCombine/malloc-free-delete.ll @@ -91,3 +91,32 @@ define void @test5(i8* %ptr, i8** %esc) { store volatile i8 4, i8* %g ret void } + +;; When a basic block contains only a call to free and this block is accessed +;; through a test of the argument of free against null, move the call in the +;; predecessor block. +;; Using simplifycfg will remove the empty basic block and the branch operation +;; Then, performing a dead elimination will remove the comparison. +;; This is what happens with -O1 and upper. +; CHECK: @test6 +define void @test6(i8* %foo) minsize { +; CHECK: %tobool = icmp eq i8* %foo, null +;; Call to free moved +; CHECK-NEXT: tail call void @free(i8* %foo) +; CHECK-NEXT: br i1 %tobool, label %if.end, label %if.then +; CHECK: if.then: +;; Block is now empty and may be simplified by simplifycfg +; CHECK-NEXT: br label %if.end +; CHECK: if.end: +; CHECK-NEXT: ret void +entry: + %tobool = icmp eq i8* %foo, null + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + tail call void @free(i8* %foo) + br label %if.end + +if.end: ; preds = %entry, %if.then + ret void +} diff --git a/test/Transforms/InstCombine/memcmp-1.ll b/test/Transforms/InstCombine/memcmp-1.ll index 4238c5f8fb15..c97b201fc0e9 100644 --- a/test/Transforms/InstCombine/memcmp-1.ll +++ b/test/Transforms/InstCombine/memcmp-1.ll @@ -59,7 +59,7 @@ define i32 @test_simplify5() { %mem2 = getelementptr [4 x i8]* @foo, i32 0, i32 0 %ret = call i32 @memcmp(i8* %mem1, i8* %mem2, i32 3) ret i32 %ret -; CHECK: ret i32 {{[0-9]+}} +; CHECK: ret i32 1 } define i32 @test_simplify6() { @@ -68,5 +68,5 @@ define i32 @test_simplify6() { %mem2 = getelementptr [4 x i8]* @hel, i32 0, i32 0 %ret = call i32 @memcmp(i8* %mem1, i8* %mem2, i32 3) ret i32 %ret -; CHECK: ret i32 {{-[0-9]+}} +; CHECK: ret i32 -1 } diff --git a/test/Transforms/InstCombine/memcpy-from-global.ll b/test/Transforms/InstCombine/memcpy-from-global.ll index 83c893e17dd6..557b160a8785 100644 --- a/test/Transforms/InstCombine/memcpy-from-global.ll +++ b/test/Transforms/InstCombine/memcpy-from-global.ll @@ -134,3 +134,13 @@ define void @test8() { ; CHECK: bar ret void } + +define void @test9() { + %A = alloca %U, align 4 + %a = bitcast %U* %A to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* bitcast (%U* getelementptr ([2 x %U]* @H, i64 0, i32 1) to i8*), i64 20, i32 4, i1 false) + call void @bar(i8* %a) readonly +; CHECK: @test9 +; CHECK-NEXT: call void @bar(i8* bitcast (%U* getelementptr inbounds ([2 x %U]* @H, i64 0, i64 1) to i8*)) + ret void +} diff --git a/test/Transforms/InstCombine/mul.ll b/test/Transforms/InstCombine/mul.ll index 6c8e6347634c..16213b8628ca 100644 --- a/test/Transforms/InstCombine/mul.ll +++ b/test/Transforms/InstCombine/mul.ll @@ -65,7 +65,7 @@ define i32 @test9(i32 %i) { ; CHECK: @test9 %j = mul i32 %i, -1 ; <i32> [#uses=1] ret i32 %j -; CHECJ: sub i32 0, %i +; CHECK: sub i32 0, %i } define i32 @test10(i32 %a, i32 %b) { @@ -138,10 +138,8 @@ define i32 @test16(i32 %b, i1 %c) { ; e = b & (a >> 31) %e = mul i32 %d, %b ; <i32> [#uses=1] ret i32 %e -; CHECK: [[TEST16:%.*]] = zext i1 %c to i32 -; CHECK-NEXT: %1 = sub i32 0, [[TEST16]] -; CHECK-NEXT: %e = and i32 %1, %b -; CHECK-NEXT: ret i32 %e +; CHECK: [[TEST16:%.*]] = select i1 %c, i32 %b, i32 0 +; CHECK-NEXT: ret i32 [[TEST16]] } ; X * Y (when Y is 0 or 1) --> x & (0-Y) diff --git a/test/Transforms/InstCombine/obfuscated_splat.ll b/test/Transforms/InstCombine/obfuscated_splat.ll index c25dade168a4..fa9cb423d02c 100644 --- a/test/Transforms/InstCombine/obfuscated_splat.ll +++ b/test/Transforms/InstCombine/obfuscated_splat.ll @@ -1,4 +1,4 @@ -; RUN: opt -instcombine -S %s | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s define void @test(<4 x float> *%in_ptr, <4 x float> *%out_ptr) { %A = load <4 x float>* %in_ptr, align 16 diff --git a/test/Transforms/InstCombine/objsize.ll b/test/Transforms/InstCombine/objsize.ll index 31a3cb46e459..0ead9d123749 100644 --- a/test/Transforms/InstCombine/objsize.ll +++ b/test/Transforms/InstCombine/objsize.ll @@ -256,3 +256,131 @@ xpto: return: ret i32 7 } + +declare noalias i8* @valloc(i32) nounwind + +; CHECK: @test14 +; CHECK: ret i32 6 +define i32 @test14(i32 %a) nounwind { + switch i32 %a, label %sw.default [ + i32 1, label %sw.bb + i32 2, label %sw.bb1 + ] + +sw.bb: + %call = tail call noalias i8* @malloc(i32 6) nounwind + br label %sw.epilog + +sw.bb1: + %call2 = tail call noalias i8* @calloc(i32 3, i32 2) nounwind + br label %sw.epilog + +sw.default: + %call3 = tail call noalias i8* @valloc(i32 6) nounwind + br label %sw.epilog + +sw.epilog: + %b.0 = phi i8* [ %call3, %sw.default ], [ %call2, %sw.bb1 ], [ %call, %sw.bb ] + %1 = tail call i32 @llvm.objectsize.i32(i8* %b.0, i1 false) + ret i32 %1 +} + +; CHECK: @test15 +; CHECK: llvm.objectsize +define i32 @test15(i32 %a) nounwind { + switch i32 %a, label %sw.default [ + i32 1, label %sw.bb + i32 2, label %sw.bb1 + ] + +sw.bb: + %call = tail call noalias i8* @malloc(i32 3) nounwind + br label %sw.epilog + +sw.bb1: + %call2 = tail call noalias i8* @calloc(i32 2, i32 1) nounwind + br label %sw.epilog + +sw.default: + %call3 = tail call noalias i8* @valloc(i32 3) nounwind + br label %sw.epilog + +sw.epilog: + %b.0 = phi i8* [ %call3, %sw.default ], [ %call2, %sw.bb1 ], [ %call, %sw.bb ] + %1 = tail call i32 @llvm.objectsize.i32(i8* %b.0, i1 false) + ret i32 %1 +} + +; CHECK: @test16 +; CHECK: llvm.objectsize +define i32 @test16(i8* %a, i32 %n) nounwind { + %b = alloca [5 x i8], align 1 + %c = alloca [5 x i8], align 1 + switch i32 %n, label %sw.default [ + i32 1, label %sw.bb + i32 2, label %sw.bb1 + ] + +sw.bb: + %bp = bitcast [5 x i8]* %b to i8* + br label %sw.epilog + +sw.bb1: + %cp = bitcast [5 x i8]* %c to i8* + br label %sw.epilog + +sw.default: + br label %sw.epilog + +sw.epilog: + %phi = phi i8* [ %a, %sw.default ], [ %cp, %sw.bb1 ], [ %bp, %sw.bb ] + %sz = call i32 @llvm.objectsize.i32(i8* %phi, i1 false) + ret i32 %sz +} + +; CHECK: @test17 +; CHECK: ret i32 5 +define i32 @test17(i32 %n) nounwind { + %b = alloca [5 x i8], align 1 + %c = alloca [5 x i8], align 1 + %bp = bitcast [5 x i8]* %b to i8* + switch i32 %n, label %sw.default [ + i32 1, label %sw.bb + i32 2, label %sw.bb1 + ] + +sw.bb: + br label %sw.epilog + +sw.bb1: + %cp = bitcast [5 x i8]* %c to i8* + br label %sw.epilog + +sw.default: + br label %sw.epilog + +sw.epilog: + %phi = phi i8* [ %bp, %sw.default ], [ %cp, %sw.bb1 ], [ %bp, %sw.bb ] + %sz = call i32 @llvm.objectsize.i32(i8* %phi, i1 false) + ret i32 %sz +} + +@globalalias = alias internal [60 x i8]* @a + +; CHECK: @test18 +; CHECK-NEXT: ret i32 60 +define i32 @test18() { + %bc = bitcast [60 x i8]* @globalalias to i8* + %1 = call i32 @llvm.objectsize.i32(i8* %bc, i1 false) + ret i32 %1 +} + +@globalalias2 = alias weak [60 x i8]* @a + +; CHECK: @test19 +; CHECK: llvm.objectsize +define i32 @test19() { + %bc = bitcast [60 x i8]* @globalalias2 to i8* + %1 = call i32 @llvm.objectsize.i32(i8* %bc, i1 false) + ret i32 %1 +} diff --git a/test/Transforms/InstCombine/or.ll b/test/Transforms/InstCombine/or.ll index c0bb28d15ccf..bde2a54048ad 100644 --- a/test/Transforms/InstCombine/or.ll +++ b/test/Transforms/InstCombine/or.ll @@ -344,10 +344,9 @@ define <4 x i32> @test32(<4 x i1> %and.i1352, <4 x i32> %vecinit6.i176, <4 x i32 %and.i = and <4 x i32> %vecinit6.i191, %neg.i ; <<4 x i32>> [#uses=1] %or.i = or <4 x i32> %and.i, %and.i129 ; <<4 x i32>> [#uses=1] ret <4 x i32> %or.i -; Don't turn this into a vector select until codegen matures to handle them -; better. +; codegen is mature enough to handle vector selects. ; CHECK: @test32 -; CHECK: or <4 x i32> %and.i, %and.i129 +; CHECK: select <4 x i1> %and.i1352, <4 x i32> %vecinit6.i176, <4 x i32> %vecinit6.i191 } define i1 @test33(i1 %X, i1 %Y) { diff --git a/test/Transforms/SimplifyLibCalls/osx-names.ll b/test/Transforms/InstCombine/osx-names.ll index e321d1dd3171..7b83526aceb5 100644 --- a/test/Transforms/SimplifyLibCalls/osx-names.ll +++ b/test/Transforms/InstCombine/osx-names.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -simplify-libcalls -S | FileCheck %s +; RUN: opt < %s -instcombine -S | FileCheck %s ; <rdar://problem/9815881> ; On OSX x86-32, fwrite and fputs aren't called fwrite and fputs. ; Make sure we use the correct names. diff --git a/test/Transforms/InstCombine/pow-1.ll b/test/Transforms/InstCombine/pow-1.ll new file mode 100644 index 000000000000..8a311f0b74c6 --- /dev/null +++ b/test/Transforms/InstCombine/pow-1.ll @@ -0,0 +1,154 @@ +; Test that the pow library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s +; rdar://7251832 + +; NOTE: The readonly attribute on the pow call should be preserved +; in the cases below where pow is transformed into another function call. + +declare float @powf(float, float) nounwind readonly +declare double @pow(double, double) nounwind readonly + +; Check pow(1.0, x) -> 1.0. + +define float @test_simplify1(float %x) { +; CHECK: @test_simplify1 + %retval = call float @powf(float 1.0, float %x) + ret float %retval +; CHECK-NEXT: ret float 1.000000e+00 +} + +define double @test_simplify2(double %x) { +; CHECK: @test_simplify2 + %retval = call double @pow(double 1.0, double %x) + ret double %retval +; CHECK-NEXT: ret double 1.000000e+00 +} + +; Check pow(2.0, x) -> exp2(x). + +define float @test_simplify3(float %x) { +; CHECK: @test_simplify3 + %retval = call float @powf(float 2.0, float %x) +; CHECK-NEXT: [[EXP2F:%[a-z0-9]+]] = call float @exp2f(float %x) [[NUW_RO:#[0-9]+]] + ret float %retval +; CHECK-NEXT: ret float [[EXP2F]] +} + +define double @test_simplify4(double %x) { +; CHECK: @test_simplify4 + %retval = call double @pow(double 2.0, double %x) +; CHECK-NEXT: [[EXP2:%[a-z0-9]+]] = call double @exp2(double %x) [[NUW_RO]] + ret double %retval +; CHECK-NEXT: ret double [[EXP2]] +} + +; Check pow(x, 0.0) -> 1.0. + +define float @test_simplify5(float %x) { +; CHECK: @test_simplify5 + %retval = call float @powf(float %x, float 0.0) + ret float %retval +; CHECK-NEXT: ret float 1.000000e+00 +} + +define double @test_simplify6(double %x) { +; CHECK: @test_simplify6 + %retval = call double @pow(double %x, double 0.0) + ret double %retval +; CHECK-NEXT: ret double 1.000000e+00 +} + +; Check pow(x, 0.5) -> fabs(sqrt(x)), where x != -infinity. + +define float @test_simplify7(float %x) { +; CHECK: @test_simplify7 + %retval = call float @powf(float %x, float 0.5) +; CHECK-NEXT: [[SQRTF:%[a-z0-9]+]] = call float @sqrtf(float %x) [[NUW_RO]] +; CHECK-NEXT: [[FABSF:%[a-z0-9]+]] = call float @fabsf(float [[SQRTF]]) [[NUW_RO]] +; CHECK-NEXT: [[FCMP:%[a-z0-9]+]] = fcmp oeq float %x, 0xFFF0000000000000 +; CHECK-NEXT: [[SELECT:%[a-z0-9]+]] = select i1 [[FCMP]], float 0x7FF0000000000000, float [[FABSF]] + ret float %retval +; CHECK-NEXT: ret float [[SELECT]] +} + +define double @test_simplify8(double %x) { +; CHECK: @test_simplify8 + %retval = call double @pow(double %x, double 0.5) +; CHECK-NEXT: [[SQRT:%[a-z0-9]+]] = call double @sqrt(double %x) [[NUW_RO]] +; CHECK-NEXT: [[FABS:%[a-z0-9]+]] = call double @fabs(double [[SQRT]]) [[NUW_RO]] +; CHECK-NEXT: [[FCMP:%[a-z0-9]+]] = fcmp oeq double %x, 0xFFF0000000000000 +; CHECK-NEXT: [[SELECT:%[a-z0-9]+]] = select i1 [[FCMP]], double 0x7FF0000000000000, double [[FABS]] + ret double %retval +; CHECK-NEXT: ret double [[SELECT]] +} + +; Check pow(-infinity, 0.5) -> +infinity. + +define float @test_simplify9(float %x) { +; CHECK: @test_simplify9 + %retval = call float @powf(float 0xFFF0000000000000, float 0.5) + ret float %retval +; CHECK-NEXT: ret float 0x7FF0000000000000 +} + +define double @test_simplify10(double %x) { +; CHECK: @test_simplify10 + %retval = call double @pow(double 0xFFF0000000000000, double 0.5) + ret double %retval +; CHECK-NEXT: ret double 0x7FF0000000000000 +} + +; Check pow(x, 1.0) -> x. + +define float @test_simplify11(float %x) { +; CHECK: @test_simplify11 + %retval = call float @powf(float %x, float 1.0) + ret float %retval +; CHECK-NEXT: ret float %x +} + +define double @test_simplify12(double %x) { +; CHECK: @test_simplify12 + %retval = call double @pow(double %x, double 1.0) + ret double %retval +; CHECK-NEXT: ret double %x +} + +; Check pow(x, 2.0) -> x*x. + +define float @test_simplify13(float %x) { +; CHECK: @test_simplify13 + %retval = call float @powf(float %x, float 2.0) +; CHECK-NEXT: [[SQUARE:%[a-z0-9]+]] = fmul float %x, %x + ret float %retval +; CHECK-NEXT: ret float [[SQUARE]] +} + +define double @test_simplify14(double %x) { +; CHECK: @test_simplify14 + %retval = call double @pow(double %x, double 2.0) +; CHECK-NEXT: [[SQUARE:%[a-z0-9]+]] = fmul double %x, %x + ret double %retval +; CHECK-NEXT: ret double [[SQUARE]] +} + +; Check pow(x, -1.0) -> 1.0/x. + +define float @test_simplify15(float %x) { +; CHECK: @test_simplify15 + %retval = call float @powf(float %x, float -1.0) +; CHECK-NEXT: [[RECIPROCAL:%[a-z0-9]+]] = fdiv float 1.000000e+00, %x + ret float %retval +; CHECK-NEXT: ret float [[RECIPROCAL]] +} + +define double @test_simplify16(double %x) { +; CHECK: @test_simplify16 + %retval = call double @pow(double %x, double -1.0) +; CHECK-NEXT: [[RECIPROCAL:%[a-z0-9]+]] = fdiv double 1.000000e+00, %x + ret double %retval +; CHECK-NEXT: ret double [[RECIPROCAL]] +} + +; CHECK: attributes [[NUW_RO]] = { nounwind readonly } diff --git a/test/Transforms/InstCombine/pow-2.ll b/test/Transforms/InstCombine/pow-2.ll new file mode 100644 index 000000000000..af64cda0904a --- /dev/null +++ b/test/Transforms/InstCombine/pow-2.ll @@ -0,0 +1,14 @@ +; Test that the pow library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +declare float @pow(double, double) + +; Check that pow functions with the wrong prototype aren't simplified. + +define float @test_no_simplify1(double %x) { +; CHECK: @test_no_simplify1 + %retval = call float @pow(double 1.0, double %x) +; CHECK-NEXT: call float @pow(double 1.000000e+00, double %x) + ret float %retval +} diff --git a/test/Transforms/InstCombine/pr12338.ll b/test/Transforms/InstCombine/pr12338.ll index 2b5c8f8a74ed..d34600f0fa58 100644 --- a/test/Transforms/InstCombine/pr12338.ll +++ b/test/Transforms/InstCombine/pr12338.ll @@ -1,24 +1,24 @@ ; RUN: opt < %s -instcombine -S | FileCheck %s -define void @entry() nounwind {
-entry:
- br label %for.cond
-
-for.cond:
+define void @entry() nounwind { +entry: + br label %for.cond + +for.cond: %local = phi <1 x i32> [ <i32 0>, %entry ], [ %phi2, %cond.end47 ] -; CHECK: sub <1 x i32> <i32 92>, %local
- %phi3 = sub <1 x i32> zeroinitializer, %local
- br label %cond.end
-
-cond.false:
- br label %cond.end
-
-cond.end:
- %cond = phi <1 x i32> [ %phi3, %for.cond ], [ undef, %cond.false ]
- br label %cond.end47
-
-cond.end47:
- %sum = add <1 x i32> %cond, <i32 92>
- %phi2 = sub <1 x i32> zeroinitializer, %sum
- br label %for.cond
-}
+; CHECK: sub <1 x i32> <i32 92>, %local + %phi3 = sub <1 x i32> zeroinitializer, %local + br label %cond.end + +cond.false: + br label %cond.end + +cond.end: + %cond = phi <1 x i32> [ %phi3, %for.cond ], [ undef, %cond.false ] + br label %cond.end47 + +cond.end47: + %sum = add <1 x i32> %cond, <i32 92> + %phi2 = sub <1 x i32> zeroinitializer, %sum + br label %for.cond +} diff --git a/test/Transforms/InstCombine/printf-1.ll b/test/Transforms/InstCombine/printf-1.ll new file mode 100644 index 000000000000..3a910ea437b7 --- /dev/null +++ b/test/Transforms/InstCombine/printf-1.ll @@ -0,0 +1,119 @@ +; Test that the printf library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s +; RUN: opt < %s -mtriple xcore-xmos-elf -instcombine -S | FileCheck %s -check-prefix=IPRINTF + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +@hello_world = constant [13 x i8] c"hello world\0A\00" +@h = constant [2 x i8] c"h\00" +@percent = constant [2 x i8] c"%\00" +@percent_c = constant [3 x i8] c"%c\00" +@percent_d = constant [3 x i8] c"%d\00" +@percent_f = constant [3 x i8] c"%f\00" +@percent_s = constant [4 x i8] c"%s\0A\00" +@empty = constant [1 x i8] c"\00" +; CHECK: [[STR:@[a-z0-9]+]] = private unnamed_addr constant [12 x i8] c"hello world\00" + +declare i32 @printf(i8*, ...) + +; Check printf("") -> noop. + +define void @test_simplify1() { +; CHECK: @test_simplify1 + %fmt = getelementptr [1 x i8]* @empty, i32 0, i32 0 + call i32 (i8*, ...)* @printf(i8* %fmt) + ret void +; CHECK-NEXT: ret void +} + +; Check printf("x") -> putchar('x'), even for '%'. + +define void @test_simplify2() { +; CHECK: @test_simplify2 + %fmt = getelementptr [2 x i8]* @h, i32 0, i32 0 + call i32 (i8*, ...)* @printf(i8* %fmt) +; CHECK-NEXT: call i32 @putchar(i32 104) + ret void +; CHECK-NEXT: ret void +} + +define void @test_simplify3() { +; CHECK: @test_simplify3 + %fmt = getelementptr [2 x i8]* @percent, i32 0, i32 0 + call i32 (i8*, ...)* @printf(i8* %fmt) +; CHECK-NEXT: call i32 @putchar(i32 37) + ret void +; CHECK-NEXT: ret void +} + +; Check printf("foo\n") -> puts("foo"). + +define void @test_simplify4() { +; CHECK: @test_simplify4 + %fmt = getelementptr [13 x i8]* @hello_world, i32 0, i32 0 + call i32 (i8*, ...)* @printf(i8* %fmt) +; CHECK-NEXT: call i32 @puts(i8* getelementptr inbounds ([12 x i8]* [[STR]], i32 0, i32 0)) + ret void +; CHECK-NEXT: ret void +} + +; Check printf("%c", chr) -> putchar(chr). + +define void @test_simplify5() { +; CHECK: @test_simplify5 + %fmt = getelementptr [3 x i8]* @percent_c, i32 0, i32 0 + call i32 (i8*, ...)* @printf(i8* %fmt, i8 104) +; CHECK-NEXT: call i32 @putchar(i32 104) + ret void +; CHECK-NEXT: ret void +} + +; Check printf("%s\n", str) -> puts(str). + +define void @test_simplify6() { +; CHECK: @test_simplify6 + %fmt = getelementptr [4 x i8]* @percent_s, i32 0, i32 0 + %str = getelementptr [13 x i8]* @hello_world, i32 0, i32 0 + call i32 (i8*, ...)* @printf(i8* %fmt, i8* %str) +; CHECK-NEXT: call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @hello_world, i32 0, i32 0)) + ret void +; CHECK-NEXT: ret void +} + +; Check printf(format, ...) -> iprintf(format, ...) if no floating point. + +define void @test_simplify7() { +; CHECK-IPRINTF: @test_simplify7 + %fmt = getelementptr [3 x i8]* @percent_d, i32 0, i32 0 + call i32 (i8*, ...)* @printf(i8* %fmt, i32 187) +; CHECK-NEXT-IPRINTF: call i32 (i8*, ...)* @iprintf(i8* getelementptr inbounds ([3 x i8]* @percent_d, i32 0, i32 0), i32 187) + ret void +; CHECK-NEXT-IPRINTF: ret void +} + +define void @test_no_simplify1() { +; CHECK-IPRINTF: @test_no_simplify1 + %fmt = getelementptr [3 x i8]* @percent_f, i32 0, i32 0 + call i32 (i8*, ...)* @printf(i8* %fmt, double 1.87) +; CHECK-NEXT-IPRINTF: call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([3 x i8]* @percent_f, i32 0, i32 0), double 1.870000e+00) + ret void +; CHECK-NEXT-IPRINTF: ret void +} + +define void @test_no_simplify2(i8* %fmt, double %d) { +; CHECK: @test_no_simplify2 + call i32 (i8*, ...)* @printf(i8* %fmt, double %d) +; CHECK-NEXT: call i32 (i8*, ...)* @printf(i8* %fmt, double %d) + ret void +; CHECK-NEXT: ret void +} + +define i32 @test_no_simplify3() { +; CHECK: @test_no_simplify3 + %fmt = getelementptr [2 x i8]* @h, i32 0, i32 0 + %ret = call i32 (i8*, ...)* @printf(i8* %fmt) +; CHECK-NEXT: call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8]* @h, i32 0, i32 0)) + ret i32 %ret +; CHECK-NEXT: ret i32 %ret +} diff --git a/test/Transforms/InstCombine/printf-2.ll b/test/Transforms/InstCombine/printf-2.ll new file mode 100644 index 000000000000..466ee1c75770 --- /dev/null +++ b/test/Transforms/InstCombine/printf-2.ll @@ -0,0 +1,41 @@ +; Test that the printf library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +@hello_world = constant [13 x i8] c"hello world\0A\00" +@h = constant [2 x i8] c"h\00" +@percent_s = constant [4 x i8] c"%s\0A\00" + +declare void @printf(i8*, ...) + +; Check simplification of printf with void return type. + +define void @test_simplify1() { +; CHECK: @test_simplify1 + %fmt = getelementptr [2 x i8]* @h, i32 0, i32 0 + call void (i8*, ...)* @printf(i8* %fmt) +; CHECK-NEXT: call i32 @putchar(i32 104) + ret void +; CHECK-NEXT: ret void +} + +define void @test_simplify2() { +; CHECK: @test_simplify2 + %fmt = getelementptr [13 x i8]* @hello_world, i32 0, i32 0 + call void (i8*, ...)* @printf(i8* %fmt) +; CHECK-NEXT: call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @str, i32 0, i32 0)) + ret void +; CHECK-NEXT: ret void +} + +define void @test_simplify6() { +; CHECK: @test_simplify6 + %fmt = getelementptr [4 x i8]* @percent_s, i32 0, i32 0 + %str = getelementptr [13 x i8]* @hello_world, i32 0, i32 0 + call void (i8*, ...)* @printf(i8* %fmt, i8* %str) +; CHECK-NEXT: call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @hello_world, i32 0, i32 0)) + ret void +; CHECK-NEXT: ret void +} diff --git a/test/Transforms/InstCombine/ptr-int-cast.ll b/test/Transforms/InstCombine/ptr-int-cast.ll index 9524d449dd8b..7a6ecff9c0be 100644 --- a/test/Transforms/InstCombine/ptr-int-cast.ll +++ b/test/Transforms/InstCombine/ptr-int-cast.ll @@ -27,3 +27,34 @@ define i64 @f0(i32 %a0) nounwind { ret i64 %t1 } +define <4 x i32> @test4(<4 x i8*> %arg) nounwind { +; CHECK: @test4 +; CHECK: ptrtoint <4 x i8*> %arg to <4 x i64> +; CHECK: trunc <4 x i64> %1 to <4 x i32> + %p1 = ptrtoint <4 x i8*> %arg to <4 x i32> + ret <4 x i32> %p1 +} + +define <4 x i128> @test5(<4 x i8*> %arg) nounwind { +; CHECK: @test5 +; CHECK: ptrtoint <4 x i8*> %arg to <4 x i64> +; CHECK: zext <4 x i64> %1 to <4 x i128> + %p1 = ptrtoint <4 x i8*> %arg to <4 x i128> + ret <4 x i128> %p1 +} + +define <4 x i8*> @test6(<4 x i32> %arg) nounwind { +; CHECK: @test6 +; CHECK: zext <4 x i32> %arg to <4 x i64> +; CHECK: inttoptr <4 x i64> %1 to <4 x i8*> + %p1 = inttoptr <4 x i32> %arg to <4 x i8*> + ret <4 x i8*> %p1 +} + +define <4 x i8*> @test7(<4 x i128> %arg) nounwind { +; CHECK: @test7 +; CHECK: trunc <4 x i128> %arg to <4 x i64> +; CHECK: inttoptr <4 x i64> %1 to <4 x i8*> + %p1 = inttoptr <4 x i128> %arg to <4 x i8*> + ret <4 x i8*> %p1 +} diff --git a/test/Transforms/InstCombine/puts-1.ll b/test/Transforms/InstCombine/puts-1.ll new file mode 100644 index 000000000000..ef4e1bbd824c --- /dev/null +++ b/test/Transforms/InstCombine/puts-1.ll @@ -0,0 +1,31 @@ +; Test that the puts library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +@empty = constant [1 x i8] zeroinitializer + +declare i32 @puts(i8*) + +; Check puts("") -> putchar('\n'). + +define void @test_simplify1() { +; CHECK: @test_simplify1 + %str = getelementptr [1 x i8]* @empty, i32 0, i32 0 + call i32 @puts(i8* %str) +; CHECK-NEXT: call i32 @putchar(i32 10) + ret void +; CHECK-NEXT: ret void +} + +; Don't simplify if the return value is used. + +define i32 @test_no_simplify1() { +; CHECK: @test_no_simplify1 + %str = getelementptr [1 x i8]* @empty, i32 0, i32 0 + %ret = call i32 @puts(i8* %str) +; CHECK-NEXT: call i32 @puts(i8* getelementptr inbounds ([1 x i8]* @empty, i32 0, i32 0)) + ret i32 %ret +; CHECK-NEXT: ret i32 %ret +} diff --git a/test/Transforms/InstCombine/sdiv-1.ll b/test/Transforms/InstCombine/sdiv-1.ll index c46b5eaef4a8..6ab18ac7f844 100644 --- a/test/Transforms/InstCombine/sdiv-1.ll +++ b/test/Transforms/InstCombine/sdiv-1.ll @@ -1,6 +1,8 @@ -; RUN: opt < %s -instcombine -inline -S | not grep '-715827882' +; RUN: opt < %s -instcombine -inline -S | FileCheck %s ; PR3142 +; CHECK-NOT: -715827882 + define i32 @a(i32 %X) nounwind readnone { entry: %0 = sub i32 0, %X diff --git a/test/Transforms/InstCombine/sext.ll b/test/Transforms/InstCombine/sext.ll index f1987973f462..968f37c9c129 100644 --- a/test/Transforms/InstCombine/sext.ll +++ b/test/Transforms/InstCombine/sext.ll @@ -184,3 +184,12 @@ define i32 @test16(i16 %x) nounwind { ; CHECK-NEXT: %ext = sext i16 %sext to i32 ; CHECK-NEXT: ret i32 %ext } + +define i32 @test17(i1 %x) nounwind { + %c1 = sext i1 %x to i32 + %c2 = sub i32 0, %c1 + ret i32 %c2 +; CHECK: @test17 +; CHECK-NEXT: [[TEST17:%.*]] = zext i1 %x to i32 +; CHECK-NEXT: ret i32 [[TEST17]] +} diff --git a/test/Transforms/InstCombine/shift.ll b/test/Transforms/InstCombine/shift.ll index 25e708b7f51d..41f8aa9ee812 100644 --- a/test/Transforms/InstCombine/shift.ll +++ b/test/Transforms/InstCombine/shift.ll @@ -523,9 +523,9 @@ entry: %tmp51 = xor i8 %tmp50, %tmp5 %tmp52 = and i8 %tmp51, -128 %tmp53 = lshr i8 %tmp52, 7 -; CHECK: lshr i8 %tmp51, 7 %tmp54 = mul i8 %tmp53, 16 -; CHECK: shl nuw nsw i8 %tmp53, 4 +; CHECK: %0 = shl i8 %tmp4, 2 +; CHECK: %tmp54 = and i8 %0, 16 %tmp55 = xor i8 %tmp54, %tmp51 ; CHECK: ret i8 %tmp551 ret i8 %tmp55 @@ -659,3 +659,89 @@ define i32 @test53(i32 %x) { ; CHECK-NEXT: %B = shl nuw i32 %x, 2 ; CHECK-NEXT: ret i32 %B } + +define i32 @test54(i32 %x) { + %shr2 = lshr i32 %x, 1 + %shl = shl i32 %shr2, 4 + %and = and i32 %shl, 16 + ret i32 %and +; CHECK: @test54 +; CHECK: shl i32 %x, 3 +} + + +define i32 @test55(i32 %x) { + %shr2 = lshr i32 %x, 1 + %shl = shl i32 %shr2, 4 + %or = or i32 %shl, 8 + ret i32 %or +; CHECK: @test55 +; CHECK: shl i32 %x, 3 +} + +define i32 @test56(i32 %x) { + %shr2 = lshr i32 %x, 1 + %shl = shl i32 %shr2, 4 + %or = or i32 %shl, 7 + ret i32 %or +; CHECK: @test56 +; CHECK: shl i32 %shr2, 4 +} + + +define i32 @test57(i32 %x) { + %shr = lshr i32 %x, 1 + %shl = shl i32 %shr, 4 + %and = and i32 %shl, 16 + ret i32 %and +; CHECK: @test57 +; CHECK: shl i32 %x, 3 +} + +define i32 @test58(i32 %x) { + %shr = lshr i32 %x, 1 + %shl = shl i32 %shr, 4 + %or = or i32 %shl, 8 + ret i32 %or +; CHECK: @test58 +; CHECK: shl i32 %x, 3 +} + +define i32 @test59(i32 %x) { + %shr = ashr i32 %x, 1 + %shl = shl i32 %shr, 4 + %or = or i32 %shl, 7 + ret i32 %or +; CHECK: @test59 +; CHECK: %shl = shl i32 %shr1, 4 +} + + +define i32 @test60(i32 %x) { + %shr = ashr i32 %x, 4 + %shl = shl i32 %shr, 1 + %or = or i32 %shl, 1 + ret i32 %or +; CHECK: @test60 +; CHECK: ashr i32 %x, 3 +} + + +define i32 @test61(i32 %x) { + %shr = ashr i32 %x, 4 + %shl = shl i32 %shr, 1 + %or = or i32 %shl, 2 + ret i32 %or +; CHECK: @test61 +; CHECK: ashr i32 %x, 4 +} + +; propagate "exact" trait +define i32 @test62(i32 %x) { + %shr = ashr exact i32 %x, 4 + %shl = shl i32 %shr, 1 + %or = or i32 %shl, 1 + ret i32 %or +; CHECK: @test62 +; CHECK: ashr exact i32 %x, 3 +} diff --git a/test/Transforms/InstCombine/signext.ll b/test/Transforms/InstCombine/signext.ll index ecee9830cd57..5ed1cd5590ae 100644 --- a/test/Transforms/InstCombine/signext.ll +++ b/test/Transforms/InstCombine/signext.ll @@ -82,6 +82,6 @@ entry: %sub = add i32 %xor, -67108864 ; <i32> [#uses=1] ret i32 %sub ; CHECK: @test8 -; CHECK: %shr = ashr i32 %x, 5 -; CHECK: ret i32 %shr +; CHECK: %sub = ashr i32 %x, 5 +; CHECK: ret i32 %sub } diff --git a/test/Transforms/InstCombine/sink_instruction.ll b/test/Transforms/InstCombine/sink_instruction.ll index e521de208f21..5c4019a98df5 100644 --- a/test/Transforms/InstCombine/sink_instruction.ll +++ b/test/Transforms/InstCombine/sink_instruction.ll @@ -1,4 +1,4 @@ -; RUN: opt -instcombine %s -S | FileCheck %s +; RUN: opt -instcombine -S < %s | FileCheck %s ;; This tests that the instructions in the entry blocks are sunk into each ;; arm of the 'if'. diff --git a/test/Transforms/InstCombine/sprintf-1.ll b/test/Transforms/InstCombine/sprintf-1.ll new file mode 100644 index 000000000000..9b8c8b1b12c7 --- /dev/null +++ b/test/Transforms/InstCombine/sprintf-1.ll @@ -0,0 +1,100 @@ +; Test that the sprintf library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s +; RUN: opt < %s -mtriple xcore-xmos-elf -instcombine -S | FileCheck %s -check-prefix=IPRINTF + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +@hello_world = constant [13 x i8] c"hello world\0A\00" +@null = constant [1 x i8] zeroinitializer +@null_hello = constant [7 x i8] c"\00hello\00" +@h = constant [2 x i8] c"h\00" +@percent_c = constant [3 x i8] c"%c\00" +@percent_d = constant [3 x i8] c"%d\00" +@percent_f = constant [3 x i8] c"%f\00" +@percent_s = constant [3 x i8] c"%s\00" + +declare i32 @sprintf(i8*, i8*, ...) + +; Check sprintf(dst, fmt) -> llvm.memcpy(str, fmt, strlen(fmt) + 1, 1). + +define void @test_simplify1(i8* %dst) { +; CHECK: @test_simplify1 + %fmt = getelementptr [13 x i8]* @hello_world, i32 0, i32 0 + call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt) +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* getelementptr inbounds ([13 x i8]* @hello_world, i32 0, i32 0), i32 13, i32 1, i1 false) + ret void +; CHECK-NEXT: ret void +} + +define void @test_simplify2(i8* %dst) { +; CHECK: @test_simplify2 + %fmt = getelementptr [1 x i8]* @null, i32 0, i32 0 + call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt) +; CHECK-NEXT: store i8 0, i8* %dst, align 1 + ret void +; CHECK-NEXT: ret void +} + +define void @test_simplify3(i8* %dst) { +; CHECK: @test_simplify3 + %fmt = getelementptr [7 x i8]* @null_hello, i32 0, i32 0 + call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt) +; CHECK-NEXT: store i8 0, i8* %dst, align 1 + ret void +; CHECK-NEXT: ret void +} + +; Check sprintf(dst, "%c", chr) -> *(i8*)dst = chr; *((i8*)dst + 1) = 0. + +define void @test_simplify4(i8* %dst) { +; CHECK: @test_simplify4 + %fmt = getelementptr [3 x i8]* @percent_c, i32 0, i32 0 + call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt, i8 104) +; CHECK-NEXT: store i8 104, i8* %dst, align 1 +; CHECK-NEXT: [[NUL:%[a-z0-9]+]] = getelementptr i8* %dst, i32 1 +; CHECK-NEXT: store i8 0, i8* [[NUL]], align 1 + ret void +; CHECK-NEXT: ret void +} + +; Check sprintf(dst, "%s", str) -> llvm.memcpy(dest, str, strlen(str) + 1, 1). + +define void @test_simplify5(i8* %dst, i8* %str) { +; CHECK: @test_simplify5 + %fmt = getelementptr [3 x i8]* @percent_s, i32 0, i32 0 + call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt, i8* %str) +; CHECK-NEXT: [[STRLEN:%[a-z0-9]+]] = call i32 @strlen(i8* %str) +; CHECK-NEXT: [[LENINC:%[a-z0-9]+]] = add i32 [[STRLEN]], 1 +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %str, i32 [[LENINC]], i32 1, i1 false) + ret void +; CHECK-NEXT: ret void +} + +; Check sprintf(dst, format, ...) -> siprintf(str, format, ...) if no floating. + +define void @test_simplify6(i8* %dst) { +; CHECK-IPRINTF: @test_simplify6 + %fmt = getelementptr [3 x i8]* @percent_d, i32 0, i32 0 + call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt, i32 187) +; CHECK-NEXT-IPRINTF: call i32 (i8*, i8*, ...)* @siprintf(i8* %dst, i8* getelementptr inbounds ([3 x i8]* @percent_d, i32 0, i32 0), i32 187) + ret void +; CHECK-NEXT-IPRINTF: ret void +} + +define void @test_no_simplify1(i8* %dst) { +; CHECK-IPRINTF: @test_no_simplify1 + %fmt = getelementptr [3 x i8]* @percent_f, i32 0, i32 0 + call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt, double 1.87) +; CHECK-NEXT-IPRINTF: call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* getelementptr inbounds ([3 x i8]* @percent_f, i32 0, i32 0), double 1.870000e+00) + ret void +; CHECK-NEXT-IPRINTF: ret void +} + +define void @test_no_simplify2(i8* %dst, i8* %fmt, double %d) { +; CHECK: @test_no_simplify2 + call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt, double %d) +; CHECK-NEXT: call i32 (i8*, i8*, ...)* @sprintf(i8* %dst, i8* %fmt, double %d) + ret void +; CHECK-NEXT: ret void +} diff --git a/test/Transforms/InstCombine/sqrt.ll b/test/Transforms/InstCombine/sqrt.ll index cc78417ebbd6..440b9748518d 100644 --- a/test/Transforms/InstCombine/sqrt.ll +++ b/test/Transforms/InstCombine/sqrt.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -instcombine %s | FileCheck %s +; RUN: opt -S -instcombine < %s | FileCheck %s define float @test1(float %x) nounwind readnone ssp { entry: diff --git a/test/Transforms/InstCombine/store.ll b/test/Transforms/InstCombine/store.ll index 64460d7a6d61..164ba7632684 100644 --- a/test/Transforms/InstCombine/store.ll +++ b/test/Transforms/InstCombine/store.ll @@ -83,3 +83,37 @@ Cont: ; CHECK-NEXT: ret void } + +; PR14753 - merging two stores should preserve the TBAA tag. +define void @test6(i32 %n, float* %a, i32* %gi) nounwind uwtable ssp { +entry: + store i32 42, i32* %gi, align 4, !tbaa !0 + br label %for.cond + +for.cond: ; preds = %for.body, %entry + %storemerge = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %0 = load i32* %gi, align 4, !tbaa !0 + %cmp = icmp slt i32 %0, %n + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %idxprom = sext i32 %0 to i64 + %arrayidx = getelementptr inbounds float* %a, i64 %idxprom + store float 0.000000e+00, float* %arrayidx, align 4, !tbaa !3 + %1 = load i32* %gi, align 4, !tbaa !0 + %inc = add nsw i32 %1, 1 + store i32 %inc, i32* %gi, align 4, !tbaa !0 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +; CHECK: @test6 +; CHECK: for.cond: +; CHECK-NEXT: phi i32 [ 42 +; CHECK-NEXT: store i32 %storemerge, i32* %gi, align 4, !tbaa !0 +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"float", metadata !1} diff --git a/test/Transforms/InstCombine/strto-1.ll b/test/Transforms/InstCombine/strto-1.ll index 16c0c67970db..7139972fe043 100644 --- a/test/Transforms/InstCombine/strto-1.ll +++ b/test/Transforms/InstCombine/strto-1.ll @@ -1,29 +1,29 @@ ; Test that the strto* library call simplifiers works correctly. ; -; RUN: opt < %s -instcombine -S | FileCheck %s +; RUN: opt < %s -instcombine -functionattrs -S | FileCheck %s target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" declare i64 @strtol(i8* %s, i8** %endptr, i32 %base) -; CHECK: declare i64 @strtol(i8*, i8**, i32) +; CHECK: declare i64 @strtol(i8*, i8** nocapture, i32) declare double @strtod(i8* %s, i8** %endptr, i32 %base) -; CHECK: declare double @strtod(i8*, i8**, i32) +; CHECK: declare double @strtod(i8*, i8** nocapture, i32) declare float @strtof(i8* %s, i8** %endptr, i32 %base) -; CHECK: declare float @strtof(i8*, i8**, i32) +; CHECK: declare float @strtof(i8*, i8** nocapture, i32) declare i64 @strtoul(i8* %s, i8** %endptr, i32 %base) -; CHECK: declare i64 @strtoul(i8*, i8**, i32) +; CHECK: declare i64 @strtoul(i8*, i8** nocapture, i32) declare i64 @strtoll(i8* %s, i8** %endptr, i32 %base) -; CHECK: declare i64 @strtoll(i8*, i8**, i32) +; CHECK: declare i64 @strtoll(i8*, i8** nocapture, i32) declare double @strtold(i8* %s, i8** %endptr) -; CHECK: declare double @strtold(i8*, i8**) +; CHECK: declare double @strtold(i8*, i8** nocapture) declare i64 @strtoull(i8* %s, i8** %endptr, i32 %base) -; CHECK: declare i64 @strtoull(i8*, i8**, i32) +; CHECK: declare i64 @strtoull(i8*, i8** nocapture, i32) define void @test_simplify1(i8* %x, i8** %endptr) { ; CHECK: @test_simplify1 diff --git a/test/Transforms/InstCombine/toascii-1.ll b/test/Transforms/InstCombine/toascii-1.ll new file mode 100644 index 000000000000..c4a13e229393 --- /dev/null +++ b/test/Transforms/InstCombine/toascii-1.ll @@ -0,0 +1,59 @@ +; Test that the toascii library call simplifier works correctly. +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +declare i32 @toascii(i32) + +; Check isascii(c) -> c & 0x7f. + +define i32 @test_simplify1() { +; CHECK: @test_simplify1 + %ret = call i32 @toascii(i32 0) + ret i32 %ret +; CHECK-NEXT: ret i32 0 +} + +define i32 @test_simplify2() { +; CHECK: @test_simplify2 + %ret = call i32 @toascii(i32 1) + ret i32 %ret +; CHECK-NEXT: ret i32 1 +} + +define i32 @test_simplify3() { +; CHECK: @test_simplify3 + %ret = call i32 @toascii(i32 127) + ret i32 %ret +; CHECK-NEXT: ret i32 127 +} + +define i32 @test_simplify4() { +; CHECK: @test_simplify4 + %ret = call i32 @toascii(i32 128) + ret i32 %ret +; CHECK-NEXT: ret i32 0 +} + +define i32 @test_simplify5() { +; CHECK: @test_simplify5 + %ret = call i32 @toascii(i32 255) + ret i32 %ret +; CHECK-NEXT: ret i32 127 +} + +define i32 @test_simplify6() { +; CHECK: @test_simplify6 + %ret = call i32 @toascii(i32 256) + ret i32 %ret +; CHECK-NEXT: ret i32 0 +} + +define i32 @test_simplify7(i32 %x) { +; CHECK: @test_simplify7 + %ret = call i32 @toascii(i32 %x) +; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 127 + ret i32 %ret +; CHECK-NEXT: ret i32 [[AND]] +} diff --git a/test/Transforms/InstCombine/vec_extract_elt.ll b/test/Transforms/InstCombine/vec_extract_elt.ll index 63e4ee2112d8..166066a201bf 100644 --- a/test/Transforms/InstCombine/vec_extract_elt.ll +++ b/test/Transforms/InstCombine/vec_extract_elt.ll @@ -7,3 +7,13 @@ define i32 @test(float %f) { ret i32 %tmp19 } +define i64 @test2(i64 %in) { + %vec = insertelement <8 x i64> undef, i64 %in, i32 0 + %splat = shufflevector <8 x i64> %vec, <8 x i64> undef, <8 x i32> zeroinitializer + %add = add <8 x i64> %splat, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> + %scl1 = extractelement <8 x i64> %add, i32 0 + %scl2 = extractelement <8 x i64> %add, i32 0 + %r = add i64 %scl1, %scl2 + ret i64 %r +} + diff --git a/test/Transforms/InstCombine/vector-casts.ll b/test/Transforms/InstCombine/vector-casts.ll index 7bbf53c270f4..2f2990b7b055 100644 --- a/test/Transforms/InstCombine/vector-casts.ll +++ b/test/Transforms/InstCombine/vector-casts.ll @@ -64,7 +64,8 @@ entry: ; CHECK: @test5 ; CHECK: sext <4 x i1> %cmp to <4 x i32> -; CHECK: sext <4 x i1> %cmp4 to <4 x i32> +; The sext-and pair is canonicalized to a select. +; CHECK: select <4 x i1> %cmp4, <4 x i32> %sext, <4 x i32> zeroinitializer } diff --git a/test/Transforms/InstCombine/vector-type.ll b/test/Transforms/InstCombine/vector-type.ll new file mode 100644 index 000000000000..59a4bdd19e70 --- /dev/null +++ b/test/Transforms/InstCombine/vector-type.ll @@ -0,0 +1,15 @@ +; The code in InstCombiner::FoldSelectOpOp was calling +; Type::getVectorNumElements without checking first if the type was a vector. + +; RUN: opt < %s -instcombine -S + +define i32 @vselect1(i32 %a.coerce, i32 %b.coerce, i32 %c.coerce) { +entry: + %0 = bitcast i32 %a.coerce to <2 x i16> + %1 = bitcast i32 %b.coerce to <2 x i16> + %2 = bitcast i32 %c.coerce to <2 x i16> + %cmp = icmp sge <2 x i16> %2, zeroinitializer + %or = select <2 x i1> %cmp, <2 x i16> %0, <2 x i16> %1 + %3 = bitcast <2 x i16> %or to i32 + ret i32 %3 +} diff --git a/test/Transforms/InstCombine/vector_gep1.ll b/test/Transforms/InstCombine/vector_gep1.ll index 652362299562..90ca26212f2a 100644 --- a/test/Transforms/InstCombine/vector_gep1.ll +++ b/test/Transforms/InstCombine/vector_gep1.ll @@ -1,5 +1,5 @@ -; RUN: opt -instcombine %s -disable-output -; RUN: opt -instsimplify %s -disable-output +; RUN: opt -instcombine -disable-output < %s +; RUN: opt -instsimplify -disable-output < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -35,3 +35,8 @@ define <2 x i1> @test5(<2 x i8*> %a) { %B = icmp ult <2 x i8*> %g, zeroinitializer ret <2 x i1> %B } + +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 +} diff --git a/test/Transforms/InstCombine/xor2.ll b/test/Transforms/InstCombine/xor2.ll index 89f00bd68475..be06d7999d84 100644 --- a/test/Transforms/InstCombine/xor2.ll +++ b/test/Transforms/InstCombine/xor2.ll @@ -51,3 +51,34 @@ define i32 @test4(i32 %A, i32 %B) { ; CHECK: %1 = ashr i32 %A, %B ; CHECK: ret i32 %1 } + +; defect-2 in rdar://12329730 +; (X^C1) >> C2) ^ C3 -> (X>>C2) ^ ((C1>>C2)^C3) +; where the "X" has more than one use +define i32 @test5(i32 %val1) { +test5: + %xor = xor i32 %val1, 1234 + %shr = lshr i32 %xor, 8 + %xor1 = xor i32 %shr, 1 + %add = add i32 %xor1, %xor + ret i32 %add +; CHECK: @test5 +; CHECK: lshr i32 %val1, 8 +; CHECK: ret +} + +; defect-1 in rdar://12329730 +; Simplify (X^Y) -> X or Y in the user's context if we know that +; only bits from X or Y are demanded. +; e.g. the "x ^ 1234" can be optimized into x in the context of "t >> 16". +; Put in other word, t >> 16 -> x >> 16. +; unsigned foo(unsigned x) { unsigned t = x ^ 1234; ; return (t >> 16) + t;} +define i32 @test6(i32 %x) { + %xor = xor i32 %x, 1234 + %shr = lshr i32 %xor, 16 + %add = add i32 %shr, %xor + ret i32 %add +; CHECK: @test6 +; CHECK: lshr i32 %x, 16 +; CHECK: ret +} diff --git a/test/Transforms/InstCombine/zext-bool-add-sub.ll b/test/Transforms/InstCombine/zext-bool-add-sub.ll index 78bcedbbc2e1..b5310575502b 100644 --- a/test/Transforms/InstCombine/zext-bool-add-sub.ll +++ b/test/Transforms/InstCombine/zext-bool-add-sub.ll @@ -4,9 +4,9 @@ define i32 @a(i1 zeroext %x, i1 zeroext %y) { entry: ; CHECK: @a -; CHECK: [[TMP1:%.*]] = zext i1 %y to i32 +; CHECK: [[TMP1:%.*]] = sext i1 %y to i32 ; CHECK: [[TMP2:%.*]] = select i1 %x, i32 2, i32 1 -; CHECK-NEXT: sub i32 [[TMP2]], [[TMP1]] +; CHECK-NEXT: add i32 [[TMP2]], [[TMP1]] %conv = zext i1 %x to i32 %conv3 = zext i1 %y to i32 %conv3.neg = sub i32 0, %conv3 diff --git a/test/Transforms/InstSimplify/call-callconv.ll b/test/Transforms/InstSimplify/call-callconv.ll new file mode 100644 index 000000000000..e475be781db9 --- /dev/null +++ b/test/Transforms/InstSimplify/call-callconv.ll @@ -0,0 +1,48 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s +; Verify that the non-default calling conv doesn't prevent the libcall simplification + +@.str = private unnamed_addr constant [4 x i8] c"abc\00", align 1 + +define arm_aapcscc i32 @_abs(i32 %i) nounwind readnone { +; CHECK: _abs + %call = tail call arm_aapcscc i32 @abs(i32 %i) nounwind readnone + ret i32 %call +; CHECK: %[[ISPOS:.*]] = icmp sgt i32 %i, -1 +; CHECK: %[[NEG:.*]] = sub i32 0, %i +; CHECK: %[[RET:.*]] = select i1 %[[ISPOS]], i32 %i, i32 %[[NEG]] +; CHECK: ret i32 %[[RET]] +} + +declare arm_aapcscc i32 @abs(i32) nounwind readnone + +define arm_aapcscc i32 @_labs(i32 %i) nounwind readnone { +; CHECK: _labs + %call = tail call arm_aapcscc i32 @labs(i32 %i) nounwind readnone + ret i32 %call +; CHECK: %[[ISPOS:.*]] = icmp sgt i32 %i, -1 +; CHECK: %[[NEG:.*]] = sub i32 0, %i +; CHECK: %[[RET:.*]] = select i1 %[[ISPOS]], i32 %i, i32 %[[NEG]] +; CHECK: ret i32 %[[RET]] +} + +declare arm_aapcscc i32 @labs(i32) nounwind readnone + +define arm_aapcscc i32 @_strlen1() { +; CHECK: _strlen1 + %call = tail call arm_aapcscc i32 @strlen(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0)) + ret i32 %call +; CHECK: ret i32 3 +} + +declare arm_aapcscc i32 @strlen(i8*) + +define arm_aapcscc zeroext i1 @_strlen2(i8* %str) { +; CHECK: _strlen2 + %call = tail call arm_aapcscc i32 @strlen(i8* %str) + %cmp = icmp ne i32 %call, 0 + ret i1 %cmp + +; CHECK: %[[STRLENFIRST:.*]] = load i8* %str +; CHECK: %[[CMP:.*]] = icmp ne i8 %[[STRLENFIRST]], 0 +; CHECK: ret i1 %[[CMP]] +} diff --git a/test/Transforms/InstSimplify/call.ll b/test/Transforms/InstSimplify/call.ll new file mode 100644 index 000000000000..cf2f8476763f --- /dev/null +++ b/test/Transforms/InstSimplify/call.ll @@ -0,0 +1,103 @@ +; RUN: opt < %s -instsimplify -S | FileCheck %s + +declare {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a, i8 %b) + +define i1 @test_uadd1() { +; CHECK: @test_uadd1 + %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 3) + %overflow = extractvalue {i8, i1} %x, 1 + ret i1 %overflow +; CHECK-NEXT: ret i1 true +} + +define i8 @test_uadd2() { +; CHECK: @test_uadd2 + %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 44) + %result = extractvalue {i8, i1} %x, 0 + ret i8 %result +; CHECK-NEXT: ret i8 42 +} + +declare i256 @llvm.cttz.i256(i256 %src, i1 %is_zero_undef) + +define i256 @test_cttz() { +; CHECK: @test_cttz + %x = call i256 @llvm.cttz.i256(i256 10, i1 false) + ret i256 %x +; CHECK-NEXT: ret i256 1 +} + +declare i256 @llvm.ctpop.i256(i256 %src) + +define i256 @test_ctpop() { +; CHECK: @test_ctpop + %x = call i256 @llvm.ctpop.i256(i256 10) + ret i256 %x +; CHECK-NEXT: ret i256 2 +} + +; Test a non-intrinsic that we know about as a library call. +declare float @fabs(float %x) + +define float @test_fabs_libcall() { +; CHECK: @test_fabs_libcall + + %x = call float @fabs(float -42.0) +; This is still a real function call, so instsimplify won't nuke it -- other +; passes have to do that. +; CHECK-NEXT: call float @fabs + + ret float %x +; CHECK-NEXT: ret float 4.2{{0+}}e+01 +} + + +declare float @llvm.fabs.f32(float) nounwind readnone +declare float @llvm.floor.f32(float) nounwind readnone +declare float @llvm.ceil.f32(float) nounwind readnone +declare float @llvm.trunc.f32(float) nounwind readnone +declare float @llvm.rint.f32(float) nounwind readnone +declare float @llvm.nearbyint.f32(float) nounwind readnone + +; Test idempotent intrinsics +define float @test_idempotence(float %a) { +; CHECK: @test_idempotence + +; CHECK: fabs +; CHECK-NOT: fabs + %a0 = call float @llvm.fabs.f32(float %a) + %a1 = call float @llvm.fabs.f32(float %a0) + +; CHECK: floor +; CHECK-NOT: floor + %b0 = call float @llvm.floor.f32(float %a) + %b1 = call float @llvm.floor.f32(float %b0) + +; CHECK: ceil +; CHECK-NOT: ceil + %c0 = call float @llvm.ceil.f32(float %a) + %c1 = call float @llvm.ceil.f32(float %c0) + +; CHECK: trunc +; CHECK-NOT: trunc + %d0 = call float @llvm.trunc.f32(float %a) + %d1 = call float @llvm.trunc.f32(float %d0) + +; CHECK: rint +; CHECK-NOT: rint + %e0 = call float @llvm.rint.f32(float %a) + %e1 = call float @llvm.rint.f32(float %e0) + +; CHECK: nearbyint +; CHECK-NOT: nearbyint + %f0 = call float @llvm.nearbyint.f32(float %a) + %f1 = call float @llvm.nearbyint.f32(float %f0) + + %r0 = fadd float %a1, %b1 + %r1 = fadd float %r0, %c1 + %r2 = fadd float %r1, %d1 + %r3 = fadd float %r2, %e1 + %r4 = fadd float %r3, %f1 + + ret float %r4 +} diff --git a/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll index ce2bb799c813..b764c761cfb2 100644 --- a/test/Transforms/InstSimplify/compare.ll +++ b/test/Transforms/InstSimplify/compare.ll @@ -165,6 +165,46 @@ entry: ret i1 %cmp } +define i1 @gep13(i8* %ptr) { +; CHECK: @gep13 +; We can prove this GEP is non-null because it is inbounds. + %x = getelementptr inbounds i8* %ptr, i32 1 + %cmp = icmp eq i8* %x, null + ret i1 %cmp +; CHECK-NEXT: ret i1 false +} + +define i1 @gep14({ {}, i8 }* %ptr) { +; CHECK: @gep14 +; We can't simplify this because the offset of one in the GEP actually doesn't +; move the pointer. + %x = getelementptr inbounds { {}, i8 }* %ptr, i32 0, i32 1 + %cmp = icmp eq i8* %x, null + ret i1 %cmp +; CHECK-NOT: ret i1 false +} + +define i1 @gep15({ {}, [4 x {i8, i8}]}* %ptr, i32 %y) { +; CHECK: @gep15 +; We can prove this GEP is non-null even though there is a user value, as we +; would necessarily violate inbounds on one side or the other. + %x = getelementptr inbounds { {}, [4 x {i8, i8}]}* %ptr, i32 0, i32 1, i32 %y, i32 1 + %cmp = icmp eq i8* %x, null + ret i1 %cmp +; CHECK-NEXT: ret i1 false +} + +define i1 @gep16(i8* %ptr, i32 %a) { +; CHECK: @gep16 +; We can prove this GEP is non-null because it is inbounds and because we know +; %b is non-zero even though we don't know its value. + %b = or i32 %a, 1 + %x = getelementptr inbounds i8* %ptr, i32 %b + %cmp = icmp eq i8* %x, null + ret i1 %cmp +; CHECK-NEXT: ret i1 false +} + define i1 @zext(i32 %x) { ; CHECK: @zext %e1 = zext i32 %x to i64 @@ -607,3 +647,49 @@ unreachableblock: %Y = icmp eq i32* %X, null ret i1 %Y } + +; It's not valid to fold a comparison of an argument with an alloca, even though +; that's tempting. An argument can't *alias* an alloca, however the aliasing rule +; relies on restrictions against guessing an object's address and dereferencing. +; There are no restrictions against guessing an object's address and comparing. + +define i1 @alloca_argument_compare(i64* %arg) { + %alloc = alloca i64 + %cmp = icmp eq i64* %arg, %alloc + ret i1 %cmp + ; CHECK: alloca_argument_compare + ; CHECK: ret i1 %cmp +} + +; As above, but with the operands reversed. + +define i1 @alloca_argument_compare_swapped(i64* %arg) { + %alloc = alloca i64 + %cmp = icmp eq i64* %alloc, %arg + ret i1 %cmp + ; CHECK: alloca_argument_compare_swapped + ; CHECK: ret i1 %cmp +} + +; Don't assume that a noalias argument isn't equal to a global variable's +; address. This is an example where AliasAnalysis' NoAlias concept is +; different from actual pointer inequality. + +@y = external global i32 +define zeroext i1 @external_compare(i32* noalias %x) { + %cmp = icmp eq i32* %x, @y + ret i1 %cmp + ; CHECK: external_compare + ; CHECK: ret i1 %cmp +} + +define i1 @alloca_gep(i64 %a, i64 %b) { +; CHECK: @alloca_gep +; We can prove this GEP is non-null because it is inbounds and the pointer +; is non-null. + %strs = alloca [1000 x [1001 x i8]], align 16 + %x = getelementptr inbounds [1000 x [1001 x i8]]* %strs, i64 0, i64 %a, i64 %b + %cmp = icmp eq i8* %x, null + ret i1 %cmp +; CHECK-NEXT: ret i1 false +} diff --git a/test/Transforms/InstSimplify/fast-math.ll b/test/Transforms/InstSimplify/fast-math.ll new file mode 100644 index 000000000000..154b96739791 --- /dev/null +++ b/test/Transforms/InstSimplify/fast-math.ll @@ -0,0 +1,107 @@ +; RUN: opt < %s -instsimplify -S | FileCheck %s + +;; x * 0 ==> 0 when no-nans and no-signed-zero +; CHECK: mul_zero_1 +define float @mul_zero_1(float %a) { + %b = fmul nsz nnan float %a, 0.0 +; CHECK: ret float 0.0 + ret float %b +} +; CHECK: mul_zero_2 +define float @mul_zero_2(float %a) { + %b = fmul fast float 0.0, %a +; CHECK: ret float 0.0 + ret float %b +} + +;; x * 0 =/=> 0 when there could be nans or -0 +; CHECK: no_mul_zero_1 +define float @no_mul_zero_1(float %a) { + %b = fmul nsz float %a, 0.0 +; CHECK: ret float %b + ret float %b +} +; CHECK: no_mul_zero_2 +define float @no_mul_zero_2(float %a) { + %b = fmul nnan float %a, 0.0 +; CHECK: ret float %b + ret float %b +} +; CHECK: no_mul_zero_3 +define float @no_mul_zero_3(float %a) { + %b = fmul float %a, 0.0 +; CHECK: ret float %b + ret float %b +} + +; fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0 +; where nnan and ninf have to occur at least once somewhere in this +; expression +; CHECK: fadd_fsub_0 +define float @fadd_fsub_0(float %a) { +; X + -X ==> 0 + %t1 = fsub nnan ninf float 0.0, %a + %zero1 = fadd nnan ninf float %t1, %a + + %t2 = fsub nnan float 0.0, %a + %zero2 = fadd ninf float %t2, %a + + %t3 = fsub nnan ninf float 0.0, %a + %zero3 = fadd float %t3, %a + + %t4 = fsub float 0.0, %a + %zero4 = fadd nnan ninf float %t4, %a + +; Dont fold this +; CHECK: %nofold = fsub float 0.0 + %nofold = fsub float 0.0, %a +; CHECK: %no_zero = fadd nnan float %nofold, %a + %no_zero = fadd nnan float %nofold, %a + +; Coalesce the folded zeros + %zero5 = fadd float %zero1, %zero2 + %zero6 = fadd float %zero3, %zero4 + %zero7 = fadd float %zero5, %zero6 + +; Should get folded + %ret = fadd nsz float %no_zero, %zero7 + +; CHECK: ret float %no_zero + ret float %ret +} + +; fsub nnan ninf x, x ==> 0.0 +; CHECK: @fsub_x_x +define float @fsub_x_x(float %a) { +; X - X ==> 0 + %zero1 = fsub nnan ninf float %a, %a + +; Dont fold +; CHECK: %no_zero1 = fsub + %no_zero1 = fsub ninf float %a, %a +; CHECK: %no_zero2 = fsub + %no_zero2 = fsub nnan float %a, %a +; CHECK: %no_zero = fadd + %no_zero = fadd float %no_zero1, %no_zero2 + +; Should get folded + %ret = fadd nsz float %no_zero, %zero1 + +; CHECK: ret float %no_zero + ret float %ret +} + +; fadd nsz X, 0 ==> X +; CHECK: @nofold_fadd_x_0 +define float @nofold_fadd_x_0(float %a) { +; Dont fold +; CHECK: %no_zero1 = fadd + %no_zero1 = fadd ninf float %a, 0.0 +; CHECK: %no_zero2 = fadd + %no_zero2 = fadd nnan float %a, 0.0 +; CHECK: %no_zero = fadd + %no_zero = fadd float %no_zero1, %no_zero2 + +; CHECK: ret float %no_zero + ret float %no_zero +} diff --git a/test/Transforms/InstSimplify/floating-point-arithmetic.ll b/test/Transforms/InstSimplify/floating-point-arithmetic.ll new file mode 100644 index 000000000000..f9c364cade36 --- /dev/null +++ b/test/Transforms/InstSimplify/floating-point-arithmetic.ll @@ -0,0 +1,35 @@ +; RUN: opt < %s -instsimplify -S | FileCheck %s + +; fsub 0, (fsub 0, X) ==> X +; CHECK: @fsub_0_0_x +define float @fsub_0_0_x(float %a) { + %t1 = fsub float -0.0, %a + %ret = fsub float -0.0, %t1 + +; CHECK: ret float %a + ret float %ret +} + +; fsub X, 0 ==> X +; CHECK: @fsub_x_0 +define float @fsub_x_0(float %a) { + %ret = fsub float %a, 0.0 +; CHECK ret float %a + ret float %ret +} + +; fadd X, -0 ==> X +; CHECK: @fadd_x_n0 +define float @fadd_x_n0(float %a) { + %ret = fadd float %a, -0.0 +; CHECK ret float %a + ret float %ret +} + +; fmul X, 1.0 ==> X +; CHECK: @fmul_X_1 +define double @fmul_X_1(double %a) { + %b = fmul double 1.000000e+00, %a ; <double> [#uses=1] + ; CHECK: ret double %a + ret double %b +} diff --git a/test/Transforms/InstSimplify/past-the-end.ll b/test/Transforms/InstSimplify/past-the-end.ll new file mode 100644 index 000000000000..075da4a24be0 --- /dev/null +++ b/test/Transforms/InstSimplify/past-the-end.ll @@ -0,0 +1,77 @@ +; RUN: opt < %s -instsimplify -S | FileCheck %s +target datalayout = "p:32:32" + +; Check some past-the-end subtleties. + +@opte_a = global i32 0 +@opte_b = global i32 0 + +; Comparing base addresses of two distinct globals. Never equal. + +define zeroext i1 @no_offsets() { + %t = icmp eq i32* @opte_a, @opte_b + ret i1 %t + ; CHECK: no_offsets( + ; CHECK: ret i1 false +} + +; Comparing past-the-end addresses of two distinct globals. Never equal. + +define zeroext i1 @both_past_the_end() { + %x = getelementptr i32* @opte_a, i32 1 + %y = getelementptr i32* @opte_b, i32 1 + %t = icmp eq i32* %x, %y + ret i1 %t + ; CHECK: both_past_the_end( + ; CHECK-NOT: ret i1 true + ; TODO: refine this +} + +; Comparing past-the-end addresses of one global to the base address +; of another. Can't fold this. + +define zeroext i1 @just_one_past_the_end() { + %x = getelementptr i32* @opte_a, i32 1 + %t = icmp eq i32* %x, @opte_b + ret i1 %t + ; CHECK: just_one_past_the_end( + ; CHECK: ret i1 icmp eq (i32* getelementptr inbounds (i32* @opte_a, i32 1), i32* @opte_b) +} + +; Comparing base addresses of two distinct allocas. Never equal. + +define zeroext i1 @no_alloca_offsets() { + %m = alloca i32 + %n = alloca i32 + %t = icmp eq i32* %m, %n + ret i1 %t + ; CHECK: no_alloca_offsets( + ; CHECK: ret i1 false +} + +; Comparing past-the-end addresses of two distinct allocas. Never equal. + +define zeroext i1 @both_past_the_end_alloca() { + %m = alloca i32 + %n = alloca i32 + %x = getelementptr i32* %m, i32 1 + %y = getelementptr i32* %n, i32 1 + %t = icmp eq i32* %x, %y + ret i1 %t + ; CHECK: both_past_the_end_alloca( + ; CHECK-NOT: ret i1 true + ; TODO: refine this +} + +; Comparing past-the-end addresses of one alloca to the base address +; of another. Can't fold this. + +define zeroext i1 @just_one_past_the_end_alloca() { + %m = alloca i32 + %n = alloca i32 + %x = getelementptr i32* %m, i32 1 + %t = icmp eq i32* %x, %n + ret i1 %t + ; CHECK: just_one_past_the_end_alloca( + ; CHECK: ret i1 %t +} diff --git a/test/Transforms/InstSimplify/ptr_diff.ll b/test/Transforms/InstSimplify/ptr_diff.ll index 1eb1fd4c097e..8b4aa796013b 100644 --- a/test/Transforms/InstSimplify/ptr_diff.ll +++ b/test/Transforms/InstSimplify/ptr_diff.ll @@ -46,3 +46,33 @@ define i64 @ptrdiff3(i8* %ptr) { %diff = sub i64 %last.int, %first.int ret i64 %diff } + +define <4 x i32> @ptrdiff4(<4 x i8*> %arg) nounwind { +; Handle simple cases of vectors of pointers. +; CHECK: @ptrdiff4 +; CHECK: ret <4 x i32> zeroinitializer + %p1 = ptrtoint <4 x i8*> %arg to <4 x i32> + %bc = bitcast <4 x i8*> %arg to <4 x i32*> + %p2 = ptrtoint <4 x i32*> %bc to <4 x i32> + %sub = sub <4 x i32> %p1, %p2 + ret <4 x i32> %sub +} + +%struct.ham = type { i32, [2 x [2 x i32]] } + +@global = internal global %struct.ham zeroinitializer, align 4 + +define i32 @ptrdiff5() nounwind { +bb: + %tmp = getelementptr inbounds %struct.ham* @global, i32 0, i32 1 + %tmp1 = getelementptr inbounds [2 x [2 x i32]]* %tmp, i32 0, i32 0 + %tmp2 = bitcast [2 x i32]* %tmp1 to i32* + %tmp3 = ptrtoint i32* %tmp2 to i32 + %tmp4 = getelementptr inbounds %struct.ham* @global, i32 0, i32 1 + %tmp5 = getelementptr inbounds [2 x [2 x i32]]* %tmp4, i32 0, i32 0 + %tmp6 = ptrtoint [2 x i32]* %tmp5 to i32 + %tmp7 = sub i32 %tmp3, %tmp6 + ret i32 %tmp7 +; CHECK: @ptrdiff5 +; CHECK: ret i32 0 +} diff --git a/test/Transforms/InstSimplify/vector_gep.ll b/test/Transforms/InstSimplify/vector_gep.ll index f65260e00f54..5ac1ddef64f8 100644 --- a/test/Transforms/InstSimplify/vector_gep.ll +++ b/test/Transforms/InstSimplify/vector_gep.ll @@ -1,4 +1,4 @@ -;RUN: opt -instsimplify %s -disable-output +;RUN: opt -instsimplify -disable-output < %s declare void @helper(<2 x i8*>) define void @test(<2 x i8*> %a) { %A = getelementptr <2 x i8*> %a, <2 x i32> <i32 0, i32 0> diff --git a/test/Transforms/JumpThreading/basic.ll b/test/Transforms/JumpThreading/basic.ll index 46271379bd0d..fe3dc77c9c13 100644 --- a/test/Transforms/JumpThreading/basic.ll +++ b/test/Transforms/JumpThreading/basic.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -jump-threading -S | FileCheck %s +; RUN: opt -jump-threading -S < %s | FileCheck %s declare i32 @f1() declare i32 @f2() @@ -476,3 +476,41 @@ exit1: ; CHECK: } } +; In this test we check that block duplication is inhibited by the presence +; of a function with the 'noduplicate' attribute. + +declare void @g() +declare void @j() +declare void @k() + +; CHECK: define void @h(i32 %p) { +define void @h(i32 %p) { + %x = icmp ult i32 %p, 5 + br i1 %x, label %l1, label %l2 + +l1: + call void @j() + br label %l3 + +l2: + call void @k() + br label %l3 + +l3: +; CHECK: call void @g() [[NOD:#[0-9]+]] +; CHECK-NOT: call void @g() [[NOD]] + call void @g() noduplicate + %y = icmp ult i32 %p, 5 + br i1 %y, label %l4, label %l5 + +l4: + call void @j() + ret void + +l5: + call void @k() + ret void +; CHECK: } +} + +; CHECK: attributes [[NOD]] = { noduplicate } diff --git a/test/Transforms/JumpThreading/degenerate-phi.ll b/test/Transforms/JumpThreading/degenerate-phi.ll index 35d9fdec4281..2905b43af72c 100644 --- a/test/Transforms/JumpThreading/degenerate-phi.ll +++ b/test/Transforms/JumpThreading/degenerate-phi.ll @@ -1,4 +1,4 @@ -; RUN: opt -jump-threading -disable-output %s +; RUN: opt -jump-threading -disable-output < %s ; PR9112 ; This is actually a test for value tracking. Jump threading produces diff --git a/test/Transforms/JumpThreading/or-undef.ll b/test/Transforms/JumpThreading/or-undef.ll index 6e359925b6c6..6311b6df4373 100644 --- a/test/Transforms/JumpThreading/or-undef.ll +++ b/test/Transforms/JumpThreading/or-undef.ll @@ -1,4 +1,4 @@ -; RUN: opt -jump-threading -S %s | FileCheck %s +; RUN: opt -jump-threading -S < %s | FileCheck %s ; rdar://7620633 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/test/Transforms/LICM/2003-12-11-SinkingToPHI.ll b/test/Transforms/LICM/2003-12-11-SinkingToPHI.ll index fe8d44531322..2bf26041626c 100644 --- a/test/Transforms/LICM/2003-12-11-SinkingToPHI.ll +++ b/test/Transforms/LICM/2003-12-11-SinkingToPHI.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -licm | lli %defaultjit +; RUN: opt < %s -licm | lli -force-interpreter define i32 @main() { entry: diff --git a/test/Transforms/LICM/2011-07-06-Alignment.ll b/test/Transforms/LICM/2011-07-06-Alignment.ll index f97b7010bc02..569231489fec 100644 --- a/test/Transforms/LICM/2011-07-06-Alignment.ll +++ b/test/Transforms/LICM/2011-07-06-Alignment.ll @@ -1,4 +1,4 @@ -; RUN: opt -licm -S %s | FileCheck %s +; RUN: opt -licm -S < %s | FileCheck %s @A = common global [1024 x float] zeroinitializer, align 4 diff --git a/test/Transforms/LICM/crash.ll b/test/Transforms/LICM/crash.ll index de41d008a746..b43477a56df5 100644 --- a/test/Transforms/LICM/crash.ll +++ b/test/Transforms/LICM/crash.ll @@ -1,4 +1,4 @@ -; RUN: opt -licm %s -disable-output +; RUN: opt -licm -disable-output < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" diff --git a/test/Transforms/LICM/hoist-invariant-load.ll b/test/Transforms/LICM/hoist-invariant-load.ll index f9fc551df358..1ba94d6b489c 100644 --- a/test/Transforms/LICM/hoist-invariant-load.ll +++ b/test/Transforms/LICM/hoist-invariant-load.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -licm -stats -S 2>&1 | grep "1 licm" @"\01L_OBJC_METH_VAR_NAME_" = internal global [4 x i8] c"foo\00", section "__TEXT,__objc_methname,cstring_literals", align 1 diff --git a/test/Transforms/LICM/hoisting.ll b/test/Transforms/LICM/hoisting.ll index 98f93345e3c3..1ca377eb4a99 100644 --- a/test/Transforms/LICM/hoisting.ll +++ b/test/Transforms/LICM/hoisting.ll @@ -90,3 +90,29 @@ for.end: ; preds = %for.body declare void @foo_may_call_exit(i32) +; PR14854 +; CHECK: @test5 +; CHECK: extractvalue +; CHECK: br label %tailrecurse +; CHECK: tailrecurse: +; CHECK: ifend: +; CHECK: insertvalue +define { i32*, i32 } @test5(i32 %i, { i32*, i32 } %e) { +entry: + br label %tailrecurse + +tailrecurse: ; preds = %then, %entry + %i.tr = phi i32 [ %i, %entry ], [ %cmp2, %then ] + %out = extractvalue { i32*, i32 } %e, 1 + %d = insertvalue { i32*, i32 } %e, i32* null, 0 + %cmp1 = icmp sgt i32 %out, %i.tr + br i1 %cmp1, label %then, label %ifend + +then: ; preds = %tailrecurse + call void @foo() + %cmp2 = add i32 %i.tr, 1 + br label %tailrecurse + +ifend: ; preds = %tailrecurse + ret { i32*, i32 } %d +} diff --git a/test/Transforms/LICM/scalar_promote.ll b/test/Transforms/LICM/scalar_promote.ll index 05a64d632274..e7eab92aa8d7 100644 --- a/test/Transforms/LICM/scalar_promote.ll +++ b/test/Transforms/LICM/scalar_promote.ll @@ -1,28 +1,28 @@ -; RUN: opt < %s -basicaa -licm -S | FileCheck %s +; RUN: opt < %s -basicaa -tbaa -licm -S | FileCheck %s target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" -@X = global i32 7 ; <i32*> [#uses=4] +@X = global i32 7 ; <i32*> [#uses=4] define void @test1(i32 %i) { Entry: - br label %Loop + br label %Loop ; CHECK: @test1 ; CHECK: Entry: ; CHECK-NEXT: load i32* @X ; CHECK-NEXT: br label %Loop -Loop: ; preds = %Loop, %0 - %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ] ; <i32> [#uses=1] - %x = load i32* @X ; <i32> [#uses=1] - %x2 = add i32 %x, 1 ; <i32> [#uses=1] - store i32 %x2, i32* @X - %Next = add i32 %j, 1 ; <i32> [#uses=2] - %cond = icmp eq i32 %Next, 0 ; <i1> [#uses=1] - br i1 %cond, label %Out, label %Loop +Loop: ; preds = %Loop, %0 + %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ] ; <i32> [#uses=1] + %x = load i32* @X ; <i32> [#uses=1] + %x2 = add i32 %x, 1 ; <i32> [#uses=1] + store i32 %x2, i32* @X + %Next = add i32 %j, 1 ; <i32> [#uses=2] + %cond = icmp eq i32 %Next, 0 ; <i1> [#uses=1] + br i1 %cond, label %Out, label %Loop -Out: - ret void +Out: + ret void ; CHECK: Out: ; CHECK-NEXT: store i32 %x2, i32* @X ; CHECK-NEXT: ret void @@ -31,22 +31,22 @@ Out: define void @test2(i32 %i) { Entry: - br label %Loop + br label %Loop ; CHECK: @test2 ; CHECK: Entry: ; CHECK-NEXT: %.promoted = load i32* getelementptr inbounds (i32* @X, i64 1) ; CHECK-NEXT: br label %Loop -Loop: ; preds = %Loop, %0 - %X1 = getelementptr i32* @X, i64 1 ; <i32*> [#uses=1] - %A = load i32* %X1 ; <i32> [#uses=1] - %V = add i32 %A, 1 ; <i32> [#uses=1] - %X2 = getelementptr i32* @X, i64 1 ; <i32*> [#uses=1] - store i32 %V, i32* %X2 - br i1 false, label %Loop, label %Exit +Loop: ; preds = %Loop, %0 + %X1 = getelementptr i32* @X, i64 1 ; <i32*> [#uses=1] + %A = load i32* %X1 ; <i32> [#uses=1] + %V = add i32 %A, 1 ; <i32> [#uses=1] + %X2 = getelementptr i32* @X, i64 1 ; <i32*> [#uses=1] + store i32 %V, i32* %X2 + br i1 false, label %Loop, label %Exit -Exit: ; preds = %Loop - ret void +Exit: ; preds = %Loop + ret void ; CHECK: Exit: ; CHECK-NEXT: store i32 %V, i32* getelementptr inbounds (i32* @X, i64 1) ; CHECK-NEXT: ret void @@ -56,19 +56,19 @@ Exit: ; preds = %Loop define void @test3(i32 %i) { ; CHECK: @test3 - br label %Loop + br label %Loop Loop: ; Should not promote this to a register - %x = load volatile i32* @X - %x2 = add i32 %x, 1 - store i32 %x2, i32* @X - br i1 true, label %Out, label %Loop - + %x = load volatile i32* @X + %x2 = add i32 %x, 1 + store i32 %x2, i32* @X + br i1 true, label %Out, label %Loop + ; CHECK: Loop: ; CHECK-NEXT: load volatile -Out: ; preds = %Loop - ret void +Out: ; preds = %Loop + ret void } ; PR8041 @@ -120,27 +120,27 @@ exit: define void @test5(i32 %i, i32** noalias %P2) { Entry: - br label %Loop + br label %Loop ; CHECK: @test5 ; CHECK: Entry: ; CHECK-NEXT: load i32* @X ; CHECK-NEXT: br label %Loop -Loop: ; preds = %Loop, %0 - %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ] ; <i32> [#uses=1] - %x = load i32* @X ; <i32> [#uses=1] - %x2 = add i32 %x, 1 ; <i32> [#uses=1] - store i32 %x2, i32* @X - +Loop: ; preds = %Loop, %0 + %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ] ; <i32> [#uses=1] + %x = load i32* @X ; <i32> [#uses=1] + %x2 = add i32 %x, 1 ; <i32> [#uses=1] + store i32 %x2, i32* @X + store volatile i32* @X, i32** %P2 - - %Next = add i32 %j, 1 ; <i32> [#uses=2] - %cond = icmp eq i32 %Next, 0 ; <i1> [#uses=1] - br i1 %cond, label %Out, label %Loop -Out: - ret void + %Next = add i32 %j, 1 ; <i32> [#uses=2] + %cond = icmp eq i32 %Next, 0 ; <i1> [#uses=1] + br i1 %cond, label %Out, label %Loop + +Out: + ret void ; CHECK: Out: ; CHECK-NEXT: store i32 %x2, i32* @X ; CHECK-NEXT: ret void @@ -148,3 +148,40 @@ Out: } +; PR14753 - Preserve TBAA tags when promoting values in a loop. +define void @test6(i32 %n, float* nocapture %a, i32* %gi) { +entry: + store i32 0, i32* %gi, align 4, !tbaa !0 + %cmp1 = icmp slt i32 0, %n + br i1 %cmp1, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %storemerge2 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ] + %idxprom = sext i32 %storemerge2 to i64 + %arrayidx = getelementptr inbounds float* %a, i64 %idxprom + store float 0.000000e+00, float* %arrayidx, align 4, !tbaa !3 + %0 = load i32* %gi, align 4, !tbaa !0 + %inc = add nsw i32 %0, 1 + store i32 %inc, i32* %gi, align 4, !tbaa !0 + %cmp = icmp slt i32 %inc, %n + br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge + +for.cond.for.end_crit_edge: ; preds = %for.body + br label %for.end + +for.end: ; preds = %for.cond.for.end_crit_edge, %entry + ret void + +; CHECK: for.body.lr.ph: +; CHECK-NEXT: %gi.promoted = load i32* %gi, align 4, !tbaa !0 +; CHECK: for.cond.for.end_crit_edge: +; CHECK-NEXT: store i32 %inc, i32* %gi, align 4, !tbaa !0 +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"float", metadata !1} diff --git a/test/Transforms/LoopDeletion/2011-06-21-phioperands.ll b/test/Transforms/LoopDeletion/2011-06-21-phioperands.ll index 40c6629e6f4f..cf9d8ce923ba 100644 --- a/test/Transforms/LoopDeletion/2011-06-21-phioperands.ll +++ b/test/Transforms/LoopDeletion/2011-06-21-phioperands.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -loop-deletion -disable-output +; RUN: opt -loop-deletion -disable-output < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/test/Transforms/LoopDeletion/simplify-then-delete.ll b/test/Transforms/LoopDeletion/simplify-then-delete.ll index 5a21672a5960..4278ef16d214 100644 --- a/test/Transforms/LoopDeletion/simplify-then-delete.ll +++ b/test/Transforms/LoopDeletion/simplify-then-delete.ll @@ -4,7 +4,7 @@ ; Indvars and loop deletion should be able to eliminate all looping ; in this testcase. -; CHECK: define i32 @pmat(i32 %m, i32 %n, double* %y) nounwind { +; CHECK: define i32 @pmat(i32 %m, i32 %n, double* %y) #0 { ; CHECK-NEXT: entry: ; CHECK-NEXT: ret i32 0 ; CHECK-NEXT: } @@ -63,3 +63,5 @@ w.e: w.e12: ret i32 0 } + +; CHECK: attributes #0 = { nounwind } diff --git a/test/Transforms/LoopIdiom/X86/lit.local.cfg b/test/Transforms/LoopIdiom/X86/lit.local.cfg new file mode 100644 index 000000000000..a8ad0f1a28b2 --- /dev/null +++ b/test/Transforms/LoopIdiom/X86/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.ll', '.c', '.cpp'] + +targets = set(config.root.targets_to_build.split()) +if not 'X86' in targets: + config.unsupported = True + diff --git a/test/Transforms/LoopIdiom/X86/popcnt.ll b/test/Transforms/LoopIdiom/X86/popcnt.ll new file mode 100644 index 000000000000..25df93d3a082 --- /dev/null +++ b/test/Transforms/LoopIdiom/X86/popcnt.ll @@ -0,0 +1,140 @@ +; RUN: opt -loop-idiom < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 -S | FileCheck %s + +;To recognize this pattern: +;int popcount(unsigned long long a) { +; int c = 0; +; while (a) { +; c++; +; a &= a - 1; +; } +; return c; +;} +; +; CHECK: entry +; CHECK: llvm.ctpop.i64 +; CHECK: ret +define i32 @popcount(i64 %a) nounwind uwtable readnone ssp { +entry: + %tobool3 = icmp eq i64 %a, 0 + br i1 %tobool3, label %while.end, label %while.body + +while.body: ; preds = %entry, %while.body + %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ] + %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ] + %inc = add nsw i32 %c.05, 1 + %sub = add i64 %a.addr.04, -1 + %and = and i64 %sub, %a.addr.04 + %tobool = icmp eq i64 %and, 0 + br i1 %tobool, label %while.end, label %while.body + +while.end: ; preds = %while.body, %entry + %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ] + ret i32 %c.0.lcssa +} + +; To recognize this pattern: +;int popcount(unsigned long long a, int mydata1, int mydata2) { +; int c = 0; +; while (a) { +; c++; +; a &= a - 1; +; mydata1 *= c; +; mydata2 *= (int)a; +; } +; return c + mydata1 + mydata2; +;} +; CHECK: entry +; CHECK: llvm.ctpop.i64 +; CHECK: ret +define i32 @popcount2(i64 %a, i32 %mydata1, i32 %mydata2) nounwind uwtable readnone ssp { +entry: + %tobool9 = icmp eq i64 %a, 0 + br i1 %tobool9, label %while.end, label %while.body + +while.body: ; preds = %entry, %while.body + %c.013 = phi i32 [ %inc, %while.body ], [ 0, %entry ] + %mydata2.addr.012 = phi i32 [ %mul1, %while.body ], [ %mydata2, %entry ] + %mydata1.addr.011 = phi i32 [ %mul, %while.body ], [ %mydata1, %entry ] + %a.addr.010 = phi i64 [ %and, %while.body ], [ %a, %entry ] + %inc = add nsw i32 %c.013, 1 + %sub = add i64 %a.addr.010, -1 + %and = and i64 %sub, %a.addr.010 + %mul = mul nsw i32 %inc, %mydata1.addr.011 + %conv = trunc i64 %and to i32 + %mul1 = mul nsw i32 %conv, %mydata2.addr.012 + %tobool = icmp eq i64 %and, 0 + br i1 %tobool, label %while.end, label %while.body + +while.end: ; preds = %while.body, %entry + %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ] + %mydata2.addr.0.lcssa = phi i32 [ %mydata2, %entry ], [ %mul1, %while.body ] + %mydata1.addr.0.lcssa = phi i32 [ %mydata1, %entry ], [ %mul, %while.body ] + %add = add i32 %mydata2.addr.0.lcssa, %mydata1.addr.0.lcssa + %add2 = add i32 %add, %c.0.lcssa + ret i32 %add2 +} + +; Some variants once cause crash +target triple = "x86_64-apple-macosx10.8.0" + +define i32 @PopCntCrash1(i64 %a) nounwind uwtable readnone ssp { +entry: + %tobool3 = icmp eq i64 %a, 0 + br i1 %tobool3, label %while.end, label %while.body + +while.body: ; preds = %entry, %while.body + %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ] + %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ] + %t = add i32 %c.05, %c.05 + %inc = add nsw i32 %t, 1 + %sub = add i64 %a.addr.04, -1 + %and = and i64 %sub, %a.addr.04 + %tobool = icmp eq i64 %and, 0 + br i1 %tobool, label %while.end, label %while.body + +while.end: ; preds = %while.body, %entry + %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ] + ret i32 %c.0.lcssa + +; CHECK: entry +; CHECK: ret +} + +define i32 @PopCntCrash2(i64 %a, i32 %b) nounwind uwtable readnone ssp { +entry: + %tobool3 = icmp eq i64 %a, 0 + br i1 %tobool3, label %while.end, label %while.body + +while.body: ; preds = %entry, %while.body + %c.05 = phi i32 [ %inc, %while.body ], [ %b, %entry ] + %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ] + %inc = add nsw i32 %c.05, 1 + %sub = add i64 %a.addr.04, -1 + %and = and i64 %sub, %a.addr.04 + %tobool = icmp eq i64 %and, 0 + br i1 %tobool, label %while.end, label %while.body + +while.end: ; preds = %while.body, %entry + %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ] + ret i32 %c.0.lcssa +} + +define i32 @PopCntCrash3(i64 %a, i32 %x) { +entry: + %tobool3 = icmp eq i64 %a, 0 + %cmp = icmp eq i32 %x, 0 + br i1 %tobool3, label %while.end, label %while.body + +while.body: ; preds = %entry, %while.body + %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ] + %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ] + %inc = add nsw i32 %c.05, 1 + %sub = add i64 %a.addr.04, -1 + %and = and i64 %sub, %a.addr.04 + %tobool = icmp eq i64 %and, 0 + br i1 %cmp, label %while.end, label %while.body + +while.end: ; preds = %while.body, %entry + %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ] + ret i32 %c.0.lcssa +} diff --git a/test/Transforms/LoopRotate/basic.ll b/test/Transforms/LoopRotate/basic.ll index b7bcb21d56f8..78878f9fa663 100644 --- a/test/Transforms/LoopRotate/basic.ll +++ b/test/Transforms/LoopRotate/basic.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -loop-rotate %s | FileCheck %s +; RUN: opt -S -loop-rotate < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" @@ -33,3 +33,29 @@ for.end: ; preds = %for.cond declare void @g(i32*) +; CHECK: @test2 +define void @test2() nounwind ssp { +entry: + %array = alloca [20 x i32], align 16 + br label %for.cond + +for.cond: ; preds = %for.body, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %cmp = icmp slt i32 %i.0, 100 +; CHECK: call void @f +; CHECK-NOT: call void @f + call void @f() noduplicate + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %inc = add nsw i32 %i.0, 1 + call void @h() + br label %for.cond + +for.end: ; preds = %for.cond + ret void +; CHECK: } +} + +declare void @f() noduplicate +declare void @h() diff --git a/test/Transforms/LoopRotate/crash.ll b/test/Transforms/LoopRotate/crash.ll index 954b83476551..fd922cb5569e 100644 --- a/test/Transforms/LoopRotate/crash.ll +++ b/test/Transforms/LoopRotate/crash.ll @@ -1,4 +1,4 @@ -; RUN: opt -loop-rotate %s -disable-output -verify-dom-info -verify-loop-info +; RUN: opt -loop-rotate -disable-output -verify-dom-info -verify-loop-info < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" diff --git a/test/Transforms/LoopRotate/dbgvalue.ll b/test/Transforms/LoopRotate/dbgvalue.ll index b32ee82d3a57..6a8d30820f6e 100644 --- a/test/Transforms/LoopRotate/dbgvalue.ll +++ b/test/Transforms/LoopRotate/dbgvalue.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -loop-rotate %s | FileCheck %s +; RUN: opt -S -loop-rotate < %s | FileCheck %s declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone diff --git a/test/Transforms/LoopRotate/phi-duplicate.ll b/test/Transforms/LoopRotate/phi-duplicate.ll index 737283092250..8ad2dce71a65 100644 --- a/test/Transforms/LoopRotate/phi-duplicate.ll +++ b/test/Transforms/LoopRotate/phi-duplicate.ll @@ -1,4 +1,4 @@ -; RUN: opt -S %s -loop-rotate | FileCheck %s +; RUN: opt -S -loop-rotate < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0" diff --git a/test/Transforms/LoopStrengthReduce/2012-07-18-LimitReassociate.ll b/test/Transforms/LoopStrengthReduce/2012-07-18-LimitReassociate.ll index 3793baccbbc1..9524be3ceee0 100644 --- a/test/Transforms/LoopStrengthReduce/2012-07-18-LimitReassociate.ll +++ b/test/Transforms/LoopStrengthReduce/2012-07-18-LimitReassociate.ll @@ -1,4 +1,4 @@ -; RUN: opt -loop-reduce -disable-output -debug-only=loop-reduce %s 2> %t +; RUN: opt -loop-reduce -disable-output -debug-only=loop-reduce < %s 2> %t ; RUN: FileCheck %s < %t ; REQUIRES: asserts ; @@ -10,15 +10,13 @@ ; CHECK: After generating reuse formulae: ; CHECK: LSR is examining the following uses: ; CHECK: LSR Use: Kind=Special -; CHECK: {{.*reg\(\{\{\{\{\{\{\{\{\{}} -; CHECK: {{.*reg\(\{\{\{\{\{\{\{\{\{}} -; CHECK: {{.*reg\(\{\{\{\{\{\{\{\{\{}} -; CHECK: {{.*reg\(\{\{\{\{\{\{\{\{\{}} -; CHECK: {{.*reg\(\{\{\{\{\{\{\{\{\{}} +; CHECK: {{.*reg\(\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{}} +; CHECK: {{.*reg\(\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{}} +; CHECK: {{.*reg\(\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{}} +; CHECK: {{.*reg\(\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{}} +; CHECK: {{.*reg\(\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{.*\{}} ; CHECK-NOT:reg ; CHECK: Filtering for use -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-freebsd9" %struct.snork = type { %struct.fuga, i32, i32, i32, i32, i32, i32 } %struct.fuga = type { %struct.gork, i64 } diff --git a/test/Transforms/LoopStrengthReduce/2013-01-05-IndBr.ll b/test/Transforms/LoopStrengthReduce/2013-01-05-IndBr.ll new file mode 100644 index 000000000000..bce234cd4066 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/2013-01-05-IndBr.ll @@ -0,0 +1,44 @@ +; RUN: opt -loop-reduce -S < %s | FileCheck %s +; +; Indirect branch in the preheader crashes replaceCongruentIVs. +; rdar://12910141 + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32-S128" + +; CHECK: @test +; CHECK: bb8: +; CHECK-NEXT: phi i8 +; CHECK-NEXT: phi i8 +; CHECK: ret void +define void @test() nounwind ssp { +bb: + br label %bb190 + +bb8: ; preds = %bb190, %bb11 + %tmp = phi i8 [ %tmp14, %bb11 ], [ 25, %bb190 ] + %tmp9 = phi i8 [ %tmp12, %bb11 ], [ 25, %bb190 ] + %tmp10 = add i8 %tmp, -5 + indirectbr i8* undef, [label %bb11, label %bb15] + +bb11: ; preds = %bb8 + %tmp12 = add i8 %tmp9, 1 + %tmp13 = add i8 %tmp9, -19 + %tmp14 = add i8 %tmp, 1 + indirectbr i8* undef, [label %bb8] + +bb15: ; preds = %bb8 + indirectbr i8* undef, [label %bb16] + +bb16: ; preds = %bb16, %bb15 + indirectbr i8* undef, [label %bb37, label %bb190] + + +bb37: ; preds = %bb190 + indirectbr i8* undef, [label %bb38] + +bb38: ; preds = %bb37, %bb5 + ret void + +bb190: ; preds = %bb189, %bb187 + indirectbr i8* undef, [label %bb37, label %bb8] +} diff --git a/test/Transforms/LoopStrengthReduce/2013-01-14-ReuseCast.ll b/test/Transforms/LoopStrengthReduce/2013-01-14-ReuseCast.ll new file mode 100644 index 000000000000..8fbddf8ae4c8 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/2013-01-14-ReuseCast.ll @@ -0,0 +1,84 @@ +; RUN: opt -loop-reduce -S < %s | FileCheck %s +; +; LTO of clang, which mistakenly uses no TargetLoweringInfo, causes a +; miscompile. ReuseOrCreateCast replace ptrtoint operand with undef. +; Reproducing the miscompile requires no triple, hence no "TTI". +; rdar://13007381 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" + +; Verify that nothing uses the "dead" ptrtoint from "undef". +; CHECK: @VerifyDiagnosticConsumerTest +; CHECK: bb: +; CHECK: %0 = ptrtoint i8* undef to i64 +; CHECK-NOT: %0 +; CHECK: .lr.ph +; CHECK-NOT: %0 +; CHECK: sub i64 %7, %tmp6 +; CHECK-NOT: %0 +; CHECK: ret void +define void @VerifyDiagnosticConsumerTest() unnamed_addr nounwind uwtable align 2 { +bb: + %tmp3 = call i8* @getCharData() nounwind + %tmp4 = call i8* @getCharData() nounwind + %tmp5 = ptrtoint i8* %tmp4 to i64 + %tmp6 = ptrtoint i8* %tmp3 to i64 + %tmp7 = sub i64 %tmp5, %tmp6 + br i1 undef, label %bb87, label %.preheader + +.preheader: ; preds = %bb10, %bb + br i1 undef, label %_ZNK4llvm9StringRef4findEcm.exit42.thread, label %bb10 + +bb10: ; preds = %.preheader + br i1 undef, label %_ZNK4llvm9StringRef4findEcm.exit42, label %.preheader + +_ZNK4llvm9StringRef4findEcm.exit42: ; preds = %bb10 + br i1 undef, label %_ZNK4llvm9StringRef4findEcm.exit42.thread, label %.lr.ph + +_ZNK4llvm9StringRef4findEcm.exit42.thread: ; preds = %_ZNK4llvm9StringRef4findEcm.exit42, %.preheader + unreachable + +.lr.ph: ; preds = %_ZNK4llvm9StringRef4findEcm.exit42 + br label %bb36 + +_ZNK4llvm9StringRef4findEcm.exit.loopexit: ; preds = %bb63 + %tmp21 = icmp eq i64 %i.0.i, -1 + br i1 %tmp21, label %_ZNK4llvm9StringRef4findEcm.exit._crit_edge, label %bb36 + +_ZNK4llvm9StringRef4findEcm.exit._crit_edge: ; preds = %bb61, %_ZNK4llvm9StringRef4findEcm.exit.loopexit + unreachable + +bb36: ; preds = %_ZNK4llvm9StringRef4findEcm.exit.loopexit, %.lr.ph + %loc.063 = phi i64 [ undef, %.lr.ph ], [ %i.0.i, %_ZNK4llvm9StringRef4findEcm.exit.loopexit ] + switch i8 undef, label %bb57 [ + i8 10, label %bb48 + i8 13, label %bb48 + ] + +bb48: ; preds = %bb36, %bb36 + br label %bb58 + +bb57: ; preds = %bb36 + br label %bb58 + +bb58: ; preds = %bb57, %bb48 + %tmp59 = icmp ugt i64 %tmp7, undef + %tmp60 = select i1 %tmp59, i64 undef, i64 %tmp7 + br label %bb61 + +bb61: ; preds = %bb63, %bb58 + %i.0.i = phi i64 [ %tmp60, %bb58 ], [ %tmp67, %bb63 ] + %tmp62 = icmp eq i64 %i.0.i, %tmp7 + br i1 %tmp62, label %_ZNK4llvm9StringRef4findEcm.exit._crit_edge, label %bb63 + +bb63: ; preds = %bb61 + %tmp64 = getelementptr inbounds i8* %tmp3, i64 %i.0.i + %tmp65 = load i8* %tmp64, align 1 + %tmp67 = add i64 %i.0.i, 1 + br i1 undef, label %_ZNK4llvm9StringRef4findEcm.exit.loopexit, label %bb61 + +bb87: ; preds = %bb + ret void +} + +declare i8* @getCharData() diff --git a/test/Transforms/LoopStrengthReduce/ARM/ivchain-ARM.ll b/test/Transforms/LoopStrengthReduce/ARM/ivchain-ARM.ll index 9189d79e2fb6..ee3cc4dd78fc 100644 --- a/test/Transforms/LoopStrengthReduce/ARM/ivchain-ARM.ll +++ b/test/Transforms/LoopStrengthReduce/ARM/ivchain-ARM.ll @@ -205,18 +205,18 @@ for.end: ; preds = %for.body ; post-increment addressing, no add's or add.w's beyond the three ; mentioned. Most importantly, there should be no spills or reloads! ; -; CHECK: testNeon: -; CHECK: %.lr.ph -; CHECK-NOT: lsl.w -; CHECK-NOT: {{ldr|str|adds|add r}} -; CHECK: add.w r -; CHECK-NOT: {{ldr|str|adds|add r}} -; CHECK: add.w r -; CHECK-NOT: {{ldr|str|adds|add r}} -; CHECK: add.w r -; CHECK-NOT: {{ldr|str|adds|add r}} -; CHECK-NOT: add.w r -; CHECK: bne +; A9: testNeon: +; A9: %.lr.ph +; A9-NOT: lsl.w +; A9-NOT: {{ldr|str|adds|add r}} +; A9: add.w r +; A9-NOT: {{ldr|str|adds|add r}} +; A9: add.w r +; A9-NOT: {{ldr|str|adds|add r}} +; A9: add.w r +; A9-NOT: {{ldr|str|adds|add r}} +; A9-NOT: add.w r +; A9: bne define hidden void @testNeon(i8* %ref_data, i32 %ref_stride, i32 %limit, <16 x i8>* nocapture %data) nounwind optsize { %1 = icmp sgt i32 %limit, 0 br i1 %1, label %.lr.ph, label %45 @@ -290,3 +290,80 @@ define hidden void @testNeon(i8* %ref_data, i32 %ref_stride, i32 %limit, <16 x i } declare <1 x i64> @llvm.arm.neon.vld1.v1i64(i8*, i32) nounwind readonly + +; Handle chains in which the same offset is used for both loads and +; stores to the same array. +; rdar://11410078. +; +; A9: @testReuse +; A9: %for.body +; A9: vld1.8 {d{{[0-9]+}}}, [[BASE:[r[0-9]+]]], [[INC:r[0-9]]] +; A9: vld1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vld1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vld1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vld1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vld1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vld1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vld1.8 {d{{[0-9]+}}}, [[BASE]], {{r[0-9]}} +; A9: vst1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vst1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vst1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vst1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vst1.8 {d{{[0-9]+}}}, [[BASE]], [[INC]] +; A9: vst1.8 {d{{[0-9]+}}}, [[BASE]] +; A9: bne +define void @testReuse(i8* %src, i32 %stride) nounwind ssp { +entry: + %mul = shl nsw i32 %stride, 2 + %idx.neg = sub i32 0, %mul + %mul1 = mul nsw i32 %stride, 3 + %idx.neg2 = sub i32 0, %mul1 + %mul5 = shl nsw i32 %stride, 1 + %idx.neg6 = sub i32 0, %mul5 + %idx.neg10 = sub i32 0, %stride + br label %for.body + +for.body: ; preds = %for.body, %entry + %i.0110 = phi i32 [ 0, %entry ], [ %inc, %for.body ] + %src.addr = phi i8* [ %src, %entry ], [ %add.ptr45, %for.body ] + %add.ptr = getelementptr inbounds i8* %src.addr, i32 %idx.neg + %vld1 = tail call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %add.ptr, i32 1) + %add.ptr3 = getelementptr inbounds i8* %src.addr, i32 %idx.neg2 + %vld2 = tail call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %add.ptr3, i32 1) + %add.ptr7 = getelementptr inbounds i8* %src.addr, i32 %idx.neg6 + %vld3 = tail call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %add.ptr7, i32 1) + %add.ptr11 = getelementptr inbounds i8* %src.addr, i32 %idx.neg10 + %vld4 = tail call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %add.ptr11, i32 1) + %vld5 = tail call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %src.addr, i32 1) + %add.ptr17 = getelementptr inbounds i8* %src.addr, i32 %stride + %vld6 = tail call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %add.ptr17, i32 1) + %add.ptr20 = getelementptr inbounds i8* %src.addr, i32 %mul5 + %vld7 = tail call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %add.ptr20, i32 1) + %add.ptr23 = getelementptr inbounds i8* %src.addr, i32 %mul1 + %vld8 = tail call <8 x i8> @llvm.arm.neon.vld1.v8i8(i8* %add.ptr23, i32 1) + %vadd1 = tail call <8 x i8> @llvm.arm.neon.vhaddu.v8i8(<8 x i8> %vld1, <8 x i8> %vld2) nounwind + %vadd2 = tail call <8 x i8> @llvm.arm.neon.vhaddu.v8i8(<8 x i8> %vld2, <8 x i8> %vld3) nounwind + %vadd3 = tail call <8 x i8> @llvm.arm.neon.vhaddu.v8i8(<8 x i8> %vld3, <8 x i8> %vld4) nounwind + %vadd4 = tail call <8 x i8> @llvm.arm.neon.vhaddu.v8i8(<8 x i8> %vld4, <8 x i8> %vld5) nounwind + %vadd5 = tail call <8 x i8> @llvm.arm.neon.vhaddu.v8i8(<8 x i8> %vld5, <8 x i8> %vld6) nounwind + %vadd6 = tail call <8 x i8> @llvm.arm.neon.vhaddu.v8i8(<8 x i8> %vld6, <8 x i8> %vld7) nounwind + tail call void @llvm.arm.neon.vst1.v8i8(i8* %add.ptr3, <8 x i8> %vadd1, i32 1) + tail call void @llvm.arm.neon.vst1.v8i8(i8* %add.ptr7, <8 x i8> %vadd2, i32 1) + tail call void @llvm.arm.neon.vst1.v8i8(i8* %add.ptr11, <8 x i8> %vadd3, i32 1) + tail call void @llvm.arm.neon.vst1.v8i8(i8* %src.addr, <8 x i8> %vadd4, i32 1) + tail call void @llvm.arm.neon.vst1.v8i8(i8* %add.ptr17, <8 x i8> %vadd5, i32 1) + tail call void @llvm.arm.neon.vst1.v8i8(i8* %add.ptr20, <8 x i8> %vadd6, i32 1) + %inc = add nsw i32 %i.0110, 1 + %add.ptr45 = getelementptr inbounds i8* %src.addr, i32 8 + %exitcond = icmp eq i32 %inc, 4 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +declare <8 x i8> @llvm.arm.neon.vld1.v8i8(i8*, i32) nounwind readonly + +declare void @llvm.arm.neon.vst1.v8i8(i8*, <8 x i8>, i32) nounwind + +declare <8 x i8> @llvm.arm.neon.vhaddu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone diff --git a/test/Transforms/LoopStrengthReduce/2008-08-14-ShadowIV.ll b/test/Transforms/LoopStrengthReduce/X86/2008-08-14-ShadowIV.ll index c650d8cf76d8..9a7f4865c591 100644 --- a/test/Transforms/LoopStrengthReduce/2008-08-14-ShadowIV.ll +++ b/test/Transforms/LoopStrengthReduce/X86/2008-08-14-ShadowIV.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-reduce -S | grep "phi double" | count 1 +; RUN: opt < %s -loop-reduce -S -mtriple=x86_64-unknown-unknown | grep "phi double" | count 1 define void @foobar(i32 %n) nounwind { entry: diff --git a/test/Transforms/LoopStrengthReduce/2011-07-20-DoubleIV.ll b/test/Transforms/LoopStrengthReduce/X86/2011-07-20-DoubleIV.ll index 5d9ed64ef422..a932b4792586 100644 --- a/test/Transforms/LoopStrengthReduce/2011-07-20-DoubleIV.ll +++ b/test/Transforms/LoopStrengthReduce/X86/2011-07-20-DoubleIV.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-reduce -S | FileCheck %s +; RUN: opt < %s -loop-reduce -S -mtriple=x86_64-unknown-unknown | FileCheck %s ; ; Test LSR's OptimizeShadowIV. Handle a floating-point IV with a ; nonzero initial value. diff --git a/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll b/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll index 510865096272..eedfc200f48b 100644 --- a/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll +++ b/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s | FileCheck %s +; RUN: opt < %s -loop-reduce -S | FileCheck %s ; ; Test LSR's ability to prune formulae that refer to nonexistant ; AddRecs in other loops. @@ -15,13 +15,10 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-darwin" ; CHECK: @test -; CHECK: # %for.body{{$}} -; dummyiv copy should be removed -; CHECK-NOT: movq -; CHECK: # %for.cond19.preheader -; dummycnt should be removed -; CHECK-NOT: incq -; CHECK: # %for.body23{{$}} +; CHECK: for.body: +; CHECK: %lsr.iv +; CHECK-NOT: %dummyout +; CHECK: ret define i64 @test(i64 %count, float* nocapture %srcrow, i32* nocapture %destrow) nounwind uwtable ssp { entry: %cmp34 = icmp eq i64 %count, 0 diff --git a/test/Transforms/LoopStrengthReduce/dominate-assert.ll b/test/Transforms/LoopStrengthReduce/dominate-assert.ll index b87bf620decf..ff8cab83137b 100644 --- a/test/Transforms/LoopStrengthReduce/dominate-assert.ll +++ b/test/Transforms/LoopStrengthReduce/dominate-assert.ll @@ -1,4 +1,4 @@ -; RUN: opt -loop-reduce %s +; RUN: opt -loop-reduce < %s ; we used to crash on this one declare i8* @_Znwm() diff --git a/test/Transforms/LoopStrengthReduce/exit_compare_live_range.ll b/test/Transforms/LoopStrengthReduce/exit_compare_live_range.ll index ad4959be340e..498be1a9a1a2 100644 --- a/test/Transforms/LoopStrengthReduce/exit_compare_live_range.ll +++ b/test/Transforms/LoopStrengthReduce/exit_compare_live_range.ll @@ -2,7 +2,7 @@ ; having overlapping live ranges that result in copies. We want the setcc ; instruction immediately before the conditional branch. ; -; RUN: opt -S -loop-reduce %s | FileCheck %s +; RUN: opt -S -loop-reduce < %s | FileCheck %s define void @foo(float* %D, i32 %E) { entry: diff --git a/test/Transforms/LoopStrengthReduce/post-inc-icmpzero.ll b/test/Transforms/LoopStrengthReduce/post-inc-icmpzero.ll index 96904c66e640..45aeb4e691a0 100644 --- a/test/Transforms/LoopStrengthReduce/post-inc-icmpzero.ll +++ b/test/Transforms/LoopStrengthReduce/post-inc-icmpzero.ll @@ -4,18 +4,17 @@ ; LSR should properly handle the post-inc offset when folding the ; non-IV operand of an icmp into the IV. -; CHECK: %4 = sub i64 %sub.ptr.lhs.cast, %sub.ptr.rhs.cast -; CHECK: %5 = lshr i64 %4, 1 -; CHECK: %6 = mul i64 %5, 2 +; CHECK: [[r1:%[a-z0-9]+]] = sub i64 %sub.ptr.lhs.cast, %sub.ptr.rhs.cast +; CHECK: [[r2:%[a-z0-9]+]] = lshr i64 [[r1]], 1 +; CHECK: [[r3:%[a-z0-9]+]] = mul i64 [[r2]], 2 ; CHECK: br label %for.body ; CHECK: for.body: -; CHECK: %lsr.iv2 = phi i64 [ %lsr.iv.next, %for.body ], [ %6, %for.body.lr.ph ] +; CHECK: %lsr.iv2 = phi i64 [ %lsr.iv.next, %for.body ], [ [[r3]], %for.body.lr.ph ] ; CHECK: %lsr.iv.next = add i64 %lsr.iv2, -2 ; CHECK: %lsr.iv.next3 = inttoptr i64 %lsr.iv.next to i16* ; CHECK: %cmp27 = icmp eq i16* %lsr.iv.next3, null target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" -target triple = "x86_64-unknown-linux-gnu" %struct.Vector2 = type { i16*, [64 x i16], i32 } diff --git a/test/Transforms/LoopUnroll/basic.ll b/test/Transforms/LoopUnroll/basic.ll index eeb3e9a57b06..ab5bc568ede4 100644 --- a/test/Transforms/LoopUnroll/basic.ll +++ b/test/Transforms/LoopUnroll/basic.ll @@ -22,3 +22,26 @@ l1: ; preds = %l1, %entry l2: ; preds = %l1 ret i32 0 } + +; This should not unroll since the call is 'noduplicate'. + +; CHECK: @test2 +define i32 @test2(i8** %P) nounwind ssp { +entry: + br label %l1 + +l1: ; preds = %l1, %entry + %x.0 = phi i32 [ 0, %entry ], [ %inc, %l1 ] +; CHECK: call void @f() +; CHECK-NOT: call void @f() + call void @f() noduplicate + %inc = add nsw i32 %x.0, 1 + %exitcond = icmp eq i32 %inc, 3 + br i1 %exitcond, label %l2, label %l1 + +l2: ; preds = %l1 + ret i32 0 +; CHECK: } +} + +declare void @f() diff --git a/test/Transforms/LoopUnroll/runtime-loop3.ll b/test/Transforms/LoopUnroll/runtime-loop3.ll index 55cf22373ece..aa928ccc60c1 100644 --- a/test/Transforms/LoopUnroll/runtime-loop3.ll +++ b/test/Transforms/LoopUnroll/runtime-loop3.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -disable-output -stats -loop-unroll -unroll-runtime -unroll-threshold=400 -info-output-file - | FileCheck %s --check-prefix=STATS ; Test that nested loops can be unrolled. We need to increase threshold to do it diff --git a/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll b/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll index 9d73d31d5044..31dba79be1f8 100644 --- a/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll +++ b/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -loop-unswitch -stats -disable-output 2>&1 | grep "1 loop-unswitch - Number of branches unswitched" | count 1 ; PR 3170 define i32 @a(i32 %x, i32 %y) nounwind { diff --git a/test/Transforms/LoopUnswitch/2011-11-18-SimpleSwitch.ll b/test/Transforms/LoopUnswitch/2011-11-18-SimpleSwitch.ll index c1fd58810660..a8608b877205 100644 --- a/test/Transforms/LoopUnswitch/2011-11-18-SimpleSwitch.ll +++ b/test/Transforms/LoopUnswitch/2011-11-18-SimpleSwitch.ll @@ -1,5 +1,6 @@ +; REQUIRES: asserts ; RUN: opt -loop-unswitch -disable-output -stats -info-output-file - < %s | FileCheck --check-prefix=STATS %s -; RUN: opt -S -loop-unswitch -verify-loop-info -verify-dom-info %s | FileCheck %s +; RUN: opt -S -loop-unswitch -verify-loop-info -verify-dom-info < %s | FileCheck %s ; STATS: 1 loop-simplify - Number of pre-header or exit blocks inserted ; STATS: 2 loop-unswitch - Number of switches unswitched @@ -19,7 +20,7 @@ ; CHECK-NEXT: i32 1, label %inc.us ; CHECK: inc.us: ; preds = %loop_begin.us -; CHECK-NEXT: call void @incf() noreturn nounwind +; CHECK-NEXT: call void @incf() [[NOR_NUW:#[0-9]+]] ; CHECK-NEXT: br label %loop_begin.backedge.us ; CHECK: .split: ; preds = %..split_crit_edge @@ -40,7 +41,7 @@ ; CHECK-NEXT: ] ; CHECK: dec.us3: ; preds = %loop_begin.us1 -; CHECK-NEXT: call void @decf() noreturn nounwind +; CHECK-NEXT: call void @decf() [[NOR_NUW]] ; CHECK-NEXT: br label %loop_begin.backedge.us5 ; CHECK: .split.split: ; preds = %.split..split.split_crit_edge @@ -89,3 +90,6 @@ loop_exit: declare void @incf() noreturn declare void @decf() noreturn + +; CHECK: attributes #0 = { noreturn } +; CHECK: attributes [[NOR_NUW]] = { noreturn nounwind } diff --git a/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches-Threshold.ll b/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches-Threshold.ll index f3db47119958..686cedbbc51a 100644 --- a/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches-Threshold.ll +++ b/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches-Threshold.ll @@ -1,5 +1,6 @@ +; REQUIRES: asserts ; RUN: opt -loop-unswitch -loop-unswitch-threshold 13 -disable-output -stats -info-output-file - < %s | FileCheck --check-prefix=STATS %s -; RUN: opt -S -loop-unswitch -loop-unswitch-threshold 13 -verify-loop-info -verify-dom-info %s | FileCheck %s +; RUN: opt -S -loop-unswitch -loop-unswitch-threshold 13 -verify-loop-info -verify-dom-info < %s | FileCheck %s ; STATS: 1 loop-simplify - Number of pre-header or exit blocks inserted ; STATS: 1 loop-unswitch - Number of switches unswitched @@ -25,7 +26,7 @@ ; CHECK-NEXT: ] ; CHECK: inc.us: ; preds = %second_switch.us, %loop_begin.us -; CHECK-NEXT: call void @incf() noreturn nounwind +; CHECK-NEXT: call void @incf() [[NOR_NUW:#[0-9]+]] ; CHECK-NEXT: br label %loop_begin.backedge.us ; CHECK: .split: ; preds = %..split_crit_edge @@ -45,7 +46,7 @@ ; CHECK-NEXT: ] ; CHECK: inc: ; preds = %loop_begin.inc_crit_edge, %second_switch -; CHECK-NEXT: call void @incf() noreturn nounwind +; CHECK-NEXT: call void @incf() [[NOR_NUW]] ; CHECK-NEXT: br label %loop_begin.backedge define i32 @test(i32* %var) { @@ -82,3 +83,6 @@ loop_exit: declare void @incf() noreturn declare void @decf() noreturn + +; CHECK: attributes #0 = { noreturn } +; CHECK: attributes [[NOR_NUW]] = { noreturn nounwind } diff --git a/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches.ll b/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches.ll index 270899642ffa..3ba9fc2f5cf1 100644 --- a/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches.ll +++ b/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches.ll @@ -1,5 +1,6 @@ +; REQUIRES: asserts ; RUN: opt -loop-unswitch -loop-unswitch-threshold 1000 -disable-output -stats -info-output-file - < %s | FileCheck --check-prefix=STATS %s -; RUN: opt -S -loop-unswitch -loop-unswitch-threshold 1000 -verify-loop-info -verify-dom-info %s | FileCheck %s +; RUN: opt -S -loop-unswitch -loop-unswitch-threshold 1000 -verify-loop-info -verify-dom-info < %s | FileCheck %s ; STATS: 1 loop-simplify - Number of pre-header or exit blocks inserted ; STATS: 3 loop-unswitch - Number of switches unswitched @@ -30,7 +31,7 @@ ; CHECK-NEXT: i32 1, label %inc.us.us ; CHECK: inc.us.us: ; preds = %second_switch.us.us, %loop_begin.us.us -; CHECK-NEXT: call void @incf() noreturn nounwind +; CHECK-NEXT: call void @incf() [[NOR_NUW:#[0-9]+]] ; CHECK-NEXT: br label %loop_begin.backedge.us.us ; CHECK: .split.us.split: ; preds = %.split.us..split.us.split_crit_edge @@ -50,7 +51,7 @@ ; CHECK-NEXT: br i1 true, label %us-unreachable8, label %inc.us ; CHECK: inc.us: ; preds = %second_switch.us.inc.us_crit_edge, %loop_begin.us -; CHECK-NEXT: call void @incf() noreturn nounwind +; CHECK-NEXT: call void @incf() [[NOR_NUW]] ; CHECK-NEXT: br label %loop_begin.backedge.us ; CHECK: .split: ; preds = %..split_crit_edge @@ -75,7 +76,7 @@ ; CHECK-NEXT: ] ; CHECK: inc.us4: ; preds = %loop_begin.inc_crit_edge.us, %second_switch.us3 -; CHECK-NEXT: call void @incf() noreturn nounwind +; CHECK-NEXT: call void @incf() [[NOR_NUW]] ; CHECK-NEXT: br label %loop_begin.backedge.us6 ; CHECK: loop_begin.inc_crit_edge.us: ; preds = %loop_begin.us1 @@ -136,3 +137,6 @@ loop_exit: declare void @incf() noreturn declare void @decf() noreturn + +; CHECK: attributes #0 = { noreturn } +; CHECK: attributes [[NOR_NUW]] = { noreturn nounwind } diff --git a/test/Transforms/LoopUnswitch/basictest.ll b/test/Transforms/LoopUnswitch/basictest.ll index 1e6f2cf15ee1..e98d82b6522d 100644 --- a/test/Transforms/LoopUnswitch/basictest.ll +++ b/test/Transforms/LoopUnswitch/basictest.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -verify-loop-info -S < %s 2>&1 | FileCheck %s define i32 @test(i32* %A, i1 %C) { entry: @@ -29,3 +29,40 @@ return: ; preds = %endif, %then ret i32 %tmp.13 } +; This simple test would normally unswitch, but should be inhibited by the presence of +; the noduplicate call. + +; CHECK: @test2 +define i32 @test2(i32* %var) { + %mem = alloca i32 + store i32 2, i32* %mem + %c = load i32* %mem + + br label %loop_begin + +loop_begin: + + %var_val = load i32* %var + + switch i32 %c, label %default [ + i32 1, label %inc + i32 2, label %dec + ] + +inc: + call void @incf() noreturn nounwind + br label %loop_begin +dec: +; CHECK: call void @decf() +; CHECK-NOT: call void @decf() + call void @decf() noreturn nounwind noduplicate + br label %loop_begin +default: + br label %loop_exit +loop_exit: + ret i32 0 +; CHECK: } +} + +declare void @incf() noreturn +declare void @decf() noreturn diff --git a/test/Transforms/LoopUnswitch/infinite-loop.ll b/test/Transforms/LoopUnswitch/infinite-loop.ll index 73391ca8d19d..8261e389370a 100644 --- a/test/Transforms/LoopUnswitch/infinite-loop.ll +++ b/test/Transforms/LoopUnswitch/infinite-loop.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -loop-unswitch -disable-output -stats -info-output-file - < %s | FileCheck --check-prefix=STATS %s ; RUN: opt -loop-unswitch -simplifycfg -S < %s | FileCheck %s ; PR5373 @@ -21,11 +22,11 @@ ; CHECK-NEXT: br label %cond.end.us ; CHECK: abort0.split: -; CHECK-NEXT: call void @end0() noreturn nounwind +; CHECK-NEXT: call void @end0() [[NOR_NUW:#[0-9]+]] ; CHECK-NEXT: unreachable ; CHECK: abort1: -; CHECK-NEXT: call void @end1() noreturn nounwind +; CHECK-NEXT: call void @end1() [[NOR_NUW]] ; CHECK-NEXT: unreachable ; CHECK: } @@ -51,3 +52,7 @@ abort1: declare void @end0() noreturn declare void @end1() noreturn + +; CHECK: attributes #0 = { nounwind } +; CHECK: attributes #1 = { noreturn } +; CHECK: attributes [[NOR_NUW]] = { noreturn nounwind } diff --git a/test/Transforms/LoopUnswitch/preserve-analyses.ll b/test/Transforms/LoopUnswitch/preserve-analyses.ll index 668f8ecaf8a5..f79612bef51e 100644 --- a/test/Transforms/LoopUnswitch/preserve-analyses.ll +++ b/test/Transforms/LoopUnswitch/preserve-analyses.ll @@ -1,4 +1,4 @@ -; RUN: opt -loop-unswitch -verify-loop-info -verify-dom-info %s -disable-output +; RUN: opt -loop-unswitch -verify-loop-info -verify-dom-info -disable-output < %s ; Loop unswitch should be able to unswitch these loops and ; preserve LCSSA and LoopSimplify forms. diff --git a/test/Transforms/LoopVectorize/12-12-11-if-conv.ll b/test/Transforms/LoopVectorize/12-12-11-if-conv.ll new file mode 100644 index 000000000000..2dd7fe34a70b --- /dev/null +++ b/test/Transforms/LoopVectorize/12-12-11-if-conv.ll @@ -0,0 +1,44 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -enable-if-conversion -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +;CHECK: @foo +;CHECK: icmp eq <4 x i32> +;CHECK: select <4 x i1> +;CHECK: ret i32 +define i32 @foo(i32 %x, i32 %t, i32* nocapture %A) nounwind uwtable ssp { +entry: + %cmp10 = icmp sgt i32 %x, 0 + br i1 %cmp10, label %for.body, label %for.end + +for.body: ; preds = %entry, %if.end + %indvars.iv = phi i64 [ %indvars.iv.next, %if.end ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i32* %A, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4, !tbaa !0 + %tobool = icmp eq i32 %0, 0 + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %for.body + %1 = add nsw i64 %indvars.iv, 45 + %2 = trunc i64 %indvars.iv to i32 + %mul = mul nsw i32 %2, %t + %3 = trunc i64 %1 to i32 + %add1 = add nsw i32 %3, %mul + br label %if.end + +if.end: ; preds = %for.body, %if.then + %z.0 = phi i32 [ %add1, %if.then ], [ 9, %for.body ] + store i32 %z.0, i32* %arrayidx, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %x + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %if.end, %entry + ret i32 undef +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/Transforms/LoopVectorize/2012-10-20-infloop.ll b/test/Transforms/LoopVectorize/2012-10-20-infloop.ll index 0176c9a18966..aa7cc0ee325d 100644 --- a/test/Transforms/LoopVectorize/2012-10-20-infloop.ll +++ b/test/Transforms/LoopVectorize/2012-10-20-infloop.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce ; Check that we don't fall into an infinite loop. define void @test() nounwind { @@ -25,3 +25,47 @@ for.body: ; preds = %for.body, %entry for.end: ; preds = %for.body unreachable } + +;PR14701 +define void @start_model_rare() nounwind uwtable ssp { +entry: + br i1 undef, label %return, label %if.end + +if.end: ; preds = %entry + br i1 undef, label %cond.false, label %cond.true + +cond.true: ; preds = %if.end + unreachable + +cond.false: ; preds = %if.end + br i1 undef, label %cond.false28, label %cond.true20 + +cond.true20: ; preds = %cond.false + unreachable + +cond.false28: ; preds = %cond.false + br label %for.body40 + +for.body40: ; preds = %for.inc50, %cond.false28 + %indvars.iv123 = phi i64 [ 3, %cond.false28 ], [ %indvars.iv.next124, %for.inc50 ] + %step.0121 = phi i32 [ 1, %cond.false28 ], [ %step.1, %for.inc50 ] + br i1 undef, label %if.then46, label %for.inc50 + +if.then46: ; preds = %for.body40 + %inc47 = add nsw i32 %step.0121, 1 + br label %for.inc50 + +for.inc50: ; preds = %if.then46, %for.body40 + %k.1 = phi i32 [ undef, %for.body40 ], [ %inc47, %if.then46 ] + %step.1 = phi i32 [ %step.0121, %for.body40 ], [ %inc47, %if.then46 ] + %indvars.iv.next124 = add i64 %indvars.iv123, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next124 to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 256 + br i1 %exitcond, label %for.end52, label %for.body40 + +for.end52: ; preds = %for.inc50 + unreachable + +return: ; preds = %entry + ret void +} diff --git a/test/Transforms/LoopVectorize/2012-10-22-isconsec.ll b/test/Transforms/LoopVectorize/2012-10-22-isconsec.ll index 2516e248bc96..405582c40899 100644 --- a/test/Transforms/LoopVectorize/2012-10-22-isconsec.ll +++ b/test/Transforms/LoopVectorize/2012-10-22-isconsec.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -dce -force-vector-width=4 +; RUN: opt < %s -loop-vectorize -dce -force-vector-unroll=1 -force-vector-width=4 ; Check that we don't crash. diff --git a/test/Transforms/LoopVectorize/ARM/arm-unroll.ll b/test/Transforms/LoopVectorize/ARM/arm-unroll.ll new file mode 100644 index 000000000000..c8d307f5d443 --- /dev/null +++ b/test/Transforms/LoopVectorize/ARM/arm-unroll.ll @@ -0,0 +1,32 @@ +; RUN: opt < %s -loop-vectorize -mtriple=thumbv7-apple-ios3.0.0 -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -mtriple=thumbv7-apple-ios3.0.0 -mcpu=swift -S | FileCheck %s --check-prefix=SWIFT + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios3.0.0" + +;CHECK: @foo +;CHECK: load <4 x i32> +;CHECK-NOT: load <4 x i32> +;CHECK: ret +;SWIFT: @foo +;SWIFT: load <4 x i32> +;SWIFT: load <4 x i32> +;SWIFT: ret +define i32 @foo(i32* nocapture %A, i32 %n) nounwind readonly ssp { + %1 = icmp sgt i32 %n, 0 + br i1 %1, label %.lr.ph, label %._crit_edge + +.lr.ph: ; preds = %0, %.lr.ph + %i.02 = phi i32 [ %5, %.lr.ph ], [ 0, %0 ] + %sum.01 = phi i32 [ %4, %.lr.ph ], [ 0, %0 ] + %2 = getelementptr inbounds i32* %A, i32 %i.02 + %3 = load i32* %2, align 4 + %4 = add nsw i32 %3, %sum.01 + %5 = add nsw i32 %i.02, 1 + %exitcond = icmp eq i32 %5, %n + br i1 %exitcond, label %._crit_edge, label %.lr.ph + +._crit_edge: ; preds = %.lr.ph, %0 + %sum.0.lcssa = phi i32 [ 0, %0 ], [ %4, %.lr.ph ] + ret i32 %sum.0.lcssa +} diff --git a/test/Transforms/LoopVectorize/ARM/gcc-examples.ll b/test/Transforms/LoopVectorize/ARM/gcc-examples.ll new file mode 100644 index 000000000000..6a68e81bcae0 --- /dev/null +++ b/test/Transforms/LoopVectorize/ARM/gcc-examples.ll @@ -0,0 +1,60 @@ +; RUN: opt < %s -loop-vectorize -mtriple=thumbv7-apple-ios3.0.0 -mcpu=swift -S -dce | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios3.0.0" + +@b = common global [2048 x i32] zeroinitializer, align 16 +@c = common global [2048 x i32] zeroinitializer, align 16 +@a = common global [2048 x i32] zeroinitializer, align 16 + +; Select VF = 8; +;CHECK: @example1 +;CHECK: load <4 x i32> +;CHECK: add nsw <4 x i32> +;CHECK: store <4 x i32> +;CHECK: ret void +define void @example1() nounwind uwtable ssp { + br label %1 + +; <label>:1 ; preds = %1, %0 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ] + %2 = getelementptr inbounds [2048 x i32]* @b, i64 0, i64 %indvars.iv + %3 = load i32* %2, align 4 + %4 = getelementptr inbounds [2048 x i32]* @c, i64 0, i64 %indvars.iv + %5 = load i32* %4, align 4 + %6 = add nsw i32 %5, %3 + %7 = getelementptr inbounds [2048 x i32]* @a, i64 0, i64 %indvars.iv + store i32 %6, i32* %7, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 256 + br i1 %exitcond, label %8, label %1 + +; <label>:8 ; preds = %1 + ret void +} + +;CHECK: @example10b +;CHECK: load <4 x i16> +;CHECK: sext <4 x i16> +;CHECK: store <4 x i32> +;CHECK: ret void +define void @example10b(i16* noalias nocapture %sa, i16* noalias nocapture %sb, i16* noalias nocapture %sc, i32* noalias nocapture %ia, i32* noalias nocapture %ib, i32* noalias nocapture %ic) nounwind uwtable ssp { + br label %1 + +; <label>:1 ; preds = %1, %0 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ] + %2 = getelementptr inbounds i16* %sb, i64 %indvars.iv + %3 = load i16* %2, align 2 + %4 = sext i16 %3 to i32 + %5 = getelementptr inbounds i32* %ia, i64 %indvars.iv + store i32 %4, i32* %5, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 1024 + br i1 %exitcond, label %6, label %1 + +; <label>:6 ; preds = %1 + ret void +} + diff --git a/test/Transforms/LoopVectorize/ARM/lit.local.cfg b/test/Transforms/LoopVectorize/ARM/lit.local.cfg new file mode 100644 index 000000000000..cb77b09ef4ad --- /dev/null +++ b/test/Transforms/LoopVectorize/ARM/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.ll', '.c', '.cpp'] + +targets = set(config.root.targets_to_build.split()) +if not 'ARM' in targets: + config.unsupported = True + diff --git a/test/Transforms/LoopVectorize/ARM/mul-cast-vect.ll b/test/Transforms/LoopVectorize/ARM/mul-cast-vect.ll new file mode 100644 index 000000000000..d2e3de279f7c --- /dev/null +++ b/test/Transforms/LoopVectorize/ARM/mul-cast-vect.ll @@ -0,0 +1,114 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=armv7-linux-gnueabihf -mcpu=cortex-a9 | FileCheck --check-prefix=COST %s +; To see the assembly output: llc -mcpu=cortex-a9 < %s | FileCheck --check-prefix=ASM %s +; ASM lines below are only for reference, tests on that direction should go to tests/CodeGen/ARM + +; ModuleID = 'arm.ll' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64" +target triple = "armv7--linux-gnueabihf" + +%T216 = type <2 x i16> +%T232 = type <2 x i32> +%T264 = type <2 x i64> + +%T416 = type <4 x i16> +%T432 = type <4 x i32> +%T464 = type <4 x i64> + +define void @direct(%T432* %loadaddr, %T432* %loadaddr2, %T432* %storeaddr) { +; COST: function 'direct': + %v0 = load %T432* %loadaddr +; ASM: vld1.64 + %v1 = load %T432* %loadaddr2 +; ASM: vld1.64 + %r3 = mul %T432 %v0, %v1 +; COST: cost of 2 for instruction: {{.*}} mul <4 x i32> +; ASM: vmul.i32 + store %T432 %r3, %T432* %storeaddr +; ASM: vst1.64 + ret void +} + +define void @ups1632(%T416* %loadaddr, %T416* %loadaddr2, %T432* %storeaddr) { +; COST: function 'ups1632': + %v0 = load %T416* %loadaddr +; ASM: vldr + %v1 = load %T416* %loadaddr2 +; ASM: vldr + %r1 = sext %T416 %v0 to %T432 + %r2 = sext %T416 %v1 to %T432 +; COST: cost of 0 for instruction: {{.*}} sext <4 x i16> {{.*}} to <4 x i32> + %r3 = mul %T432 %r1, %r2 +; COST: cost of 2 for instruction: {{.*}} mul <4 x i32> +; ASM: vmull.s16 + store %T432 %r3, %T432* %storeaddr +; ASM: vst1.64 + ret void +} + +define void @upu1632(%T416* %loadaddr, %T416* %loadaddr2, %T432* %storeaddr) { +; COST: function 'upu1632': + %v0 = load %T416* %loadaddr +; ASM: vldr + %v1 = load %T416* %loadaddr2 +; ASM: vldr + %r1 = zext %T416 %v0 to %T432 + %r2 = zext %T416 %v1 to %T432 +; COST: cost of 0 for instruction: {{.*}} zext <4 x i16> {{.*}} to <4 x i32> + %r3 = mul %T432 %r1, %r2 +; COST: cost of 2 for instruction: {{.*}} mul <4 x i32> +; ASM: vmull.u16 + store %T432 %r3, %T432* %storeaddr +; ASM: vst1.64 + ret void +} + +define void @ups3264(%T232* %loadaddr, %T232* %loadaddr2, %T264* %storeaddr) { +; COST: function 'ups3264': + %v0 = load %T232* %loadaddr +; ASM: vldr + %v1 = load %T232* %loadaddr2 +; ASM: vldr + %r3 = mul %T232 %v0, %v1 +; ASM: vmul.i32 +; COST: cost of 1 for instruction: {{.*}} mul <2 x i32> + %st = sext %T232 %r3 to %T264 +; ASM: vmovl.s32 +; COST: cost of 1 for instruction: {{.*}} sext <2 x i32> {{.*}} to <2 x i64> + store %T264 %st, %T264* %storeaddr +; ASM: vst1.64 + ret void +} + +define void @upu3264(%T232* %loadaddr, %T232* %loadaddr2, %T264* %storeaddr) { +; COST: function 'upu3264': + %v0 = load %T232* %loadaddr +; ASM: vldr + %v1 = load %T232* %loadaddr2 +; ASM: vldr + %r3 = mul %T232 %v0, %v1 +; ASM: vmul.i32 +; COST: cost of 1 for instruction: {{.*}} mul <2 x i32> + %st = zext %T232 %r3 to %T264 +; ASM: vmovl.u32 +; COST: cost of 1 for instruction: {{.*}} zext <2 x i32> {{.*}} to <2 x i64> + store %T264 %st, %T264* %storeaddr +; ASM: vst1.64 + ret void +} + +define void @dn3216(%T432* %loadaddr, %T432* %loadaddr2, %T416* %storeaddr) { +; COST: function 'dn3216': + %v0 = load %T432* %loadaddr +; ASM: vld1.64 + %v1 = load %T432* %loadaddr2 +; ASM: vld1.64 + %r3 = mul %T432 %v0, %v1 +; ASM: vmul.i32 +; COST: cost of 2 for instruction: {{.*}} mul <4 x i32> + %st = trunc %T432 %r3 to %T416 +; ASM: vmovn.i32 +; COST: cost of 1 for instruction: {{.*}} trunc <4 x i32> {{.*}} to <4 x i16> + store %T416 %st, %T416* %storeaddr +; ASM: vstr + ret void +} diff --git a/test/Transforms/LoopVectorize/ARM/width-detect.ll b/test/Transforms/LoopVectorize/ARM/width-detect.ll new file mode 100644 index 000000000000..c0795b6a79af --- /dev/null +++ b/test/Transforms/LoopVectorize/ARM/width-detect.ll @@ -0,0 +1,52 @@ +; RUN: opt < %s -loop-vectorize -mtriple=thumbv7-apple-ios3.0.0 -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios3.0.0" + +;CHECK:foo_F64 +;CHECK: <2 x double> +;CHECK:ret +define double @foo_F64(double* nocapture %A, i32 %n) nounwind uwtable readonly ssp { + %1 = icmp sgt i32 %n, 0 + br i1 %1, label %.lr.ph, label %._crit_edge + +.lr.ph: ; preds = %0, %.lr.ph + %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ] + %prod.01 = phi double [ %4, %.lr.ph ], [ 0.000000e+00, %0 ] + %2 = getelementptr inbounds double* %A, i64 %indvars.iv + %3 = load double* %2, align 8 + %4 = fmul fast double %prod.01, %3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %._crit_edge, label %.lr.ph + +._crit_edge: ; preds = %.lr.ph, %0 + %prod.0.lcssa = phi double [ 0.000000e+00, %0 ], [ %4, %.lr.ph ] + ret double %prod.0.lcssa +} + +;CHECK:foo_I8 +;CHECK: xor <16 x i8> +;CHECK:ret +define signext i8 @foo_I8(i8* nocapture %A, i32 %n) nounwind uwtable readonly ssp { + %1 = icmp sgt i32 %n, 0 + br i1 %1, label %.lr.ph, label %._crit_edge + +.lr.ph: ; preds = %0, %.lr.ph + %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ] + %red.01 = phi i8 [ %4, %.lr.ph ], [ 0, %0 ] + %2 = getelementptr inbounds i8* %A, i64 %indvars.iv + %3 = load i8* %2, align 1 + %4 = xor i8 %3, %red.01 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %._crit_edge, label %.lr.ph + +._crit_edge: ; preds = %.lr.ph, %0 + %red.0.lcssa = phi i8 [ 0, %0 ], [ %4, %.lr.ph ] + ret i8 %red.0.lcssa +} + + diff --git a/test/Transforms/LoopVectorize/X86/avx1.ll b/test/Transforms/LoopVectorize/X86/avx1.ll index a2d176a534c9..6c0366eae973 100644 --- a/test/Transforms/LoopVectorize/X86/avx1.ll +++ b/test/Transforms/LoopVectorize/X86/avx1.ll @@ -27,7 +27,7 @@ define i32 @read_mod_write_single_ptr(float* nocapture %a, i32 %n) nounwind uwta ;CHECK: @read_mod_i64 -;CHECK: load <8 x i64> +;CHECK: load <2 x i64> ;CHECK: ret i32 define i32 @read_mod_i64(i64* nocapture %a, i32 %n) nounwind uwtable ssp { %1 = icmp sgt i32 %n, 0 @@ -37,7 +37,7 @@ define i32 @read_mod_i64(i64* nocapture %a, i32 %n) nounwind uwtable ssp { %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ] %2 = getelementptr inbounds i64* %a, i64 %indvars.iv %3 = load i64* %2, align 4 - %4 = mul i64 %3, 3 + %4 = add i64 %3, 3 store i64 %4, i64* %2, align 4 %indvars.iv.next = add i64 %indvars.iv, 1 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 diff --git a/test/Transforms/LoopVectorize/X86/constant-vector-operand.ll b/test/Transforms/LoopVectorize/X86/constant-vector-operand.ll new file mode 100644 index 000000000000..6c924409af37 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/constant-vector-operand.ll @@ -0,0 +1,28 @@ +; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -loop-vectorize -dce -instcombine -S < %s | FileCheck %s + +@B = common global [1024 x i32] zeroinitializer, align 16 +@A = common global [1024 x i32] zeroinitializer, align 16 + +; We use to not vectorize this loop because the shift was deemed to expensive. +; Now that we differentiate shift cost base on the operand value kind, we will +; vectorize this loop. +; CHECK: ashr <4 x i32> +define void @f() { +entry: + br label %for.body + +for.body: + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds [1024 x i32]* @B, i64 0, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4 + %shl = ashr i32 %0, 3 + %arrayidx2 = getelementptr inbounds [1024 x i32]* @A, i64 0, i64 %indvars.iv + store i32 %shl, i32* %arrayidx2, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 1024 + br i1 %exitcond, label %for.end, label %for.body + +for.end: + ret void +} diff --git a/test/Transforms/LoopVectorize/X86/conversion-cost.ll b/test/Transforms/LoopVectorize/X86/conversion-cost.ll index 8f1bb545fa01..760d28deaf27 100644 --- a/test/Transforms/LoopVectorize/X86/conversion-cost.ll +++ b/test/Transforms/LoopVectorize/X86/conversion-cost.ll @@ -4,7 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-macosx10.8.0" ;CHECK: @conversion_cost1 -;CHECK: store <2 x i8> +;CHECK: store <32 x i8> ;CHECK: ret define i32 @conversion_cost1(i32 %n, i8* nocapture %A, float* nocapture %B) nounwind uwtable ssp { %1 = icmp sgt i32 %n, 3 @@ -33,11 +33,10 @@ define i32 @conversion_cost2(i32 %n, i8* nocapture %A, float* nocapture %B) noun .lr.ph: ; preds = %0, %.lr.ph %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 9, %0 ] - %2 = add nsw i64 %indvars.iv, 3 - %3 = trunc i64 %2 to i32 - %4 = sitofp i32 %3 to float - %5 = getelementptr inbounds float* %B, i64 %indvars.iv - store float %4, float* %5, align 4 + %add = add nsw i64 %indvars.iv, 3 + %tofp = sitofp i64 %add to float + %gep = getelementptr inbounds float* %B, i64 %indvars.iv + store float %tofp, float* %gep, align 4 %indvars.iv.next = add i64 %indvars.iv, 1 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 %exitcond = icmp eq i32 %lftr.wideiv, %n diff --git a/test/Transforms/LoopVectorize/X86/cost-model.ll b/test/Transforms/LoopVectorize/X86/cost-model.ll index 628f9912c8c9..b7f479acf962 100644 --- a/test/Transforms/LoopVectorize/X86/cost-model.ll +++ b/test/Transforms/LoopVectorize/X86/cost-model.ll @@ -8,8 +8,11 @@ target triple = "x86_64-apple-macosx10.8.0" @d = common global [2048 x i32] zeroinitializer, align 16 @a = common global [2048 x i32] zeroinitializer, align 16 +; The program below gathers and scatters data. We better not vectorize it. ;CHECK: cost_model_1 -;CHECK: <4 x i32> +;CHECK-NOT: <2 x i32> +;CHECK-NOT: <4 x i32> +;CHECK-NOT: <8 x i32> ;CHECK: ret void define void @cost_model_1() nounwind uwtable noinline ssp { entry: diff --git a/test/Transforms/LoopVectorize/X86/gcc-examples.ll b/test/Transforms/LoopVectorize/X86/gcc-examples.ll index 574c529834ac..d2d0eac305f5 100644 --- a/test/Transforms/LoopVectorize/X86/gcc-examples.ll +++ b/test/Transforms/LoopVectorize/X86/gcc-examples.ll @@ -1,4 +1,5 @@ -; RUN: opt < %s -loop-vectorize -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7 -dce -instcombine -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7 -force-vector-unroll=0 -dce -instcombine -S | FileCheck %s -check-prefix=UNROLL target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" @@ -9,10 +10,19 @@ target triple = "x86_64-apple-macosx10.8.0" ; Select VF = 8; ;CHECK: @example1 -;CHECK: load <8 x i32> -;CHECK: add nsw <8 x i32> -;CHECK: store <8 x i32> +;CHECK: load <4 x i32> +;CHECK: add nsw <4 x i32> +;CHECK: store <4 x i32> ;CHECK: ret void + +;UNROLL: @example1 +;UNROLL: load <4 x i32> +;UNROLL: load <4 x i32> +;UNROLL: add nsw <4 x i32> +;UNROLL: add nsw <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: ret void define void @example1() nounwind uwtable ssp { br label %1 @@ -34,13 +44,18 @@ define void @example1() nounwind uwtable ssp { ret void } - -; Select VF=4 because sext <8 x i1> to <8 x i32> is expensive. +; Select VF=4 because sext <8 x i1> to <8 x i32> is expensive. ;CHECK: @example10b ;CHECK: load <4 x i16> ;CHECK: sext <4 x i16> ;CHECK: store <4 x i32> ;CHECK: ret void +;UNROLL: @example10b +;UNROLL: load <4 x i16> +;UNROLL: load <4 x i16> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: ret void define void @example10b(i16* noalias nocapture %sa, i16* noalias nocapture %sb, i16* noalias nocapture %sc, i32* noalias nocapture %ia, i32* noalias nocapture %ib, i32* noalias nocapture %ic) nounwind uwtable ssp { br label %1 diff --git a/test/Transforms/LoopVectorize/X86/min-trip-count-switch.ll b/test/Transforms/LoopVectorize/X86/min-trip-count-switch.ll new file mode 100644 index 000000000000..186fba87d653 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/min-trip-count-switch.ll @@ -0,0 +1,28 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -vectorizer-min-trip-count=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK: <4 x float> +define void @trivial_loop(float* nocapture %a) nounwind uwtable optsize { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds float* %a, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %add = fadd float %0, 1.000000e+00 + store float %add, float* %arrayidx, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 8 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +!0 = metadata !{metadata !"float", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/Transforms/LoopVectorize/X86/no-vector.ll b/test/Transforms/LoopVectorize/X86/no-vector.ll new file mode 100644 index 000000000000..692eec989591 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/no-vector.ll @@ -0,0 +1,22 @@ +; RUN: opt -S -mtriple=i386-unknown-freebsd -mcpu=i486 -loop-vectorize < %s + +define i32 @PR14639(i8* nocapture %s, i32 %len) nounwind { +entry: + %cmp4 = icmp sgt i32 %len, 0 + br i1 %cmp4, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %i.06 = phi i32 [ %inc, %for.body ], [ 0, %entry ] + %r.05 = phi i32 [ %xor, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i8* %s, i32 %i.06 + %0 = load i8* %arrayidx, align 1 + %conv = sext i8 %0 to i32 + %xor = xor i32 %conv, %r.05 + %inc = add nsw i32 %i.06, 1 + %exitcond = icmp eq i32 %inc, %len + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + %r.0.lcssa = phi i32 [ 0, %entry ], [ %xor, %for.body ] + ret i32 %r.0.lcssa +} diff --git a/test/Transforms/LoopVectorize/X86/parallel-loops-after-reg2mem.ll b/test/Transforms/LoopVectorize/X86/parallel-loops-after-reg2mem.ll new file mode 100644 index 000000000000..452d0df133db --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/parallel-loops-after-reg2mem.ll @@ -0,0 +1,52 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; The parallel loop has been invalidated by the new memory accesses introduced +; by reg2mem (Loop::isParallel() starts to return false). Ensure the loop is +; now non-vectorizable. + +;CHECK-NOT: <4 x i32> +define void @parallel_loop(i32* nocapture %a, i32* nocapture %b) nounwind uwtable { +entry: + %indvars.iv.next.reg2mem = alloca i64 + %indvars.iv.reg2mem = alloca i64 + %"reg2mem alloca point" = bitcast i32 0 to i32 + store i64 0, i64* %indvars.iv.reg2mem + br label %for.body + +for.body: ; preds = %for.body.for.body_crit_edge, %entry + %indvars.iv.reload = load i64* %indvars.iv.reg2mem + %arrayidx = getelementptr inbounds i32* %b, i64 %indvars.iv.reload + %0 = load i32* %arrayidx, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + %arrayidx2 = getelementptr inbounds i32* %a, i64 %indvars.iv.reload + %1 = load i32* %arrayidx2, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + %idxprom3 = sext i32 %1 to i64 + %arrayidx4 = getelementptr inbounds i32* %a, i64 %idxprom3 + store i32 %0, i32* %arrayidx4, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + %indvars.iv.next = add i64 %indvars.iv.reload, 1 + ; A new store without the parallel metadata here: + store i64 %indvars.iv.next, i64* %indvars.iv.next.reg2mem + %indvars.iv.next.reload1 = load i64* %indvars.iv.next.reg2mem + %arrayidx6 = getelementptr inbounds i32* %b, i64 %indvars.iv.next.reload1 + %2 = load i32* %arrayidx6, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + store i32 %2, i32* %arrayidx2, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + %indvars.iv.next.reload = load i64* %indvars.iv.next.reg2mem + %lftr.wideiv = trunc i64 %indvars.iv.next.reload to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 512 + br i1 %exitcond, label %for.end, label %for.body.for.body_crit_edge, !llvm.loop.parallel !3 + +for.body.for.body_crit_edge: ; preds = %for.body + %indvars.iv.next.reload2 = load i64* %indvars.iv.next.reg2mem + store i64 %indvars.iv.next.reload2, i64* %indvars.iv.reg2mem + br label %for.body + +for.end: ; preds = %for.body + ret void +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !3} diff --git a/test/Transforms/LoopVectorize/X86/parallel-loops.ll b/test/Transforms/LoopVectorize/X86/parallel-loops.ll new file mode 100644 index 000000000000..f648722734a1 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/parallel-loops.ll @@ -0,0 +1,114 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; A tricky loop: +; +; void loop(int *a, int *b) { +; for (int i = 0; i < 512; ++i) { +; a[a[i]] = b[i]; +; a[i] = b[i+1]; +; } +;} + +;CHECK: @loop +;CHECK-NOT: <4 x i32> +define void @loop(i32* nocapture %a, i32* nocapture %b) nounwind uwtable { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds i32* %b, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4, !tbaa !0 + %arrayidx2 = getelementptr inbounds i32* %a, i64 %indvars.iv + %1 = load i32* %arrayidx2, align 4, !tbaa !0 + %idxprom3 = sext i32 %1 to i64 + %arrayidx4 = getelementptr inbounds i32* %a, i64 %idxprom3 + store i32 %0, i32* %arrayidx4, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %arrayidx6 = getelementptr inbounds i32* %b, i64 %indvars.iv.next + %2 = load i32* %arrayidx6, align 4, !tbaa !0 + store i32 %2, i32* %arrayidx2, align 4, !tbaa !0 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 512 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +; The same loop with parallel loop metadata added to the loop branch +; and the memory instructions. + +;CHECK: @parallel_loop +;CHECK: <4 x i32> +define void @parallel_loop(i32* nocapture %a, i32* nocapture %b) nounwind uwtable { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds i32* %b, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + %arrayidx2 = getelementptr inbounds i32* %a, i64 %indvars.iv + %1 = load i32* %arrayidx2, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + %idxprom3 = sext i32 %1 to i64 + %arrayidx4 = getelementptr inbounds i32* %a, i64 %idxprom3 + ; This store might have originated from inlining a function with a parallel + ; loop. Refers to a list with the "original loop reference" (!4) also included. + store i32 %0, i32* %arrayidx4, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !5 + %indvars.iv.next = add i64 %indvars.iv, 1 + %arrayidx6 = getelementptr inbounds i32* %b, i64 %indvars.iv.next + %2 = load i32* %arrayidx6, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + store i32 %2, i32* %arrayidx2, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !3 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 512 + br i1 %exitcond, label %for.end, label %for.body, !llvm.loop.parallel !3 + +for.end: ; preds = %for.body + ret void +} + +; The same loop with an illegal parallel loop metadata: the memory +; accesses refer to a different loop's identifier. + +;CHECK: @mixed_metadata +;CHECK-NOT: <4 x i32> + +define void @mixed_metadata(i32* nocapture %a, i32* nocapture %b) nounwind uwtable { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds i32* %b, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !6 + %arrayidx2 = getelementptr inbounds i32* %a, i64 %indvars.iv + %1 = load i32* %arrayidx2, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !6 + %idxprom3 = sext i32 %1 to i64 + %arrayidx4 = getelementptr inbounds i32* %a, i64 %idxprom3 + ; This refers to the loop marked with !7 which we are not in at the moment. + ; It should prevent detecting as a parallel loop. + store i32 %0, i32* %arrayidx4, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !7 + %indvars.iv.next = add i64 %indvars.iv, 1 + %arrayidx6 = getelementptr inbounds i32* %b, i64 %indvars.iv.next + %2 = load i32* %arrayidx6, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !6 + store i32 %2, i32* %arrayidx2, align 4, !tbaa !0, !llvm.mem.parallel_loop_access !6 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 512 + br i1 %exitcond, label %for.end, label %for.body, !llvm.loop.parallel !6 + +for.end: ; preds = %for.body + ret void +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !3} +!4 = metadata !{metadata !4} +!5 = metadata !{metadata !3, metadata !4} +!6 = metadata !{metadata !6} +!7 = metadata !{metadata !7} diff --git a/test/Transforms/LoopVectorize/X86/reduction-crash.ll b/test/Transforms/LoopVectorize/X86/reduction-crash.ll new file mode 100644 index 000000000000..f580846a0228 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/reduction-crash.ll @@ -0,0 +1,35 @@ +; RUN: opt -S -loop-vectorize -mcpu=prescott < %s | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" +target triple = "i386-apple-darwin" + +; PR15344 +define void @test1(float* nocapture %arg, i32 %arg1) nounwind { +; CHECK: @test1 +; CHECK: preheader +; CHECK: insertelement <2 x double> zeroinitializer, double %tmp, i32 0 +; CHECK: vector.memcheck + +bb: + br label %bb2 + +bb2: ; preds = %bb + %tmp = load double* null, align 8 + br i1 undef, label %bb3, label %bb12 + +bb3: ; preds = %bb3, %bb2 + %tmp4 = phi double [ %tmp9, %bb3 ], [ %tmp, %bb2 ] + %tmp5 = phi i32 [ %tmp8, %bb3 ], [ 0, %bb2 ] + %tmp6 = getelementptr inbounds [16 x double]* undef, i32 0, i32 %tmp5 + %tmp7 = load double* %tmp6, align 4 + %tmp8 = add nsw i32 %tmp5, 1 + %tmp9 = fadd fast double %tmp4, undef + %tmp10 = getelementptr inbounds float* %arg, i32 %tmp5 + store float undef, float* %tmp10, align 4 + %tmp11 = icmp eq i32 %tmp8, %arg1 + br i1 %tmp11, label %bb12, label %bb3 + +bb12: ; preds = %bb3, %bb2 + %tmp13 = phi double [ %tmp, %bb2 ], [ %tmp9, %bb3 ] + ret void +} diff --git a/test/Transforms/LoopVectorize/X86/small-size.ll b/test/Transforms/LoopVectorize/X86/small-size.ll new file mode 100644 index 000000000000..f390b33c0388 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/small-size.ll @@ -0,0 +1,170 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@b = common global [2048 x i32] zeroinitializer, align 16 +@c = common global [2048 x i32] zeroinitializer, align 16 +@a = common global [2048 x i32] zeroinitializer, align 16 +@G = common global [32 x [1024 x i32]] zeroinitializer, align 16 +@ub = common global [1024 x i32] zeroinitializer, align 16 +@uc = common global [1024 x i32] zeroinitializer, align 16 +@d = common global [2048 x i32] zeroinitializer, align 16 +@fa = common global [1024 x float] zeroinitializer, align 16 +@fb = common global [1024 x float] zeroinitializer, align 16 +@ic = common global [1024 x i32] zeroinitializer, align 16 +@da = common global [1024 x float] zeroinitializer, align 16 +@db = common global [1024 x float] zeroinitializer, align 16 +@dc = common global [1024 x float] zeroinitializer, align 16 +@dd = common global [1024 x float] zeroinitializer, align 16 +@dj = common global [1024 x i32] zeroinitializer, align 16 + +; We can optimize this test without a tail. +;CHECK: @example1 +;CHECK: load <4 x i32> +;CHECK: add nsw <4 x i32> +;CHECK: store <4 x i32> +;CHECK: ret void +define void @example1() optsize { + br label %1 + +; <label>:1 ; preds = %1, %0 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ] + %2 = getelementptr inbounds [2048 x i32]* @b, i64 0, i64 %indvars.iv + %3 = load i32* %2, align 4 + %4 = getelementptr inbounds [2048 x i32]* @c, i64 0, i64 %indvars.iv + %5 = load i32* %4, align 4 + %6 = add nsw i32 %5, %3 + %7 = getelementptr inbounds [2048 x i32]* @a, i64 0, i64 %indvars.iv + store i32 %6, i32* %7, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 256 + br i1 %exitcond, label %8, label %1 + +; <label>:8 ; preds = %1 + ret void +} + +; Can't vectorize in 'optsize' mode because we need a tail. +;CHECK: @example2 +;CHECK-NOT: store <4 x i32> +;CHECK: ret void +define void @example2(i32 %n, i32 %x) optsize { + %1 = icmp sgt i32 %n, 0 + br i1 %1, label %.lr.ph5, label %.preheader + +..preheader_crit_edge: ; preds = %.lr.ph5 + %phitmp = sext i32 %n to i64 + br label %.preheader + +.preheader: ; preds = %..preheader_crit_edge, %0 + %i.0.lcssa = phi i64 [ %phitmp, %..preheader_crit_edge ], [ 0, %0 ] + %2 = icmp eq i32 %n, 0 + br i1 %2, label %._crit_edge, label %.lr.ph + +.lr.ph5: ; preds = %0, %.lr.ph5 + %indvars.iv6 = phi i64 [ %indvars.iv.next7, %.lr.ph5 ], [ 0, %0 ] + %3 = getelementptr inbounds [2048 x i32]* @b, i64 0, i64 %indvars.iv6 + store i32 %x, i32* %3, align 4 + %indvars.iv.next7 = add i64 %indvars.iv6, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next7 to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %..preheader_crit_edge, label %.lr.ph5 + +.lr.ph: ; preds = %.preheader, %.lr.ph + %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %i.0.lcssa, %.preheader ] + %.02 = phi i32 [ %4, %.lr.ph ], [ %n, %.preheader ] + %4 = add nsw i32 %.02, -1 + %5 = getelementptr inbounds [2048 x i32]* @b, i64 0, i64 %indvars.iv + %6 = load i32* %5, align 4 + %7 = getelementptr inbounds [2048 x i32]* @c, i64 0, i64 %indvars.iv + %8 = load i32* %7, align 4 + %9 = and i32 %8, %6 + %10 = getelementptr inbounds [2048 x i32]* @a, i64 0, i64 %indvars.iv + store i32 %9, i32* %10, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %11 = icmp eq i32 %4, 0 + br i1 %11, label %._crit_edge, label %.lr.ph + +._crit_edge: ; preds = %.lr.ph, %.preheader + ret void +} + +; N is unknown, we need a tail. Can't vectorize. +;CHECK: @example3 +;CHECK-NOT: <4 x i32> +;CHECK: ret void +define void @example3(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture %q) optsize { + %1 = icmp eq i32 %n, 0 + br i1 %1, label %._crit_edge, label %.lr.ph + +.lr.ph: ; preds = %0, %.lr.ph + %.05 = phi i32 [ %2, %.lr.ph ], [ %n, %0 ] + %.014 = phi i32* [ %5, %.lr.ph ], [ %p, %0 ] + %.023 = phi i32* [ %3, %.lr.ph ], [ %q, %0 ] + %2 = add nsw i32 %.05, -1 + %3 = getelementptr inbounds i32* %.023, i64 1 + %4 = load i32* %.023, align 16 + %5 = getelementptr inbounds i32* %.014, i64 1 + store i32 %4, i32* %.014, align 16 + %6 = icmp eq i32 %2, 0 + br i1 %6, label %._crit_edge, label %.lr.ph + +._crit_edge: ; preds = %.lr.ph, %0 + ret void +} + + +; We can't vectorize this one because we need a runtime ptr check. +;CHECK: @example23 +;CHECK-NOT: <4 x i32> +;CHECK: ret void +define void @example23(i16* nocapture %src, i32* nocapture %dst) optsize { + br label %1 + +; <label>:1 ; preds = %1, %0 + %.04 = phi i16* [ %src, %0 ], [ %2, %1 ] + %.013 = phi i32* [ %dst, %0 ], [ %6, %1 ] + %i.02 = phi i32 [ 0, %0 ], [ %7, %1 ] + %2 = getelementptr inbounds i16* %.04, i64 1 + %3 = load i16* %.04, align 2 + %4 = zext i16 %3 to i32 + %5 = shl nuw nsw i32 %4, 7 + %6 = getelementptr inbounds i32* %.013, i64 1 + store i32 %5, i32* %.013, align 4 + %7 = add nsw i32 %i.02, 1 + %exitcond = icmp eq i32 %7, 256 + br i1 %exitcond, label %8, label %1 + +; <label>:8 ; preds = %1 + ret void +} + + +; We CAN vectorize this example because the pointers are marked as noalias. +;CHECK: @example23b +;CHECK: <4 x i32> +;CHECK: ret void +define void @example23b(i16* noalias nocapture %src, i32* noalias nocapture %dst) optsize { + br label %1 + +; <label>:1 ; preds = %1, %0 + %.04 = phi i16* [ %src, %0 ], [ %2, %1 ] + %.013 = phi i32* [ %dst, %0 ], [ %6, %1 ] + %i.02 = phi i32 [ 0, %0 ], [ %7, %1 ] + %2 = getelementptr inbounds i16* %.04, i64 1 + %3 = load i16* %.04, align 2 + %4 = zext i16 %3 to i32 + %5 = shl nuw nsw i32 %4, 7 + %6 = getelementptr inbounds i32* %.013, i64 1 + store i32 %5, i32* %.013, align 4 + %7 = add nsw i32 %i.02, 1 + %exitcond = icmp eq i32 %7, 256 + br i1 %exitcond, label %8, label %1 + +; <label>:8 ; preds = %1 + ret void +} + + diff --git a/test/Transforms/LoopVectorize/X86/struct-store.ll b/test/Transforms/LoopVectorize/X86/struct-store.ll new file mode 100644 index 000000000000..a995e43a5ab1 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/struct-store.ll @@ -0,0 +1,27 @@ +; RUN: opt < %s -loop-vectorize -mtriple=x86_64-unknown-linux-gnu -S + +; Make sure we are not crashing on this one. + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@glbl = external global [16 x { i64, i64 }], align 16 + +declare void @fn() + +define void @test() { +entry: + br label %loop + +loop: + %indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ 0, %entry ] + %tmp = getelementptr inbounds [16 x { i64, i64 }]* @glbl, i64 0, i64 %indvars.iv + store { i64, i64 } { i64 ptrtoint (void ()* @fn to i64), i64 0 }, { i64, i64 }* %tmp, align 16 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp ne i32 %lftr.wideiv, 16 + br i1 %exitcond, label %loop, label %exit + +exit: + ret void +} diff --git a/test/Transforms/LoopVectorize/X86/unroll-small-loops.ll b/test/Transforms/LoopVectorize/X86/unroll-small-loops.ll new file mode 100644 index 000000000000..ef63a145d0c1 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/unroll-small-loops.ll @@ -0,0 +1,50 @@ +; RUN: opt < %s -loop-vectorize -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx -force-vector-width=4 -force-vector-unroll=0 -dce -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" +;CHECK: @foo +;CHECK: load <4 x i32> +;CHECK-NOT: load <4 x i32> +;CHECK: store <4 x i32> +;CHECK-NOT: store <4 x i32> +;CHECK: ret +define i32 @foo(i32* nocapture %A) nounwind uwtable ssp { + br label %1 + +; <label>:1 ; preds = %1, %0 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ] + %2 = getelementptr inbounds i32* %A, i64 %indvars.iv + %3 = load i32* %2, align 4 + %4 = add nsw i32 %3, 6 + store i32 %4, i32* %2, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 100 + br i1 %exitcond, label %5, label %1 + +; <label>:5 ; preds = %1 + ret i32 undef +} + +;CHECK: @bar +;CHECK: store <4 x i32> +;CHECK: store <4 x i32> +;CHECK: ret +define i32 @bar(i32* nocapture %A, i32 %n) nounwind uwtable ssp { + %1 = icmp sgt i32 %n, 0 + br i1 %1, label %.lr.ph, label %._crit_edge + +.lr.ph: ; preds = %0, %.lr.ph + %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ] + %2 = getelementptr inbounds i32* %A, i64 %indvars.iv + %3 = load i32* %2, align 4 + %4 = add nsw i32 %3, 6 + store i32 %4, i32* %2, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %._crit_edge, label %.lr.ph + +._crit_edge: ; preds = %.lr.ph, %0 + ret i32 undef +} diff --git a/test/Transforms/LoopVectorize/X86/unroll_selection.ll b/test/Transforms/LoopVectorize/X86/unroll_selection.ll new file mode 100644 index 000000000000..2d7b663804f5 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/unroll_selection.ll @@ -0,0 +1,71 @@ +; RUN: opt < %s -loop-vectorize -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx -force-vector-width=4 -force-vector-unroll=0 -dce -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +; Don't unroll when we have register pressure. +;CHECK: reg_pressure +;CHECK: load <4 x double> +;CHECK-NOT: load <4 x double> +;CHECK: store <4 x double> +;CHECK-NOT: store <4 x double> +;CHECK: ret +define void @reg_pressure(double* nocapture %A, i32 %n) nounwind uwtable ssp { + %1 = sext i32 %n to i64 + br label %2 + +; <label>:2 ; preds = %2, %0 + %indvars.iv = phi i64 [ %indvars.iv.next, %2 ], [ %1, %0 ] + %3 = getelementptr inbounds double* %A, i64 %indvars.iv + %4 = load double* %3, align 8 + %5 = fadd double %4, 3.000000e+00 + %6 = fmul double %4, 2.000000e+00 + %7 = fadd double %5, %6 + %8 = fadd double %7, 2.000000e+00 + %9 = fmul double %8, 5.000000e-01 + %10 = fadd double %6, %9 + %11 = fsub double %10, %5 + %12 = fadd double %4, %11 + %13 = fdiv double %8, %12 + %14 = fmul double %13, %8 + %15 = fmul double %6, %14 + %16 = fmul double %5, %15 + %17 = fadd double %16, -3.000000e+00 + %18 = fsub double %4, %5 + %19 = fadd double %6, %18 + %20 = fadd double %13, %19 + %21 = fadd double %20, %17 + %22 = fadd double %21, 3.000000e+00 + %23 = fmul double %4, %22 + store double %23, double* %3, align 8 + %indvars.iv.next = add i64 %indvars.iv, -1 + %24 = trunc i64 %indvars.iv to i32 + %25 = icmp eq i32 %24, 0 + br i1 %25, label %26, label %2 + +; <label>:26 ; preds = %2 + ret void +} + +; This is a small loop. Unroll it twice. +;CHECK: small_loop +;CHECK: xor +;CHECK: xor +;CHECK: ret +define void @small_loop(i16* nocapture %A, i64 %n) nounwind uwtable ssp { + %1 = icmp eq i64 %n, 0 + br i1 %1, label %._crit_edge, label %.lr.ph + +.lr.ph: ; preds = %0, %.lr.ph + %i.01 = phi i64 [ %5, %.lr.ph ], [ 0, %0 ] + %2 = getelementptr inbounds i16* %A, i64 %i.01 + %3 = load i16* %2, align 2 + %4 = xor i16 %3, 3 + store i16 %4, i16* %2, align 2 + %5 = add i64 %i.01, 1 + %exitcond = icmp eq i64 %5, %n + br i1 %exitcond, label %._crit_edge, label %.lr.ph + +._crit_edge: ; preds = %.lr.ph, %0 + ret void +} diff --git a/test/Transforms/LoopVectorize/X86/vector-scalar-select-cost.ll b/test/Transforms/LoopVectorize/X86/vector-scalar-select-cost.ll new file mode 100644 index 000000000000..3b3a7875ab36 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/vector-scalar-select-cost.ll @@ -0,0 +1,66 @@ +; RUN: opt < %s -loop-vectorize -mcpu=core2 -debug-only=loop-vectorize 2>&1 -S | FileCheck %s +; REQUIRES: asserts +; Make sure we use the right select kind when querying select costs. + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@a = common global [2048 x i32] zeroinitializer, align 16 +@b = common global [2048 x i32] zeroinitializer, align 16 +@c = common global [2048 x i32] zeroinitializer, align 16 + +; CHECK: Checking a loop in "scalarselect" +define void @scalarselect(i1 %cond) { + br label %1 + +; <label>:1 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ] + %2 = getelementptr inbounds [2048 x i32]* @b, i64 0, i64 %indvars.iv + %3 = load i32* %2, align 4 + %4 = getelementptr inbounds [2048 x i32]* @c, i64 0, i64 %indvars.iv + %5 = load i32* %4, align 4 + %6 = add nsw i32 %5, %3 + %7 = getelementptr inbounds [2048 x i32]* @a, i64 0, i64 %indvars.iv + +; A scalar select has a cost of 1 on core2 +; CHECK: cost of 1 for VF 2 {{.*}} select i1 %cond, i32 %6, i32 0 + + %sel = select i1 %cond, i32 %6, i32 zeroinitializer + store i32 %sel, i32* %7, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 256 + br i1 %exitcond, label %8, label %1 + +; <label>:8 + ret void +} + +; CHECK: Checking a loop in "vectorselect" +define void @vectorselect(i1 %cond) { + br label %1 + +; <label>:1 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ] + %2 = getelementptr inbounds [2048 x i32]* @b, i64 0, i64 %indvars.iv + %3 = load i32* %2, align 4 + %4 = getelementptr inbounds [2048 x i32]* @c, i64 0, i64 %indvars.iv + %5 = load i32* %4, align 4 + %6 = add nsw i32 %5, %3 + %7 = getelementptr inbounds [2048 x i32]* @a, i64 0, i64 %indvars.iv + %8 = icmp ult i64 %indvars.iv, 8 + +; A vector select has a cost of 4 on core2 +; CHECK: cost of 4 for VF 2 {{.*}} select i1 %8, i32 %6, i32 0 + + %sel = select i1 %8, i32 %6, i32 zeroinitializer + store i32 %sel, i32* %7, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 256 + br i1 %exitcond, label %9, label %1 + +; <label>:9 + ret void +} + diff --git a/test/Transforms/LoopVectorize/X86/vector_ptr_load_store.ll b/test/Transforms/LoopVectorize/X86/vector_ptr_load_store.ll new file mode 100644 index 000000000000..59bb8d0054c5 --- /dev/null +++ b/test/Transforms/LoopVectorize/X86/vector_ptr_load_store.ll @@ -0,0 +1,150 @@ +; RUN: opt -loop-vectorize -mcpu=corei7-avx -debug -S < %s 2>&1 | FileCheck %s +; REQUIRES: asserts + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +%0 = type { %0*, %1 } +%1 = type { i8*, i32 } + +@p = global [2048 x [8 x i32*]] zeroinitializer, align 16 +@q = global [2048 x i16] zeroinitializer, align 16 +@r = global [2048 x i16] zeroinitializer, align 16 + +; Tests for widest type +; Ensure that we count the pointer store in the first test case. We have a +; consecutive vector of pointers store, therefore we should count it towards the +; widest vector count. +; +; CHECK: test_consecutive_store +; CHECK: The Widest type: 64 bits +define void @test_consecutive_store(%0**, %0**, %0** nocapture) nounwind ssp uwtable align 2 { + %4 = load %0** %2, align 8 + %5 = icmp eq %0** %0, %1 + br i1 %5, label %12, label %6 + +; <label>:6 ; preds = %3 + br label %7 + +; <label>:7 ; preds = %7, %6 + %8 = phi %0** [ %0, %6 ], [ %9, %7 ] + store %0* %4, %0** %8, align 8 + %9 = getelementptr inbounds %0** %8, i64 1 + %10 = icmp eq %0** %9, %1 + br i1 %10, label %11, label %7 + +; <label>:11 ; preds = %7 + br label %12 + +; <label>:12 ; preds = %11, %3 + ret void +} + +; However, if the store of a set of pointers is not to consecutive memory we do +; NOT count the store towards the widest vector type. +; In the test case below we add i16 types to store it in an array of pointer, +; therefore the widest type should be i16. +; int* p[2048][8]; +; short q[2048]; +; for (int y = 0; y < 8; ++y) +; for (int i = 0; i < 1024; ++i) { +; p[i][y] = (int*) (1 + q[i]); +; } +; CHECK: test_nonconsecutive_store +; CHECK: The Widest type: 16 bits +define void @test_nonconsecutive_store() nounwind ssp uwtable { + br label %1 + +; <label>:1 ; preds = %14, %0 + %2 = phi i64 [ 0, %0 ], [ %15, %14 ] + br label %3 + +; <label>:3 ; preds = %3, %1 + %4 = phi i64 [ 0, %1 ], [ %11, %3 ] + %5 = getelementptr inbounds [2048 x i16]* @q, i64 0, i64 %4 + %6 = load i16* %5, align 2 + %7 = sext i16 %6 to i64 + %8 = add i64 %7, 1 + %9 = inttoptr i64 %8 to i32* + %10 = getelementptr inbounds [2048 x [8 x i32*]]* @p, i64 0, i64 %4, i64 %2 + store i32* %9, i32** %10, align 8 + %11 = add i64 %4, 1 + %12 = trunc i64 %11 to i32 + %13 = icmp ne i32 %12, 1024 + br i1 %13, label %3, label %14 + +; <label>:14 ; preds = %3 + %15 = add i64 %2, 1 + %16 = trunc i64 %15 to i32 + %17 = icmp ne i32 %16, 8 + br i1 %17, label %1, label %18 + +; <label>:18 ; preds = %14 + ret void +} + + +@ia = global [1024 x i32*] zeroinitializer, align 16 +@ib = global [1024 x i32] zeroinitializer, align 16 +@ic = global [1024 x i8] zeroinitializer, align 16 +@p2 = global [2048 x [8 x i32*]] zeroinitializer, align 16 +@q2 = global [2048 x i16] zeroinitializer, align 16 + +;; Now we check the same rules for loads. We should take consecutive loads of +;; pointer types into account. +; CHECK: test_consecutive_ptr_load +; CHECK: The Widest type: 64 bits +define i8 @test_consecutive_ptr_load() nounwind readonly ssp uwtable { + br label %1 + +; <label>:1 ; preds = %1, %0 + %2 = phi i64 [ 0, %0 ], [ %10, %1 ] + %3 = phi i8 [ 0, %0 ], [ %9, %1 ] + %4 = getelementptr inbounds [1024 x i32*]* @ia, i32 0, i64 %2 + %5 = load i32** %4, align 4 + %6 = ptrtoint i32* %5 to i64 + %7 = trunc i64 %6 to i8 + %8 = add i8 %3, 1 + %9 = add i8 %7, %8 + %10 = add i64 %2, 1 + %11 = icmp ne i64 %10, 1024 + br i1 %11, label %1, label %12 + +; <label>:12 ; preds = %1 + %13 = phi i8 [ %9, %1 ] + ret i8 %13 +} + +;; However, we should not take unconsecutive loads of pointers into account. +; CHECK: test_nonconsecutive_ptr_load +; CHECK: The Widest type: 16 bits +define void @test_nonconsecutive_ptr_load() nounwind ssp uwtable { + br label %1 + +; <label>:1 ; preds = %13, %0 + %2 = phi i64 [ 0, %0 ], [ %14, %13 ] + br label %3 + +; <label>:3 ; preds = %3, %1 + %4 = phi i64 [ 0, %1 ], [ %10, %3 ] + %5 = getelementptr inbounds [2048 x [8 x i32*]]* @p2, i64 0, i64 %4, i64 %2 + %6 = getelementptr inbounds [2048 x i16]* @q2, i64 0, i64 %4 + %7 = load i32** %5, align 2 + %8 = ptrtoint i32* %7 to i64 + %9 = trunc i64 %8 to i16 + store i16 %9, i16* %6, align 8 + %10 = add i64 %4, 1 + %11 = trunc i64 %10 to i32 + %12 = icmp ne i32 %11, 1024 + br i1 %12, label %3, label %13 + +; <label>:13 ; preds = %3 + %14 = add i64 %2, 1 + %15 = trunc i64 %14 to i32 + %16 = icmp ne i32 %15, 8 + br i1 %16, label %1, label %17 + +; <label>:17 ; preds = %13 + ret void +} + diff --git a/test/Transforms/LoopVectorize/bzip_reverse_loops.ll b/test/Transforms/LoopVectorize/bzip_reverse_loops.ll new file mode 100644 index 000000000000..431e422c2fbe --- /dev/null +++ b/test/Transforms/LoopVectorize/bzip_reverse_loops.ll @@ -0,0 +1,71 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S -enable-if-conversion | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +;CHECK: fc +;CHECK: load <4 x i16> +;CHECK-NEXT: shufflevector <4 x i16> +;CHECK: select <4 x i1> +;CHECK: store <4 x i16> +;CHECK: ret +define void @fc(i16* nocapture %p, i32 %n, i32 %size) nounwind uwtable ssp { +entry: + br label %do.body + +do.body: ; preds = %cond.end, %entry + %n.addr.0 = phi i32 [ %n, %entry ], [ %dec, %cond.end ] + %p.addr.0 = phi i16* [ %p, %entry ], [ %incdec.ptr, %cond.end ] + %incdec.ptr = getelementptr inbounds i16* %p.addr.0, i64 -1 + %0 = load i16* %incdec.ptr, align 2, !tbaa !0 + %conv = zext i16 %0 to i32 + %cmp = icmp ult i32 %conv, %size + br i1 %cmp, label %cond.end, label %cond.true + +cond.true: ; preds = %do.body + %sub = sub i32 %conv, %size + %phitmp = trunc i32 %sub to i16 + br label %cond.end + +cond.end: ; preds = %do.body, %cond.true + %cond = phi i16 [ %phitmp, %cond.true ], [ 0, %do.body ] + store i16 %cond, i16* %incdec.ptr, align 2, !tbaa !0 + %dec = add i32 %n.addr.0, -1 + %tobool = icmp eq i32 %dec, 0 + br i1 %tobool, label %do.end, label %do.body + +do.end: ; preds = %cond.end + ret void +} + +;CHECK: example1 +;CHECK: load <4 x i32> +;CHECK-NEXT: shufflevector <4 x i32> +;CHECK: select <4 x i1> +;CHECK: store <4 x i32> +;CHECK: ret +define void @example1(i32* nocapture %a, i32 %n, i32 %wsize) nounwind uwtable ssp { +entry: + br label %do.body + +do.body: ; preds = %do.body, %entry + %n.addr.0 = phi i32 [ %n, %entry ], [ %dec, %do.body ] + %p.0 = phi i32* [ %a, %entry ], [ %incdec.ptr, %do.body ] + %incdec.ptr = getelementptr inbounds i32* %p.0, i64 -1 + %0 = load i32* %incdec.ptr, align 4, !tbaa !3 + %cmp = icmp slt i32 %0, %wsize + %sub = sub nsw i32 %0, %wsize + %cond = select i1 %cmp, i32 0, i32 %sub + store i32 %cond, i32* %incdec.ptr, align 4, !tbaa !3 + %dec = add nsw i32 %n.addr.0, -1 + %tobool = icmp eq i32 %dec, 0 + br i1 %tobool, label %do.end, label %do.body + +do.end: ; preds = %do.body + ret void +} + +!0 = metadata !{metadata !"short", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"int", metadata !1} diff --git a/test/Transforms/LoopVectorize/calloc.ll b/test/Transforms/LoopVectorize/calloc.ll new file mode 100644 index 000000000000..08c84eff5dbf --- /dev/null +++ b/test/Transforms/LoopVectorize/calloc.ll @@ -0,0 +1,53 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +;CHECK: hexit +;CHECK: zext <4 x i8> +;CHECK: ret + +define noalias i8* @hexit(i8* nocapture %bytes, i64 %length) nounwind uwtable ssp { +entry: + %shl = shl i64 %length, 1 + %add28 = or i64 %shl, 1 + %call = tail call i8* @calloc(i64 1, i64 %add28) nounwind + %cmp29 = icmp eq i64 %shl, 0 + br i1 %cmp29, label %for.end, label %for.body.lr.ph + +for.body.lr.ph: ; preds = %entry + %0 = shl i64 %length, 1 + br label %for.body + +for.body: ; preds = %for.body, %for.body.lr.ph + %i.030 = phi i64 [ 0, %for.body.lr.ph ], [ %inc, %for.body ] + %shr = lshr i64 %i.030, 1 + %arrayidx = getelementptr inbounds i8* %bytes, i64 %shr + %1 = load i8* %arrayidx, align 1, !tbaa !0 + %conv = zext i8 %1 to i32 + %and = shl i64 %i.030, 2 + %neg = and i64 %and, 4 + %and3 = xor i64 %neg, 4 + %sh_prom = trunc i64 %and3 to i32 + %shl4 = shl i32 15, %sh_prom + %and5 = and i32 %conv, %shl4 + %shr11 = lshr i32 %and5, %sh_prom + %conv13 = and i32 %shr11, 254 + %cmp15 = icmp ugt i32 %conv13, 9 + %cond = select i1 %cmp15, i32 87, i32 48 + %add17 = add nsw i32 %cond, %shr11 + %conv18 = trunc i32 %add17 to i8 + %arrayidx19 = getelementptr inbounds i8* %call, i64 %i.030 + store i8 %conv18, i8* %arrayidx19, align 1, !tbaa !0 + %inc = add i64 %i.030, 1 + %exitcond = icmp eq i64 %inc, %0 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret i8* %call +} + +declare noalias i8* @calloc(i64, i64) nounwind + +!0 = metadata !{metadata !"omnipotent char", metadata !1} +!1 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/Transforms/LoopVectorize/cast-induction.ll b/test/Transforms/LoopVectorize/cast-induction.ll new file mode 100644 index 000000000000..2aa29ed2c820 --- /dev/null +++ b/test/Transforms/LoopVectorize/cast-induction.ll @@ -0,0 +1,30 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +; rdar://problem/12848162 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@a = common global [2048 x i32] zeroinitializer, align 16 + +;CHECK: @example12 +;CHECK: trunc i64 +;CHECK: store <4 x i32> +;CHECK: ret void +define void @example12() nounwind uwtable ssp { + br label %1 + +; <label>:1 ; preds = %1, %0 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ] + %2 = getelementptr inbounds [2048 x i32]* @a, i64 0, i64 %indvars.iv + %3 = trunc i64 %indvars.iv to i32 + store i32 %3, i32* %2, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 1024 + br i1 %exitcond, label %4, label %1 + +; <label>:4 ; preds = %1 + ret void +} + diff --git a/test/Transforms/LoopVectorize/cpp-new-array.ll b/test/Transforms/LoopVectorize/cpp-new-array.ll index 26902eba9e29..da0fb05fe843 100644 --- a/test/Transforms/LoopVectorize/cpp-new-array.ll +++ b/test/Transforms/LoopVectorize/cpp-new-array.ll @@ -1,10 +1,10 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" ;CHECK: @cpp_new_arrays -;CHECK: insertelement <4 x i32> +;CHECK: sext i32 ;CHECK: load <4 x float> ;CHECK: fadd <4 x float> ;CHECK: ret i32 diff --git a/test/Transforms/LoopVectorize/dbg.value.ll b/test/Transforms/LoopVectorize/dbg.value.ll new file mode 100644 index 000000000000..a2ea9511bb22 --- /dev/null +++ b/test/Transforms/LoopVectorize/dbg.value.ll @@ -0,0 +1,70 @@ +; RUN: opt < %s -S -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine | FileCheck %s +; Make sure we vectorize with debugging turned on. + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@A = global [1024 x i32] zeroinitializer, align 16 +@B = global [1024 x i32] zeroinitializer, align 16 +@C = global [1024 x i32] zeroinitializer, align 16 + +; CHECK: @test +define i32 @test() #0 { +entry: + tail call void @llvm.dbg.value(metadata !1, i64 0, metadata !9), !dbg !18 + br label %for.body, !dbg !18 + +for.body: + ;CHECK: load <4 x i32> + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds [1024 x i32]* @B, i64 0, i64 %indvars.iv, !dbg !19 + %0 = load i32* %arrayidx, align 4, !dbg !19, !tbaa !21 + %arrayidx2 = getelementptr inbounds [1024 x i32]* @C, i64 0, i64 %indvars.iv, !dbg !19 + %1 = load i32* %arrayidx2, align 4, !dbg !19, !tbaa !21 + %add = add nsw i32 %1, %0, !dbg !19 + %arrayidx4 = getelementptr inbounds [1024 x i32]* @A, i64 0, i64 %indvars.iv, !dbg !19 + store i32 %add, i32* %arrayidx4, align 4, !dbg !19, !tbaa !21 + %indvars.iv.next = add i64 %indvars.iv, 1, !dbg !18 + tail call void @llvm.dbg.value(metadata !{null}, i64 0, metadata !9), !dbg !18 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32, !dbg !18 + %exitcond = icmp ne i32 %lftr.wideiv, 1024, !dbg !18 + br i1 %exitcond, label %for.body, label %for.end, !dbg !18 + +for.end: + ret i32 0, !dbg !24 +} + +declare void @llvm.dbg.declare(metadata, metadata) #1 + +declare void @llvm.dbg.value(metadata, i64, metadata) #1 + +attributes #0 = { nounwind ssp uwtable "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="pic" "ssp-buffers-size"="8" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"test", metadata !"/path/to/somewhere", metadata !"clang", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !2, metadata !11, metadata !""} +!1 = metadata !{i32 0} +!2 = metadata !{metadata !3} +!3 = metadata !{i32 786478, i32 0, metadata !4, metadata !"test", metadata !"test", metadata !"test", metadata !4, i32 5, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @test, null, null, metadata !8, i32 5} +!4 = metadata !{i32 786473, metadata !"test", metadata !"/path/to/somewhere", null} +!5 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !6, i32 0, i32 0} +!6 = metadata !{metadata !7} +!7 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786688, metadata !10, metadata !"i", metadata !4, i32 6, metadata !7, i32 0, i32 0} +!10 = metadata !{i32 786443, metadata !3, i32 6, i32 0, metadata !4, i32 0} +!11 = metadata !{metadata !12, metadata !16, metadata !17} +!12 = metadata !{i32 786484, i32 0, null, metadata !"A", metadata !"A", metadata !"", metadata !4, i32 1, metadata !13, i32 0, i32 1, [1024 x i32]* @A, null} +!13 = metadata !{i32 786433, null, metadata !"", null, i32 0, i64 32768, i64 32, i32 0, i32 0, metadata !7, metadata !14, i32 0, i32 0} +!14 = metadata !{metadata !15} +!15 = metadata !{i32 786465, i64 0, i64 1024} +!16 = metadata !{i32 786484, i32 0, null, metadata !"B", metadata !"B", metadata !"", metadata !4, i32 2, metadata !13, i32 0, i32 1, [1024 x i32]* @B, null} +!17 = metadata !{i32 786484, i32 0, null, metadata !"C", metadata !"C", metadata !"", metadata !4, i32 3, metadata !13, i32 0, i32 1, [1024 x i32]* @C, null} +!18 = metadata !{i32 6, i32 0, metadata !10, null} +!19 = metadata !{i32 7, i32 0, metadata !20, null} +!20 = metadata !{i32 786443, metadata !10, i32 6, i32 0, metadata !4, i32 1} +!21 = metadata !{metadata !"int", metadata !22} +!22 = metadata !{metadata !"omnipotent char", metadata !23} +!23 = metadata !{metadata !"Simple C/C++ TBAA"} +!24 = metadata !{i32 9, i32 0, metadata !3, null} diff --git a/test/Transforms/LoopVectorize/flags.ll b/test/Transforms/LoopVectorize/flags.ll index 2f22a764572f..656912e178f9 100644 --- a/test/Transforms/LoopVectorize/flags.ll +++ b/test/Transforms/LoopVectorize/flags.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/LoopVectorize/float-reduction.ll b/test/Transforms/LoopVectorize/float-reduction.ll new file mode 100644 index 000000000000..565684cccb9a --- /dev/null +++ b/test/Transforms/LoopVectorize/float-reduction.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" +;CHECK: @foo +;CHECK: fadd <4 x float> +;CHECK: ret +define float @foo(float* nocapture %A, i32* nocapture %n) nounwind uwtable readonly ssp { +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %sum.04 = phi float [ 0.000000e+00, %entry ], [ %add, %for.body ] + %arrayidx = getelementptr inbounds float* %A, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %add = fadd fast float %sum.04, %0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 200 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret float %add +} + +!0 = metadata !{metadata !"float", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/Transforms/LoopVectorize/gcc-examples.ll b/test/Transforms/LoopVectorize/gcc-examples.ll index fce29d240487..f335557c0019 100644 --- a/test/Transforms/LoopVectorize/gcc-examples.ll +++ b/test/Transforms/LoopVectorize/gcc-examples.ll @@ -1,4 +1,5 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-width=4 -force-vector-unroll=1 -dce -instcombine -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-width=4 -force-vector-unroll=4 -dce -instcombine -S | FileCheck %s -check-prefix=UNROLL target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" @@ -24,6 +25,20 @@ target triple = "x86_64-apple-macosx10.8.0" ;CHECK: add nsw <4 x i32> ;CHECK: store <4 x i32> ;CHECK: ret void +;UNROLL: @example1 +;UNROLL: load <4 x i32> +;UNROLL: load <4 x i32> +;UNROLL: load <4 x i32> +;UNROLL: load <4 x i32> +;UNROLL: add nsw <4 x i32> +;UNROLL: add nsw <4 x i32> +;UNROLL: add nsw <4 x i32> +;UNROLL: add nsw <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: ret void define void @example1() nounwind uwtable ssp { br label %1 @@ -48,6 +63,12 @@ define void @example1() nounwind uwtable ssp { ;CHECK: @example2 ;CHECK: store <4 x i32> ;CHECK: ret void +;UNROLL: @example2 +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: ret void define void @example2(i32 %n, i32 %x) nounwind uwtable ssp { %1 = icmp sgt i32 %n, 0 br i1 %1, label %.lr.ph5, label %.preheader @@ -89,10 +110,15 @@ define void @example2(i32 %n, i32 %x) nounwind uwtable ssp { ret void } -; We can't vectorize this loop because it has non constant loop bounds. ;CHECK: @example3 -;CHECK-NOT: <4 x i32> +;CHECK: <4 x i32> ;CHECK: ret void +;UNROLL: @example3 +;UNROLL: <4 x i32> +;UNROLL: <4 x i32> +;UNROLL: <4 x i32> +;UNROLL: <4 x i32> +;UNROLL: ret void define void @example3(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture %q) nounwind uwtable ssp { %1 = icmp eq i32 %n, 0 br i1 %1, label %._crit_edge, label %.lr.ph @@ -116,6 +142,12 @@ define void @example3(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture ;CHECK: @example4 ;CHECK: load <4 x i32> ;CHECK: ret void +;UNROLL: @example4 +;UNROLL: load <4 x i32> +;UNROLL: load <4 x i32> +;UNROLL: load <4 x i32> +;UNROLL: load <4 x i32> +;UNROLL: ret void define void @example4(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture %q) nounwind uwtable ssp { %1 = add nsw i32 %n, -1 %2 = icmp eq i32 %n, 0 @@ -176,6 +208,12 @@ define void @example4(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture ;CHECK: @example8 ;CHECK: store <4 x i32> ;CHECK: ret void +;UNROLL: @example8 +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: store <4 x i32> +;UNROLL: ret void define void @example8(i32 %x) nounwind uwtable ssp { br label %.preheader @@ -330,7 +368,7 @@ define void @example11() nounwind uwtable ssp { } ;CHECK: @example12 -;CHECK: trunc <4 x i64> +;CHECK: trunc i64 ;CHECK: store <4 x i32> ;CHECK: ret void define void @example12() nounwind uwtable ssp { @@ -391,9 +429,9 @@ define void @example13(i32** nocapture %A, i32** nocapture %B, i32* nocapture %o ret void } -; Can't vectorize because of reductions. +; Can vectorize. ;CHECK: @example14 -;CHECK-NOT: <4 x i32> +;CHECK: <4 x i32> ;CHECK: ret void define void @example14(i32** nocapture %in, i32** nocapture %coeff, i32* nocapture %out) nounwind uwtable ssp { .preheader3: @@ -537,9 +575,9 @@ define void @example14(i32** nocapture %in, i32** nocapture %coeff, i32* nocaptu ret void } -; Can't vectorize because the src and dst pointers are not disjoint. ;CHECK: @example21 -;CHECK-NOT: <4 x i32> +;CHECK: load <4 x i32> +;CHECK: shufflevector {{.*}} <i32 3, i32 2, i32 1, i32 0> ;CHECK: ret i32 define i32 @example21(i32* nocapture %b, i32 %n) nounwind uwtable readonly ssp { %1 = icmp sgt i32 %n, 0 @@ -565,9 +603,8 @@ define i32 @example21(i32* nocapture %b, i32 %n) nounwind uwtable readonly ssp { ret i32 %a.0.lcssa } -; Can't vectorize because there are multiple PHIs. ;CHECK: @example23 -;CHECK-NOT: <4 x i32> +;CHECK: <4 x i32> ;CHECK: ret void define void @example23(i16* nocapture %src, i32* nocapture %dst) nounwind uwtable ssp { br label %1 diff --git a/test/Transforms/LoopVectorize/global_alias.ll b/test/Transforms/LoopVectorize/global_alias.ll new file mode 100644 index 000000000000..121da8ba7e16 --- /dev/null +++ b/test/Transforms/LoopVectorize/global_alias.ll @@ -0,0 +1,1078 @@ +; RUN: opt < %s -O3 -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64" + +%struct.anon = type { [100 x i32], i32, [100 x i32] } +%struct.anon.0 = type { [100 x [100 x i32]], i32, [100 x [100 x i32]] } + +@Foo = common global %struct.anon zeroinitializer, align 4 +@Bar = common global %struct.anon.0 zeroinitializer, align 4 + +@PB = external global i32* +@PA = external global i32* + + +;; === First, the tests that should always vectorize, wither statically or by adding run-time checks === + + +; /// Different objects, positive induction, constant distance +; int noAlias01 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[i] = Foo.B[i] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @noAlias01 +; CHECK: add nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias01(i32 %a) nounwind { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %arrayidx1 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %4 + store i32 %add, i32* %arrayidx1, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx2 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx2, align 4 + ret i32 %7 +} + +; /// Different objects, positive induction with widening slide +; int noAlias02 (int a) { +; int i; +; for (i=0; i<SIZE-10; i++) +; Foo.A[i] = Foo.B[i+10] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @noAlias02 +; CHECK: add nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias02(i32 %a) { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 90 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %add = add nsw i32 %1, 10 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %add + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add1 = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %arrayidx2 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %4 + store i32 %add1, i32* %arrayidx2, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx3 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx3, align 4 + ret i32 %7 +} + +; /// Different objects, positive induction with shortening slide +; int noAlias03 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[i+10] = Foo.B[i] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @noAlias03 +; CHECK: add nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias03(i32 %a) { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %add1 = add nsw i32 %4, 10 + %arrayidx2 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %add1 + store i32 %add, i32* %arrayidx2, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx3 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx3, align 4 + ret i32 %7 +} + +; /// Pointer access, positive stride, run-time check added +; int noAlias04 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; *(PA+i) = *(PB+i) + a; +; return *(PA+a); +; } +; CHECK: define i32 @noAlias04 +; CHECK-NOT: add nsw <4 x i32> +; CHECK: ret +; +; TODO: This test vectorizes (with run-time check) on real targets with -O3) +; Check why it's not being vectorized even when forcing vectorization + +define i32 @noAlias04(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32** @PB, align 4 + %2 = load i32* %i, align 4 + %add.ptr = getelementptr inbounds i32* %1, i32 %2 + %3 = load i32* %add.ptr, align 4 + %4 = load i32* %a.addr, align 4 + %add = add nsw i32 %3, %4 + %5 = load i32** @PA, align 4 + %6 = load i32* %i, align 4 + %add.ptr1 = getelementptr inbounds i32* %5, i32 %6 + store i32 %add, i32* %add.ptr1, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %7 = load i32* %i, align 4 + %inc = add nsw i32 %7, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %8 = load i32** @PA, align 4 + %9 = load i32* %a.addr, align 4 + %add.ptr2 = getelementptr inbounds i32* %8, i32 %9 + %10 = load i32* %add.ptr2, align 4 + ret i32 %10 +} + +; /// Different objects, positive induction, multi-array +; int noAlias05 (int a) { +; int i, N=10; +; for (i=0; i<SIZE; i++) +; Bar.A[N][i] = Bar.B[N][i] + a; +; return Bar.A[N][a]; +; } +; CHECK: define i32 @noAlias05 +; CHECK: add nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias05(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + %N = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 10, i32* %N, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %2 = load i32* %N, align 4 + %arrayidx = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 2), i32 0, i32 %2 + %arrayidx1 = getelementptr inbounds [100 x i32]* %arrayidx, i32 0, i32 %1 + %3 = load i32* %arrayidx1, align 4 + %4 = load i32* %a.addr, align 4 + %add = add nsw i32 %3, %4 + %5 = load i32* %i, align 4 + %6 = load i32* %N, align 4 + %arrayidx2 = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %6 + %arrayidx3 = getelementptr inbounds [100 x i32]* %arrayidx2, i32 0, i32 %5 + store i32 %add, i32* %arrayidx3, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %7 = load i32* %i, align 4 + %inc = add nsw i32 %7, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %8 = load i32* %a.addr, align 4 + %9 = load i32* %N, align 4 + %arrayidx4 = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %9 + %arrayidx5 = getelementptr inbounds [100 x i32]* %arrayidx4, i32 0, i32 %8 + %10 = load i32* %arrayidx5, align 4 + ret i32 %10 +} + +; /// Same objects, positive induction, multi-array, different sub-elements +; int noAlias06 (int a) { +; int i, N=10; +; for (i=0; i<SIZE; i++) +; Bar.A[N][i] = Bar.A[N+1][i] + a; +; return Bar.A[N][a]; +; } +; CHECK: define i32 @noAlias06 +; CHECK: add nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias06(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + %N = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 10, i32* %N, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %2 = load i32* %N, align 4 + %add = add nsw i32 %2, 1 + %arrayidx = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %add + %arrayidx1 = getelementptr inbounds [100 x i32]* %arrayidx, i32 0, i32 %1 + %3 = load i32* %arrayidx1, align 4 + %4 = load i32* %a.addr, align 4 + %add2 = add nsw i32 %3, %4 + %5 = load i32* %i, align 4 + %6 = load i32* %N, align 4 + %arrayidx3 = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %6 + %arrayidx4 = getelementptr inbounds [100 x i32]* %arrayidx3, i32 0, i32 %5 + store i32 %add2, i32* %arrayidx4, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %7 = load i32* %i, align 4 + %inc = add nsw i32 %7, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %8 = load i32* %a.addr, align 4 + %9 = load i32* %N, align 4 + %arrayidx5 = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %9 + %arrayidx6 = getelementptr inbounds [100 x i32]* %arrayidx5, i32 0, i32 %8 + %10 = load i32* %arrayidx6, align 4 + ret i32 %10 +} + +; /// Different objects, negative induction, constant distance +; int noAlias07 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[SIZE-i-1] = Foo.B[SIZE-i-1] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @noAlias07 +; CHECK: sub nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias07(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 1 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %sub1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %sub2 = sub nsw i32 100, %4 + %sub3 = sub nsw i32 %sub2, 1 + %arrayidx4 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %sub3 + store i32 %add, i32* %arrayidx4, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx5 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx5, align 4 + ret i32 %7 +} + +; /// Different objects, negative induction, shortening slide +; int noAlias08 (int a) { +; int i; +; for (i=0; i<SIZE-10; i++) +; Foo.A[SIZE-i-1] = Foo.B[SIZE-i-10] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @noAlias08 +; CHECK: sub nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias08(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 90 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 10 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %sub1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %sub2 = sub nsw i32 100, %4 + %sub3 = sub nsw i32 %sub2, 1 + %arrayidx4 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %sub3 + store i32 %add, i32* %arrayidx4, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx5 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx5, align 4 + ret i32 %7 +} + +; /// Different objects, negative induction, widening slide +; int noAlias09 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[SIZE-i-10] = Foo.B[SIZE-i-1] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @noAlias09 +; CHECK: sub nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias09(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 1 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %sub1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %sub2 = sub nsw i32 100, %4 + %sub3 = sub nsw i32 %sub2, 10 + %arrayidx4 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %sub3 + store i32 %add, i32* %arrayidx4, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx5 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx5, align 4 + ret i32 %7 +} + +; /// Pointer access, negative stride, run-time check added +; int noAlias10 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; *(PA+SIZE-i-1) = *(PB+SIZE-i-1) + a; +; return *(PA+a); +; } +; CHECK: define i32 @noAlias10 +; CHECK-NOT: sub nsw <4 x i32> +; CHECK: ret +; +; TODO: This test vectorizes (with run-time check) on real targets with -O3) +; Check why it's not being vectorized even when forcing vectorization + +define i32 @noAlias10(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32** @PB, align 4 + %add.ptr = getelementptr inbounds i32* %1, i32 100 + %2 = load i32* %i, align 4 + %idx.neg = sub i32 0, %2 + %add.ptr1 = getelementptr inbounds i32* %add.ptr, i32 %idx.neg + %add.ptr2 = getelementptr inbounds i32* %add.ptr1, i32 -1 + %3 = load i32* %add.ptr2, align 4 + %4 = load i32* %a.addr, align 4 + %add = add nsw i32 %3, %4 + %5 = load i32** @PA, align 4 + %add.ptr3 = getelementptr inbounds i32* %5, i32 100 + %6 = load i32* %i, align 4 + %idx.neg4 = sub i32 0, %6 + %add.ptr5 = getelementptr inbounds i32* %add.ptr3, i32 %idx.neg4 + %add.ptr6 = getelementptr inbounds i32* %add.ptr5, i32 -1 + store i32 %add, i32* %add.ptr6, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %7 = load i32* %i, align 4 + %inc = add nsw i32 %7, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %8 = load i32** @PA, align 4 + %9 = load i32* %a.addr, align 4 + %add.ptr7 = getelementptr inbounds i32* %8, i32 %9 + %10 = load i32* %add.ptr7, align 4 + ret i32 %10 +} + +; /// Different objects, negative induction, multi-array +; int noAlias11 (int a) { +; int i, N=10; +; for (i=0; i<SIZE; i++) +; Bar.A[N][SIZE-i-1] = Bar.B[N][SIZE-i-1] + a; +; return Bar.A[N][a]; +; } +; CHECK: define i32 @noAlias11 +; CHECK: sub nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias11(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + %N = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 10, i32* %N, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 1 + %2 = load i32* %N, align 4 + %arrayidx = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 2), i32 0, i32 %2 + %arrayidx2 = getelementptr inbounds [100 x i32]* %arrayidx, i32 0, i32 %sub1 + %3 = load i32* %arrayidx2, align 4 + %4 = load i32* %a.addr, align 4 + %add = add nsw i32 %3, %4 + %5 = load i32* %i, align 4 + %sub3 = sub nsw i32 100, %5 + %sub4 = sub nsw i32 %sub3, 1 + %6 = load i32* %N, align 4 + %arrayidx5 = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %6 + %arrayidx6 = getelementptr inbounds [100 x i32]* %arrayidx5, i32 0, i32 %sub4 + store i32 %add, i32* %arrayidx6, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %7 = load i32* %i, align 4 + %inc = add nsw i32 %7, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %8 = load i32* %a.addr, align 4 + %9 = load i32* %N, align 4 + %arrayidx7 = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %9 + %arrayidx8 = getelementptr inbounds [100 x i32]* %arrayidx7, i32 0, i32 %8 + %10 = load i32* %arrayidx8, align 4 + ret i32 %10 +} + +; /// Same objects, negative induction, multi-array, different sub-elements +; int noAlias12 (int a) { +; int i, N=10; +; for (i=0; i<SIZE; i++) +; Bar.A[N][SIZE-i-1] = Bar.A[N+1][SIZE-i-1] + a; +; return Bar.A[N][a]; +; } +; CHECK: define i32 @noAlias12 +; CHECK: sub nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias12(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + %N = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 10, i32* %N, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 1 + %2 = load i32* %N, align 4 + %add = add nsw i32 %2, 1 + %arrayidx = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %add + %arrayidx2 = getelementptr inbounds [100 x i32]* %arrayidx, i32 0, i32 %sub1 + %3 = load i32* %arrayidx2, align 4 + %4 = load i32* %a.addr, align 4 + %add3 = add nsw i32 %3, %4 + %5 = load i32* %i, align 4 + %sub4 = sub nsw i32 100, %5 + %sub5 = sub nsw i32 %sub4, 1 + %6 = load i32* %N, align 4 + %arrayidx6 = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %6 + %arrayidx7 = getelementptr inbounds [100 x i32]* %arrayidx6, i32 0, i32 %sub5 + store i32 %add3, i32* %arrayidx7, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %7 = load i32* %i, align 4 + %inc = add nsw i32 %7, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %8 = load i32* %a.addr, align 4 + %9 = load i32* %N, align 4 + %arrayidx8 = getelementptr inbounds [100 x [100 x i32]]* getelementptr inbounds (%struct.anon.0* @Bar, i32 0, i32 0), i32 0, i32 %9 + %arrayidx9 = getelementptr inbounds [100 x i32]* %arrayidx8, i32 0, i32 %8 + %10 = load i32* %arrayidx9, align 4 + ret i32 %10 +} + +; /// Same objects, positive induction, constant distance, just enough for vector size +; int noAlias13 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[i] = Foo.A[i+4] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @noAlias13 +; CHECK: add nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias13(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %add = add nsw i32 %1, 4 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %add + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add1 = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %arrayidx2 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %4 + store i32 %add1, i32* %arrayidx2, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx3 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx3, align 4 + ret i32 %7 +} + +; /// Same objects, negative induction, constant distance, just enough for vector size +; int noAlias14 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[SIZE-i-1] = Foo.A[SIZE-i-5] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @noAlias14 +; CHECK: sub nsw <4 x i32> +; CHECK: ret + +define i32 @noAlias14(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 5 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %sub1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %sub2 = sub nsw i32 100, %4 + %sub3 = sub nsw i32 %sub2, 1 + %arrayidx4 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %sub3 + store i32 %add, i32* %arrayidx4, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx5 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx5, align 4 + ret i32 %7 +} + + +;; === Now, the tests that we could vectorize with induction changes or run-time checks === + + +; /// Different objects, swapped induction, alias at the end +; int mayAlias01 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[i] = Foo.B[SIZE-i-1] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @mayAlias01 +; CHECK-NOT: add nsw <4 x i32> +; CHECK: ret + +define i32 @mayAlias01(i32 %a) nounwind { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 1 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %sub1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %arrayidx2 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %4 + store i32 %add, i32* %arrayidx2, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx3 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx3, align 4 + ret i32 %7 +} + +; /// Different objects, swapped induction, alias at the beginning +; int mayAlias02 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[SIZE-i-1] = Foo.B[i] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @mayAlias02 +; CHECK-NOT: add nsw <4 x i32> +; CHECK: ret + +define i32 @mayAlias02(i32 %a) nounwind { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %sub = sub nsw i32 100, %4 + %sub1 = sub nsw i32 %sub, 1 + %arrayidx2 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %sub1 + store i32 %add, i32* %arrayidx2, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx3 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx3, align 4 + ret i32 %7 +} + +; /// Pointer access, run-time check added +; int mayAlias03 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; *(PA+i) = *(PB+SIZE-i-1) + a; +; return *(PA+a); +; } +; CHECK: define i32 @mayAlias03 +; CHECK-NOT: add nsw <4 x i32> +; CHECK: ret + +define i32 @mayAlias03(i32 %a) nounwind { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32** @PB, align 4 + %add.ptr = getelementptr inbounds i32* %1, i32 100 + %2 = load i32* %i, align 4 + %idx.neg = sub i32 0, %2 + %add.ptr1 = getelementptr inbounds i32* %add.ptr, i32 %idx.neg + %add.ptr2 = getelementptr inbounds i32* %add.ptr1, i32 -1 + %3 = load i32* %add.ptr2, align 4 + %4 = load i32* %a.addr, align 4 + %add = add nsw i32 %3, %4 + %5 = load i32** @PA, align 4 + %6 = load i32* %i, align 4 + %add.ptr3 = getelementptr inbounds i32* %5, i32 %6 + store i32 %add, i32* %add.ptr3, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %7 = load i32* %i, align 4 + %inc = add nsw i32 %7, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %8 = load i32** @PA, align 4 + %9 = load i32* %a.addr, align 4 + %add.ptr4 = getelementptr inbounds i32* %8, i32 %9 + %10 = load i32* %add.ptr4, align 4 + ret i32 %10 +} + + +;; === Finally, the tests that should only vectorize with care (or if we ignore undefined behaviour at all) === + + +; int mustAlias01 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[i+10] = Foo.B[SIZE-i-1] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @mustAlias01 +; CHECK-NOT: add nsw <4 x i32> +; CHECK: ret + +define i32 @mustAlias01(i32 %a) nounwind { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 1 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %sub1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %add2 = add nsw i32 %4, 10 + %arrayidx3 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %add2 + store i32 %add, i32* %arrayidx3, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx4 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx4, align 4 + ret i32 %7 +} + +; int mustAlias02 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[i] = Foo.B[SIZE-i-10] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @mustAlias02 +; CHECK-NOT: add nsw <4 x i32> +; CHECK: ret + +define i32 @mustAlias02(i32 %a) nounwind { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 10 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %sub1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %arrayidx2 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %4 + store i32 %add, i32* %arrayidx2, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx3 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx3, align 4 + ret i32 %7 +} + +; int mustAlias03 (int a) { +; int i; +; for (i=0; i<SIZE; i++) +; Foo.A[i+10] = Foo.B[SIZE-i-10] + a; +; return Foo.A[a]; +; } +; CHECK: define i32 @mustAlias03 +; CHECK-NOT: add nsw <4 x i32> +; CHECK: ret + +define i32 @mustAlias03(i32 %a) nounwind { +entry: + %a.addr = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 100 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* %i, align 4 + %sub = sub nsw i32 100, %1 + %sub1 = sub nsw i32 %sub, 10 + %arrayidx = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 2), i32 0, i32 %sub1 + %2 = load i32* %arrayidx, align 4 + %3 = load i32* %a.addr, align 4 + %add = add nsw i32 %2, %3 + %4 = load i32* %i, align 4 + %add2 = add nsw i32 %4, 10 + %arrayidx3 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %add2 + store i32 %add, i32* %arrayidx3, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %5 = load i32* %i, align 4 + %inc = add nsw i32 %5, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %6 = load i32* %a.addr, align 4 + %arrayidx4 = getelementptr inbounds [100 x i32]* getelementptr inbounds (%struct.anon* @Foo, i32 0, i32 0), i32 0, i32 %6 + %7 = load i32* %arrayidx4, align 4 + ret i32 %7 +} diff --git a/test/Transforms/LoopVectorize/i8-induction.ll b/test/Transforms/LoopVectorize/i8-induction.ll new file mode 100644 index 000000000000..7759b7085a1b --- /dev/null +++ b/test/Transforms/LoopVectorize/i8-induction.ll @@ -0,0 +1,35 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@a = common global i8 0, align 1 +@b = common global i8 0, align 1 + +define void @f() nounwind uwtable ssp { +scalar.ph: + store i8 0, i8* inttoptr (i64 1 to i8*), align 1, !tbaa !0 + %0 = load i8* @a, align 1, !tbaa !0 + br label %for.body + +for.body: + %mul16 = phi i8 [ 0, %scalar.ph ], [ %mul, %for.body ] ; <------- i8 induction var. + %c.015 = phi i8 [ undef, %scalar.ph ], [ %conv8, %for.body ] + %conv2 = sext i8 %c.015 to i32 + %tobool = icmp ne i8 %c.015, 0 + %.sink = select i1 %tobool, i8 %c.015, i8 %0 + %mul = mul i8 %mul16, %.sink + %add = add nsw i32 %conv2, 1 + %conv8 = trunc i32 %add to i8 + %sext = shl i32 %add, 24 + %phitmp14 = icmp slt i32 %sext, 268435456 + br i1 %phitmp14, label %for.body, label %for.end + +for.end: ; preds = %for.body + store i8 %mul, i8* @b, align 1, !tbaa !0 + ret void +} + +!0 = metadata !{metadata !"omnipotent char", metadata !1} +!1 = metadata !{metadata !"Simple C/C++ TBAA"} + diff --git a/test/Transforms/LoopVectorize/if-conv-crash.ll b/test/Transforms/LoopVectorize/if-conv-crash.ll new file mode 100644 index 000000000000..3283456aa3c3 --- /dev/null +++ b/test/Transforms/LoopVectorize/if-conv-crash.ll @@ -0,0 +1,39 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -enable-if-conversion + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +define fastcc void @DD_dump() nounwind uwtable ssp { +entry: + br i1 undef, label %lor.lhs.false, label %if.end25 + +lor.lhs.false: ; preds = %entry + br i1 undef, label %if.end21, label %if.else + +if.else: ; preds = %lor.lhs.false + br i1 undef, label %num_q.exit, label %while.body.i.preheader + +while.body.i.preheader: ; preds = %if.else + br label %while.body.i + +while.body.i: ; preds = %if.end.i, %while.body.i.preheader + switch i8 undef, label %if.end.i [ + i8 39, label %if.then.i + i8 92, label %if.then.i + ] + +if.then.i: ; preds = %while.body.i, %while.body.i + br label %if.end.i + +if.end.i: ; preds = %if.then.i, %while.body.i + br i1 undef, label %num_q.exit, label %while.body.i + +num_q.exit: ; preds = %if.end.i, %if.else + unreachable + +if.end21: ; preds = %lor.lhs.false + unreachable + +if.end25: ; preds = %entry + ret void +} diff --git a/test/Transforms/LoopVectorize/if-conversion-reduction.ll b/test/Transforms/LoopVectorize/if-conversion-reduction.ll new file mode 100644 index 000000000000..3a2d82e15d63 --- /dev/null +++ b/test/Transforms/LoopVectorize/if-conversion-reduction.ll @@ -0,0 +1,38 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -enable-if-conversion -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +;CHECK: @reduction_func +;CHECK-NOT: load <4 x i32> +;CHECK: ret i32 +define i32 @reduction_func(i32* nocapture %A, i32 %n) nounwind uwtable readonly ssp { +entry: + %cmp10 = icmp sgt i32 %n, 0 + br i1 %cmp10, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.inc + %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] + %sum.011 = phi i32 [ %sum.1, %for.inc ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i32* %A, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4 + %cmp1 = icmp sgt i32 %0, 30 + br i1 %cmp1, label %if.then, label %for.inc + +if.then: ; preds = %for.body + %add = add i32 %sum.011, 2 + %add4 = add i32 %add, %0 + br label %for.inc + +for.inc: ; preds = %for.body, %if.then + %sum.1 = phi i32 [ %add4, %if.then ], [ %sum.011, %for.body ] + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.inc, %entry + %sum.0.lcssa = phi i32 [ 0, %entry ], [ 4, %for.inc ] + ret i32 %sum.0.lcssa +} + diff --git a/test/Transforms/LoopVectorize/if-conversion.ll b/test/Transforms/LoopVectorize/if-conversion.ll new file mode 100644 index 000000000000..6e7c03a556c4 --- /dev/null +++ b/test/Transforms/LoopVectorize/if-conversion.ll @@ -0,0 +1,108 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -enable-if-conversion -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +; This is the loop in this example: +; +;int function0(int *a, int *b, int start, int end) { +; +; for (int i=start; i<end; ++i) { +; unsigned k = a[i]; +; +; if (a[i] > b[i]) <------ notice the IF inside the loop. +; k = k * 5 + 3; +; +; a[i] = k; <---- K is a phi node that becomes vector-select. +; } +;} + +;CHECK: @function0 +;CHECK: load <4 x i32> +;CHECK: icmp sgt <4 x i32> +;CHECK: mul <4 x i32> +;CHECK: add <4 x i32> +;CHECK: select <4 x i1> +;CHECK: ret i32 +define i32 @function0(i32* nocapture %a, i32* nocapture %b, i32 %start, i32 %end) nounwind uwtable ssp { +entry: + %cmp16 = icmp slt i32 %start, %end + br i1 %cmp16, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: + %0 = sext i32 %start to i64 + br label %for.body + +for.body: + %indvars.iv = phi i64 [ %0, %for.body.lr.ph ], [ %indvars.iv.next, %if.end ] + %arrayidx = getelementptr inbounds i32* %a, i64 %indvars.iv + %1 = load i32* %arrayidx, align 4 + %arrayidx4 = getelementptr inbounds i32* %b, i64 %indvars.iv + %2 = load i32* %arrayidx4, align 4 + %cmp5 = icmp sgt i32 %1, %2 + br i1 %cmp5, label %if.then, label %if.end + +if.then: + %mul = mul i32 %1, 5 + %add = add i32 %mul, 3 + br label %if.end + +if.end: + %k.0 = phi i32 [ %add, %if.then ], [ %1, %for.body ] + store i32 %k.0, i32* %arrayidx, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %3 = trunc i64 %indvars.iv.next to i32 + %cmp = icmp slt i32 %3, %end + br i1 %cmp, label %for.body, label %for.end + +for.end: + ret i32 undef +} + + + +; int func(int *A, int n) { +; unsigned sum = 0; +; for (int i = 0; i < n; ++i) +; if (A[i] > 30) +; sum += A[i] + 2; +; +; return sum; +; } + +;CHECK: @reduction_func +;CHECK: load <4 x i32> +;CHECK: icmp sgt <4 x i32> +;CHECK: add <4 x i32> +;CHECK: select <4 x i1> +;CHECK: ret i32 +define i32 @reduction_func(i32* nocapture %A, i32 %n) nounwind uwtable readonly ssp { +entry: + %cmp10 = icmp sgt i32 %n, 0 + br i1 %cmp10, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.inc + %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] + %sum.011 = phi i32 [ %sum.1, %for.inc ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i32* %A, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4 + %cmp1 = icmp sgt i32 %0, 30 + br i1 %cmp1, label %if.then, label %for.inc + +if.then: ; preds = %for.body + %add = add i32 %sum.011, 2 + %add4 = add i32 %add, %0 + br label %for.inc + +for.inc: ; preds = %for.body, %if.then + %sum.1 = phi i32 [ %add4, %if.then ], [ %sum.011, %for.body ] + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.inc, %entry + %sum.0.lcssa = phi i32 [ 0, %entry ], [ %sum.1, %for.inc ] + ret i32 %sum.0.lcssa +} + diff --git a/test/Transforms/LoopVectorize/increment.ll b/test/Transforms/LoopVectorize/increment.ll index 71ea7689fc04..3fa6b19ca928 100644 --- a/test/Transforms/LoopVectorize/increment.ll +++ b/test/Transforms/LoopVectorize/increment.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/LoopVectorize/induction_plus.ll b/test/Transforms/LoopVectorize/induction_plus.ll index b31bceb50df6..96595cdc16bc 100644 --- a/test/Transforms/LoopVectorize/induction_plus.ll +++ b/test/Transforms/LoopVectorize/induction_plus.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -instcombine -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" @@ -6,8 +6,7 @@ target triple = "x86_64-apple-macosx10.8.0" @array = common global [1024 x i32] zeroinitializer, align 16 ;CHECK: @array_at_plus_one -;CHECK: add <4 x i64> -;CHECK: trunc <4 x i64> +;CHECK: trunc i64 ;CHECK: add i64 %index, 12 ;CHECK: ret i32 define i32 @array_at_plus_one(i32 %n) nounwind uwtable ssp { diff --git a/test/Transforms/LoopVectorize/intrinsic.ll b/test/Transforms/LoopVectorize/intrinsic.ll new file mode 100644 index 000000000000..e79d78de67c5 --- /dev/null +++ b/test/Transforms/LoopVectorize/intrinsic.ll @@ -0,0 +1,935 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +;CHECK: @sqrt_f32 +;CHECK: llvm.sqrt.v4f32 +;CHECK: ret void +define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.sqrt.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.sqrt.f32(float) nounwind readnone + +;CHECK: @sqrt_f64 +;CHECK: llvm.sqrt.v4f64 +;CHECK: ret void +define void @sqrt_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.sqrt.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.sqrt.f64(double) nounwind readnone + +;CHECK: @sin_f32 +;CHECK: llvm.sin.v4f32 +;CHECK: ret void +define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.sin.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.sin.f32(float) nounwind readnone + +;CHECK: @sin_f64 +;CHECK: llvm.sin.v4f64 +;CHECK: ret void +define void @sin_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.sin.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.sin.f64(double) nounwind readnone + +;CHECK: @cos_f32 +;CHECK: llvm.cos.v4f32 +;CHECK: ret void +define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.cos.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.cos.f32(float) nounwind readnone + +;CHECK: @cos_f64 +;CHECK: llvm.cos.v4f64 +;CHECK: ret void +define void @cos_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.cos.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.cos.f64(double) nounwind readnone + +;CHECK: @exp_f32 +;CHECK: llvm.exp.v4f32 +;CHECK: ret void +define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.exp.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.exp.f32(float) nounwind readnone + +;CHECK: @exp_f64 +;CHECK: llvm.exp.v4f64 +;CHECK: ret void +define void @exp_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.exp.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.exp.f64(double) nounwind readnone + +;CHECK: @exp2_f32 +;CHECK: llvm.exp2.v4f32 +;CHECK: ret void +define void @exp2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.exp2.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.exp2.f32(float) nounwind readnone + +;CHECK: @exp2_f64 +;CHECK: llvm.exp2.v4f64 +;CHECK: ret void +define void @exp2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.exp2.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.exp2.f64(double) nounwind readnone + +;CHECK: @log_f32 +;CHECK: llvm.log.v4f32 +;CHECK: ret void +define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.log.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.log.f32(float) nounwind readnone + +;CHECK: @log_f64 +;CHECK: llvm.log.v4f64 +;CHECK: ret void +define void @log_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.log.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.log.f64(double) nounwind readnone + +;CHECK: @log10_f32 +;CHECK: llvm.log10.v4f32 +;CHECK: ret void +define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.log10.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.log10.f32(float) nounwind readnone + +;CHECK: @log10_f64 +;CHECK: llvm.log10.v4f64 +;CHECK: ret void +define void @log10_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.log10.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.log10.f64(double) nounwind readnone + +;CHECK: @log2_f32 +;CHECK: llvm.log2.v4f32 +;CHECK: ret void +define void @log2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.log2.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.log2.f32(float) nounwind readnone + +;CHECK: @log2_f64 +;CHECK: llvm.log2.v4f64 +;CHECK: ret void +define void @log2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.log2.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.log2.f64(double) nounwind readnone + +;CHECK: @fabs_f32 +;CHECK: llvm.fabs.v4f32 +;CHECK: ret void +define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.fabs.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.fabs.f32(float) nounwind readnone + +define void @fabs_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.fabs(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.fabs(double) nounwind readnone + +;CHECK: @floor_f32 +;CHECK: llvm.floor.v4f32 +;CHECK: ret void +define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.floor.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.floor.f32(float) nounwind readnone + +;CHECK: @floor_f64 +;CHECK: llvm.floor.v4f64 +;CHECK: ret void +define void @floor_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.floor.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.floor.f64(double) nounwind readnone + +;CHECK: @ceil_f32 +;CHECK: llvm.ceil.v4f32 +;CHECK: ret void +define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.ceil.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.ceil.f32(float) nounwind readnone + +;CHECK: @ceil_f64 +;CHECK: llvm.ceil.v4f64 +;CHECK: ret void +define void @ceil_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.ceil.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.ceil.f64(double) nounwind readnone + +;CHECK: @trunc_f32 +;CHECK: llvm.trunc.v4f32 +;CHECK: ret void +define void @trunc_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.trunc.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.trunc.f32(float) nounwind readnone + +;CHECK: @trunc_f64 +;CHECK: llvm.trunc.v4f64 +;CHECK: ret void +define void @trunc_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.trunc.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.trunc.f64(double) nounwind readnone + +;CHECK: @rint_f32 +;CHECK: llvm.rint.v4f32 +;CHECK: ret void +define void @rint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.rint.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.rint.f32(float) nounwind readnone + +;CHECK: @rint_f64 +;CHECK: llvm.rint.v4f64 +;CHECK: ret void +define void @rint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.rint.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.rint.f64(double) nounwind readnone + +;CHECK: @nearbyint_f32 +;CHECK: llvm.nearbyint.v4f32 +;CHECK: ret void +define void @nearbyint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %call = tail call float @llvm.nearbyint.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.nearbyint.f32(float) nounwind readnone + +;CHECK: @nearbyint_f64 +;CHECK: llvm.nearbyint.v4f64 +;CHECK: ret void +define void @nearbyint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %call = tail call double @llvm.nearbyint.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.nearbyint.f64(double) nounwind readnone + +;CHECK: @fma_f32 +;CHECK: llvm.fma.v4f32 +;CHECK: ret void +define void @fma_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable { +entry: + %cmp12 = icmp sgt i32 %n, 0 + br i1 %cmp12, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %arrayidx2 = getelementptr inbounds float* %w, i64 %indvars.iv + %1 = load float* %arrayidx2, align 4, !tbaa !0 + %arrayidx4 = getelementptr inbounds float* %z, i64 %indvars.iv + %2 = load float* %arrayidx4, align 4, !tbaa !0 + %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1) + %arrayidx6 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %3, float* %arrayidx6, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.fma.f32(float, float, float) nounwind readnone + +;CHECK: @fma_f64 +;CHECK: llvm.fma.v4f64 +;CHECK: ret void +define void @fma_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable { +entry: + %cmp12 = icmp sgt i32 %n, 0 + br i1 %cmp12, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %arrayidx2 = getelementptr inbounds double* %w, i64 %indvars.iv + %1 = load double* %arrayidx2, align 8, !tbaa !3 + %arrayidx4 = getelementptr inbounds double* %z, i64 %indvars.iv + %2 = load double* %arrayidx4, align 8, !tbaa !3 + %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1) + %arrayidx6 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %3, double* %arrayidx6, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.fma.f64(double, double, double) nounwind readnone + +;CHECK: @fmuladd_f32 +;CHECK: llvm.fmuladd.v4f32 +;CHECK: ret void +define void @fmuladd_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable { +entry: + %cmp12 = icmp sgt i32 %n, 0 + br i1 %cmp12, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %arrayidx2 = getelementptr inbounds float* %w, i64 %indvars.iv + %1 = load float* %arrayidx2, align 4, !tbaa !0 + %arrayidx4 = getelementptr inbounds float* %z, i64 %indvars.iv + %2 = load float* %arrayidx4, align 4, !tbaa !0 + %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1) + %arrayidx6 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %3, float* %arrayidx6, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.fmuladd.f32(float, float, float) nounwind readnone + +;CHECK: @fmuladd_f64 +;CHECK: llvm.fmuladd.v4f64 +;CHECK: ret void +define void @fmuladd_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable { +entry: + %cmp12 = icmp sgt i32 %n, 0 + br i1 %cmp12, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %arrayidx2 = getelementptr inbounds double* %w, i64 %indvars.iv + %1 = load double* %arrayidx2, align 8, !tbaa !3 + %arrayidx4 = getelementptr inbounds double* %z, i64 %indvars.iv + %2 = load double* %arrayidx4, align 8, !tbaa !3 + %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1) + %arrayidx6 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %3, double* %arrayidx6, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.fmuladd.f64(double, double, double) nounwind readnone + +;CHECK: @pow_f32 +;CHECK: llvm.pow.v4f32 +;CHECK: ret void +define void @pow_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable { +entry: + %cmp9 = icmp sgt i32 %n, 0 + br i1 %cmp9, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4, !tbaa !0 + %arrayidx2 = getelementptr inbounds float* %z, i64 %indvars.iv + %1 = load float* %arrayidx2, align 4, !tbaa !0 + %call = tail call float @llvm.pow.f32(float %0, float %1) nounwind readnone + %arrayidx4 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx4, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.pow.f32(float, float) nounwind readnone + +;CHECK: @pow_f64 +;CHECK: llvm.pow.v4f64 +;CHECK: ret void +define void @pow_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable { +entry: + %cmp9 = icmp sgt i32 %n, 0 + br i1 %cmp9, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8, !tbaa !3 + %arrayidx2 = getelementptr inbounds double* %z, i64 %indvars.iv + %1 = load double* %arrayidx2, align 8, !tbaa !3 + %call = tail call double @llvm.pow.f64(double %0, double %1) nounwind readnone + %arrayidx4 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx4, align 8, !tbaa !3 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +; CHECK: fabs_libm +; CHECK: call <4 x float> @llvm.fabs.v4f32 +; CHECK: ret void +define void @fabs_libm(float* nocapture %x) nounwind { +entry: + br label %for.body + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds float* %x, i64 %indvars.iv + %0 = load float* %arrayidx, align 4 + %call = tail call float @fabsf(float %0) nounwind readnone + store float %call, float* %arrayidx, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 1024 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +declare float @fabsf(float) nounwind readnone + +declare double @llvm.pow.f64(double, double) nounwind readnone + +!0 = metadata !{metadata !"float", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{metadata !"double", metadata !1} +!4 = metadata !{metadata !"int", metadata !1} diff --git a/test/Transforms/LoopVectorize/lcssa-crash.ll b/test/Transforms/LoopVectorize/lcssa-crash.ll new file mode 100644 index 000000000000..06b3b08aa0e3 --- /dev/null +++ b/test/Transforms/LoopVectorize/lcssa-crash.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%type1 = type { %type2 } +%type2 = type { [0 x i8*], i8**, i32, i32, i32 } + +define void @test() nounwind uwtable align 2 { + br label %for.body.lr.ph.i.i.i + +for.body.lr.ph.i.i.i: + br label %for.body.i.i.i + +for.body.i.i.i: + %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc.i.i.i ], [ 0, %for.body.lr.ph.i.i.i ] + br label %for.inc.i.i.i + +for.inc.i.i.i: + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp ne i32 %lftr.wideiv, undef + br i1 %exitcond, label %for.body.i.i.i, label %for.end.i.i.i + +for.end.i.i.i: + %lcssa = phi %type1* [ undef, %for.inc.i.i.i ] + unreachable +} + diff --git a/test/Transforms/LoopVectorize/no_int_induction.ll b/test/Transforms/LoopVectorize/no_int_induction.ll new file mode 100644 index 000000000000..45aa8c7cd9be --- /dev/null +++ b/test/Transforms/LoopVectorize/no_int_induction.ll @@ -0,0 +1,33 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +; int __attribute__((noinline)) sum_array(int *A, int n) { +; return std::accumulate(A, A + n, 0); +; } + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +;CHECK: @sum_array +;CHECK: phi <4 x i32> +;CHECK: load <4 x i32> +;CHECK: add nsw <4 x i32> +;CHECK: ret i32 +define i32 @sum_array(i32* %A, i32 %n) nounwind uwtable readonly noinline ssp { + %1 = sext i32 %n to i64 + %2 = getelementptr inbounds i32* %A, i64 %1 + %3 = icmp eq i32 %n, 0 + br i1 %3, label %_ZSt10accumulateIPiiET0_T_S2_S1_.exit, label %.lr.ph.i + +.lr.ph.i: ; preds = %0, %.lr.ph.i + %.03.i = phi i32* [ %6, %.lr.ph.i ], [ %A, %0 ] + %.012.i = phi i32 [ %5, %.lr.ph.i ], [ 0, %0 ] + %4 = load i32* %.03.i, align 4 + %5 = add nsw i32 %4, %.012.i + %6 = getelementptr inbounds i32* %.03.i, i64 1 + %7 = icmp eq i32* %6, %2 + br i1 %7, label %_ZSt10accumulateIPiiET0_T_S2_S1_.exit, label %.lr.ph.i + +_ZSt10accumulateIPiiET0_T_S2_S1_.exit: ; preds = %.lr.ph.i, %0 + %.01.lcssa.i = phi i32 [ 0, %0 ], [ %5, %.lr.ph.i ] + ret i32 %.01.lcssa.i +} diff --git a/test/Transforms/LoopVectorize/nofloat.ll b/test/Transforms/LoopVectorize/nofloat.ll new file mode 100644 index 000000000000..de23bf02b63a --- /dev/null +++ b/test/Transforms/LoopVectorize/nofloat.ll @@ -0,0 +1,29 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s + +; Make sure that we don't vectorize functions with 'noimplicitfloat' attributes. + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@a = common global [2048 x i32] zeroinitializer, align 16 + +;CHECK: @example12 +;CHECK-NOT: store <4 x i32> +;CHECK: ret void +define void @example12() noimplicitfloat { ; <--------- "noimplicitfloat" attribute here! + br label %1 + +; <label>:1 ; preds = %1, %0 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ] + %2 = getelementptr inbounds [2048 x i32]* @a, i64 0, i64 %indvars.iv + %3 = trunc i64 %indvars.iv to i32 + store i32 %3, i32* %2, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 1024 + br i1 %exitcond, label %4, label %1 + +; <label>:4 ; preds = %1 + ret void +} + diff --git a/test/Transforms/LoopVectorize/non-const-n.ll b/test/Transforms/LoopVectorize/non-const-n.ll index 1a6c15ed96c4..8262a18f1807 100644 --- a/test/Transforms/LoopVectorize/non-const-n.ll +++ b/test/Transforms/LoopVectorize/non-const-n.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/LoopVectorize/nsw-crash.ll b/test/Transforms/LoopVectorize/nsw-crash.ll new file mode 100644 index 000000000000..e5fad14d0dda --- /dev/null +++ b/test/Transforms/LoopVectorize/nsw-crash.ll @@ -0,0 +1,25 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 + +target datalayout = +"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +define void @test() { +entry: + br i1 undef, label %while.end, label %while.body.lr.ph + +while.body.lr.ph: + br label %while.body + +while.body: + %it.sroa.0.091 = phi i32* [ undef, %while.body.lr.ph ], [ %incdec.ptr.i, %while.body ] + %incdec.ptr.i = getelementptr inbounds i32* %it.sroa.0.091, i64 1 + %inc32 = add i32 undef, 1 ; <------------- Make sure we don't set NSW flags to the undef. + %cmp.i11 = icmp eq i32* %incdec.ptr.i, undef + br i1 %cmp.i11, label %while.end, label %while.body + +while.end: + ret void +} + + diff --git a/test/Transforms/LoopVectorize/phi-hang.ll b/test/Transforms/LoopVectorize/phi-hang.ll new file mode 100644 index 000000000000..b80d45995dc3 --- /dev/null +++ b/test/Transforms/LoopVectorize/phi-hang.ll @@ -0,0 +1,29 @@ +; RUN: opt -S -loop-vectorize < %s + +; PR15384 +define void @test1(i32 %arg) { +bb: + br label %bb1 + +bb1: ; preds = %bb5, %bb + %tmp = phi i32 [ 1, %bb ], [ %tmp7, %bb5 ] + %tmp2 = phi i32 [ %arg, %bb ], [ %tmp9, %bb5 ] + br i1 true, label %bb5, label %bb3 + +bb3: ; preds = %bb1 + br label %bb4 + +bb4: ; preds = %bb3 + br label %bb5 + +bb5: ; preds = %bb4, %bb1 + %tmp6 = phi i32 [ 0, %bb4 ], [ %tmp, %bb1 ] + %tmp7 = phi i32 [ 0, %bb4 ], [ %tmp6, %bb1 ] + %tmp8 = phi i32 [ 0, %bb4 ], [ %tmp, %bb1 ] + %tmp9 = add nsw i32 %tmp2, 1 + %tmp10 = icmp eq i32 %tmp9, 0 + br i1 %tmp10, label %bb11, label %bb1 + +bb11: ; preds = %bb5 + ret void +} diff --git a/test/Transforms/LoopVectorize/ptr_loops.ll b/test/Transforms/LoopVectorize/ptr_loops.ll new file mode 100644 index 000000000000..25599f8f4c3c --- /dev/null +++ b/test/Transforms/LoopVectorize/ptr_loops.ll @@ -0,0 +1,74 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S -enable-if-conversion | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@A = global [36 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35], align 16 +@B = global [36 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35], align 16 + +;CHECK:_Z5test1v +;CHECK: load <4 x i32> +;CHECK: shufflevector <4 x i32> +;CHECK: store <4 x i32> +;CHECK: ret +define i32 @_Z5test1v() nounwind uwtable ssp { + br label %1 + +; <label>:1 ; preds = %0, %1 + %p.02 = phi i32* [ getelementptr inbounds ([36 x i32]* @A, i64 0, i64 18), %0 ], [ %4, %1 ] + %b.01 = phi i32* [ getelementptr inbounds ([36 x i32]* @B, i64 0, i64 0), %0 ], [ %5, %1 ] + %2 = load i32* %b.01, align 4 + %3 = shl nsw i32 %2, 1 + store i32 %3, i32* %p.02, align 4 + %4 = getelementptr inbounds i32* %p.02, i64 -1 + %5 = getelementptr inbounds i32* %b.01, i64 1 + %6 = icmp eq i32* %4, getelementptr ([36 x i32]* @A, i64 128102389400760775, i64 3) + br i1 %6, label %7, label %1 + +; <label>:7 ; preds = %1 + ret i32 0 +} + +;CHECK:_Z5test2v +;CHECK: load <4 x i32> +;CHECK: shufflevector <4 x i32> +;CHECK: store <4 x i32> +;CHECK: ret +define i32 @_Z5test2v() nounwind uwtable ssp { + br label %1 + +; <label>:1 ; preds = %0, %1 + %p.02 = phi i32* [ getelementptr inbounds ([36 x i32]* @A, i64 0, i64 25), %0 ], [ %3, %1 ] + %b.01 = phi i32* [ getelementptr inbounds ([36 x i32]* @B, i64 0, i64 2), %0 ], [ %4, %1 ] + %2 = load i32* %b.01, align 4 + store i32 %2, i32* %p.02, align 4 + %3 = getelementptr inbounds i32* %p.02, i64 -1 + %4 = getelementptr inbounds i32* %b.01, i64 1 + %5 = icmp eq i32* %4, getelementptr inbounds ([36 x i32]* @A, i64 0, i64 18) + br i1 %5, label %6, label %1 + +; <label>:6 ; preds = %1 + ret i32 0 +} + +;CHECK:_Z5test3v +;CHECK: load <4 x i32> +;CHECK: shufflevector <4 x i32> +;CHECK: store <4 x i32> +;CHECK: ret +define i32 @_Z5test3v() nounwind uwtable ssp { + br label %1 + +; <label>:1 ; preds = %0, %1 + %p.02 = phi i32* [ getelementptr inbounds ([36 x i32]* @A, i64 0, i64 29), %0 ], [ %3, %1 ] + %b.01 = phi i32* [ getelementptr inbounds ([36 x i32]* @B, i64 0, i64 5), %0 ], [ %4, %1 ] + %2 = load i32* %b.01, align 4 + store i32 %2, i32* %p.02, align 4 + %3 = getelementptr inbounds i32* %p.02, i64 -1 + %4 = getelementptr inbounds i32* %b.01, i64 1 + %5 = icmp eq i32* %3, getelementptr ([36 x i32]* @A, i64 128102389400760775, i64 3) + br i1 %5, label %6, label %1 + +; <label>:6 ; preds = %1 + ret i32 0 +} diff --git a/test/Transforms/LoopVectorize/read-only.ll b/test/Transforms/LoopVectorize/read-only.ll index b4d1bac132f0..bfaa6d452bce 100644 --- a/test/Transforms/LoopVectorize/read-only.ll +++ b/test/Transforms/LoopVectorize/read-only.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/LoopVectorize/reduction.ll b/test/Transforms/LoopVectorize/reduction.ll index c1848b35fc6e..08b7b27e4257 100644 --- a/test/Transforms/LoopVectorize/reduction.ll +++ b/test/Transforms/LoopVectorize/reduction.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" @@ -7,6 +7,11 @@ target triple = "x86_64-apple-macosx10.8.0" ;CHECK: phi <4 x i32> ;CHECK: load <4 x i32> ;CHECK: add <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef> +;CHECK: add <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +;CHECK: add <4 x i32> +;CHECK: extractelement <4 x i32> %{{.*}}, i32 0 ;CHECK: ret i32 define i32 @reduction_sum(i32 %n, i32* noalias nocapture %A, i32* noalias nocapture %B) nounwind uwtable readonly noinline ssp { %1 = icmp sgt i32 %n, 0 @@ -37,6 +42,11 @@ define i32 @reduction_sum(i32 %n, i32* noalias nocapture %A, i32* noalias nocapt ;CHECK: phi <4 x i32> ;CHECK: load <4 x i32> ;CHECK: mul <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef> +;CHECK: mul <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +;CHECK: mul <4 x i32> +;CHECK: extractelement <4 x i32> %{{.*}}, i32 0 ;CHECK: ret i32 define i32 @reduction_prod(i32 %n, i32* noalias nocapture %A, i32* noalias nocapture %B) nounwind uwtable readonly noinline ssp { %1 = icmp sgt i32 %n, 0 @@ -67,6 +77,11 @@ define i32 @reduction_prod(i32 %n, i32* noalias nocapture %A, i32* noalias nocap ;CHECK: phi <4 x i32> ;CHECK: load <4 x i32> ;CHECK: mul nsw <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef> +;CHECK: add <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +;CHECK: add <4 x i32> +;CHECK: extractelement <4 x i32> %{{.*}}, i32 0 ;CHECK: ret i32 define i32 @reduction_mix(i32 %n, i32* noalias nocapture %A, i32* noalias nocapture %B) nounwind uwtable readonly noinline ssp { %1 = icmp sgt i32 %n, 0 @@ -95,6 +110,11 @@ define i32 @reduction_mix(i32 %n, i32* noalias nocapture %A, i32* noalias nocapt ;CHECK: @reduction_mul ;CHECK: mul <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef> +;CHECK: mul <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +;CHECK: mul <4 x i32> +;CHECK: extractelement <4 x i32> %{{.*}}, i32 0 ;CHECK: ret i32 define i32 @reduction_mul(i32 %n, i32* noalias nocapture %A, i32* noalias nocapture %B) nounwind uwtable readonly noinline ssp { %1 = icmp sgt i32 %n, 0 @@ -124,6 +144,11 @@ define i32 @reduction_mul(i32 %n, i32* noalias nocapture %A, i32* noalias nocapt ;CHECK: @start_at_non_zero ;CHECK: phi <4 x i32> ;CHECK: <i32 120, i32 0, i32 0, i32 0> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef> +;CHECK: add <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +;CHECK: add <4 x i32> +;CHECK: extractelement <4 x i32> %{{.*}}, i32 0 ;CHECK: ret i32 define i32 @start_at_non_zero(i32* nocapture %in, i32* nocapture %coeff, i32* nocapture %out, i32 %n) nounwind uwtable readonly ssp { entry: @@ -152,6 +177,11 @@ for.end: ; preds = %for.body, %entry ;CHECK: @reduction_and ;CHECK: and <4 x i32> ;CHECK: <i32 -1, i32 -1, i32 -1, i32 -1> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef> +;CHECK: and <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +;CHECK: and <4 x i32> +;CHECK: extractelement <4 x i32> %{{.*}}, i32 0 ;CHECK: ret i32 define i32 @reduction_and(i32 %n, i32* nocapture %A, i32* nocapture %B) nounwind uwtable readonly { entry: @@ -179,6 +209,11 @@ for.end: ; preds = %for.body, %entry ;CHECK: @reduction_or ;CHECK: or <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef> +;CHECK: or <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +;CHECK: or <4 x i32> +;CHECK: extractelement <4 x i32> %{{.*}}, i32 0 ;CHECK: ret i32 define i32 @reduction_or(i32 %n, i32* nocapture %A, i32* nocapture %B) nounwind uwtable readonly { entry: @@ -206,6 +241,11 @@ for.end: ; preds = %for.body, %entry ;CHECK: @reduction_xor ;CHECK: xor <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef> +;CHECK: xor <4 x i32> +;CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +;CHECK: xor <4 x i32> +;CHECK: extractelement <4 x i32> %{{.*}}, i32 0 ;CHECK: ret i32 define i32 @reduction_xor(i32 %n, i32* nocapture %A, i32* nocapture %B) nounwind uwtable readonly { entry: @@ -230,3 +270,56 @@ for.end: ; preds = %for.body, %entry %result.0.lcssa = phi i32 [ 0, %entry ], [ %xor, %for.body ] ret i32 %result.0.lcssa } + +; In this code the subtracted variable is on the RHS and this is not an induction variable. +;CHECK: @reduction_sub_rhs +;CHECK-NOT: phi <4 x i32> +;CHECK-NOT: sub nsw <4 x i32> +;CHECK: ret i32 +define i32 @reduction_sub_rhs(i32 %n, i32* noalias nocapture %A) nounwind uwtable readonly { +entry: + %cmp4 = icmp sgt i32 %n, 0 + br i1 %cmp4, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %x.05 = phi i32 [ %sub, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i32* %A, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4 + %sub = sub nsw i32 %0, %x.05 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + %x.0.lcssa = phi i32 [ 0, %entry ], [ %sub, %for.body ] + ret i32 %x.0.lcssa +} + + +; In this test the reduction variable is on the LHS and we can vectorize it. +;CHECK: @reduction_sub_lhs +;CHECK: phi <4 x i32> +;CHECK: sub nsw <4 x i32> +;CHECK: ret i32 +define i32 @reduction_sub_lhs(i32 %n, i32* noalias nocapture %A) nounwind uwtable readonly { +entry: + %cmp4 = icmp sgt i32 %n, 0 + br i1 %cmp4, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %x.05 = phi i32 [ %sub, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i32* %A, i64 %indvars.iv + %0 = load i32* %arrayidx, align 4 + %sub = sub nsw i32 %x.05, %0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + %x.0.lcssa = phi i32 [ 0, %entry ], [ %sub, %for.body ] + ret i32 %x.0.lcssa +} diff --git a/test/Transforms/LoopVectorize/runtime-check.ll b/test/Transforms/LoopVectorize/runtime-check.ll index 23933cf7c7db..86098a6e7db2 100644 --- a/test/Transforms/LoopVectorize/runtime-check.ll +++ b/test/Transforms/LoopVectorize/runtime-check.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.9.0" @@ -9,6 +9,10 @@ target triple = "x86_64-apple-macosx10.9.0" ; a[i] = b[i] * 3; ; } +;CHECK: for.body.preheader: +;CHECK: br i1 %cmp.zero, label %middle.block, label %vector.memcheck +;CHECK: vector.memcheck: +;CHECK: br i1 %found.conflict, label %middle.block, label %vector.ph ;CHECK: load <4 x float> define i32 @foo(float* nocapture %a, float* nocapture %b, i32 %n) nounwind uwtable ssp { entry: diff --git a/test/Transforms/LoopVectorize/same-base-access.ll b/test/Transforms/LoopVectorize/same-base-access.ll new file mode 100644 index 000000000000..15738936457a --- /dev/null +++ b/test/Transforms/LoopVectorize/same-base-access.ll @@ -0,0 +1,110 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S -enable-if-conversion | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +; This is kernel11 from "LivermoreLoops". We can't vectorize it because we +; access both x[k] and x[k-1]. +; +; void kernel11(double *x, double *y, int n) { +; for ( int k=1 ; k<n ; k++ ) +; x[k] = x[k-1] + y[k]; +; } + +; CHECK: @kernel11 +; CHECK-NOT: <4 x double> +; CHECK: ret +define i32 @kernel11(double* %x, double* %y, i32 %n) nounwind uwtable ssp { + %1 = alloca double*, align 8 + %2 = alloca double*, align 8 + %3 = alloca i32, align 4 + %k = alloca i32, align 4 + store double* %x, double** %1, align 8 + store double* %y, double** %2, align 8 + store i32 %n, i32* %3, align 4 + store i32 1, i32* %k, align 4 + br label %4 + +; <label>:4 ; preds = %25, %0 + %5 = load i32* %k, align 4 + %6 = load i32* %3, align 4 + %7 = icmp slt i32 %5, %6 + br i1 %7, label %8, label %28 + +; <label>:8 ; preds = %4 + %9 = load i32* %k, align 4 + %10 = sub nsw i32 %9, 1 + %11 = sext i32 %10 to i64 + %12 = load double** %1, align 8 + %13 = getelementptr inbounds double* %12, i64 %11 + %14 = load double* %13, align 8 + %15 = load i32* %k, align 4 + %16 = sext i32 %15 to i64 + %17 = load double** %2, align 8 + %18 = getelementptr inbounds double* %17, i64 %16 + %19 = load double* %18, align 8 + %20 = fadd double %14, %19 + %21 = load i32* %k, align 4 + %22 = sext i32 %21 to i64 + %23 = load double** %1, align 8 + %24 = getelementptr inbounds double* %23, i64 %22 + store double %20, double* %24, align 8 + br label %25 + +; <label>:25 ; preds = %8 + %26 = load i32* %k, align 4 + %27 = add nsw i32 %26, 1 + store i32 %27, i32* %k, align 4 + br label %4 + +; <label>:28 ; preds = %4 + ret i32 0 +} + + + +; We don't vectorize this function because A[i*7] is scalarized, and the +; different scalars can in theory wrap around and overwrite other scalar +; elements. At the moment we only allow read/write access to arrays +; that are consecutive. +; +; void foo(int *a) { +; for (int i=0; i<256; ++i) { +; int x = a[i*7]; +; if (x>3) +; x = x*x+x*4; +; a[i*7] = x+3; +; } +; } + +; CHECK: @func2 +; CHECK-NOT: <4 x i32> +; CHECK: ret +define i32 @func2(i32* nocapture %a) nounwind uwtable ssp { + br label %1 + +; <label>:1 ; preds = %7, %0 + %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %7 ] + %2 = mul nsw i64 %indvars.iv, 7 + %3 = getelementptr inbounds i32* %a, i64 %2 + %4 = load i32* %3, align 4 + %5 = icmp sgt i32 %4, 3 + br i1 %5, label %6, label %7 + +; <label>:6 ; preds = %1 + %tmp = add i32 %4, 4 + %tmp1 = mul i32 %tmp, %4 + br label %7 + +; <label>:7 ; preds = %6, %1 + %x.0 = phi i32 [ %tmp1, %6 ], [ %4, %1 ] + %8 = add nsw i32 %x.0, 3 + store i32 %8, i32* %3, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 256 + br i1 %exitcond, label %9, label %1 + +; <label>:9 ; preds = %7 + ret i32 0 +} diff --git a/test/Transforms/LoopVectorize/scalar-select.ll b/test/Transforms/LoopVectorize/scalar-select.ll index e537bde31bb0..7a14d247c9b4 100644 --- a/test/Transforms/LoopVectorize/scalar-select.ll +++ b/test/Transforms/LoopVectorize/scalar-select.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/LoopVectorize/simple-unroll.ll b/test/Transforms/LoopVectorize/simple-unroll.ll new file mode 100644 index 000000000000..7e2dd5fc0fcf --- /dev/null +++ b/test/Transforms/LoopVectorize/simple-unroll.ll @@ -0,0 +1,39 @@ +; RUN: opt < %s -loop-vectorize -force-vector-width=4 -force-vector-unroll=2 -dce -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +@a = common global [2048 x i32] zeroinitializer, align 16 + +; This is the loop. +; for (i=0; i<n; i++){ +; a[i] += i; +; } +;CHECK: @inc +;CHECK: load <4 x i32> +;CHECK: load <4 x i32> +;CHECK: add nsw <4 x i32> +;CHECK: add nsw <4 x i32> +;CHECK: store <4 x i32> +;CHECK: store <4 x i32> +;CHECK: ret void +define void @inc(i32 %n) nounwind uwtable noinline ssp { + %1 = icmp sgt i32 %n, 0 + br i1 %1, label %.lr.ph, label %._crit_edge + +.lr.ph: ; preds = %0, %.lr.ph + %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ] + %2 = getelementptr inbounds [2048 x i32]* @a, i64 0, i64 %indvars.iv + %3 = load i32* %2, align 4 + %4 = trunc i64 %indvars.iv to i32 + %5 = add nsw i32 %3, %4 + store i32 %5, i32* %2, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %._crit_edge, label %.lr.ph + +._crit_edge: ; preds = %.lr.ph, %0 + ret void +} + diff --git a/test/Transforms/LoopVectorize/small-loop.ll b/test/Transforms/LoopVectorize/small-loop.ll index 4a6e4b231dfe..fa83dba3d367 100644 --- a/test/Transforms/LoopVectorize/small-loop.ll +++ b/test/Transforms/LoopVectorize/small-loop.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/LoopVectorize/start-non-zero.ll b/test/Transforms/LoopVectorize/start-non-zero.ll index 5aa3bc034d0b..998001c3187b 100644 --- a/test/Transforms/LoopVectorize/start-non-zero.ll +++ b/test/Transforms/LoopVectorize/start-non-zero.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -instcombine -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/LoopVectorize/struct_access.ll b/test/Transforms/LoopVectorize/struct_access.ll new file mode 100644 index 000000000000..de65d0d14870 --- /dev/null +++ b/test/Transforms/LoopVectorize/struct_access.ll @@ -0,0 +1,50 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +%struct.coordinate = type { i32, i32 } + +; Make sure that we don't generate a wide load when accessing the struct. +; struct coordinate { +; int x; +; int y; +; }; +; +; +; int foo(struct coordinate *A, int n) { +; +; int sum = 0; +; for (int i = 0; i < n; ++i) +; sum += A[i].x; +; +; return sum; +; } + +;CHECK: @foo +;CHECK-NOT: load <4 x i32> +;CHECK: ret +define i32 @foo(%struct.coordinate* nocapture %A, i32 %n) nounwind uwtable readonly ssp { +entry: + %cmp4 = icmp sgt i32 %n, 0 + br i1 %cmp4, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %sum.05 = phi i32 [ %add, %for.body ], [ 0, %entry ] + %x = getelementptr inbounds %struct.coordinate* %A, i64 %indvars.iv, i32 0 + %0 = load i32* %x, align 4, !tbaa !0 + %add = add nsw i32 %0, %sum.05 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ] + ret i32 %sum.0.lcssa +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} diff --git a/test/Transforms/LoopVectorize/vectorize-once.ll b/test/Transforms/LoopVectorize/vectorize-once.ll new file mode 100644 index 000000000000..ac1694802a32 --- /dev/null +++ b/test/Transforms/LoopVectorize/vectorize-once.ll @@ -0,0 +1,75 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S -simplifycfg | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +; +; We want to make sure that we are vectorizeing the scalar loop only once +; even if the pass manager runs the vectorizer multiple times due to inlining. + + +; This test checks that we add metadata to vectorized loops +; CHECK: _Z4foo1Pii +; CHECK: <4 x i32> +; CHECK: llvm.vectorizer.already_vectorized +; CHECK: ret + +; This test comes from the loop: +; +;int foo (int *A, int n) { +; return std::accumulate(A, A + n, 0); +;} +define i32 @_Z4foo1Pii(i32* %A, i32 %n) #0 { +entry: + %idx.ext = sext i32 %n to i64 + %add.ptr = getelementptr inbounds i32* %A, i64 %idx.ext + %cmp3.i = icmp eq i32 %n, 0 + br i1 %cmp3.i, label %_ZSt10accumulateIPiiET0_T_S2_S1_.exit, label %for.body.i + +for.body.i: ; preds = %entry, %for.body.i + %__init.addr.05.i = phi i32 [ %add.i, %for.body.i ], [ 0, %entry ] + %__first.addr.04.i = phi i32* [ %incdec.ptr.i, %for.body.i ], [ %A, %entry ] + %0 = load i32* %__first.addr.04.i, align 4, !tbaa !0 + %add.i = add nsw i32 %0, %__init.addr.05.i + %incdec.ptr.i = getelementptr inbounds i32* %__first.addr.04.i, i64 1 + %cmp.i = icmp eq i32* %incdec.ptr.i, %add.ptr + br i1 %cmp.i, label %_ZSt10accumulateIPiiET0_T_S2_S1_.exit, label %for.body.i + +_ZSt10accumulateIPiiET0_T_S2_S1_.exit: ; preds = %for.body.i, %entry + %__init.addr.0.lcssa.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ] + ret i32 %__init.addr.0.lcssa.i +} + +; This test checks that we don't vectorize loops that are marked with the "already vectorized" metadata. +; CHECK: _Z4foo2Pii +; CHECK-NOT: <4 x i32> +; CHECK: llvm.vectorizer.already_vectorized +; CHECK: ret +define i32 @_Z4foo2Pii(i32* %A, i32 %n) #0 { +entry: + %idx.ext = sext i32 %n to i64 + %add.ptr = getelementptr inbounds i32* %A, i64 %idx.ext + %cmp3.i = icmp eq i32 %n, 0 + br i1 %cmp3.i, label %_ZSt10accumulateIPiiET0_T_S2_S1_.exit, label %for.body.i + +for.body.i: ; preds = %entry, %for.body.i + %__init.addr.05.i = phi i32 [ %add.i, %for.body.i ], [ 0, %entry ] + %__first.addr.04.i = phi i32* [ %incdec.ptr.i, %for.body.i ], [ %A, %entry ] + %0 = load i32* %__first.addr.04.i, align 4, !tbaa !0 + %add.i = add nsw i32 %0, %__init.addr.05.i + %incdec.ptr.i = getelementptr inbounds i32* %__first.addr.04.i, i64 1 + %cmp.i = icmp eq i32* %incdec.ptr.i, %add.ptr + br i1 %cmp.i, label %_ZSt10accumulateIPiiET0_T_S2_S1_.exit, label %for.body.i, !llvm.vectorizer.already_vectorized !3 + +_ZSt10accumulateIPiiET0_T_S2_S1_.exit: ; preds = %for.body.i, %entry + %__init.addr.0.lcssa.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ] + ret i32 %__init.addr.0.lcssa.i +} + +attributes #0 = { nounwind readonly ssp uwtable "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="pic" "ssp-buffers-size"="8" } + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA"} +!3 = metadata !{} + diff --git a/test/Transforms/LoopVectorize/write-only.ll b/test/Transforms/LoopVectorize/write-only.ll index eb027604134f..54cbe8df46b0 100644 --- a/test/Transforms/LoopVectorize/write-only.ll +++ b/test/Transforms/LoopVectorize/write-only.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/Mem2Reg/ConvertDebugInfo.ll b/test/Transforms/Mem2Reg/ConvertDebugInfo.ll index 2f1ccb493da8..c0eaaa40154b 100644 --- a/test/Transforms/Mem2Reg/ConvertDebugInfo.ll +++ b/test/Transforms/Mem2Reg/ConvertDebugInfo.ll @@ -8,8 +8,10 @@ entry: %0 = alloca double ; <double*> [#uses=2] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] call void @llvm.dbg.declare(metadata !{i32* %i_addr}, metadata !0), !dbg !8 -; CHECK: call void @llvm.dbg.value(metadata !{i32 %i}, i64 0, metadata !0) -; CHECK: call void @llvm.dbg.value(metadata !{double %j}, i64 0, metadata !9) +; CHECK: call void @llvm.dbg.value(metadata !{i32 %i}, i64 0, metadata ![[IVAR:[0-9]*]]) +; CHECK: call void @llvm.dbg.value(metadata !{double %j}, i64 0, metadata ![[JVAR:[0-9]*]]) +; CHECK: ![[IVAR]] = {{.*}} ; [ DW_TAG_arg_variable ] [i] +; CHECK: ![[JVAR]] = {{.*}} ; [ DW_TAG_arg_variable ] [j] store i32 %i, i32* %i_addr call void @llvm.dbg.declare(metadata !{double* %j_addr}, metadata !9), !dbg !8 store double %j, double* %j_addr @@ -30,16 +32,18 @@ return: ; preds = %entry declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone -!0 = metadata !{i32 524545, metadata !1, metadata !"i", metadata !2, i32 2, metadata !7} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"testfunc", metadata !"testfunc", metadata !"testfunc", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"testfunc.c", metadata !"/tmp", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"testfunc.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!llvm.dbg.cu = !{!3} + +!0 = metadata !{i32 786689, metadata !1, metadata !"i", metadata !2, i32 2, metadata !7, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"testfunc", metadata !"testfunc", metadata !"testfunc", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, double (i32, double)* @testfunc, null, null, null, i32 2} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !12} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 0, i32 1, metadata !"testfunc.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{metadata !6, metadata !7, metadata !6} -!6 = metadata !{i32 524324, metadata !2, metadata !"double", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786468, metadata !2, metadata !"double", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !8 = metadata !{i32 2, i32 0, metadata !1, null} -!9 = metadata !{i32 524545, metadata !1, metadata !"j", metadata !2, i32 2, metadata !6} ; [ DW_TAG_arg_variable ] +!9 = metadata !{i32 786689, metadata !1, metadata !"j", metadata !2, i32 2, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] !10 = metadata !{i32 3, i32 0, metadata !11, null} -!11 = metadata !{i32 524299, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] - +!11 = metadata !{i32 786443, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] +!12 = metadata !{metadata !"testfunc.c", metadata !"/tmp"} diff --git a/test/Transforms/Mem2Reg/ConvertDebugInfo2.ll b/test/Transforms/Mem2Reg/ConvertDebugInfo2.ll index 4cb621f61ca2..f6119f8bbd85 100644 --- a/test/Transforms/Mem2Reg/ConvertDebugInfo2.ll +++ b/test/Transforms/Mem2Reg/ConvertDebugInfo2.ll @@ -30,23 +30,24 @@ return: ; preds = %entry ret void, !dbg !19 } -!0 = metadata !{i32 524545, metadata !1, metadata !"a", metadata !2, i32 8, metadata !6} ; [ DW_TAG_arg_variable ] -!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"baz", metadata !"baz", metadata !"baz", metadata !2, i32 8, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 524329, metadata !"bar.c", metadata !"/tmp/", metadata !3} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"bar.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!0 = metadata !{i32 786689, metadata !1, metadata !"a", metadata !2, i32 8, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!1 = metadata !{i32 786478, metadata !2, metadata !"baz", metadata !"baz", metadata !"baz", metadata !2, i32 8, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, void (i32)* @baz, null, null, null, i32 8} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786449, i32 0, i32 1, metadata !"bar.c", metadata !"/tmp/", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] !5 = metadata !{null, metadata !6} -!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786468, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !7 = metadata !{i32 8, i32 0, metadata !1, null} !8 = metadata !{i32 9, i32 0, metadata !1, null} -!9 = metadata !{i32 524545, metadata !10, metadata !"x", metadata !2, i32 4, metadata !6} ; [ DW_TAG_arg_variable ] -!10 = metadata !{i32 524334, i32 0, metadata !2, metadata !"bar", metadata !"bar", metadata !"bar", metadata !2, i32 4, metadata !11, i1 true, i1 true, i32 0, i32 0, null, i1 false, i1 false} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null} ; [ DW_TAG_subroutine_type ] +!9 = metadata !{i32 786689, metadata !10, metadata !"x", metadata !2, i32 4, metadata !6, i32 0, null} ; [ DW_TAG_arg_variable ] +!10 = metadata !{i32 786478, metadata !2, metadata !"bar", metadata !"bar", metadata !"bar", metadata !2, i32 4, metadata !11, i1 true, i1 true, i32 0, i32 0, null, i1 false, i1 false, null, null, null, null, i32 4} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null} ; [ DW_TAG_subroutine_type ] !12 = metadata !{null, metadata !6, metadata !13, metadata !14} -!13 = metadata !{i32 524324, metadata !2, metadata !"long int", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!14 = metadata !{i32 524303, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] +!13 = metadata !{i32 786468, metadata !2, metadata !"long int", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!14 = metadata !{i32 786447, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] !15 = metadata !{i32 4, i32 0, metadata !10, metadata !8} -!16 = metadata !{i32 524545, metadata !10, metadata !"y", metadata !2, i32 4, metadata !13} ; [ DW_TAG_arg_variable ] -!17 = metadata !{i32 524545, metadata !10, metadata !"z", metadata !2, i32 4, metadata !14} ; [ DW_TAG_arg_variable ] +!16 = metadata !{i32 786689, metadata !10, metadata !"y", metadata !2, i32 4, metadata !13, i32 0, null} ; [ DW_TAG_arg_variable ] +!17 = metadata !{i32 786689, metadata !10, metadata !"z", metadata !2, i32 4, metadata !14, i32 0, null} ; [ DW_TAG_arg_variable ] !18 = metadata !{i32 5, i32 0, metadata !10, metadata !8} !19 = metadata !{i32 10, i32 0, metadata !1, null} +!20 = metadata !{metadata !"bar.c", metadata !"/tmp/"} diff --git a/test/Transforms/MemCpyOpt/memcpy.ll b/test/Transforms/MemCpyOpt/memcpy.ll index 3fa16288c219..582a57b5d39c 100644 --- a/test/Transforms/MemCpyOpt/memcpy.ll +++ b/test/Transforms/MemCpyOpt/memcpy.ll @@ -70,20 +70,20 @@ define void @test4(i8 *%P) { %A = alloca %1 %a = bitcast %1* %A to i8* call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %P, i64 8, i32 4, i1 false) - call void @test4a(i8* byval align 1 %a) + call void @test4a(i8* align 1 byval %a) ret void ; CHECK: @test4 ; CHECK-NEXT: call void @test4a( } -declare void @test4a(i8* byval align 1) +declare void @test4a(i8* align 1 byval) declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind %struct.S = type { i128, [4 x i8]} @sS = external global %struct.S, align 16 -declare void @test5a(%struct.S* byval align 16) nounwind ssp +declare void @test5a(%struct.S* align 16 byval) nounwind ssp ; rdar://8713376 - This memcpy can't be eliminated. @@ -94,7 +94,7 @@ entry: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp, i8* bitcast (%struct.S* @sS to i8*), i64 32, i32 16, i1 false) %a = getelementptr %struct.S* %y, i64 0, i32 1, i64 0 store i8 4, i8* %a - call void @test5a(%struct.S* byval align 16 %y) + call void @test5a(%struct.S* align 16 byval %y) ret i32 0 ; CHECK: @test5( ; CHECK: store i8 4 @@ -114,19 +114,19 @@ define void @test6(i8 *%P) { ; isn't itself 8 byte aligned. %struct.p = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } -define i32 @test7(%struct.p* nocapture byval align 8 %q) nounwind ssp { +define i32 @test7(%struct.p* nocapture align 8 byval %q) nounwind ssp { entry: %agg.tmp = alloca %struct.p, align 4 %tmp = bitcast %struct.p* %agg.tmp to i8* %tmp1 = bitcast %struct.p* %q to i8* call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp, i8* %tmp1, i64 48, i32 4, i1 false) - %call = call i32 @g(%struct.p* byval align 8 %agg.tmp) nounwind + %call = call i32 @g(%struct.p* align 8 byval %agg.tmp) nounwind ret i32 %call ; CHECK: @test7 -; CHECK: call i32 @g(%struct.p* byval align 8 %q) nounwind +; CHECK: call i32 @g(%struct.p* byval align 8 %q) [[NUW:#[0-9]+]] } -declare i32 @g(%struct.p* byval align 8) +declare i32 @g(%struct.p* align 8 byval) declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind @@ -152,7 +152,7 @@ declare noalias i8* @malloc(i32) ; rdar://11341081 %struct.big = type { [50 x i32] } -define void @test9() nounwind uwtable ssp { +define void @test9() nounwind ssp uwtable { entry: ; CHECK: test9 ; CHECK: f1 @@ -170,3 +170,7 @@ entry: declare void @f1(%struct.big* sret) declare void @f2(%struct.big*) + +; CHECK: attributes [[NUW]] = { nounwind } +; CHECK: attributes #1 = { nounwind ssp } +; CHECK: attributes #2 = { nounwind ssp uwtable } diff --git a/test/Transforms/MergeFunc/2011-02-08-RemoveEqual.ll b/test/Transforms/MergeFunc/2011-02-08-RemoveEqual.ll index e3e52b401af5..19cd6a5171da 100644 --- a/test/Transforms/MergeFunc/2011-02-08-RemoveEqual.ll +++ b/test/Transforms/MergeFunc/2011-02-08-RemoveEqual.ll @@ -1,4 +1,4 @@ -; RUN: opt -mergefunc %s -disable-output +; RUN: opt -mergefunc -disable-output < %s ; This used to crash. target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32" diff --git a/test/Transforms/MergeFunc/2013-01-10-MergeFuncAssert.ll b/test/Transforms/MergeFunc/2013-01-10-MergeFuncAssert.ll new file mode 100644 index 000000000000..3f6a5ba157de --- /dev/null +++ b/test/Transforms/MergeFunc/2013-01-10-MergeFuncAssert.ll @@ -0,0 +1,36 @@ +; RUN: opt -mergefunc -disable-output < %s +; This used to trigger a ConstantExpr::getBitCast assertion. + +define void @t1() unnamed_addr uwtable ssp align 2 { +entry: + switch i32 undef, label %sw.bb12 [ + i32 127, label %sw.bb + i32 126, label %sw.bb4 + ] + +sw.bb: ; preds = %entry + unreachable + +sw.bb4: ; preds = %entry + unreachable + +sw.bb12: ; preds = %entry + ret void +} + +define void @t2() unnamed_addr uwtable ssp align 2 { +entry: + switch i32 undef, label %sw.bb8 [ + i32 4, label %sw.bb + i32 3, label %sw.bb4 + ] + +sw.bb: ; preds = %entry + unreachable + +sw.bb4: ; preds = %entry + ret void + +sw.bb8: ; preds = %entry + unreachable +} diff --git a/test/Transforms/MergeFunc/phi-speculation1.ll b/test/Transforms/MergeFunc/phi-speculation1.ll index fd0baffb3108..548e5102be10 100644 --- a/test/Transforms/MergeFunc/phi-speculation1.ll +++ b/test/Transforms/MergeFunc/phi-speculation1.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -mergefunc -stats -disable-output 2>&1 | not grep "functions merged" define i32 @foo1(i32 %x) { diff --git a/test/Transforms/MergeFunc/phi-speculation2.ll b/test/Transforms/MergeFunc/phi-speculation2.ll index eec8b5c5a90a..d42a465d0c65 100644 --- a/test/Transforms/MergeFunc/phi-speculation2.ll +++ b/test/Transforms/MergeFunc/phi-speculation2.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -mergefunc -stats -disable-output 2>&1 | grep "functions merged" define i32 @foo1(i32 %x) { diff --git a/test/Transforms/MergeFunc/vector.ll b/test/Transforms/MergeFunc/vector.ll index 4af079f8cdf7..dba5fa349aba 100644 --- a/test/Transforms/MergeFunc/vector.ll +++ b/test/Transforms/MergeFunc/vector.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -mergefunc -stats -disable-output < %s 2>&1 | grep "functions merged" ; This test is checks whether we can merge diff --git a/test/Transforms/MergeFunc/vectors-and-arrays.ll b/test/Transforms/MergeFunc/vectors-and-arrays.ll index dc64a0858ba8..22747224a193 100644 --- a/test/Transforms/MergeFunc/vectors-and-arrays.ll +++ b/test/Transforms/MergeFunc/vectors-and-arrays.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt -mergefunc < %s -disable-output -stats | not grep merged ; This used to crash with an assert. diff --git a/test/Transforms/MetaRenamer/metarenamer.ll b/test/Transforms/MetaRenamer/metarenamer.ll index ad41bcf50f19..4020e1045081 100644 --- a/test/Transforms/MetaRenamer/metarenamer.ll +++ b/test/Transforms/MetaRenamer/metarenamer.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -metarenamer -S | FileCheck %s +; RUN: opt -metarenamer -S < %s | FileCheck %s ; CHECK: target triple {{.*}} ; CHECK-NOT: {{^x*}}xxx{{^x*}} diff --git a/test/Transforms/ObjCARC/apelim.ll b/test/Transforms/ObjCARC/apelim.ll index 8c7b5b1e654f..4541b3f2fdf3 100644 --- a/test/Transforms/ObjCARC/apelim.ll +++ b/test/Transforms/ObjCARC/apelim.ll @@ -38,8 +38,8 @@ entry: } ; CHECK: define internal void @_GLOBAL__I_y() -; CHECK: %0 = call i8* @objc_autoreleasePoolPush() nounwind -; CHECK: call void @objc_autoreleasePoolPop(i8* %0) nounwind +; CHECK: %0 = call i8* @objc_autoreleasePoolPush() [[NUW:#[0-9]+]] +; CHECK: call void @objc_autoreleasePoolPop(i8* %0) [[NUW]] ; CHECK: } define internal void @_GLOBAL__I_y() { entry: @@ -51,3 +51,5 @@ entry: declare i8* @objc_autoreleasePoolPush() declare void @objc_autoreleasePoolPop(i8*) + +; CHECK: attributes #0 = { nounwind } diff --git a/test/Transforms/ObjCARC/arc-annotations.ll b/test/Transforms/ObjCARC/arc-annotations.ll new file mode 100644 index 000000000000..4c56b4a3def9 --- /dev/null +++ b/test/Transforms/ObjCARC/arc-annotations.ll @@ -0,0 +1,307 @@ +; This file consists of various tests which ensure that the objc-arc-annotations +; are working correctly. In the future, I will use this in other lit tests to +; check the data flow analysis of ARC. + +; REQUIRES: asserts +; RUN: opt -S -objc-arc -enable-objc-arc-annotations < %s | FileCheck %s + +declare i8* @objc_retain(i8*) +declare i8* @objc_retainAutoreleasedReturnValue(i8*) +declare void @objc_release(i8*) +declare i8* @objc_autorelease(i8*) +declare i8* @objc_autoreleaseReturnValue(i8*) +declare void @objc_autoreleasePoolPop(i8*) +declare i8* @objc_autoreleasePoolPush() +declare i8* @objc_retainBlock(i8*) + +declare i8* @objc_retainedObject(i8*) +declare i8* @objc_unretainedObject(i8*) +declare i8* @objc_unretainedPointer(i8*) + +declare void @use_pointer(i8*) +declare void @callee() +declare void @callee_fnptr(void ()*) +declare void @invokee() +declare i8* @returner() + +; Simple retain+release pair deletion, with some intervening control +; flow and harmless instructions. + +; CHECK: define void @test0( +; CHECK: entry: +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_None) +; CHECK: %0 = tail call i8* @objc_retain(i8* %a) #0, !llvm.arc.annotation.bottomup !0, !llvm.arc.annotation.topdown !1 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Use) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: t: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Use) +; CHECK: store float 2.000000e+00, float* %b, !llvm.arc.annotation.bottomup !2 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Release) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: f: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Use) +; CHECK: store i32 7, i32* %x, !llvm.arc.annotation.bottomup !2 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Release) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: return: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Release) +; CHECK: call void @objc_release(i8* %c) #0, !llvm.arc.annotation.bottomup !3, !llvm.arc.annotation.topdown !4 +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_None) +; CHECK: } +define void @test0(i32* %x, i1 %p) nounwind { +entry: + %a = bitcast i32* %x to i8* + %0 = call i8* @objc_retain(i8* %a) nounwind + br i1 %p, label %t, label %f + +t: + store i8 3, i8* %a + %b = bitcast i32* %x to float* + store float 2.0, float* %b + br label %return + +f: + store i32 7, i32* %x + br label %return + +return: + %c = bitcast i32* %x to i8* + call void @objc_release(i8* %c) nounwind + ret void +} + +; Like test0 but the release isn't always executed when the retain is, +; so the optimization is not safe. + +; TODO: Make the objc_release's argument be %0. + +; CHECK: define void @test1( +; CHECK: entry: +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_None) +; CHECK: %0 = tail call i8* @objc_retain(i8* %a) #0, !llvm.arc.annotation.bottomup !5, !llvm.arc.annotation.topdown !6 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_None) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: t: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Use) +; CHECK: store float 2.000000e+00, float* %b, !llvm.arc.annotation.bottomup !7 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Release) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: f: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_None) +; CHECK: call void @callee(), !llvm.arc.annotation.topdown !8 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_None) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_CanRelease) +; CHECK: return: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_None) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Release) +; CHECK: call void @objc_release(i8* %c) #0, !llvm.arc.annotation.bottomup !9 +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_None) +; CHECK: alt_return: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_None) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_None) +; CHECK: } +define void @test1(i32* %x, i1 %p, i1 %q) nounwind { +entry: + %a = bitcast i32* %x to i8* + %0 = call i8* @objc_retain(i8* %a) nounwind + br i1 %p, label %t, label %f + +t: + store i8 3, i8* %a + %b = bitcast i32* %x to float* + store float 2.0, float* %b + br label %return + +f: + store i32 7, i32* %x + call void @callee() + br i1 %q, label %return, label %alt_return + +return: + %c = bitcast i32* %x to i8* + call void @objc_release(i8* %c) nounwind + ret void + +alt_return: + ret void +} + +; Don't do partial elimination into two different CFG diamonds. + +; CHECK: define void @test1b( +; CHECK: entry: +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_None) +; CHECK: %0 = tail call i8* @objc_retain(i8* %x) #0, !llvm.arc.annotation.bottomup !10, !llvm.arc.annotation.topdown !11 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_None) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: if.then: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_CanRelease) +; CHECK: tail call void @callee(), !llvm.arc.annotation.bottomup !12, !llvm.arc.annotation.topdown !13 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Use) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_CanRelease) +; CHECK: if.end: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_CanRelease) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Use) +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Use) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_CanRelease) +; CHECK: if.then3: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_CanRelease) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Use) +; CHECK: tail call void @use_pointer(i8* %x), !llvm.arc.annotation.bottomup !14, !llvm.arc.annotation.topdown !15 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_MovableRelease) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Use) +; CHECK: if.end5: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_None) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_MovableRelease) +; CHECK: tail call void @objc_release(i8* %x) #0, !clang.imprecise_release !16, !llvm.arc.annotation.bottomup !17 +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_None) +; CHECK: } +define void @test1b(i8* %x, i1 %p, i1 %q) { +entry: + tail call i8* @objc_retain(i8* %x) nounwind + br i1 %p, label %if.then, label %if.end + +if.then: ; preds = %entry + tail call void @callee() + br label %if.end + +if.end: ; preds = %if.then, %entry + br i1 %q, label %if.then3, label %if.end5 + +if.then3: ; preds = %if.end + tail call void @use_pointer(i8* %x) + br label %if.end5 + +if.end5: ; preds = %if.then3, %if.end + tail call void @objc_release(i8* %x) nounwind, !clang.imprecise_release !0 + ret void +} + +; Like test0 but the pointer is passed to an intervening call, +; so the optimization is not safe. + +; CHECK: define void @test2( +; CHECK: entry: +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_None) +; CHECK: %e = tail call i8* @objc_retain(i8* %a) #0, !llvm.arc.annotation.bottomup !18, !llvm.arc.annotation.topdown !19 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_CanRelease) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: t: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Use) +; CHECK: store float 2.000000e+00, float* %b, !llvm.arc.annotation.bottomup !20 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Release) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: f: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_CanRelease) +; CHECK: call void @use_pointer(i8* %e), !llvm.arc.annotation.bottomup !21, !llvm.arc.annotation.topdown !22 +; CHECK: store float 3.000000e+00, float* %d, !llvm.arc.annotation.bottomup !20, !llvm.arc.annotation.topdown !23 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Release) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Use) +; CHECK: return: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Use) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Release) +; CHECK: call void @objc_release(i8* %c) #0, !llvm.arc.annotation.bottomup !24, !llvm.arc.annotation.topdown !25 +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_None) +; CHECK: } +define void @test2(i32* %x, i1 %p) nounwind { +entry: + %a = bitcast i32* %x to i8* + %e = call i8* @objc_retain(i8* %a) nounwind + br i1 %p, label %t, label %f + +t: + store i8 3, i8* %a + %b = bitcast i32* %x to float* + store float 2.0, float* %b + br label %return + +f: + store i32 7, i32* %x + call void @use_pointer(i8* %e) + %d = bitcast i32* %x to float* + store float 3.0, float* %d + br label %return + +return: + %c = bitcast i32* %x to i8* + call void @objc_release(i8* %c) nounwind + ret void +} + +; Like test0 but the release is in a loop, +; so the optimization is not safe. + +; TODO: For now, assume this can't happen. + +; CHECK: define void @test3( +; CHECK: entry: +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_None) +; CHECK: tail call i8* @objc_retain(i8* %a) #0, !llvm.arc.annotation.bottomup !26, !llvm.arc.annotation.topdown !27 +; CHECK: call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Release) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain) +; CHECK: loop: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain) +; CHECK: call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Release) +; CHECK: call void @objc_release(i8* %c) #0, !llvm.arc.annotation.bottomup !28, !llvm.arc.annotation.topdown !29 +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_None) +; CHECK: return: +; CHECK: call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_None) +; CHECK: call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_None) +; CHECK: } +define void @test3(i32* %x, i1* %q) nounwind { +entry: + %a = bitcast i32* %x to i8* + %0 = call i8* @objc_retain(i8* %a) nounwind + br label %loop + +loop: + %c = bitcast i32* %x to i8* + call void @objc_release(i8* %c) nounwind + %j = load volatile i1* %q + br i1 %j, label %loop, label %return + +return: + ret void +} + +!0 = metadata !{} + +; CHECK: !0 = metadata !{metadata !"(test0,%x)", metadata !"S_Use", metadata !"S_None"} +; CHECK: !1 = metadata !{metadata !"(test0,%x)", metadata !"S_None", metadata !"S_Retain"} +; CHECK: !2 = metadata !{metadata !"(test0,%x)", metadata !"S_Release", metadata !"S_Use"} +; CHECK: !3 = metadata !{metadata !"(test0,%x)", metadata !"S_None", metadata !"S_Release"} +; CHECK: !4 = metadata !{metadata !"(test0,%x)", metadata !"S_Retain", metadata !"S_None"} +; CHECK: !5 = metadata !{metadata !"(test1,%x)", metadata !"S_None", metadata !"S_None"} +; CHECK: !6 = metadata !{metadata !"(test1,%x)", metadata !"S_None", metadata !"S_Retain"} +; CHECK: !7 = metadata !{metadata !"(test1,%x)", metadata !"S_Release", metadata !"S_Use"} +; CHECK: !8 = metadata !{metadata !"(test1,%x)", metadata !"S_Retain", metadata !"S_CanRelease"} +; CHECK: !9 = metadata !{metadata !"(test1,%x)", metadata !"S_None", metadata !"S_Release"} +; CHECK: !10 = metadata !{metadata !"(test1b,%x)", metadata !"S_None", metadata !"S_None"} +; CHECK: !11 = metadata !{metadata !"(test1b,%x)", metadata !"S_None", metadata !"S_Retain"} +; CHECK: !12 = metadata !{metadata !"(test1b,%x)", metadata !"S_Use", metadata !"S_CanRelease"} +; CHECK: !13 = metadata !{metadata !"(test1b,%x)", metadata !"S_Retain", metadata !"S_CanRelease"} +; CHECK: !14 = metadata !{metadata !"(test1b,%x)", metadata !"S_MovableRelease", metadata !"S_Use"} +; CHECK: !15 = metadata !{metadata !"(test1b,%x)", metadata !"S_CanRelease", metadata !"S_Use"} +; CHECK: !16 = metadata !{} +; CHECK: !17 = metadata !{metadata !"(test1b,%x)", metadata !"S_None", metadata !"S_MovableRelease"} +; CHECK: !18 = metadata !{metadata !"(test2,%x)", metadata !"S_CanRelease", metadata !"S_None"} +; CHECK: !19 = metadata !{metadata !"(test2,%x)", metadata !"S_None", metadata !"S_Retain"} +; CHECK: !20 = metadata !{metadata !"(test2,%x)", metadata !"S_Release", metadata !"S_Use"} +; CHECK: !21 = metadata !{metadata !"(test2,%x)", metadata !"S_Use", metadata !"S_CanRelease"} +; CHECK: !22 = metadata !{metadata !"(test2,%x)", metadata !"S_Retain", metadata !"S_CanRelease"} +; CHECK: !23 = metadata !{metadata !"(test2,%x)", metadata !"S_CanRelease", metadata !"S_Use"} +; CHECK: !24 = metadata !{metadata !"(test2,%x)", metadata !"S_None", metadata !"S_Release"} +; CHECK: !25 = metadata !{metadata !"(test2,%x)", metadata !"S_Use", metadata !"S_None"} +; CHECK: !26 = metadata !{metadata !"(test3,%x)", metadata !"S_Release", metadata !"S_None"} +; CHECK: !27 = metadata !{metadata !"(test3,%x)", metadata !"S_None", metadata !"S_Retain"} +; CHECK: !28 = metadata !{metadata !"(test3,%x)", metadata !"S_None", metadata !"S_Release"} +; CHECK: !29 = metadata !{metadata !"(test3,%x)", metadata !"S_Retain", metadata !"S_None"} + diff --git a/test/Transforms/ObjCARC/basic.ll b/test/Transforms/ObjCARC/basic.ll index 7b64b1be7c62..828a8a701127 100644 --- a/test/Transforms/ObjCARC/basic.ll +++ b/test/Transforms/ObjCARC/basic.ll @@ -92,10 +92,10 @@ alt_return: ; CHECK: define void @test1b( ; CHECK: entry: -; CHECK: tail call i8* @objc_retain(i8* %x) nounwind +; CHECK: tail call i8* @objc_retain(i8* %x) [[NUW:#[0-9]+]] ; CHECK-NOT: @objc_ ; CHECK: if.end5: -; CHECK: tail call void @objc_release(i8* %x) nounwind, !clang.imprecise_release !0 +; CHECK: tail call void @objc_release(i8* %x) [[NUW]], !clang.imprecise_release !0 ; CHECK-NOT: @objc_ ; CHECK: } define void @test1b(i8* %x, i1 %p, i1 %q) { @@ -404,8 +404,8 @@ entry: ; a stack argument. ; CHECK: define void @test11( -; CHECK: tail call i8* @objc_retain(i8* %x) nounwind -; CHECK: tail call i8* @objc_autorelease(i8* %0) nounwind +; CHECK: tail call i8* @objc_retain(i8* %x) [[NUW]] +; CHECK: call i8* @objc_autorelease(i8* %0) [[NUW]] ; CHECK: } define void @test11(i8* %x) nounwind { entry: @@ -428,11 +428,13 @@ entry: ret void } -; Same as test11 but the value is returned. Do an RV optimization. +; Same as test11 but the value is returned. Do not perform an RV optimization +; since if the frontend emitted code for an __autoreleasing variable, we may +; want it to be in the autorelease pool. ; CHECK: define i8* @test11b( -; CHECK: tail call i8* @objc_retain(i8* %x) nounwind -; CHECK: tail call i8* @objc_autoreleaseReturnValue(i8* %0) nounwind +; CHECK: tail call i8* @objc_retain(i8* %x) [[NUW]] +; CHECK: call i8* @objc_autorelease(i8* %0) [[NUW]] ; CHECK: } define i8* @test11b(i8* %x) nounwind { entry: @@ -462,10 +464,10 @@ entry: ; Trivial retain,autorelease pair. Don't delete! ; CHECK: define void @test13( -; CHECK: tail call i8* @objc_retain(i8* %x) nounwind -; CHECK: tail call i8* @objc_retain(i8* %x) nounwind +; CHECK: tail call i8* @objc_retain(i8* %x) [[NUW]] +; CHECK: tail call i8* @objc_retain(i8* %x) [[NUW]] ; CHECK: @use_pointer(i8* %x) -; CHECK: tail call i8* @objc_autorelease(i8* %x) nounwind +; CHECK: call i8* @objc_autorelease(i8* %x) [[NUW]] ; CHECK: } define void @test13(i8* %x, i64 %n) { entry: @@ -716,7 +718,7 @@ entry: ; Bitcast insertion ; CHECK: define void @test20( -; CHECK: %tmp1 = tail call i8* @objc_retain(i8* %tmp) nounwind +; CHECK: %tmp1 = tail call i8* @objc_retain(i8* %tmp) [[NUW]] ; CHECK-NEXT: invoke define void @test20(double* %self) { if.then12: @@ -795,10 +797,10 @@ entry: ret void } -; Don't optimize objc_retainBlock. +; Don't optimize objc_retainBlock, but do strength reduce it. ; CHECK: define void @test23b -; CHECK: @objc_retainBlock +; CHECK: @objc_retain ; CHECK: @objc_release ; CHECK: } define void @test23b(i8* %p) { @@ -980,7 +982,7 @@ done: ; CHECK: call i8* @objc_retain( ; CHECK: call void @callee() ; CHECK: store -; CHECK: call void @objc_release(i8* %p) nounwind, !clang.imprecise_release +; CHECK: call void @objc_release(i8* %p) [[NUW]], !clang.imprecise_release ; CHECK: done: ; CHECK-NOT: @objc_ ; CHECK: } @@ -1450,9 +1452,9 @@ define void @test45(i8** %pp, i8** %qq) { ; Don't delete retain and autorelease here. ; CHECK: define void @test46( -; CHECK: tail call i8* @objc_retain(i8* %p) nounwind +; CHECK: tail call i8* @objc_retain(i8* %p) [[NUW]] ; CHECK: true: -; CHECK: tail call i8* @objc_autorelease(i8* %p) nounwind +; CHECK: call i8* @objc_autorelease(i8* %p) [[NUW]] define void @test46(i8* %p, i1 %a) { entry: call i8* @objc_retain(i8* %p) @@ -1565,7 +1567,7 @@ define void @test53(void ()** %zz, i8** %pp) { ; CHECK: define void @test54( ; CHECK: call i8* @returner() -; CHECK-NEXT: call void @objc_release(i8* %t) nounwind, !clang.imprecise_release !0 +; CHECK-NEXT: call void @objc_release(i8* %t) [[NUW]], !clang.imprecise_release !0 ; CHECK-NEXT: ret void define void @test54() { %t = call i8* @returner() @@ -1595,10 +1597,10 @@ entry: ; CHECK: define void @test56( ; CHECK-NOT: @objc ; CHECK: if.then: -; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %x) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %x) [[NUW]] ; CHECK-NEXT: tail call void @use_pointer(i8* %x) ; CHECK-NEXT: tail call void @use_pointer(i8* %x) -; CHECK-NEXT: tail call void @objc_release(i8* %x) nounwind, !clang.imprecise_release !0 +; CHECK-NEXT: tail call void @objc_release(i8* %x) [[NUW]], !clang.imprecise_release !0 ; CHECK-NEXT: br label %if.end ; CHECK-NOT: @objc ; CHECK: } @@ -1630,10 +1632,10 @@ if.end: ; preds = %entry, %if.then ; CHECK-NEXT: entry: ; CHECK-NEXT: call void @use_pointer(i8* %x) ; CHECK-NEXT: call void @use_pointer(i8* %x) -; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %x) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %x) [[NUW]] ; CHECK-NEXT: call void @use_pointer(i8* %x) ; CHECK-NEXT: call void @use_pointer(i8* %x) -; CHECK-NEXT: call void @objc_release(i8* %x) nounwind +; CHECK-NEXT: call void @objc_release(i8* %x) [[NUW]] ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @test57(i8* %x) nounwind { @@ -1673,10 +1675,10 @@ entry: ; CHECK: define void @test59( ; CHECK-NEXT: entry: -; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %x) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %x) [[NUW]] ; CHECK-NEXT: call void @use_pointer(i8* %x) ; CHECK-NEXT: call void @use_pointer(i8* %x) -; CHECK-NEXT: call void @objc_release(i8* %x) nounwind +; CHECK-NEXT: call void @objc_release(i8* %x) [[NUW]] ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @test59(i8* %x) nounwind { @@ -1875,8 +1877,8 @@ return: ; preds = %if.then, %entry ; rdar://11931823 ; CHECK: define void @test66( -; CHECK: %tmp7 = tail call i8* @objc_retain(i8* %cond) nounwind -; CHECK: tail call void @objc_release(i8* %cond) nounwind +; CHECK: %tmp7 = tail call i8* @objc_retain(i8* %cond) [[NUW]] +; CHECK: tail call void @objc_release(i8* %cond) [[NUW]] ; CHECK: } define void @test66(i8* %tmp5, i8* %bar, i1 %tobool, i1 %tobool1, i8* %call) { entry: @@ -2224,3 +2226,6 @@ end: ; preds = %if.end125, %if.end1 !0 = metadata !{} declare i32 @__gxx_personality_v0(...) + +; CHECK: attributes #0 = { nounwind readnone } +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/cfg-hazards.ll b/test/Transforms/ObjCARC/cfg-hazards.ll index 15194237c4c5..899298b5967e 100644 --- a/test/Transforms/ObjCARC/cfg-hazards.ll +++ b/test/Transforms/ObjCARC/cfg-hazards.ll @@ -86,9 +86,9 @@ for.end: ; preds = %for.body ; Delete nested retain+release pairs around loops. -; CHECK: define void @test3(i8* %a) nounwind { +; CHECK: define void @test3(i8* %a) #0 { ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) [[NUW:#[0-9]+]] ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ ; CHECK: exit: @@ -112,9 +112,9 @@ exit: ret void } -; CHECK: define void @test4(i8* %a) nounwind { +; CHECK: define void @test4(i8* %a) #0 { ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) [[NUW]] ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ ; CHECK: exit: @@ -142,9 +142,9 @@ exit: ret void } -; CHECK: define void @test5(i8* %a) nounwind { +; CHECK: define void @test5(i8* %a) #0 { ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) [[NUW]] ; CHECK-NEXT: call void @callee() ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ @@ -176,9 +176,9 @@ exit: ret void } -; CHECK: define void @test6(i8* %a) nounwind { +; CHECK: define void @test6(i8* %a) #0 { ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) [[NUW]] ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ ; CHECK: exit: @@ -209,9 +209,9 @@ exit: ret void } -; CHECK: define void @test7(i8* %a) nounwind { +; CHECK: define void @test7(i8* %a) #0 { ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) [[NUW]] ; CHECK-NEXT: call void @callee() ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ @@ -242,9 +242,9 @@ exit: ret void } -; CHECK: define void @test8(i8* %a) nounwind { +; CHECK: define void @test8(i8* %a) #0 { ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %a) [[NUW]] ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ ; CHECK: exit: @@ -274,7 +274,7 @@ exit: ret void } -; CHECK: define void @test9(i8* %a) nounwind { +; CHECK: define void @test9(i8* %a) #0 { ; CHECK-NEXT: entry: ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ @@ -303,7 +303,7 @@ exit: ret void } -; CHECK: define void @test10(i8* %a) nounwind { +; CHECK: define void @test10(i8* %a) #0 { ; CHECK-NEXT: entry: ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ @@ -332,7 +332,7 @@ exit: ret void } -; CHECK: define void @test11(i8* %a) nounwind { +; CHECK: define void @test11(i8* %a) #0 { ; CHECK-NEXT: entry: ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ @@ -362,15 +362,15 @@ exit: ; Don't delete anything if they're not balanced. -; CHECK: define void @test12(i8* %a) nounwind { +; CHECK: define void @test12(i8* %a) #0 { ; CHECK-NEXT: entry: -; CHECK-NEXT: %outer = tail call i8* @objc_retain(i8* %a) nounwind -; CHECK-NEXT: %inner = tail call i8* @objc_retain(i8* %a) nounwind +; CHECK-NEXT: %outer = tail call i8* @objc_retain(i8* %a) [[NUW]] +; CHECK-NEXT: %inner = tail call i8* @objc_retain(i8* %a) [[NUW]] ; CHECK-NEXT: br label %loop ; CHECK-NOT: @objc_ ; CHECK: exit: -; CHECK-NEXT: call void @objc_release(i8* %a) nounwind -; CHECK-NEXT: call void @objc_release(i8* %a) nounwind, !clang.imprecise_release !0 +; CHECK-NEXT: call void @objc_release(i8* %a) [[NUW]] +; CHECK-NEXT: call void @objc_release(i8* %a) [[NUW]], !clang.imprecise_release !0 ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @test12(i8* %a) nounwind { @@ -394,4 +394,6 @@ exit: ret void } +; CHECK: attributes [[NUW]] = { nounwind } + !0 = metadata !{} diff --git a/test/Transforms/ObjCARC/clang-arc-used-intrinsic-removed-if-isolated.ll b/test/Transforms/ObjCARC/clang-arc-used-intrinsic-removed-if-isolated.ll new file mode 100644 index 000000000000..4215b5c36465 --- /dev/null +++ b/test/Transforms/ObjCARC/clang-arc-used-intrinsic-removed-if-isolated.ll @@ -0,0 +1,16 @@ +; RUN: opt -objc-arc-contract -S < %s | FileCheck %s + +; This file makes sure that clang.arc.used is removed even if no other ARC +; interesting calls are in the module. + +declare void @clang.arc.use(...) nounwind + +; Kill calls to @clang.arc.use(...) +; CHECK: define void @test0( +; CHECK-NOT: clang.arc.use +; CHECK: } +define void @test0(i8* %a, i8* %b) { + call void (...)* @clang.arc.use(i8* %a, i8* %b) nounwind + ret void +} + diff --git a/test/Transforms/ObjCARC/contract-marker.ll b/test/Transforms/ObjCARC/contract-marker.ll index 01d978a0e21d..01fd1e71436e 100644 --- a/test/Transforms/ObjCARC/contract-marker.ll +++ b/test/Transforms/ObjCARC/contract-marker.ll @@ -3,7 +3,7 @@ ; CHECK: %call = tail call i32* @qux() ; CHECK-NEXT: %tcall = bitcast i32* %call to i8* ; CHECK-NEXT: call void asm sideeffect "mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue", ""() -; CHECK-NEXT: %0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %tcall) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %tcall) [[NUW:#[0-9]+]] define void @foo() { entry: @@ -21,3 +21,5 @@ declare void @bar(i8*) !clang.arc.retainAutoreleasedReturnValueMarker = !{!0} !0 = metadata !{metadata !"mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue"} + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/contract-storestrong.ll b/test/Transforms/ObjCARC/contract-storestrong.ll index 2922f816d589..6999237300e7 100644 --- a/test/Transforms/ObjCARC/contract-storestrong.ll +++ b/test/Transforms/ObjCARC/contract-storestrong.ll @@ -10,7 +10,7 @@ declare void @use_pointer(i8*) ; CHECK: define void @test0( ; CHECK: entry: -; CHECK-NEXT: tail call void @objc_storeStrong(i8** @x, i8* %p) nounwind +; CHECK-NEXT: tail call void @objc_storeStrong(i8** @x, i8* %p) [[NUW:#[0-9]+]] ; CHECK-NEXT: ret void define void @test0(i8* %p) { entry: @@ -25,10 +25,10 @@ entry: ; CHECK: define void @test1(i8* %p) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %p) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %p) [[NUW]] ; CHECK-NEXT: %tmp = load volatile i8** @x, align 8 ; CHECK-NEXT: store i8* %0, i8** @x, align 8 -; CHECK-NEXT: tail call void @objc_release(i8* %tmp) nounwind +; CHECK-NEXT: tail call void @objc_release(i8* %tmp) [[NUW]] ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @test1(i8* %p) { @@ -44,10 +44,10 @@ entry: ; CHECK: define void @test2(i8* %p) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %p) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %p) [[NUW]] ; CHECK-NEXT: %tmp = load i8** @x, align 8 ; CHECK-NEXT: store volatile i8* %0, i8** @x, align 8 -; CHECK-NEXT: tail call void @objc_release(i8* %tmp) nounwind +; CHECK-NEXT: tail call void @objc_release(i8* %tmp) [[NUW]] ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @test2(i8* %p) { @@ -64,11 +64,11 @@ entry: ; CHECK: define void @test3(i8* %newValue) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %x0 = tail call i8* @objc_retain(i8* %newValue) nounwind +; CHECK-NEXT: %x0 = tail call i8* @objc_retain(i8* %newValue) [[NUW]] ; CHECK-NEXT: %x1 = load i8** @x, align 8 ; CHECK-NEXT: store i8* %x0, i8** @x, align 8 ; CHECK-NEXT: tail call void @use_pointer(i8* %x1), !clang.arc.no_objc_arc_exceptions !0 -; CHECK-NEXT: tail call void @objc_release(i8* %x1) nounwind, !clang.imprecise_release !0 +; CHECK-NEXT: tail call void @objc_release(i8* %x1) [[NUW]], !clang.imprecise_release !0 ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @test3(i8* %newValue) { @@ -85,11 +85,11 @@ entry: ; CHECK: define i1 @test4(i8* %newValue, i8* %foo) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %x0 = tail call i8* @objc_retain(i8* %newValue) nounwind +; CHECK-NEXT: %x0 = tail call i8* @objc_retain(i8* %newValue) [[NUW]] ; CHECK-NEXT: %x1 = load i8** @x, align 8 ; CHECK-NEXT: store i8* %x0, i8** @x, align 8 ; CHECK-NEXT: %t = icmp eq i8* %x1, %foo -; CHECK-NEXT: tail call void @objc_release(i8* %x1) nounwind, !clang.imprecise_release !0 +; CHECK-NEXT: tail call void @objc_release(i8* %x1) [[NUW]], !clang.imprecise_release !0 ; CHECK-NEXT: ret i1 %t ; CHECK-NEXT: } define i1 @test4(i8* %newValue, i8* %foo) { @@ -106,7 +106,7 @@ entry: ; CHECK: define i1 @test5(i8* %newValue, i8* %foo) { ; CHECK: %t = icmp eq i8* %x1, %foo -; CHECK: tail call void @objc_storeStrong(i8** @x, i8* %newValue) nounwind +; CHECK: tail call void @objc_storeStrong(i8** @x, i8* %newValue) [[NUW]] define i1 @test5(i8* %newValue, i8* %foo) { entry: %x0 = tail call i8* @objc_retain(i8* %newValue) nounwind @@ -121,7 +121,7 @@ entry: ; CHECK: define i1 @test6(i8* %newValue, i8* %foo) { ; CHECK: %t = icmp eq i8* %x1, %foo -; CHECK: tail call void @objc_storeStrong(i8** @x, i8* %newValue) nounwind +; CHECK: tail call void @objc_storeStrong(i8** @x, i8* %newValue) [[NUW]] define i1 @test6(i8* %newValue, i8* %foo) { entry: %x0 = tail call i8* @objc_retain(i8* %newValue) nounwind @@ -136,9 +136,9 @@ entry: ; CHECK: define void @test7( ; CHECK-NEXT: entry: -; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %p) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %p) [[NUW]] ; CHECK-NEXT: %tmp = load i8** @x, align 8 -; CHECK-NEXT: tail call void @objc_release(i8* %tmp) nounwind +; CHECK-NEXT: tail call void @objc_release(i8* %tmp) [[NUW]] ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @test7(i8* %p) { @@ -155,7 +155,7 @@ entry: ; CHECK-NEXT: entry: ; CHECK-NEXT: %tmp = load i8** @x, align 8 ; CHECK-NEXT: store i8* %p, i8** @x, align 8 -; CHECK-NEXT: tail call void @objc_release(i8* %tmp) nounwind +; CHECK-NEXT: tail call void @objc_release(i8* %tmp) [[NUW]] ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @test8(i8* %p) { @@ -167,3 +167,5 @@ entry: } !0 = metadata !{} + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/contract-testcases.ll b/test/Transforms/ObjCARC/contract-testcases.ll index 1510ed00e691..85b03be275ec 100644 --- a/test/Transforms/ObjCARC/contract-testcases.ll +++ b/test/Transforms/ObjCARC/contract-testcases.ll @@ -69,7 +69,7 @@ bb7: ; preds = %bb6, %bb6, %bb5 ; CHECK: define void @_Z6doTestP8NSString() { ; CHECK: invoke.cont: ; preds = %entry ; CHECK-NEXT: call void asm sideeffect "mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue", ""() -; CHECK-NEXT: %tmp = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind +; CHECK-NEXT: %tmp = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %call) [[NUW:#[0-9]+]] define void @_Z6doTestP8NSString() { entry: %call = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* ()*)() @@ -88,3 +88,6 @@ lpad: ; preds = %entry !clang.arc.retainAutoreleasedReturnValueMarker = !{!0} !0 = metadata !{metadata !"mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue"} + +; CHECK: attributes #0 = { optsize } +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/contract.ll b/test/Transforms/ObjCARC/contract.ll index c48f8a534fad..0b60683d9995 100644 --- a/test/Transforms/ObjCARC/contract.ll +++ b/test/Transforms/ObjCARC/contract.ll @@ -34,12 +34,12 @@ entry: ; Merge objc_retain and objc_autorelease into objc_retainAutorelease. ; CHECK: define void @test2( -; CHECK: tail call i8* @objc_retainAutorelease(i8* %x) nounwind +; CHECK: tail call i8* @objc_retainAutorelease(i8* %x) [[NUW:#[0-9]+]] ; CHECK: } define void @test2(i8* %x) nounwind { entry: %0 = tail call i8* @objc_retain(i8* %x) nounwind - tail call i8* @objc_autorelease(i8* %0) nounwind + call i8* @objc_autorelease(i8* %0) nounwind call void @use_pointer(i8* %x) ret void } @@ -47,7 +47,7 @@ entry: ; Same as test2 but the value is returned. Do an RV optimization. ; CHECK: define i8* @test2b( -; CHECK: tail call i8* @objc_retainAutoreleaseReturnValue(i8* %x) nounwind +; CHECK: tail call i8* @objc_retainAutoreleaseReturnValue(i8* %x) [[NUW]] ; CHECK: } define i8* @test2b(i8* %x) nounwind { entry: @@ -59,14 +59,14 @@ entry: ; Merge a retain,autorelease pair around a call. ; CHECK: define void @test3( -; CHECK: tail call i8* @objc_retainAutorelease(i8* %x) nounwind +; CHECK: tail call i8* @objc_retainAutorelease(i8* %x) [[NUW]] ; CHECK: @use_pointer(i8* %0) ; CHECK: } define void @test3(i8* %x, i64 %n) { entry: tail call i8* @objc_retain(i8* %x) nounwind call void @use_pointer(i8* %x) - tail call i8* @objc_autorelease(i8* %x) nounwind + call i8* @objc_autorelease(i8* %x) nounwind ret void } @@ -75,7 +75,7 @@ entry: ; CHECK: define void @test4( ; CHECK-NEXT: entry: -; CHECK-NEXT: @objc_retainAutorelease(i8* %x) nounwind +; CHECK-NEXT: @objc_retainAutorelease(i8* %x) [[NUW]] ; CHECK-NEXT: @use_pointer ; CHECK-NEXT: @objc_release ; CHECK-NEXT: ret void @@ -84,7 +84,7 @@ define void @test4(i8* %x, i64 %n) { entry: tail call i8* @objc_retain(i8* %x) nounwind call void @use_pointer(i8* %x) - tail call i8* @objc_autorelease(i8* %x) nounwind + call i8* @objc_autorelease(i8* %x) nounwind tail call void @objc_release(i8* %x) nounwind ret void } @@ -92,9 +92,9 @@ entry: ; Don't merge retain and autorelease if they're not control-equivalent. ; CHECK: define void @test5( -; CHECK: tail call i8* @objc_retain(i8* %p) nounwind +; CHECK: tail call i8* @objc_retain(i8* %p) [[NUW]] ; CHECK: true: -; CHECK: tail call i8* @objc_autorelease(i8* %0) nounwind +; CHECK: call i8* @objc_autorelease(i8* %0) [[NUW]] ; CHECK: } define void @test5(i8* %p, i1 %a) { entry: @@ -102,7 +102,7 @@ entry: br i1 %a, label %true, label %false true: - tail call i8* @objc_autorelease(i8* %p) nounwind + call i8* @objc_autorelease(i8* %p) nounwind call void @use_pointer(i8* %p) ret void @@ -119,8 +119,8 @@ false: ; Those entrypoints don't exist yet though. ; CHECK: define i8* @test6( -; CHECK: call i8* @objc_retainAutoreleasedReturnValue(i8* %p) nounwind -; CHECK: %t = tail call i8* @objc_autoreleaseReturnValue(i8* %1) nounwind +; CHECK: call i8* @objc_retainAutoreleasedReturnValue(i8* %p) [[NUW]] +; CHECK: %t = tail call i8* @objc_autoreleaseReturnValue(i8* %1) [[NUW]] ; CHECK: } define i8* @test6() { %p = call i8* @returner() @@ -161,3 +161,16 @@ return: ; preds = %if.then, %entry %retval = phi i8* [ %c, %if.then ], [ null, %entry ] ret i8* %retval } + +; Kill calls to @clang.arc.use(...) +; CHECK: define void @test9( +; CHECK-NOT: clang.arc.use +; CHECK: } +define void @test9(i8* %a, i8* %b) { + call void (...)* @clang.arc.use(i8* %a, i8* %b) nounwind + ret void +} + +declare void @clang.arc.use(...) nounwind + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll b/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll new file mode 100644 index 000000000000..05257d1d5cf8 --- /dev/null +++ b/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll @@ -0,0 +1,174 @@ +; RUN: opt -objc-arc -S < %s | FileCheck %s +; rdar://11744105 +; bugzilla://14584 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +%0 = type opaque +%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* } +%struct._objc_cache = type opaque +%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* } +%struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] } +%struct._objc_method = type { i8*, i8*, i8* } +%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] } +%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8** } +%struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] } +%struct._prop_t = type { i8*, i8* } +%struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] } +%struct._ivar_t = type { i64*, i8*, i8*, i32, i32 } +%struct.NSConstantString = type { i32*, i32, i8*, i64 } + +@"OBJC_CLASS_$_NSObject" = external global %struct._class_t +@"\01L_OBJC_CLASSLIST_REFERENCES_$_" = internal global %struct._class_t* @"OBJC_CLASS_$_NSObject", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8 +@"\01L_OBJC_METH_VAR_NAME_" = internal global [4 x i8] c"new\00", section "__TEXT,__objc_methname,cstring_literals", align 1 +@"\01L_OBJC_SELECTOR_REFERENCES_" = internal global i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i64 0, i64 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip" +@__CFConstantStringClassReference = external global [0 x i32] +@.str = linker_private unnamed_addr constant [11 x i8] c"Failed: %@\00", align 1 +@_unnamed_cfstring_ = private constant %struct.NSConstantString { i32* getelementptr inbounds ([0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([11 x i8]* @.str, i32 0, i32 0), i64 10 }, section "__DATA,__cfstring" +@"OBJC_CLASS_$_NSException" = external global %struct._class_t +@"\01L_OBJC_CLASSLIST_REFERENCES_$_1" = internal global %struct._class_t* @"OBJC_CLASS_$_NSException", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8 +@.str2 = linker_private unnamed_addr constant [4 x i8] c"Foo\00", align 1 +@_unnamed_cfstring_3 = private constant %struct.NSConstantString { i32* getelementptr inbounds ([0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([4 x i8]* @.str2, i32 0, i32 0), i64 3 }, section "__DATA,__cfstring" +@"\01L_OBJC_METH_VAR_NAME_4" = internal global [14 x i8] c"raise:format:\00", section "__TEXT,__objc_methname,cstring_literals", align 1 +@"\01L_OBJC_SELECTOR_REFERENCES_5" = internal global i8* getelementptr inbounds ([14 x i8]* @"\01L_OBJC_METH_VAR_NAME_4", i64 0, i64 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip" +@llvm.used = appending global [6 x i8*] [i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_" to i8*), i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_" to i8*), i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_1" to i8*), i8* getelementptr inbounds ([14 x i8]* @"\01L_OBJC_METH_VAR_NAME_4", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_5" to i8*)], section "llvm.metadata" + +define i32 @main() uwtable ssp { +entry: + %tmp = load %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_", align 8, !dbg !37 + %tmp1 = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8, !dbg !37, !invariant.load !38 + %tmp2 = bitcast %struct._class_t* %tmp to i8*, !dbg !37 +; CHECK: call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %tmp2, i8* %tmp1) + %call = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %tmp2, i8* %tmp1), !dbg !37, !clang.arc.no_objc_arc_exceptions !38 + call void @llvm.dbg.value(metadata !{i8* %call}, i64 0, metadata !12), !dbg !37 +; CHECK: call i8* @objc_retain(i8* %call) [[NUW:#[0-9]+]] + %tmp3 = call i8* @objc_retain(i8* %call) nounwind, !dbg !39 + call void @llvm.dbg.value(metadata !{i8* %call}, i64 0, metadata !25), !dbg !39 + invoke fastcc void @ThrowFunc(i8* %call) + to label %eh.cont unwind label %lpad, !dbg !40, !clang.arc.no_objc_arc_exceptions !38 + +eh.cont: ; preds = %entry +; CHECK: call void @objc_release(i8* %call) + call void @objc_release(i8* %call) nounwind, !dbg !42, !clang.imprecise_release !38 + br label %if.end, !dbg !43 + +lpad: ; preds = %entry + %tmp4 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) + catch i8* null, !dbg !40 + %tmp5 = extractvalue { i8*, i32 } %tmp4, 0, !dbg !40 + %exn.adjusted = call i8* @objc_begin_catch(i8* %tmp5) nounwind, !dbg !44 + call void @llvm.dbg.value(metadata !45, i64 0, metadata !21), !dbg !46 + call void @objc_end_catch(), !dbg !49, !clang.arc.no_objc_arc_exceptions !38 +; CHECK: call void @objc_release(i8* %call) + call void @objc_release(i8* %call) nounwind, !dbg !42, !clang.imprecise_release !38 + call void (i8*, ...)* @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring_ to i8*), i8* %call), !dbg !50, !clang.arc.no_objc_arc_exceptions !38 + br label %if.end, !dbg !52 + +if.end: ; preds = %lpad, %eh.cont + call void (i8*, ...)* @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring_ to i8*), i8* %call), !dbg !53, !clang.arc.no_objc_arc_exceptions !38 +; CHECK: call void @objc_release(i8* %call) + call void @objc_release(i8* %call) nounwind, !dbg !54, !clang.imprecise_release !38 + ret i32 0, !dbg !54 +} + +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind + +declare i8* @objc_retain(i8*) nonlazybind + +declare i8* @objc_begin_catch(i8*) + +declare void @objc_end_catch() + +declare void @objc_exception_rethrow() + +define internal fastcc void @ThrowFunc(i8* %obj) uwtable noinline ssp { +entry: + %tmp = call i8* @objc_retain(i8* %obj) nounwind + call void @llvm.dbg.value(metadata !{i8* %obj}, i64 0, metadata !32), !dbg !55 + %tmp1 = load %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_1", align 8, !dbg !56 + %tmp2 = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_5", align 8, !dbg !56, !invariant.load !38 + %tmp3 = bitcast %struct._class_t* %tmp1 to i8*, !dbg !56 + call void (i8*, i8*, %0*, %0*, ...)* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %0*, %0*, ...)*)(i8* %tmp3, i8* %tmp2, %0* bitcast (%struct.NSConstantString* @_unnamed_cfstring_3 to %0*), %0* bitcast (%struct.NSConstantString* @_unnamed_cfstring_3 to %0*)), !dbg !56, !clang.arc.no_objc_arc_exceptions !38 + call void @objc_release(i8* %obj) nounwind, !dbg !58, !clang.imprecise_release !38 + ret void, !dbg !58 +} + +declare i32 @__objc_personality_v0(...) + +declare void @objc_release(i8*) nonlazybind + +declare void @NSLog(i8*, ...) + +declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone + +; CHECK: attributes #0 = { ssp uwtable } +; CHECK: attributes #1 = { nounwind readnone } +; CHECK: attributes #2 = { nonlazybind } +; CHECK: attributes #3 = { noinline ssp uwtable } +; CHECK: attributes [[NUW]] = { nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!33, !34, !35, !36} + +!0 = metadata !{i32 786449, i32 0, i32 16, metadata !"test.m", metadata !"/Volumes/Files/gottesmmcab/Radar/12906997", metadata !"clang version 3.3 ", i1 true, i1 true, metadata !"", i32 2, metadata !1, metadata !1, metadata !3, metadata !1} ; [ DW_TAG_compile_unit ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] [DW_LANG_ObjC] +!1 = metadata !{metadata !2} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{metadata !5, metadata !27} +!5 = metadata !{i32 786478, i32 0, metadata !6, metadata !"main", metadata !"main", metadata !"", metadata !6, i32 9, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, i32 ()* @main, null, null, metadata !10, i32 10} ; [ DW_TAG_subprogram ] [line 9] [def] [scope 10] [main] +!6 = metadata !{i32 786473, metadata !"test.m", metadata !"/Volumes/Files/gottesmmcab/Radar/12906997", null} ; [ DW_TAG_file_type ] +!7 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786468, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{metadata !11} +!11 = metadata !{metadata !12, metadata !21, metadata !25} +!12 = metadata !{i32 786688, metadata !13, metadata !"obj", metadata !6, i32 11, metadata !14, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [obj] [line 11] +!13 = metadata !{i32 786443, metadata !5, i32 10, i32 0, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] +!14 = metadata !{i32 786454, null, metadata !"id", metadata !6, i32 11, i64 0, i64 0, i64 0, i32 0, metadata !15} ; [ DW_TAG_typedef ] [id] [line 11, size 0, align 0, offset 0] [from ] +!15 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from objc_object] +!16 = metadata !{i32 786451, null, metadata !"objc_object", metadata !6, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !17, i32 0, i32 0, i32 0} ; [ DW_TAG_structure_type ] [objc_object] [line 0, size 0, align 0, offset 0] [from ] +!17 = metadata !{metadata !18} +!18 = metadata !{i32 786445, metadata !16, metadata !"isa", metadata !6, i32 0, i64 64, i64 0, i64 0, i32 0, metadata !19} ; [ DW_TAG_member ] [isa] [line 0, size 64, align 0, offset 0] [from ] +!19 = metadata !{i32 786447, null, metadata !"", null, i32 0, i64 64, i64 0, i64 0, i32 0, metadata !20} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from objc_class] +!20 = metadata !{i32 786451, null, metadata !"objc_class", metadata !6, i32 0, i64 0, i64 0, i32 0, i32 4, null, null, i32 0} ; [ DW_TAG_structure_type ] [objc_class] [line 0, size 0, align 0, offset 0] [fwd] [from ] +!21 = metadata !{i32 786688, metadata !22, metadata !"ok", metadata !6, i32 13, metadata !23, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [ok] [line 13] +!22 = metadata !{i32 786443, metadata !13, i32 12, i32 0, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] +!23 = metadata !{i32 786454, null, metadata !"BOOL", metadata !6, i32 62, i64 0, i64 0, i64 0, i32 0, metadata !24} ; [ DW_TAG_typedef ] [BOOL] [line 62, size 0, align 0, offset 0] [from signed char] +!24 = metadata !{i32 786468, null, metadata !"signed char", null, i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [signed char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char] +!25 = metadata !{i32 786688, metadata !26, metadata !"obj2", metadata !6, i32 15, metadata !14, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [obj2] [line 15] +!26 = metadata !{i32 786443, metadata !22, i32 14, i32 0, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] +!27 = metadata !{i32 786478, i32 0, metadata !6, metadata !"ThrowFunc", metadata !"ThrowFunc", metadata !"", metadata !6, i32 4, metadata !28, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i8*)* @ThrowFunc, null, null, metadata !30, i32 5} ; [ DW_TAG_subprogram ] [line 4] [local] [def] [scope 5] [ThrowFunc] +!28 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !29, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!29 = metadata !{null, metadata !14} +!30 = metadata !{metadata !31} +!31 = metadata !{metadata !32} +!32 = metadata !{i32 786689, metadata !27, metadata !"obj", metadata !6, i32 16777220, metadata !14, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [obj] [line 4] +!33 = metadata !{i32 1, metadata !"Objective-C Version", i32 2} +!34 = metadata !{i32 1, metadata !"Objective-C Image Info Version", i32 0} +!35 = metadata !{i32 1, metadata !"Objective-C Image Info Section", metadata !"__DATA, __objc_imageinfo, regular, no_dead_strip"} +!36 = metadata !{i32 4, metadata !"Objective-C Garbage Collection", i32 0} +!37 = metadata !{i32 11, i32 0, metadata !13, null} +!38 = metadata !{} +!39 = metadata !{i32 15, i32 0, metadata !26, null} +!40 = metadata !{i32 17, i32 0, metadata !41, null} +!41 = metadata !{i32 786443, metadata !26, i32 16, i32 0, metadata !6, i32 3} ; [ DW_TAG_lexical_block ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] +!42 = metadata !{i32 22, i32 0, metadata !26, null} +!43 = metadata !{i32 23, i32 0, metadata !22, null} +!44 = metadata !{i32 19, i32 0, metadata !41, null} +!45 = metadata !{i8 0} +!46 = metadata !{i32 20, i32 0, metadata !47, null} +!47 = metadata !{i32 786443, metadata !48, i32 19, i32 0, metadata !6, i32 5} ; [ DW_TAG_lexical_block ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] +!48 = metadata !{i32 786443, metadata !26, i32 19, i32 0, metadata !6, i32 4} ; [ DW_TAG_lexical_block ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] +!49 = metadata !{i32 21, i32 0, metadata !47, null} +!50 = metadata !{i32 24, i32 0, metadata !51, null} +!51 = metadata !{i32 786443, metadata !22, i32 23, i32 0, metadata !6, i32 6} ; [ DW_TAG_lexical_block ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] +!52 = metadata !{i32 25, i32 0, metadata !51, null} +!53 = metadata !{i32 27, i32 0, metadata !13, null} +!54 = metadata !{i32 28, i32 0, metadata !13, null} +!55 = metadata !{i32 4, i32 0, metadata !27, null} +!56 = metadata !{i32 6, i32 0, metadata !57, null} +!57 = metadata !{i32 786443, metadata !27, i32 5, i32 0, metadata !6, i32 7} ; [ DW_TAG_lexical_block ] [/Volumes/Files/gottesmmcab/Radar/12906997/test.m] +!58 = metadata !{i32 7, i32 0, metadata !57, null} diff --git a/test/Transforms/ObjCARC/escape.ll b/test/Transforms/ObjCARC/escape.ll index 3f694cf1d5a4..8f252a0d343a 100644 --- a/test/Transforms/ObjCARC/escape.ll +++ b/test/Transforms/ObjCARC/escape.ll @@ -10,8 +10,8 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 ; with the objc_storeWeak call. ; CHECK: define void @test0( -; CHECK: %tmp7 = call i8* @objc_retainBlock(i8* %tmp6) nounwind, !clang.arc.copy_on_escape !0 -; CHECK: call void @objc_release(i8* %tmp7) nounwind, !clang.imprecise_release !0 +; CHECK: %tmp7 = call i8* @objc_retainBlock(i8* %tmp6) [[NUW:#[0-9]+]], !clang.arc.copy_on_escape !0 +; CHECK: call void @objc_release(i8* %tmp7) [[NUW]], !clang.imprecise_release !0 ; CHECK: } define void @test0() nounwind { entry: @@ -129,3 +129,6 @@ declare i8* @not_really_objc_storeWeak(i8**, i8*) declare void @objc_release(i8*) !0 = metadata !{} + +; CHECK: attributes [[NUW]] = { nounwind } +; CHECK: attributes #1 = { nounwind ssp } diff --git a/test/Transforms/ObjCARC/gvn.ll b/test/Transforms/ObjCARC/gvn.ll index 6917b02e0324..3648866de01a 100644 --- a/test/Transforms/ObjCARC/gvn.ll +++ b/test/Transforms/ObjCARC/gvn.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -basicaa -objc-arc -gvn < %s | FileCheck %s +; RUN: opt -S -basicaa -objc-arc-aa -gvn < %s | FileCheck %s @x = common global i8* null, align 8 diff --git a/test/Transforms/ObjCARC/intrinsic-use.ll b/test/Transforms/ObjCARC/intrinsic-use.ll new file mode 100644 index 000000000000..9c7b81a95d23 --- /dev/null +++ b/test/Transforms/ObjCARC/intrinsic-use.ll @@ -0,0 +1,63 @@ +; RUN: opt -basicaa -objc-arc -S < %s | FileCheck %s + +target datalayout = "e-p:64:64:64" + +declare i8* @objc_retain(i8*) +declare i8* @objc_retainAutorelease(i8*) +declare void @objc_release(i8*) +declare i8* @objc_autorelease(i8*) + +declare void @clang.arc.use(...) + +declare void @test0_helper(i8*, i8**) + +; Ensure that we honor clang.arc.use as a use and don't miscompile +; the reduced test case from <rdar://13195034>. +; +; FIXME: the fact that we re-order retains w.r.t. @clang.arc.use could +; be problematic if we get run twice, e.g. under LTO. +; +; CHECK: define void @test0( +; CHECK: @objc_retain(i8* %x) +; CHECK-NEXT: store i8* %y, i8** %temp0 +; CHECK-NEXT: @objc_retain(i8* %y) +; CHECK-NEXT: call void @test0_helper +; CHECK-NEXT: [[VAL1:%.*]] = load i8** %temp0 +; CHECK-NEXT: call void (...)* @clang.arc.use(i8* %y) +; CHECK-NEXT: @objc_retain(i8* [[VAL1]]) +; CHECK-NEXT: @objc_release(i8* %y) +; CHECK-NEXT: store i8* [[VAL1]], i8** %temp1 +; CHECK-NEXT: call void @test0_helper +; CHECK-NEXT: [[VAL2:%.*]] = load i8** %temp1 +; CHECK-NEXT: call void (...)* @clang.arc.use(i8* [[VAL1]]) +; CHECK-NEXT: @objc_retain(i8* [[VAL2]]) +; CHECK-NEXT: @objc_release(i8* [[VAL1]]) +; CHECK-NEXT: @objc_autorelease(i8* %x) +; CHECK-NEXT: store i8* %x, i8** %out +; CHECK-NEXT: @objc_release(i8* [[VAL2]]) +; CHECK-NEXT: ret void +define void @test0(i8** %out, i8* %x, i8* %y) { +entry: + %temp0 = alloca i8*, align 8 + %temp1 = alloca i8*, align 8 + %0 = call i8* @objc_retain(i8* %x) nounwind + %1 = call i8* @objc_retain(i8* %y) nounwind + store i8* %y, i8** %temp0 + call void @test0_helper(i8* %x, i8** %temp0) + %val1 = load i8** %temp0 + %2 = call i8* @objc_retain(i8* %val1) nounwind + call void (...)* @clang.arc.use(i8* %y) nounwind + call void @objc_release(i8* %y) nounwind + store i8* %val1, i8** %temp1 + call void @test0_helper(i8* %x, i8** %temp1) + %val2 = load i8** %temp1 + %3 = call i8* @objc_retain(i8* %val2) nounwind + call void (...)* @clang.arc.use(i8* %val1) nounwind + call void @objc_release(i8* %val1) nounwind + %4 = call i8* @objc_retain(i8* %x) nounwind + %5 = call i8* @objc_autorelease(i8* %x) nounwind + store i8* %x, i8** %out + call void @objc_release(i8* %val2) nounwind + call void @objc_release(i8* %x) nounwind + ret void +} diff --git a/test/Transforms/ObjCARC/invoke.ll b/test/Transforms/ObjCARC/invoke.ll index 1a58e34940e1..f528b4ac35bc 100644 --- a/test/Transforms/ObjCARC/invoke.ll +++ b/test/Transforms/ObjCARC/invoke.ll @@ -12,10 +12,10 @@ declare i8* @returner() ; CHECK: define void @test0( ; CHECK: invoke.cont: -; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 +; CHECK: call void @objc_release(i8* %zipFile) [[NUW:#[0-9]+]], !clang.imprecise_release !0 ; CHECK: ret void ; CHECK: lpad: -; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 +; CHECK: call void @objc_release(i8* %zipFile) [[NUW]], !clang.imprecise_release !0 ; CHECK: ret void define void @test0(i8* %zipFile) { entry: @@ -39,11 +39,11 @@ lpad: ; preds = %entry ; CHECK: define void @test1( ; CHECK: invoke.cont: -; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 +; CHECK: call void @objc_release(i8* %zipFile) [[NUW]], !clang.imprecise_release !0 ; CHECK: call void @callee() ; CHECK: br label %done ; CHECK: lpad: -; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 +; CHECK: call void @objc_release(i8* %zipFile) [[NUW]], !clang.imprecise_release !0 ; CHECK: call void @callee() ; CHECK: br label %done ; CHECK: done: @@ -108,7 +108,7 @@ finally.rethrow: ; preds = %invoke.cont, %entry ; CHECK: define void @test3( ; CHECK: if.end: -; CHECK-NEXT: call void @objc_release(i8* %p) nounwind +; CHECK-NEXT: call void @objc_release(i8* %p) [[NUW]] ; CHECK-NEXT: ret void define void @test3(i8* %p, i1 %b) { entry: @@ -140,10 +140,10 @@ if.end: ; CHECK: lpad: ; CHECK-NEXT: %r = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) ; CHECK-NEXT: cleanup -; CHECK-NEXT: call void @objc_release(i8* %p) nounwind +; CHECK-NEXT: call void @objc_release(i8* %p) [[NUW]] ; CHECK-NEXT: ret void ; CHECK: if.end: -; CHECK-NEXT: call void @objc_release(i8* %p) nounwind +; CHECK-NEXT: call void @objc_release(i8* %p) [[NUW]] ; CHECK-NEXT: ret void define void @test4(i8* %p, i1 %b) { entry: @@ -215,4 +215,6 @@ if.end: declare i32 @__gxx_personality_v0(...) declare i32 @__objc_personality_v0(...) +; CHECK: attributes [[NUW]] = { nounwind } + !0 = metadata !{} diff --git a/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll b/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll index 170d0a99c98b..5d058257c6ed 100644 --- a/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll +++ b/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll @@ -4,7 +4,7 @@ ; and various scary looking things and fold it into an objc_retainAutorelease. ; CHECK: bb57: -; CHECK: tail call i8* @objc_retainAutorelease(i8* %tmp71x) nounwind +; CHECK: tail call i8* @objc_retainAutorelease(i8* %tmp71x) [[NUW:#[0-9]+]] ; CHECK: bb99: target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" @@ -212,10 +212,12 @@ bb99: ; preds = %bb57 br label %bb104 bb104: ; preds = %bb99, %bb57 - %tmp105 = tail call i8* @objc_autorelease(i8* %tmp72) nounwind + %tmp105 = call i8* @objc_autorelease(i8* %tmp72) nounwind %tmp106 = bitcast i8* %tmp105 to %14* tail call void @objc_release(i8* %tmp85) nounwind %tmp107 = bitcast %18* %tmp47 to i8* tail call void @objc_release(i8* %tmp107) nounwind ret %14* %tmp106 } + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/nested.ll b/test/Transforms/ObjCARC/nested.ll index 32be03ec6ae0..ca9c58bcb3e3 100644 --- a/test/Transforms/ObjCARC/nested.ll +++ b/test/Transforms/ObjCARC/nested.ll @@ -770,9 +770,9 @@ forcoll.empty: @__block_d_tmp5 = external hidden constant { i64, i64, i8*, i8*, i8*, i8* } ; CHECK: define void @test11( -; CHECK: tail call i8* @objc_retain(i8* %call) nounwind -; CHECK: tail call i8* @objc_retain(i8* %call) nounwind -; CHECK: call void @objc_release(i8* %call) nounwind, !clang.imprecise_release !0 +; CHECK: tail call i8* @objc_retain(i8* %call) [[NUW:#[0-9]+]] +; CHECK: tail call i8* @objc_retain(i8* %call) [[NUW]] +; CHECK: call void @objc_release(i8* %call) [[NUW]], !clang.imprecise_release !0 ; CHECK: } define void @test11() { entry: @@ -820,3 +820,6 @@ entry: call void @objc_release(i8* %call) nounwind, !clang.imprecise_release !0 ret void } + +; CHECK: attributes [[NUW]] = { nounwind } +; CHECK: attributes #1 = { nonlazybind } diff --git a/test/Transforms/ObjCARC/no-objc-arc-exceptions.ll b/test/Transforms/ObjCARC/no-objc-arc-exceptions.ll index 9728f6e0d94f..58b5bbe9c7e9 100644 --- a/test/Transforms/ObjCARC/no-objc-arc-exceptions.ll +++ b/test/Transforms/ObjCARC/no-objc-arc-exceptions.ll @@ -59,11 +59,12 @@ lpad: ; preds = %entry resume { i8*, i32 } %t8 } -; There is no !clang.arc.no_objc_arc_exceptions -; metadata here, so the optimizer shouldn't eliminate anything. +; There is no !clang.arc.no_objc_arc_exceptions metadata here, so the optimizer +; shouldn't eliminate anything, but *CAN* strength reduce the objc_retainBlock +; to an objc_retain. ; CHECK: define void @test0_no_metadata( -; CHECK: call i8* @objc_retainBlock( +; CHECK: call i8* @objc_retain( ; CHECK: invoke ; CHECK: call void @objc_release( ; CHECK: } diff --git a/test/Transforms/ObjCARC/pr12270.ll b/test/Transforms/ObjCARC/pr12270.ll index 1faae5f68705..bdff0d7b4d58 100644 --- a/test/Transforms/ObjCARC/pr12270.ll +++ b/test/Transforms/ObjCARC/pr12270.ll @@ -1,4 +1,4 @@ -; RUN: opt -disable-output -objc-arc-contract %s +; RUN: opt -disable-output -objc-arc-contract < %s ; test that we don't crash on unreachable code %2 = type opaque diff --git a/test/Transforms/ObjCARC/retain-block-alloca.ll b/test/Transforms/ObjCARC/retain-block-alloca.ll index 01f208704c7b..f40be238baf3 100644 --- a/test/Transforms/ObjCARC/retain-block-alloca.ll +++ b/test/Transforms/ObjCARC/retain-block-alloca.ll @@ -9,7 +9,7 @@ @"\01L_OBJC_SELECTOR_REFERENCES_" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip" ; CHECK: define void @test( -; CHECK: %3 = call i8* @objc_retainBlock(i8* %2) nounwind +; CHECK: %3 = call i8* @objc_retainBlock(i8* %2) [[NUW:#[0-9]+]] ; CHECK: @objc_msgSend ; CHECK-NEXT: @objc_release(i8* %3) define void @test(%0* %array) uwtable { @@ -87,4 +87,8 @@ declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind declare void @objc_release(i8*) +; CHECK: attributes #0 = { uwtable } +; CHECK: attributes #1 = { nonlazybind } +; CHECK: attributes [[NUW]] = { nounwind } + !0 = metadata !{} diff --git a/test/Transforms/ObjCARC/retain-block-escape-analysis.ll b/test/Transforms/ObjCARC/retain-block-escape-analysis.ll new file mode 100644 index 000000000000..2c1ddce32836 --- /dev/null +++ b/test/Transforms/ObjCARC/retain-block-escape-analysis.ll @@ -0,0 +1,127 @@ +; RUN: opt -S -objc-arc < %s | FileCheck %s + +declare i8* @objc_retain(i8*) nonlazybind +declare void @objc_release(i8*) nonlazybind +declare i8* @objc_retainBlock(i8*) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Use by an instruction which copies the value is an escape if the ; +; result is an escape. The current instructions with this property are: ; +; ; +; 1. BitCast. ; +; 2. GEP. ; +; 3. PhiNode. ; +; 4. SelectInst. ; +; ; +; Make sure that such instructions do not confuse the optimizer into removing ; +; an objc_retainBlock that is needed. ; +; ; +; rdar://13273675. (With extra test cases to handle bitcast, phi, and select. ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +define void @bitcasttest(i8* %storage, void (...)* %block) { +; CHECK: define void @bitcasttest +entry: + %t1 = bitcast void (...)* %block to i8* +; CHECK-NOT: tail call i8* @objc_retain + %t2 = tail call i8* @objc_retain(i8* %t1) +; CHECK: tail call i8* @objc_retainBlock + %t3 = tail call i8* @objc_retainBlock(i8* %t1), !clang.arc.copy_on_escape !0 + %t4 = bitcast i8* %storage to void (...)** + %t5 = bitcast i8* %t3 to void (...)* + store void (...)* %t5, void (...)** %t4, align 8 +; CHECK-NOT: call void @objc_release + call void @objc_release(i8* %t1) + ret void +} + +define void @geptest(void (...)** %storage_array, void (...)* %block) { +; CHECK: define void @geptest +entry: + %t1 = bitcast void (...)* %block to i8* +; CHECK-NOT: tail call i8* @objc_retain + %t2 = tail call i8* @objc_retain(i8* %t1) +; CHECK: tail call i8* @objc_retainBlock + %t3 = tail call i8* @objc_retainBlock(i8* %t1), !clang.arc.copy_on_escape !0 + %t4 = bitcast i8* %t3 to void (...)* + + %storage = getelementptr inbounds void (...)** %storage_array, i64 0 + + store void (...)* %t4, void (...)** %storage, align 8 +; CHECK-NOT: call void @objc_release + call void @objc_release(i8* %t1) + ret void +} + +define void @selecttest(void (...)** %store1, void (...)** %store2, + void (...)* %block) { +; CHECK: define void @selecttest +entry: + %t1 = bitcast void (...)* %block to i8* +; CHECK-NOT: tail call i8* @objc_retain + %t2 = tail call i8* @objc_retain(i8* %t1) +; CHECK: tail call i8* @objc_retainBlock + %t3 = tail call i8* @objc_retainBlock(i8* %t1), !clang.arc.copy_on_escape !0 + %t4 = bitcast i8* %t3 to void (...)* + %store = select i1 undef, void (...)** %store1, void (...)** %store2 + store void (...)* %t4, void (...)** %store, align 8 +; CHECK-NOT: call void @objc_release + call void @objc_release(i8* %t1) + ret void +} + +define void @phinodetest(void (...)** %storage1, + void (...)** %storage2, + void (...)* %block) { +; CHECK: define void @phinodetest +entry: + %t1 = bitcast void (...)* %block to i8* +; CHECK-NOT: tail call i8* @objc_retain + %t2 = tail call i8* @objc_retain(i8* %t1) +; CHECK: tail call i8* @objc_retainBlock + %t3 = tail call i8* @objc_retainBlock(i8* %t1), !clang.arc.copy_on_escape !0 + %t4 = bitcast i8* %t3 to void (...)* + br i1 undef, label %store1_set, label %store2_set + +store1_set: + br label %end + +store2_set: + br label %end + +end: + %storage = phi void (...)** [ %storage1, %store1_set ], [ %storage2, %store2_set] + store void (...)* %t4, void (...)** %storage, align 8 +; CHECK-NOT: call void @objc_release + call void @objc_release(i8* %t1) + ret void +} + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; This test makes sure that we do not hang clang when visiting a use ; +; cycle caused by phi nodes during objc-arc analysis. *NOTE* This ; +; test case looks a little convoluted since it was produced by ; +; bugpoint. ; +; ; +; bugzilla://14551 ; +; rdar://12851911 ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +define void @phinode_use_cycle(i8* %block) uwtable optsize ssp { +; CHECK: define void @phinode_use_cycle(i8* %block) +entry: + br label %for.body + +for.body: ; preds = %if.then, %for.body, %entry + %block.05 = phi void (...)* [ null, %entry ], [ %1, %if.then ], [ %block.05, %for.body ] + br i1 undef, label %for.body, label %if.then + +if.then: ; preds = %for.body + %0 = call i8* @objc_retainBlock(i8* %block), !clang.arc.copy_on_escape !0 + %1 = bitcast i8* %0 to void (...)* + %2 = bitcast void (...)* %block.05 to i8* + call void @objc_release(i8* %2) nounwind, !clang.imprecise_release !0 + br label %for.body +} + +!0 = metadata !{} diff --git a/test/Transforms/ObjCARC/retain-block-side-effects.ll b/test/Transforms/ObjCARC/retain-block-side-effects.ll index e84d48f86912..7fa73cbfef15 100644 --- a/test/Transforms/ObjCARC/retain-block-side-effects.ll +++ b/test/Transforms/ObjCARC/retain-block-side-effects.ll @@ -4,7 +4,7 @@ ; objc_retainBlock stores into %repeater so the load from after the ; call isn't forwardable from the store before the call. -; CHECK: %tmp16 = call i8* @objc_retainBlock(i8* %tmp15) nounwind +; CHECK: %tmp16 = call i8* @objc_retainBlock(i8* %tmp15) [[NUW:#[0-9]+]] ; CHECK: %tmp17 = bitcast i8* %tmp16 to void ()* ; CHECK: %tmp18 = load %struct.__block_byref_repeater** %byref.forwarding, align 8 ; CHECK: %repeater12 = getelementptr inbounds %struct.__block_byref_repeater* %tmp18, i64 0, i32 6 @@ -37,3 +37,6 @@ entry: } declare i8* @objc_retainBlock(i8*) + +; CHECK: attributes #0 = { noreturn } +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/retain-block.ll b/test/Transforms/ObjCARC/retain-block.ll index b3b62d300008..1bb3f0276adf 100644 --- a/test/Transforms/ObjCARC/retain-block.ll +++ b/test/Transforms/ObjCARC/retain-block.ll @@ -28,8 +28,8 @@ entry: ; optimization possible. ; CHECK: define void @test0_no_metadata(i8* %tmp) { -; CHECK: %tmp2 = tail call i8* @objc_retainBlock(i8* %tmp) nounwind -; CHECK: tail call void @objc_release(i8* %tmp2) nounwind, !clang.imprecise_release !0 +; CHECK: %tmp2 = tail call i8* @objc_retainBlock(i8* %tmp) [[NUW:#[0-9]+]] +; CHECK: tail call void @objc_release(i8* %tmp2) [[NUW]], !clang.imprecise_release !0 ; CHECK: } define void @test0_no_metadata(i8* %tmp) { entry: @@ -43,8 +43,8 @@ entry: ; optimization possible. ; CHECK: define void @test0_escape(i8* %tmp, i8** %z) { -; CHECK: %tmp2 = tail call i8* @objc_retainBlock(i8* %tmp) nounwind, !clang.arc.copy_on_escape !0 -; CHECK: tail call void @objc_release(i8* %tmp2) nounwind, !clang.imprecise_release !0 +; CHECK: %tmp2 = tail call i8* @objc_retainBlock(i8* %tmp) [[NUW]], !clang.arc.copy_on_escape !0 +; CHECK: tail call void @objc_release(i8* %tmp2) [[NUW]], !clang.imprecise_release !0 ; CHECK: } define void @test0_escape(i8* %tmp, i8** %z) { entry: @@ -58,8 +58,8 @@ entry: ; Same as test0_escape, but there's no intervening call. ; CHECK: define void @test0_just_escape(i8* %tmp, i8** %z) { -; CHECK: %tmp2 = tail call i8* @objc_retainBlock(i8* %tmp) nounwind, !clang.arc.copy_on_escape !0 -; CHECK: tail call void @objc_release(i8* %tmp2) nounwind, !clang.imprecise_release !0 +; CHECK: %tmp2 = tail call i8* @objc_retainBlock(i8* %tmp) [[NUW]], !clang.arc.copy_on_escape !0 +; CHECK: tail call void @objc_release(i8* %tmp2) [[NUW]], !clang.imprecise_release !0 ; CHECK: } define void @test0_just_escape(i8* %tmp, i8** %z) { entry: @@ -73,9 +73,9 @@ entry: ; CHECK: define void @test1(i8* %tmp) { ; CHECK-NOT: @objc -; CHECK: tail call i8* @objc_retain(i8* %tmp) nounwind +; CHECK: tail call i8* @objc_retain(i8* %tmp) [[NUW]] ; CHECK-NOT: @objc -; CHECK: tail call void @objc_release(i8* %tmp) nounwind, !clang.imprecise_release !0 +; CHECK: tail call void @objc_release(i8* %tmp) [[NUW]], !clang.imprecise_release !0 ; CHECK-NOT: @objc ; CHECK: } define void @test1(i8* %tmp) { @@ -95,10 +95,10 @@ entry: ; CHECK: define void @test1_no_metadata(i8* %tmp) { ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call i8* @objc_retainBlock(i8* %tmp) nounwind +; CHECK-NEXT: tail call i8* @objc_retainBlock(i8* %tmp) [[NUW]] ; CHECK-NEXT: @use_pointer(i8* %tmp2) ; CHECK-NEXT: @use_pointer(i8* %tmp2) -; CHECK-NEXT: tail call void @objc_release(i8* %tmp) nounwind, !clang.imprecise_release !0 +; CHECK-NEXT: tail call void @objc_release(i8* %tmp2) [[NUW]], !clang.imprecise_release !0 ; CHECK-NOT: @objc ; CHECK: } define void @test1_no_metadata(i8* %tmp) { @@ -118,11 +118,11 @@ entry: ; CHECK: define void @test1_escape(i8* %tmp, i8** %z) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %tmp2 = tail call i8* @objc_retainBlock(i8* %tmp) nounwind, !clang.arc.copy_on_escape !0 +; CHECK-NEXT: %tmp2 = tail call i8* @objc_retainBlock(i8* %tmp) [[NUW]], !clang.arc.copy_on_escape !0 ; CHECK-NEXT: store i8* %tmp2, i8** %z ; CHECK-NEXT: @use_pointer(i8* %tmp2) ; CHECK-NEXT: @use_pointer(i8* %tmp2) -; CHECK-NEXT: tail call void @objc_release(i8* %tmp) nounwind, !clang.imprecise_release !0 +; CHECK-NEXT: tail call void @objc_release(i8* %tmp2) [[NUW]], !clang.imprecise_release !0 ; CHECK-NOT: @objc ; CHECK: } define void @test1_escape(i8* %tmp, i8** %z) { @@ -136,3 +136,5 @@ entry: tail call void @objc_release(i8* %tmp) nounwind, !clang.imprecise_release !0 ret void } + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/retain-not-declared.ll b/test/Transforms/ObjCARC/retain-not-declared.ll index f876e51592b6..165829f7c01f 100644 --- a/test/Transforms/ObjCARC/retain-not-declared.ll +++ b/test/Transforms/ObjCARC/retain-not-declared.ll @@ -13,7 +13,7 @@ declare void @objc_release(i8*) ; CHECK: define i8* @test0(i8* %p) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %0 = tail call i8* @objc_retainAutoreleaseReturnValue(i8* %p) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retainAutoreleaseReturnValue(i8* %p) [[NUW:#[0-9]+]] ; CHECK-NEXT: ret i8* %0 ; CHECK-NEXT: } @@ -21,8 +21,8 @@ define i8* @test0(i8* %p) { entry: %call = tail call i8* @objc_unretainedObject(i8* %p) %0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind - %1 = tail call i8* @objc_autoreleaseReturnValue(i8* %0) nounwind - ret i8* %1 + %1 = tail call i8* @objc_autoreleaseReturnValue(i8* %call) nounwind + ret i8* %call } ; Properly create the @objc_retain declaration when it doesn't already exist. @@ -65,3 +65,5 @@ lpad100: ; preds = %invoke.cont93 declare i32 @__gxx_personality_v0(...) !0 = metadata !{} + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/rle-s2l.ll b/test/Transforms/ObjCARC/rle-s2l.ll index 8f8d5c0d3825..2865c94dc88c 100644 --- a/test/Transforms/ObjCARC/rle-s2l.ll +++ b/test/Transforms/ObjCARC/rle-s2l.ll @@ -57,7 +57,7 @@ define void @test2(i8** %p) { ; CHECK: define void @test3(i8** %p) { ; CHECK-NEXT: %x = call i8* @objc_loadWeak(i8** %p) -; CHECK-NEXT: call void @use_pointer(i8* %x) readonly +; CHECK-NEXT: call void @use_pointer(i8* %x) [[RO:#[0-9]+]] ; CHECK-NEXT: %1 = tail call i8* @objc_retain(i8* %x) ; CHECK-NEXT: call void @use_pointer(i8* %x) ; CHECK-NEXT: ret void @@ -74,7 +74,7 @@ define void @test3(i8** %p) { ; CHECK: define void @test4(i8** %p) { ; CHECK-NEXT: %x = call i8* @objc_loadWeak(i8** %p) -; CHECK-NEXT: call void @use_pointer(i8* %x) readonly +; CHECK-NEXT: call void @use_pointer(i8* %x) [[RO]] ; CHECK-NEXT: call void @callee() ; CHECK-NEXT: %y = call i8* @objc_loadWeak(i8** %p) ; CHECK-NEXT: call void @use_pointer(i8* %y) @@ -133,3 +133,6 @@ define void @test7(i8** %p, i8* %n, i8** %q, i8* %m) { call void @use_pointer(i8* %y) ret void } + +; CHECK: attributes #0 = { nounwind } +; CHECK: attributes [[RO]] = { readonly } diff --git a/test/Transforms/ObjCARC/rv.ll b/test/Transforms/ObjCARC/rv.ll index 9353a19f71a4..589c60f9f3aa 100644 --- a/test/Transforms/ObjCARC/rv.ll +++ b/test/Transforms/ObjCARC/rv.ll @@ -29,7 +29,7 @@ declare i8* @returner() ; CHECK: define void @test0( ; CHECK-NEXT: entry: ; CHECK-NEXT: %x = call i8* @returner -; CHECK-NEXT: %0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %x) nounwind +; CHECK-NEXT: %0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %x) [[NUW:#[0-9]+]] ; CHECK: t: ; CHECK-NOT: @objc_ ; CHECK: return: @@ -121,7 +121,7 @@ define i8* @test7() { %p = call i8* @returner() call i8* @objc_retainAutoreleasedReturnValue(i8* %p) %t = call i8* @objc_autoreleaseReturnValue(i8* %p) - call void @use_pointer(i8* %t) + call void @use_pointer(i8* %p) ret i8* %t } @@ -133,7 +133,7 @@ define i8* @test7b() { call void @use_pointer(i8* %p) call i8* @objc_retainAutoreleasedReturnValue(i8* %p) %t = call i8* @objc_autoreleaseReturnValue(i8* %p) - ret i8* %t + ret i8* %p } ; Turn objc_retain into objc_retainAutoreleasedReturnValue if its operand @@ -150,17 +150,17 @@ define void @test8() { ; Don't apply the RV optimization to autorelease if there's no retain. ; CHECK: define i8* @test9(i8* %p) -; CHECK: tail call i8* @objc_autorelease(i8* %p) +; CHECK: call i8* @objc_autorelease(i8* %p) define i8* @test9(i8* %p) { call i8* @objc_autorelease(i8* %p) ret i8* %p } -; Apply the RV optimization. +; Do not apply the RV optimization. ; CHECK: define i8* @test10(i8* %p) -; CHECK: tail call i8* @objc_retain(i8* %p) nounwind -; CHECK: tail call i8* @objc_autoreleaseReturnValue(i8* %p) nounwind +; CHECK: tail call i8* @objc_retain(i8* %p) [[NUW]] +; CHECK: call i8* @objc_autorelease(i8* %p) [[NUW]] ; CHECK-NEXT: ret i8* %p define i8* @test10(i8* %p) { %1 = call i8* @objc_retain(i8* %p) @@ -174,7 +174,7 @@ define i8* @test10(i8* %p) { ; CHECK: define i8* @test11(i8* %p) ; CHECK: tail call i8* @objc_retain(i8* %p) ; CHECK-NEXT: call void @use_pointer(i8* %p) -; CHECK: tail call i8* @objc_autorelease(i8* %p) +; CHECK: call i8* @objc_autorelease(i8* %p) ; CHECK-NEXT: ret i8* %p define i8* @test11(i8* %p) { %1 = call i8* @objc_retain(i8* %p) @@ -201,7 +201,7 @@ define i8* @test12(i8* %p) { ; CHECK: define i8* @test13( ; CHECK: tail call i8* @objc_retainAutoreleasedReturnValue(i8* %p) -; CHECK: tail call i8* @objc_autorelease(i8* %p) +; CHECK: call i8* @objc_autorelease(i8* %p) ; CHECK: ret i8* %p define i8* @test13() { %p = call i8* @returner() @@ -215,7 +215,7 @@ define i8* @test13() { ; argument is not a return value. ; CHECK: define void @test14( -; CHECK-NEXT: tail call i8* @objc_retain(i8* %p) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %p) [[NUW]] ; CHECK-NEXT: ret void define void @test14(i8* %p) { call i8* @objc_retainAutoreleasedReturnValue(i8* %p) @@ -227,7 +227,7 @@ define void @test14(i8* %p) { ; CHECK: define void @test15( ; CHECK-NEXT: %y = call i8* @returner() -; CHECK-NEXT: tail call i8* @objc_retainAutoreleasedReturnValue(i8* %y) nounwind +; CHECK-NEXT: tail call i8* @objc_retainAutoreleasedReturnValue(i8* %y) [[NUW]] ; CHECK-NEXT: ret void define void @test15() { %y = call i8* @returner() @@ -240,7 +240,7 @@ define void @test15() { ; CHECK: define void @test16( ; CHECK-NEXT: %y = call i8* @returner() -; CHECK-NEXT: tail call i8* @objc_retainAutoreleasedReturnValue(i8* %y) nounwind +; CHECK-NEXT: tail call i8* @objc_retainAutoreleasedReturnValue(i8* %y) [[NUW]] ; CHECK-NEXT: ret void define void @test16() { %y = call i8* @returner() @@ -252,7 +252,7 @@ define void @test16() { ; argument is not a return value. ; CHECK: define void @test17( -; CHECK-NEXT: tail call i8* @objc_retain(i8* %y) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %y) [[NUW]] ; CHECK-NEXT: ret void define void @test17(i8* %y) { call i8* @objc_retain(i8* %y) @@ -265,7 +265,7 @@ define void @test17(i8* %y) { ; CHECK: define void @test18( ; CHECK-NEXT: %y = call i8* @returner() ; CHECK-NEXT: call void @callee() -; CHECK-NEXT: tail call i8* @objc_retain(i8* %y) nounwind +; CHECK-NEXT: tail call i8* @objc_retain(i8* %y) [[NUW]] ; CHECK-NEXT: ret void define void @test18() { %y = call i8* @returner() @@ -323,7 +323,7 @@ define i8* @test22(i8* %p) { ; Convert autoreleaseRV to autorelease. ; CHECK: define void @test23( -; CHECK: tail call i8* @objc_autorelease(i8* %p) nounwind +; CHECK: call i8* @objc_autorelease(i8* %p) [[NUW]] define void @test23(i8* %p) { store i8 0, i8* %p call i8* @objc_autoreleaseReturnValue(i8* %p) @@ -340,3 +340,5 @@ define {}* @test24(i8* %p) { %s = bitcast i8* %p to {}* ret {}* %s } + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/split-backedge.ll b/test/Transforms/ObjCARC/split-backedge.ll index 08e2dce1f551..5ac278a45d50 100644 --- a/test/Transforms/ObjCARC/split-backedge.ll +++ b/test/Transforms/ObjCARC/split-backedge.ll @@ -4,12 +4,12 @@ ; rdar://11256239 ; CHECK: define void @test0 -; CHECK: call i8* @objc_retain(i8* %call) nounwind -; CHECK: call i8* @objc_retain(i8* %call) nounwind -; CHECK: call i8* @objc_retain(i8* %cond) nounwind -; CHECK: call void @objc_release(i8* %call) nounwind -; CHECK: call void @objc_release(i8* %call) nounwind -; CHECK: call void @objc_release(i8* %cond) nounwind +; CHECK: call i8* @objc_retain(i8* %call) [[NUW:#[0-9]+]] +; CHECK: call i8* @objc_retain(i8* %call) [[NUW]] +; CHECK: call i8* @objc_retain(i8* %cond) [[NUW]] +; CHECK: call void @objc_release(i8* %call) [[NUW]] +; CHECK: call void @objc_release(i8* %call) [[NUW]] +; CHECK: call void @objc_release(i8* %cond) [[NUW]] define void @test0() { entry: br label %while.body @@ -46,3 +46,5 @@ declare i8* @objc_retain(i8*) declare void @use_pointer(i8*) !0 = metadata !{} + +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll b/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll new file mode 100644 index 000000000000..26cd67727e6a --- /dev/null +++ b/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll @@ -0,0 +1,74 @@ +; RUN: opt -objc-arc -S < %s | FileCheck %s + +declare i8* @objc_release(i8* %x) +declare i8* @objc_retain(i8* %x) +declare i8* @objc_autorelease(i8* %x) +declare i8* @objc_autoreleaseReturnValue(i8* %x) +declare i8* @objc_retainAutoreleasedReturnValue(i8* %x) + +; Never tail call objc_autorelease. +define i8* @test0(i8* %x) { +entry: + ; CHECK: %tmp0 = call i8* @objc_autorelease(i8* %x) + %tmp0 = call i8* @objc_autorelease(i8* %x) + ; CHECK: %tmp1 = call i8* @objc_autorelease(i8* %x) + %tmp1 = tail call i8* @objc_autorelease(i8* %x) + + ret i8* %x +} + +; Always tail call autoreleaseReturnValue. +define i8* @test1(i8* %x) { +entry: + ; CHECK: %tmp0 = tail call i8* @objc_autoreleaseReturnValue(i8* %x) + %tmp0 = call i8* @objc_autoreleaseReturnValue(i8* %x) + ; CHECK: %tmp1 = tail call i8* @objc_autoreleaseReturnValue(i8* %x) + %tmp1 = tail call i8* @objc_autoreleaseReturnValue(i8* %x) + ret i8* %x +} + +; Always tail call objc_retain. +define i8* @test2(i8* %x) { +entry: + ; CHECK: %tmp0 = tail call i8* @objc_retain(i8* %x) + %tmp0 = call i8* @objc_retain(i8* %x) + ; CHECK: %tmp1 = tail call i8* @objc_retain(i8* %x) + %tmp1 = tail call i8* @objc_retain(i8* %x) + ret i8* %x +} + +define i8* @tmp(i8* %x) { + ret i8* %x +} + +; Always tail call objc_retainAutoreleasedReturnValue. +define i8* @test3(i8* %x) { +entry: + %y = call i8* @tmp(i8* %x) + ; CHECK: %tmp0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %y) + %tmp0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %y) + %z = call i8* @tmp(i8* %x) + ; CHECK: %tmp1 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %z) + %tmp1 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %z) + ret i8* %x +} + +; By itself, we should never change whether or not objc_release is tail called. +define i8* @test4(i8* %x) { +entry: + ; CHECK: %tmp0 = call i8* @objc_release(i8* %x) + %tmp0 = call i8* @objc_release(i8* %x) + ; CHECK: %tmp1 = tail call i8* @objc_release(i8* %x) + %tmp1 = tail call i8* @objc_release(i8* %x) + ret i8* %x +} + +; If we convert a tail called @objc_autoreleaseReturnValue to an +; @objc_autorelease, ensure that the tail call is removed. +define i8* @test5(i8* %x) { +entry: + ; CHECK: %tmp0 = call i8* @objc_autorelease(i8* %x) + %tmp0 = tail call i8* @objc_autoreleaseReturnValue(i8* %x) + ret i8* %tmp0 +} + diff --git a/test/Transforms/ObjCARC/weak-copies.ll b/test/Transforms/ObjCARC/weak-copies.ll index e1a94bb4749a..5dab4e049e22 100644 --- a/test/Transforms/ObjCARC/weak-copies.ll +++ b/test/Transforms/ObjCARC/weak-copies.ll @@ -19,7 +19,7 @@ target triple = "x86_64-apple-darwin11.0.0" ; CHECK: define void @foo() { ; CHECK-NEXT: entry: ; CHECK-NEXT: %call = call i8* @bar() -; CHECK-NEXT: call void @use(i8* %call) nounwind +; CHECK-NEXT: call void @use(i8* %call) [[NUW:#[0-9]+]] ; CHECK-NEXT: ret void ; CHECK-NEXT: } define void @foo() { @@ -39,7 +39,7 @@ entry: ; Eliminate unnecessary weak pointer copies in a block initialization. -; CHECK: define void @qux(i8* %me) nounwind { +; CHECK: define void @qux(i8* %me) #0 { ; CHECK-NEXT: entry: ; CHECK-NEXT: %block = alloca %1, align 8 ; CHECK-NOT: alloca @@ -84,4 +84,6 @@ declare i8* @objc_loadWeak(i8**) declare void @use(i8*) nounwind declare void @objc_destroyWeak(i8**) +; CHECK: attributes [[NUW]] = { nounwind } + !0 = metadata !{} diff --git a/test/Transforms/PhaseOrdering/2010-03-22-empty-baseclass.ll b/test/Transforms/PhaseOrdering/2010-03-22-empty-baseclass.ll index 8859da8de106..53d98e02ec88 100644 --- a/test/Transforms/PhaseOrdering/2010-03-22-empty-baseclass.ll +++ b/test/Transforms/PhaseOrdering/2010-03-22-empty-baseclass.ll @@ -1,4 +1,4 @@ -; RUN: opt -O2 %s -S -o - | FileCheck %s +; RUN: opt -O2 -S < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin11.1" diff --git a/test/Transforms/PhaseOrdering/PR6627.ll b/test/Transforms/PhaseOrdering/PR6627.ll index ef9947f103a8..58b762a7af49 100644 --- a/test/Transforms/PhaseOrdering/PR6627.ll +++ b/test/Transforms/PhaseOrdering/PR6627.ll @@ -1,4 +1,4 @@ -; RUN: opt -O3 -S %s | FileCheck %s +; RUN: opt -O3 -S < %s | FileCheck %s ; XFAIL: * declare i32 @doo(...) diff --git a/test/Transforms/PhaseOrdering/basic.ll b/test/Transforms/PhaseOrdering/basic.ll index 88ebca0a9c3d..8fbe8c58f451 100644 --- a/test/Transforms/PhaseOrdering/basic.ll +++ b/test/Transforms/PhaseOrdering/basic.ll @@ -1,4 +1,4 @@ -; RUN: opt -O3 -S %s | FileCheck %s +; RUN: opt -O3 -S < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-macosx10.6.7" diff --git a/test/Transforms/PhaseOrdering/gdce.ll b/test/Transforms/PhaseOrdering/gdce.ll index 273e47e97cb4..95f06757a788 100644 --- a/test/Transforms/PhaseOrdering/gdce.ll +++ b/test/Transforms/PhaseOrdering/gdce.ll @@ -1,4 +1,4 @@ -; RUN: opt -O2 -S %s | FileCheck %s +; RUN: opt -O2 -S < %s | FileCheck %s ; Run global DCE to eliminate unused ctor and dtor. ; rdar://9142819 diff --git a/test/Transforms/PhaseOrdering/scev.ll b/test/Transforms/PhaseOrdering/scev.ll index c73128082216..39adb6b73d3a 100644 --- a/test/Transforms/PhaseOrdering/scev.ll +++ b/test/Transforms/PhaseOrdering/scev.ll @@ -1,4 +1,4 @@ -; RUN: opt -O3 -S -analyze -scalar-evolution %s | FileCheck %s +; RUN: opt -O3 -S -analyze -scalar-evolution < %s | FileCheck %s ; ; This file contains phase ordering tests for scalar evolution. ; Test that the standard passes don't obfuscate the IR so scalar evolution can't diff --git a/test/Transforms/Reassociate/crash.ll b/test/Transforms/Reassociate/crash.ll index e29b5dc9c0ce..770f97371d7e 100644 --- a/test/Transforms/Reassociate/crash.ll +++ b/test/Transforms/Reassociate/crash.ll @@ -1,4 +1,4 @@ -; RUN: opt -reassociate -disable-output %s +; RUN: opt -reassociate -disable-output < %s ; rdar://7507855 diff --git a/test/Transforms/Reassociate/xor_reassoc.ll b/test/Transforms/Reassociate/xor_reassoc.ll new file mode 100644 index 000000000000..d371a9b5b68f --- /dev/null +++ b/test/Transforms/Reassociate/xor_reassoc.ll @@ -0,0 +1,166 @@ +;RUN: opt -S -reassociate < %s | FileCheck %s + +; ========================================================================== +; +; Xor reassociation general cases +; +; ========================================================================== + +; (x | c1) ^ (x | c2) => (x & c3) ^ c3, where c3 = c1^c2 +; +define i32 @xor1(i32 %x) { + %or = or i32 %x, 123 + %or1 = or i32 %x, 456 + %xor = xor i32 %or, %or1 + ret i32 %xor + +;CHECK: @xor1 +;CHECK: %and.ra = and i32 %x, 435 +;CHECK: %xor = xor i32 %and.ra, 435 +} + +; Test rule : (x & c1) ^ (x & c2) = (x & (c1^c2)) +; Real testing case : (x & 123) ^ y ^ (x & 345) => (x & 435) ^ y +define i32 @xor2(i32 %x, i32 %y) { + %and = and i32 %x, 123 + %xor = xor i32 %and, %y + %and1 = and i32 %x, 456 + %xor2 = xor i32 %xor, %and1 + ret i32 %xor2 + +;CHECK: @xor2 +;CHECK: %and.ra = and i32 %x, 435 +;CHECK: %xor2 = xor i32 %and.ra, %y +} + +; Test rule: (x | c1) ^ (x & c2) = (x & c3) ^ c1, where c3 = ~c1 ^ c2 +; c3 = ~c1 ^ c2 +define i32 @xor3(i32 %x, i32 %y) { + %or = or i32 %x, 123 + %xor = xor i32 %or, %y + %and = and i32 %x, 456 + %xor1 = xor i32 %xor, %and + ret i32 %xor1 + +;CHECK: @xor3 +;CHECK: %and.ra = and i32 %x, -436 +;CHECK: %xor = xor i32 %y, 123 +;CHECK: %xor1 = xor i32 %xor, %and.ra +} + +; Test rule: (x | c1) ^ c2 = (x & ~c1) ^ (c1 ^ c2) +define i32 @xor4(i32 %x, i32 %y) { + %and = and i32 %x, -124 + %xor = xor i32 %y, 435 + %xor1 = xor i32 %xor, %and + ret i32 %xor1 +; CHECK: @xor4 +; CHECK: %and = and i32 %x, -124 +; CHECK: %xor = xor i32 %y, 435 +; CHECK: %xor1 = xor i32 %xor, %and +} + +; ========================================================================== +; +; Xor reassociation special cases +; +; ========================================================================== + +; Special case1: +; (x | c1) ^ (x & ~c1) = c1 +define i32 @xor_special1(i32 %x, i32 %y) { + %or = or i32 %x, 123 + %xor = xor i32 %or, %y + %and = and i32 %x, -124 + %xor1 = xor i32 %xor, %and + ret i32 %xor1 +; CHECK: @xor_special1 +; CHECK: %xor1 = xor i32 %y, 123 +; CHECK: ret i32 %xor1 +} + +; Special case1: +; (x | c1) ^ (x & c1) = x ^ c1 +define i32 @xor_special2(i32 %x, i32 %y) { + %or = or i32 %x, 123 + %xor = xor i32 %or, %y + %and = and i32 %x, 123 + %xor1 = xor i32 %xor, %and + ret i32 %xor1 +; CHECK: @xor_special2 +; CHECK: %xor = xor i32 %y, 123 +; CHECK: %xor1 = xor i32 %xor, %x +; CHECK: ret i32 %xor1 +} + +; (x | c1) ^ (x | c1) => 0 +define i32 @xor_special3(i32 %x) { + %or = or i32 %x, 123 + %or1 = or i32 %x, 123 + %xor = xor i32 %or, %or1 + ret i32 %xor +;CHECK: @xor_special3 +;CHECK: ret i32 0 +} + +; (x & c1) ^ (x & c1) => 0 +define i32 @xor_special4(i32 %x) { + %or = and i32 %x, 123 + %or1 = and i32 123, %x + %xor = xor i32 %or, %or1 + ret i32 %xor +;CHECK: @xor_special4 +;CHECK: ret i32 0 +} + +; ========================================================================== +; +; Xor reassociation curtail code size +; +; ========================================================================== + +; (x | c1) ^ (x | c2) => (x & c3) ^ c3 +; is enabled if one of operands has multiple uses +; +define i32 @xor_ra_size1(i32 %x) { + %or = or i32 %x, 123 + %or1 = or i32 %x, 456 + %xor = xor i32 %or, %or1 + + %add = add i32 %xor, %or + ret i32 %add +;CHECK: @xor_ra_size1 +;CHECK: %xor = xor i32 %and.ra, 435 +} + +; (x | c1) ^ (x | c2) => (x & c3) ^ c3 +; is disenabled if bothf operands has multiple uses. +; +define i32 @xor_ra_size2(i32 %x) { + %or = or i32 %x, 123 + %or1 = or i32 %x, 456 + %xor = xor i32 %or, %or1 + + %add = add i32 %xor, %or + %add2 = add i32 %add, %or1 + ret i32 %add2 + +;CHECK: @xor_ra_size2 +;CHECK: %or1 = or i32 %x, 456 +;CHECK: %xor = xor i32 %or, %or1 +} + + +; ========================================================================== +; +; Xor reassociation bugs +; +; ========================================================================== + +@xor_bug1_data = external global <{}>, align 4 +define void @xor_bug1() { + %1 = ptrtoint i32* undef to i64 + %2 = xor i64 %1, ptrtoint (<{}>* @xor_bug1_data to i64) + %3 = and i64 undef, %2 + ret void +} diff --git a/test/Transforms/Reg2Mem/crash.ll b/test/Transforms/Reg2Mem/crash.ll new file mode 100644 index 000000000000..02fed94b8527 --- /dev/null +++ b/test/Transforms/Reg2Mem/crash.ll @@ -0,0 +1,88 @@ +; RUN: opt -reg2mem -disable-output < %s +; PR14782 + +declare void @f1() + +declare i32 @__gxx_personality_sj0(...) + +declare void @f2() + +declare void @f3() + +declare void @f4_() + +declare void @_Z12xxxdtsP10xxxpq() + +define hidden void @_ZN12xxxyzIi9xxxwLi29ELi0EE4f3NewES0_i() ssp align 2 { +bb: + invoke void @f4_() + to label %bb1 unwind label %.thread + +.thread: ; preds = %bb + %tmp = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + br label %bb13 + +bb1: ; preds = %bb + invoke void @f1() + to label %.noexc unwind label %bb10 + +.noexc: ; preds = %bb1 + invoke void @f4_() + to label %bb6 unwind label %bb2 + +bb2: ; preds = %.noexc + %tmp3 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + invoke void @f3() + to label %.body unwind label %bb4 + +bb4: ; preds = %bb2 + %tmp5 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* null + unreachable + +bb6: ; preds = %.noexc + invoke void @_Z12xxxdtsP10xxxpq() + to label %_ZN6xxxdIN12xxxyzIi9xxxwLi29ELi0EE4fr1jS3_.exit unwind label %bb10 + +_ZN6xxxdIN12xxxyzIi9xxxwLi29ELi0EE4fr1jS3_.exit: ; preds = %bb6 + invoke void @f2() + to label %bb7 unwind label %bb8 + +bb7: ; preds = %_ZN6xxxdIN12xxxyzIi9xxxwLi29ELi0EE4fr1jS3_.exit + ret void + +bb8: ; preds = %_ZN6xxxdIN12xxxyzIi9xxxwLi29ELi0EE4fr1jS3_.exit + %tmp9 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + br label %_ZN10xxxpqdlev.exit + +bb10: ; preds = %bb6, %bb1 + %.1 = phi i1 [ true, %bb1 ], [ false, %bb6 ] + %tmp11 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + br label %.body + +.body: ; preds = %bb10, %bb2 + %.1.lpad-body = phi i1 [ %.1, %bb10 ], [ true, %bb2 ] + invoke void @f2() + to label %bb12 unwind label %bb14 + +bb12: ; preds = %.body + br i1 %.1.lpad-body, label %bb13, label %_ZN10xxxpqdlev.exit + +bb13: ; preds = %bb12, %.thread + invoke void @xxx_MemFree() + to label %_ZN10xxxpqdlev.exit unwind label %bb14 + +_ZN10xxxpqdlev.exit: ; preds = %bb13, %bb12, %bb8 + resume { i8*, i32 } undef + +bb14: ; preds = %bb13, %.body + %tmp15 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + catch i8* null + unreachable +} + +declare void @xxx_MemFree() diff --git a/test/Transforms/Reg2Mem/lit.local.cfg b/test/Transforms/Reg2Mem/lit.local.cfg new file mode 100644 index 000000000000..19eebc0ac7ac --- /dev/null +++ b/test/Transforms/Reg2Mem/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.ll', '.c', '.cpp'] diff --git a/test/Transforms/SCCP/crash.ll b/test/Transforms/SCCP/crash.ll index 2f6da1d726a0..88528902d721 100644 --- a/test/Transforms/SCCP/crash.ll +++ b/test/Transforms/SCCP/crash.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -sccp -S +; RUN: opt -sccp -S < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" target triple = "x86_64-apple-darwin10.0" diff --git a/test/Transforms/SCCP/ipsccp-addr-taken.ll b/test/Transforms/SCCP/ipsccp-addr-taken.ll index c6572fa5d141..b49da97ab2c0 100644 --- a/test/Transforms/SCCP/ipsccp-addr-taken.ll +++ b/test/Transforms/SCCP/ipsccp-addr-taken.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -ipsccp -S | FileCheck %s +; RUN: opt -ipsccp -S < %s | FileCheck %s ; PR7876 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" diff --git a/test/Transforms/SCCP/retvalue-undef.ll b/test/Transforms/SCCP/retvalue-undef.ll index 389561f8a112..5a4ba113b7c0 100644 --- a/test/Transforms/SCCP/retvalue-undef.ll +++ b/test/Transforms/SCCP/retvalue-undef.ll @@ -1,4 +1,4 @@ -; RUN: opt -ipsccp -S %s | FileCheck %s +; RUN: opt -ipsccp -S < %s | FileCheck %s ; PR6414 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/Transforms/SCCP/undef-resolve.ll b/test/Transforms/SCCP/undef-resolve.ll index a3dddb799a6a..a1a600c9607a 100644 --- a/test/Transforms/SCCP/undef-resolve.ll +++ b/test/Transforms/SCCP/undef-resolve.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -sccp -S | FileCheck %s +; RUN: opt -sccp -S < %s | FileCheck %s ; PR6940 diff --git a/test/Transforms/SROA/basictest.ll b/test/Transforms/SROA/basictest.ll index 9fe926ee2cc1..30dd21774343 100644 --- a/test/Transforms/SROA/basictest.ll +++ b/test/Transforms/SROA/basictest.ll @@ -500,14 +500,27 @@ entry: define i64 @test9() { ; Ensure we can handle loads off the end of an alloca even when wrapped in -; weird bit casts and types. The result is undef, but this shouldn't crash -; anything. +; weird bit casts and types. This is valid IR due to the alignment and masking +; off the bits past the end of the alloca. +; ; CHECK: @test9 ; CHECK-NOT: alloca -; CHECK: ret i64 undef +; CHECK: %[[b2:.*]] = zext i8 26 to i64 +; CHECK-NEXT: %[[s2:.*]] = shl i64 %[[b2]], 16 +; CHECK-NEXT: %[[m2:.*]] = and i64 undef, -16711681 +; CHECK-NEXT: %[[i2:.*]] = or i64 %[[m2]], %[[s2]] +; CHECK-NEXT: %[[b1:.*]] = zext i8 0 to i64 +; CHECK-NEXT: %[[s1:.*]] = shl i64 %[[b1]], 8 +; CHECK-NEXT: %[[m1:.*]] = and i64 %[[i2]], -65281 +; CHECK-NEXT: %[[i1:.*]] = or i64 %[[m1]], %[[s1]] +; CHECK-NEXT: %[[b0:.*]] = zext i8 0 to i64 +; CHECK-NEXT: %[[m0:.*]] = and i64 %[[i1]], -256 +; CHECK-NEXT: %[[i0:.*]] = or i64 %[[m0]], %[[b0]] +; CHECK-NEXT: %[[result:.*]] = and i64 %[[i0]], 16777215 +; CHECK-NEXT: ret i64 %[[result]] entry: - %a = alloca { [3 x i8] } + %a = alloca { [3 x i8] }, align 8 %gep1 = getelementptr inbounds { [3 x i8] }* %a, i32 0, i32 0, i32 0 store i8 0, i8* %gep1, align 1 %gep2 = getelementptr inbounds { [3 x i8] }* %a, i32 0, i32 0, i32 1 @@ -516,7 +529,8 @@ entry: store i8 26, i8* %gep3, align 1 %cast = bitcast { [3 x i8] }* %a to { i64 }* %elt = getelementptr inbounds { i64 }* %cast, i32 0, i32 0 - %result = load i64* %elt + %load = load i64* %elt + %result = and i64 %load, 16777215 ret i64 %result } @@ -575,8 +589,8 @@ entry: store i8 0, i8* %a2ptr %aiptr = bitcast [3 x i8]* %a to i24* %ai = load i24* %aiptr -; CHCEK-NOT: store -; CHCEK-NOT: load +; CHECK-NOT: store +; CHECK-NOT: load ; CHECK: %[[ext2:.*]] = zext i8 0 to i24 ; CHECK-NEXT: %[[shift2:.*]] = shl i24 %[[ext2]], 16 ; CHECK-NEXT: %[[mask2:.*]] = and i24 undef, 65535 @@ -597,8 +611,8 @@ entry: %b1 = load i8* %b1ptr %b2ptr = getelementptr [3 x i8]* %b, i64 0, i32 2 %b2 = load i8* %b2ptr -; CHCEK-NOT: store -; CHCEK-NOT: load +; CHECK-NOT: store +; CHECK-NOT: load ; CHECK: %[[trunc0:.*]] = trunc i24 %[[insert0]] to i8 ; CHECK-NEXT: %[[shift1:.*]] = lshr i24 %[[insert0]], 8 ; CHECK-NEXT: %[[trunc1:.*]] = trunc i24 %[[shift1]] to i8 @@ -617,11 +631,12 @@ define i32 @test13() { ; Ensure we don't crash and handle undefined loads that straddle the end of the ; allocation. ; CHECK: @test13 -; CHECK: %[[ret:.*]] = zext i16 undef to i32 -; CHECK: ret i32 %[[ret]] +; CHECK: %[[value:.*]] = zext i8 0 to i16 +; CHECK-NEXT: %[[ret:.*]] = zext i16 %[[value]] to i32 +; CHECK-NEXT: ret i32 %[[ret]] entry: - %a = alloca [3 x i8] + %a = alloca [3 x i8], align 2 %b0ptr = getelementptr [3 x i8]* %a, i64 0, i32 0 store i8 0, i8* %b0ptr %b1ptr = getelementptr [3 x i8]* %a, i64 0, i32 1 @@ -1160,19 +1175,71 @@ define void @PR14548(i1 %x) { entry: %a = alloca <{ i1 }>, align 8 %b = alloca <{ i1 }>, align 8 -; Nothing of interest is simplified here. -; CHECK: alloca -; CHECK: alloca +; CHECK: %[[a:.*]] = alloca i8, align 8 %b.i1 = bitcast <{ i1 }>* %b to i1* store i1 %x, i1* %b.i1, align 8 %b.i8 = bitcast <{ i1 }>* %b to i8* %foo = load i8* %b.i8, align 1 +; CHECK-NEXT: {{.*}} = zext i1 %x to i8 +; CHECK-NEXT: %[[ext:.*]] = zext i1 %x to i8 +; CHECK-NEXT: store i8 %[[ext]], i8* %[[a]], align 8 +; CHECK-NEXT: {{.*}} = load i8* %[[a]], align 8 %a.i8 = bitcast <{ i1 }>* %a to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a.i8, i8* %b.i8, i32 1, i32 1, i1 false) nounwind %bar = load i8* %a.i8, align 1 %a.i1 = getelementptr inbounds <{ i1 }>* %a, i32 0, i32 0 %baz = load i1* %a.i1, align 1 +; CHECK-NEXT: %[[a_cast:.*]] = bitcast i8* %[[a]] to i1* +; CHECK-NEXT: {{.*}} = load i1* %[[a_cast]], align 8 + ret void } + +define <3 x i8> @PR14572.1(i32 %x) { +; Ensure that a split integer store which is wider than the type size of the +; alloca (relying on the alloc size padding) doesn't trigger an assert. +; CHECK: @PR14572.1 + +entry: + %a = alloca <3 x i8>, align 4 +; CHECK-NOT: alloca + + %cast = bitcast <3 x i8>* %a to i32* + store i32 %x, i32* %cast, align 1 + %y = load <3 x i8>* %a, align 4 + ret <3 x i8> %y +; CHECK: ret <3 x i8> +} + +define i32 @PR14572.2(<3 x i8> %x) { +; Ensure that a split integer load which is wider than the type size of the +; alloca (relying on the alloc size padding) doesn't trigger an assert. +; CHECK: @PR14572.2 + +entry: + %a = alloca <3 x i8>, align 4 +; CHECK-NOT: alloca + + store <3 x i8> %x, <3 x i8>* %a, align 1 + %cast = bitcast <3 x i8>* %a to i32* + %y = load i32* %cast, align 4 + ret i32 %y +; CHECK: ret i32 +} + +define i32 @PR14601(i32 %x) { +; Don't try to form a promotable integer alloca when there is a variable length +; memory intrinsic. +; CHECK: @PR14601 + +entry: + %a = alloca i32 +; CHECK: alloca + + %a.i8 = bitcast i32* %a to i8* + call void @llvm.memset.p0i8.i32(i8* %a.i8, i8 0, i32 %x, i32 1, i1 false) + %v = load i32* %a + ret i32 %v +} diff --git a/test/Transforms/SROA/big-endian.ll b/test/Transforms/SROA/big-endian.ll index 1ac6d25d6341..64a0cc743974 100644 --- a/test/Transforms/SROA/big-endian.ll +++ b/test/Transforms/SROA/big-endian.ll @@ -24,8 +24,8 @@ entry: store i8 0, i8* %a2ptr %aiptr = bitcast [3 x i8]* %a to i24* %ai = load i24* %aiptr -; CHCEK-NOT: store -; CHCEK-NOT: load +; CHECK-NOT: store +; CHECK-NOT: load ; CHECK: %[[ext2:.*]] = zext i8 0 to i24 ; CHECK-NEXT: %[[mask2:.*]] = and i24 undef, -256 ; CHECK-NEXT: %[[insert2:.*]] = or i24 %[[mask2]], %[[ext2]] @@ -46,8 +46,8 @@ entry: %b1 = load i8* %b1ptr %b2ptr = getelementptr [3 x i8]* %b, i64 0, i32 2 %b2 = load i8* %b2ptr -; CHCEK-NOT: store -; CHCEK-NOT: load +; CHECK-NOT: store +; CHECK-NOT: load ; CHECK: %[[shift0:.*]] = lshr i24 %[[insert0]], 16 ; CHECK-NEXT: %[[trunc0:.*]] = trunc i24 %[[shift0]] to i8 ; CHECK-NEXT: %[[shift1:.*]] = lshr i24 %[[insert0]], 8 @@ -77,8 +77,8 @@ entry: %a2ptr = getelementptr [7 x i8]* %a, i64 0, i32 2 %a3ptr = getelementptr [7 x i8]* %a, i64 0, i32 3 -; CHCEK-NOT: store -; CHCEK-NOT: load +; CHECK-NOT: store +; CHECK-NOT: load %a0i16ptr = bitcast i8* %a0ptr to i16* store i16 1, i16* %a0i16ptr @@ -98,8 +98,8 @@ entry: ; CHECK-NEXT: %[[mask3:.*]] = and i56 undef, -1099511627776 ; CHECK-NEXT: %[[insert3:.*]] = or i56 %[[mask3]], %[[ext3]] -; CHCEK-NOT: store -; CHCEK-NOT: load +; CHECK-NOT: store +; CHECK-NOT: load %aiptr = bitcast [7 x i8]* %a to i56* %ai = load i56* %aiptr diff --git a/test/Transforms/SROA/phi-and-select.ll b/test/Transforms/SROA/phi-and-select.ll index 921016a9c24b..b9931800e7f4 100644 --- a/test/Transforms/SROA/phi-and-select.ll +++ b/test/Transforms/SROA/phi-and-select.ll @@ -396,9 +396,10 @@ define i64 @PR14132(i1 %flag) { ; Here we form a PHI-node by promoting the pointer alloca first, and then in ; order to promote the other two allocas, we speculate the load of the ; now-phi-node-pointer. In doing so we end up loading a 64-bit value from an i8 -; alloca, which is completely bogus. However, we were asserting on trying to -; rewrite it. Now it is replaced with undef. Eventually we may replace it with -; unrechable and even the CFG will go away here. +; alloca. While this is a bit dubious, we were asserting on trying to +; rewrite it. The trick is that the code using the value may carefully take +; steps to only use the not-undef bits, and so we need to at least loosely +; support this.. entry: %a = alloca i64 %b = alloca i8 @@ -414,13 +415,14 @@ entry: if.then: store i8* %b, i8** %ptr.cast br label %if.end +; CHECK-NOT: store +; CHECK: %[[ext:.*]] = zext i8 1 to i64 if.end: %tmp = load i64** %ptr %result = load i64* %tmp -; CHECK-NOT: store ; CHECK-NOT: load -; CHECK: %[[result:.*]] = phi i64 [ undef, %if.then ], [ 0, %entry ] +; CHECK: %[[result:.*]] = phi i64 [ %[[ext]], %if.then ], [ 0, %entry ] ret i64 %result ; CHECK-NEXT: ret i64 %[[result]] diff --git a/test/Transforms/SROA/vector-promotion.ll b/test/Transforms/SROA/vector-promotion.ll index ea28f5d1a647..02f6d040cc95 100644 --- a/test/Transforms/SROA/vector-promotion.ll +++ b/test/Transforms/SROA/vector-promotion.ll @@ -36,15 +36,15 @@ entry: define i32 @test2(<4 x i32> %x, <4 x i32> %y) { ; CHECK: @test2 -; FIXME: This should be handled! entry: %a = alloca [2 x <4 x i32>] -; CHECK: alloca <4 x i32> +; CHECK-NOT: alloca %a.x = getelementptr inbounds [2 x <4 x i32>]* %a, i64 0, i64 0 store <4 x i32> %x, <4 x i32>* %a.x %a.y = getelementptr inbounds [2 x <4 x i32>]* %a, i64 0, i64 1 store <4 x i32> %y, <4 x i32>* %a.y +; CHECK-NOT: store %a.tmp1 = getelementptr inbounds [2 x <4 x i32>]* %a, i64 0, i64 0, i64 2 %tmp1 = load i32* %a.tmp1 @@ -54,10 +54,18 @@ entry: %a.tmp3.cast = bitcast i32* %a.tmp3 to <2 x i32>* %tmp3.vec = load <2 x i32>* %a.tmp3.cast %tmp3 = extractelement <2 x i32> %tmp3.vec, i32 0 +; CHECK-NOT: load +; CHECK: %[[extract1:.*]] = extractelement <4 x i32> %x, i32 2 +; CHECK-NEXT: %[[extract2:.*]] = extractelement <4 x i32> %y, i32 3 +; CHECK-NEXT: %[[extract3:.*]] = shufflevector <4 x i32> %y, <4 x i32> undef, <2 x i32> <i32 0, i32 1> +; CHECK-NEXT: %[[extract4:.*]] = extractelement <2 x i32> %[[extract3]], i32 0 %tmp4 = add i32 %tmp1, %tmp2 %tmp5 = add i32 %tmp3, %tmp4 ret i32 %tmp5 +; CHECK-NEXT: %[[sum1:.*]] = add i32 %[[extract1]], %[[extract2]] +; CHECK-NEXT: %[[sum2:.*]] = add i32 %[[extract4]], %[[sum1]] +; CHECK-NEXT: ret i32 %[[sum2]] } define i32 @test3(<4 x i32> %x, <4 x i32> %y) { @@ -206,6 +214,154 @@ define i64 @test6(<4 x i64> %x, <4 x i64> %y, i64 %n) { ret i64 %res } +define <4 x i32> @test_subvec_store() { +; CHECK: @test_subvec_store +entry: + %a = alloca <4 x i32> +; CHECK-NOT: alloca + + %a.gep0 = getelementptr <4 x i32>* %a, i32 0, i32 0 + %a.cast0 = bitcast i32* %a.gep0 to <2 x i32>* + store <2 x i32> <i32 0, i32 0>, <2 x i32>* %a.cast0 +; CHECK-NOT: store +; CHECK: %[[insert1:.*]] = shufflevector <4 x i32> <i32 0, i32 0, i32 undef, i32 undef>, <4 x i32> undef, <4 x i32> <i32 0, i32 1, {{.*}}> + + %a.gep1 = getelementptr <4 x i32>* %a, i32 0, i32 1 + %a.cast1 = bitcast i32* %a.gep1 to <2 x i32>* + store <2 x i32> <i32 1, i32 1>, <2 x i32>* %a.cast1 +; CHECK-NEXT: %[[insert2:.*]] = shufflevector <4 x i32> <i32 undef, i32 1, i32 1, i32 undef>, <4 x i32> %[[insert1]], <4 x i32> <i32 4, i32 1, i32 2, {{.*}}> + + %a.gep2 = getelementptr <4 x i32>* %a, i32 0, i32 2 + %a.cast2 = bitcast i32* %a.gep2 to <2 x i32>* + store <2 x i32> <i32 2, i32 2>, <2 x i32>* %a.cast2 +; CHECK-NEXT: %[[insert3:.*]] = shufflevector <4 x i32> <i32 undef, i32 undef, i32 2, i32 2>, <4 x i32> %[[insert2]], <4 x i32> <i32 4, i32 5, i32 2, i32 3> + + %a.gep3 = getelementptr <4 x i32>* %a, i32 0, i32 3 + store i32 3, i32* %a.gep3 +; CHECK-NEXT: %[[insert4:.*]] = insertelement <4 x i32> %[[insert3]], i32 3, i32 3 + + %ret = load <4 x i32>* %a + + ret <4 x i32> %ret +; CHECK-NEXT: ret <4 x i32> %[[insert4]] +} + +define <4 x i32> @test_subvec_load() { +; CHECK: @test_subvec_load +entry: + %a = alloca <4 x i32> +; CHECK-NOT: alloca + store <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32>* %a +; CHECK-NOT: store + + %a.gep0 = getelementptr <4 x i32>* %a, i32 0, i32 0 + %a.cast0 = bitcast i32* %a.gep0 to <2 x i32>* + %first = load <2 x i32>* %a.cast0 +; CHECK-NOT: load +; CHECK: %[[extract1:.*]] = shufflevector <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32> undef, <2 x i32> <i32 0, i32 1> + + %a.gep1 = getelementptr <4 x i32>* %a, i32 0, i32 1 + %a.cast1 = bitcast i32* %a.gep1 to <2 x i32>* + %second = load <2 x i32>* %a.cast1 +; CHECK-NEXT: %[[extract2:.*]] = shufflevector <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32> undef, <2 x i32> <i32 1, i32 2> + + %a.gep2 = getelementptr <4 x i32>* %a, i32 0, i32 2 + %a.cast2 = bitcast i32* %a.gep2 to <2 x i32>* + %third = load <2 x i32>* %a.cast2 +; CHECK-NEXT: %[[extract3:.*]] = shufflevector <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32> undef, <2 x i32> <i32 2, i32 3> + + %tmp = shufflevector <2 x i32> %first, <2 x i32> %second, <2 x i32> <i32 0, i32 2> + %ret = shufflevector <2 x i32> %tmp, <2 x i32> %third, <4 x i32> <i32 0, i32 1, i32 2, i32 3> +; CHECK-NEXT: %[[tmp:.*]] = shufflevector <2 x i32> %[[extract1]], <2 x i32> %[[extract2]], <2 x i32> <i32 0, i32 2> +; CHECK-NEXT: %[[ret:.*]] = shufflevector <2 x i32> %[[tmp]], <2 x i32> %[[extract3]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> + + ret <4 x i32> %ret +; CHECK-NEXT: ret <4 x i32> %[[ret]] +} + +declare void @llvm.memset.p0i32.i32(i32* nocapture, i32, i32, i32, i1) nounwind + +define <4 x float> @test_subvec_memset() { +; CHECK: @test_subvec_memset +entry: + %a = alloca <4 x float> +; CHECK-NOT: alloca + + %a.gep0 = getelementptr <4 x float>* %a, i32 0, i32 0 + %a.cast0 = bitcast float* %a.gep0 to i8* + call void @llvm.memset.p0i8.i32(i8* %a.cast0, i8 0, i32 8, i32 0, i1 false) +; CHECK-NOT: store +; CHECK: %[[insert1:.*]] = shufflevector <4 x float> <float 0.000000e+00, float 0.000000e+00, float undef, float undef>, <4 x float> undef, <4 x i32> <i32 0, i32 1, {{.*}}> + + %a.gep1 = getelementptr <4 x float>* %a, i32 0, i32 1 + %a.cast1 = bitcast float* %a.gep1 to i8* + call void @llvm.memset.p0i8.i32(i8* %a.cast1, i8 1, i32 8, i32 0, i1 false) +; CHECK-NEXT: %[[insert2:.*]] = shufflevector <4 x float> <float undef, float 0x3820202020000000, float 0x3820202020000000, float undef>, <4 x float> %[[insert1]], <4 x i32> <i32 4, i32 1, i32 2, {{.*}}> + + %a.gep2 = getelementptr <4 x float>* %a, i32 0, i32 2 + %a.cast2 = bitcast float* %a.gep2 to i8* + call void @llvm.memset.p0i8.i32(i8* %a.cast2, i8 3, i32 8, i32 0, i1 false) +; CHECK-NEXT: %[[insert3:.*]] = shufflevector <4 x float> <float undef, float undef, float 0x3860606060000000, float 0x3860606060000000>, <4 x float> %[[insert2]], <4 x i32> <i32 4, i32 5, i32 2, i32 3> + + %a.gep3 = getelementptr <4 x float>* %a, i32 0, i32 3 + %a.cast3 = bitcast float* %a.gep3 to i8* + call void @llvm.memset.p0i8.i32(i8* %a.cast3, i8 7, i32 4, i32 0, i1 false) +; CHECK-NEXT: %[[insert4:.*]] = insertelement <4 x float> %[[insert3]], float 0x38E0E0E0E0000000, i32 3 + + %ret = load <4 x float>* %a + + ret <4 x float> %ret +; CHECK-NEXT: ret <4 x float> %[[insert4]] +} + +define <4 x float> @test_subvec_memcpy(i8* %x, i8* %y, i8* %z, i8* %f, i8* %out) { +; CHECK: @test_subvec_memcpy +entry: + %a = alloca <4 x float> +; CHECK-NOT: alloca + + %a.gep0 = getelementptr <4 x float>* %a, i32 0, i32 0 + %a.cast0 = bitcast float* %a.gep0 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a.cast0, i8* %x, i32 8, i32 0, i1 false) +; CHECK: %[[xptr:.*]] = bitcast i8* %x to <2 x float>* +; CHECK-NEXT: %[[x:.*]] = load <2 x float>* %[[xptr]] +; CHECK-NEXT: %[[expand_x:.*]] = shufflevector <2 x float> %[[x]], <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> +; CHECK-NEXT: %[[insert_x:.*]] = shufflevector <4 x float> %[[expand_x]], <4 x float> undef, <4 x i32> <i32 0, i32 1, {{.*}}> + + %a.gep1 = getelementptr <4 x float>* %a, i32 0, i32 1 + %a.cast1 = bitcast float* %a.gep1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a.cast1, i8* %y, i32 8, i32 0, i1 false) +; CHECK-NEXT: %[[yptr:.*]] = bitcast i8* %y to <2 x float>* +; CHECK-NEXT: %[[y:.*]] = load <2 x float>* %[[yptr]] +; CHECK-NEXT: %[[expand_y:.*]] = shufflevector <2 x float> %[[y]], <2 x float> undef, <4 x i32> <i32 undef, i32 0, i32 1, i32 undef> +; CHECK-NEXT: %[[insert_y:.*]] = shufflevector <4 x float> %[[expand_y]], <4 x float> %[[insert_x]], <4 x i32> <i32 4, i32 1, i32 2, {{.*}}> + + %a.gep2 = getelementptr <4 x float>* %a, i32 0, i32 2 + %a.cast2 = bitcast float* %a.gep2 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a.cast2, i8* %z, i32 8, i32 0, i1 false) +; CHECK-NEXT: %[[zptr:.*]] = bitcast i8* %z to <2 x float>* +; CHECK-NEXT: %[[z:.*]] = load <2 x float>* %[[zptr]] +; CHECK-NEXT: %[[expand_z:.*]] = shufflevector <2 x float> %[[z]], <2 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 1> +; CHECK-NEXT: %[[insert_z:.*]] = shufflevector <4 x float> %[[expand_z]], <4 x float> %[[insert_y]], <4 x i32> <i32 4, i32 5, i32 2, i32 3> + + %a.gep3 = getelementptr <4 x float>* %a, i32 0, i32 3 + %a.cast3 = bitcast float* %a.gep3 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a.cast3, i8* %f, i32 4, i32 0, i1 false) +; CHECK-NEXT: %[[fptr:.*]] = bitcast i8* %f to float* +; CHECK-NEXT: %[[f:.*]] = load float* %[[fptr]] +; CHECK-NEXT: %[[insert_f:.*]] = insertelement <4 x float> %[[insert_z]], float %[[f]], i32 3 + + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %out, i8* %a.cast2, i32 8, i32 0, i1 false) +; CHECK-NEXT: %[[outptr:.*]] = bitcast i8* %out to <2 x float>* +; CHECK-NEXT: %[[extract_out:.*]] = shufflevector <4 x float> %[[insert_f]], <4 x float> undef, <2 x i32> <i32 2, i32 3> +; CHECK-NEXT: store <2 x float> %[[extract_out]], <2 x float>* %[[outptr]] + + %ret = load <4 x float>* %a + + ret <4 x float> %ret +; CHECK-NEXT: ret <4 x float> %[[insert_f]] +} + define i32 @PR14212() { ; CHECK: @PR14212 ; This caused a crash when "splitting" the load of the i32 in order to promote @@ -222,7 +378,7 @@ entry: } define <2 x i8> @PR14349.1(i32 %x) { -; CEHCK: @PR14349.1 +; CHECK: @PR14349.1 ; The first testcase for broken SROA rewriting of split integer loads and ; stores due to smaller vector loads and stores. This particular test ensures ; that we can rewrite a split store of an integer to a store of a vector. @@ -244,7 +400,7 @@ entry: } define i32 @PR14349.2(<2 x i8> %x) { -; CEHCK: @PR14349.2 +; CHECK: @PR14349.2 ; The first testcase for broken SROA rewriting of split integer loads and ; stores due to smaller vector loads and stores. This particular test ensures ; that we can rewrite a split load of an integer to a load of a vector. diff --git a/test/Transforms/SROA/vectors-of-pointers.ll b/test/Transforms/SROA/vectors-of-pointers.ll new file mode 100644 index 000000000000..7e995b9e4476 --- /dev/null +++ b/test/Transforms/SROA/vectors-of-pointers.ll @@ -0,0 +1,25 @@ +; RUN: opt < %s -sroa + +; Make sure we don't crash on this one. + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +define void @foo() { +entry: + %Args.i = alloca <2 x i32*>, align 16 + br i1 undef, label %bb0.exit158, label %if.then.i.i.i.i.i138 + +if.then.i.i.i.i.i138: + unreachable + +bb0.exit158: + br i1 undef, label %bb0.exit257, label %if.then.i.i.i.i.i237 + +if.then.i.i.i.i.i237: + unreachable + +bb0.exit257: + %0 = load <2 x i32*>* %Args.i, align 16 + unreachable +} diff --git a/test/Transforms/ScalarRepl/2003-09-12-IncorrectPromote.ll b/test/Transforms/ScalarRepl/2003-09-12-IncorrectPromote.ll index 0b5e4152c423..3f28cb187f86 100644 --- a/test/Transforms/ScalarRepl/2003-09-12-IncorrectPromote.ll +++ b/test/Transforms/ScalarRepl/2003-09-12-IncorrectPromote.ll @@ -1,7 +1,6 @@ ; Scalar replacement was incorrectly promoting this alloca!! ; -; RUN: opt < %s -scalarrepl -S | \ -; RUN: sed "s/;.*//g" | grep "\[" +; RUN: opt < %s -scalarrepl -S | FileCheck %s define i8* @test() { %A = alloca [30 x i8] ; <[30 x i8]*> [#uses=1] @@ -10,4 +9,4 @@ define i8* @test() { store i8 0, i8* %B ret i8* %C } - +; CHECK: alloca [ diff --git a/test/Transforms/ScalarRepl/crash.ll b/test/Transforms/ScalarRepl/crash.ll index 58c5a3a0527d..8c60dceb8b07 100644 --- a/test/Transforms/ScalarRepl/crash.ll +++ b/test/Transforms/ScalarRepl/crash.ll @@ -1,5 +1,5 @@ -; RUN: opt -scalarrepl %s -disable-output -; RUN: opt -scalarrepl-ssa %s -disable-output +; RUN: opt -scalarrepl -disable-output < %s +; RUN: opt -scalarrepl-ssa -disable-output < %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" diff --git a/test/Transforms/ScalarRepl/debuginfo-preserved.ll b/test/Transforms/ScalarRepl/debuginfo-preserved.ll index c1491345351e..7d3bcea8b857 100644 --- a/test/Transforms/ScalarRepl/debuginfo-preserved.ll +++ b/test/Transforms/ScalarRepl/debuginfo-preserved.ll @@ -40,22 +40,23 @@ entry: declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} -!llvm.dbg.sp = !{!1} -!0 = metadata !{i32 589841, 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} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"f", metadata !"f", metadata !"", metadata !2, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 (i32, i32)* @f, null, null} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 589865, metadata !"/d/j/debug-test.c", metadata !"/Volumes/Data/b", metadata !0} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 589845, 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 ] +!0 = metadata !{i32 786449, i32 0, i32 12, metadata !2, metadata !"clang version 3.0 (trunk 131941)", i1 false, metadata !"", i32 0, null, null, metadata !17, null, null} ; [ DW_TAG_compile_unit ] +!1 = metadata !{i32 786478, metadata !2, metadata !"f", metadata !"f", metadata !"", metadata !2, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 (i32, i32)* @f, null, null, null, i32 1} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !18} ; [ 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 589860, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 590081, metadata !1, metadata !"a", metadata !2, i32 16777217, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] +!5 = metadata !{i32 786468, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 786689, metadata !1, metadata !"a", metadata !2, i32 16777217, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] !7 = metadata !{i32 1, i32 11, metadata !1, null} -!8 = metadata !{i32 590081, metadata !1, metadata !"b", metadata !2, i32 33554433, metadata !5, i32 0} ; [ DW_TAG_arg_variable ] +!8 = metadata !{i32 786689, metadata !1, metadata !"b", metadata !2, i32 33554433, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] !9 = metadata !{i32 1, i32 18, metadata !1, null} -!10 = metadata !{i32 590080, metadata !11, metadata !"c", metadata !2, i32 2, metadata !5, i32 0} ; [ DW_TAG_auto_variable ] -!11 = metadata !{i32 589835, metadata !1, i32 1, i32 21, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] +!10 = metadata !{i32 786688, metadata !11, metadata !"c", metadata !2, i32 2, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!11 = metadata !{i32 786443, metadata !1, i32 1, i32 21, metadata !2, i32 0} ; [ DW_TAG_lexical_block ] !12 = metadata !{i32 2, i32 9, metadata !11, null} !13 = metadata !{i32 2, i32 14, metadata !11, null} !14 = metadata !{i32 3, i32 5, metadata !11, null} !15 = metadata !{i32 4, i32 5, metadata !11, null} !16 = metadata !{i32 5, i32 5, metadata !11, null} +!17 = metadata !{metadata !1} +!18 = metadata !{metadata !"/d/j/debug-test.c", metadata !"/Volumes/Data/b"} diff --git a/test/Transforms/ScalarRepl/memcpy-align.ll b/test/Transforms/ScalarRepl/memcpy-align.ll index a7af208f4f39..6046e1295d9e 100644 --- a/test/Transforms/ScalarRepl/memcpy-align.ll +++ b/test/Transforms/ScalarRepl/memcpy-align.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -scalarrepl -S | FileCheck %s +; RUN: opt -scalarrepl -S < %s | FileCheck %s ; PR6832 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32" diff --git a/test/Transforms/ScalarRepl/phi-cycle.ll b/test/Transforms/ScalarRepl/phi-cycle.ll index cb5101c2dd8e..05d9382cec40 100644 --- a/test/Transforms/ScalarRepl/phi-cycle.ll +++ b/test/Transforms/ScalarRepl/phi-cycle.ll @@ -67,7 +67,7 @@ while.cond.backedge.i: ; preds = %if.end.i, %while.bo ; CHECK: func.exit: ; CHECK-NOT: load -; CHECK: %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0), i32 %tmp) nounwind +; CHECK: %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0), i32 %tmp) [[NUW:#[0-9]+]] func.exit: ; preds = %while.body.i.func.exit_crit_edge, %while.cond.i.func.exit_crit_edge %tmp3 = load i32* %x.i, align 4 %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0), i32 %tmp3) nounwind @@ -75,3 +75,6 @@ func.exit: ; preds = %while.body.i.func.e } declare i32 @printf(i8* nocapture, ...) nounwind + +; CHECK: attributes #0 = { nounwind uwtable } +; CHECK: attributes [[NUW]] = { nounwind } diff --git a/test/Transforms/ScalarRepl/phi-select.ll b/test/Transforms/ScalarRepl/phi-select.ll index ffe0b1dd5f47..5c21c3bd9f34 100644 --- a/test/Transforms/ScalarRepl/phi-select.ll +++ b/test/Transforms/ScalarRepl/phi-select.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -scalarrepl -S | FileCheck %s +; RUN: opt -scalarrepl -S < %s | FileCheck %s ; Test promotion of allocas that have phis and select users. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.2" diff --git a/test/Transforms/ScalarRepl/volatile.ll b/test/Transforms/ScalarRepl/volatile.ll index 056526cbd92b..d506cdfbd87a 100644 --- a/test/Transforms/ScalarRepl/volatile.ll +++ b/test/Transforms/ScalarRepl/volatile.ll @@ -1,12 +1,13 @@ -; RUN: opt < %s -scalarrepl -S | grep "load volatile" -; RUN: opt < %s -scalarrepl -S | grep "store volatile" +; RUN: opt < %s -scalarrepl -S | FileCheck %s define i32 @voltest(i32 %T) { %A = alloca {i32, i32} %B = getelementptr {i32,i32}* %A, i32 0, i32 0 store volatile i32 %T, i32* %B +; CHECK: store volatile %C = getelementptr {i32,i32}* %A, i32 0, i32 1 %X = load volatile i32* %C +; CHECK: load volatile ret i32 %X } diff --git a/test/Transforms/SimplifyCFG/2010-03-30-InvokeCrash.ll b/test/Transforms/SimplifyCFG/2010-03-30-InvokeCrash.ll index 7bffa1a8e0e2..333336de7673 100644 --- a/test/Transforms/SimplifyCFG/2010-03-30-InvokeCrash.ll +++ b/test/Transforms/SimplifyCFG/2010-03-30-InvokeCrash.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -simplifycfg -disable-output +; RUN: opt -simplifycfg -disable-output < %s ; END. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/Transforms/SimplifyCFG/2002-05-05-EmptyBlockMerge.ll b/test/Transforms/SimplifyCFG/EmptyBlockMerge.ll index feffb4e4c812..aba08dc073a8 100644 --- a/test/Transforms/SimplifyCFG/2002-05-05-EmptyBlockMerge.ll +++ b/test/Transforms/SimplifyCFG/EmptyBlockMerge.ll @@ -1,8 +1,6 @@ ; Basic block #2 should not be merged into BB #3! ; -; RUN: opt < %s -simplifycfg -S | \ -; RUN: grep "br label" -; +; RUN: opt < %s -simplifycfg -S | FileCheck %s declare void @foo() @@ -13,6 +11,7 @@ bb0: br i1 %cond218, label %bb3, label %bb2 bb2: ; preds = %bb0 call void @foo( ) +; CHECK: br label %bb3 br label %bb3 bb3: ; preds = %bb2, %bb0 %reg117 = phi i32 [ 110, %bb2 ], [ %reg108, %bb0 ] ; <i32> [#uses=1] diff --git a/test/Transforms/SimplifyCFG/2002-06-24-PHINode.ll b/test/Transforms/SimplifyCFG/PHINode.ll index 88f32bc08279..25a242a55997 100644 --- a/test/Transforms/SimplifyCFG/2002-06-24-PHINode.ll +++ b/test/Transforms/SimplifyCFG/PHINode.ll @@ -1,10 +1,11 @@ ; -simplifycfg is not folding blocks if there is a PHI node involved. This ; should be fixed eventually -; RUN: opt < %s -simplifycfg -S | not grep br +; RUN: opt < %s -simplifycfg -S | FileCheck %s define i32 @main(i32 %argc) { ; <label>:0 +; CHECK-NOT: br label %InlinedFunctionReturnNode br label %InlinedFunctionReturnNode InlinedFunctionReturnNode: ; preds = %0 %X = phi i32 [ 7, %0 ] ; <i32> [#uses=1] diff --git a/test/Transforms/SimplifyCFG/PR9946.ll b/test/Transforms/SimplifyCFG/PR9946.ll index 4a61b846052e..c355a8f5cc98 100644 --- a/test/Transforms/SimplifyCFG/PR9946.ll +++ b/test/Transforms/SimplifyCFG/PR9946.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -simplifycfg -disable-output +; RUN: opt -simplifycfg -disable-output < %s @foo = external constant i32 diff --git a/test/Transforms/SimplifyCFG/SpeculativeExec.ll b/test/Transforms/SimplifyCFG/SpeculativeExec.ll index a61867fe89c7..dd2e5d1c3a77 100644 --- a/test/Transforms/SimplifyCFG/SpeculativeExec.ll +++ b/test/Transforms/SimplifyCFG/SpeculativeExec.ll @@ -44,3 +44,44 @@ join: ret i8 %c } +define i8* @test4(i1* %dummy, i8* %a, i8* %b) { +; Test that we don't speculate an arbitrarily large number of unfolded constant +; expressions. +; CHECK: @test4 + +entry: + %cond1 = load volatile i1* %dummy + br i1 %cond1, label %if, label %end + +if: + %cond2 = load volatile i1* %dummy + br i1 %cond2, label %then, label %end + +then: + br label %end + +end: + %x1 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 1 to i8*), %then ] + %x2 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 2 to i8*), %then ] + %x3 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 3 to i8*), %then ] + %x4 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 4 to i8*), %then ] + %x5 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 5 to i8*), %then ] + %x6 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 6 to i8*), %then ] + %x7 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 7 to i8*), %then ] + %x8 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 8 to i8*), %then ] + %x9 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 9 to i8*), %then ] + %x10 = phi i8* [ %a, %entry ], [ %b, %if ], [ inttoptr (i64 10 to i8*), %then ] +; CHECK-NOT: select +; CHECK: phi i8* +; CHECK: phi i8* +; CHECK: phi i8* +; CHECK: phi i8* +; CHECK: phi i8* +; CHECK: phi i8* +; CHECK: phi i8* +; CHECK: phi i8* +; CHECK: phi i8* +; CHECK: phi i8* + + ret i8* %x10 +} diff --git a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll index 8a59992f5e64..5f70465c64d4 100644 --- a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll +++ b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll @@ -777,3 +777,29 @@ return: ; CHECK: switch.lookup: ; CHECK: getelementptr inbounds [5 x i32]* @switch.table6, i32 0, i32 %switch.tableidx } + +; Don't create a table with illegal type +; rdar://12779436 +define i96 @illegaltype(i32 %c) { +entry: + switch i32 %c, label %sw.default [ + i32 42, label %return + i32 43, label %sw.bb1 + i32 44, label %sw.bb2 + i32 45, label %sw.bb3 + i32 46, label %sw.bb4 + ] + +sw.bb1: br label %return +sw.bb2: br label %return +sw.bb3: br label %return +sw.bb4: br label %return +sw.default: br label %return +return: + %retval.0 = phi i96 [ 15, %sw.default ], [ 27, %sw.bb4 ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] + ret i96 %retval.0 + +; CHECK: @illegaltype +; CHECK-NOT: @switch.table +; CHECK: switch i32 %c +} diff --git a/test/Transforms/SimplifyCFG/branch-fold-dbg.ll b/test/Transforms/SimplifyCFG/branch-fold-dbg.ll index 0897c95a6778..0526883fe8f4 100644 --- a/test/Transforms/SimplifyCFG/branch-fold-dbg.ll +++ b/test/Transforms/SimplifyCFG/branch-fold-dbg.ll @@ -1,4 +1,4 @@ -; RUN: opt -simplifycfg -S %s | FileCheck %s +; RUN: opt -simplifycfg -S < %s | FileCheck %s %0 = type { i32*, i32* } diff --git a/test/Transforms/SimplifyCFG/select-gep.ll b/test/Transforms/SimplifyCFG/select-gep.ll index 7654d0271a9a..3e2a6237b275 100644 --- a/test/Transforms/SimplifyCFG/select-gep.ll +++ b/test/Transforms/SimplifyCFG/select-gep.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -simplifycfg %s | FileCheck %s +; RUN: opt -S -simplifycfg < %s | FileCheck %s define i8* @test1(i8* %x, i64 %y) nounwind { entry: diff --git a/test/Transforms/SimplifyCFG/switch-on-const-select.ll b/test/Transforms/SimplifyCFG/switch-on-const-select.ll index 673a62bf035c..9cd709ff8ecf 100644 --- a/test/Transforms/SimplifyCFG/switch-on-const-select.ll +++ b/test/Transforms/SimplifyCFG/switch-on-const-select.ll @@ -35,7 +35,7 @@ define i32 @bar(i64 %x, i64 %y) nounwind { ; CHECK: @bar entry: ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call void @bees.a() nounwind +; CHECK-NEXT: tail call void @bees.a() [[NUW:#[0-9]+]] ; CHECK-NEXT: ret i32 0 %lt = icmp slt i64 %x, %y %qux = select i1 %lt, i32 0, i32 2 @@ -61,7 +61,7 @@ define void @bazz(i64 %x, i64 %y) nounwind { ; CHECK: @bazz entry: ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call void @bees.b() nounwind +; CHECK-NEXT: tail call void @bees.b() [[NUW]] ; CHECK-NEXT: ret void %lt = icmp slt i64 %x, %y %qux = select i1 %lt, i32 10, i32 12 @@ -86,7 +86,7 @@ define void @quux(i64 %x, i64 %y) nounwind { ; CHECK: @quux entry: ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call void @bees.a() nounwind +; CHECK-NEXT: tail call void @bees.a() [[NUW]] ; CHECK-NEXT: ret void %lt = icmp slt i64 %x, %y %qux = select i1 %lt, i32 0, i32 0 @@ -136,3 +136,6 @@ bees: declare void @llvm.trap() nounwind noreturn declare void @bees.a() nounwind declare void @bees.b() nounwind + +; CHECK: attributes [[NUW]] = { nounwind } +; CHECK: attributes #1 = { noreturn nounwind } diff --git a/test/Transforms/SimplifyCFG/trivial-throw.ll b/test/Transforms/SimplifyCFG/trivial-throw.ll new file mode 100644 index 000000000000..ca2b5693e600 --- /dev/null +++ b/test/Transforms/SimplifyCFG/trivial-throw.ll @@ -0,0 +1,77 @@ +; RUN: opt -simplifycfg -S < %s | FileCheck %s +; <rdar://problem/13360379> + +@_ZTVN10__cxxabiv117__class_type_infoE = external global i8* +@_ZTS13TestException = linkonce_odr constant [16 x i8] c"13TestException\00" +@_ZTI13TestException = linkonce_odr unnamed_addr constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8** @_ZTVN10__cxxabiv117__class_type_infoE, i64 2) to i8*), i8* getelementptr inbounds ([16 x i8]* @_ZTS13TestException, i32 0, i32 0) } + +define void @throw(i32 %n) #0 { +entry: + %exception = call i8* @__cxa_allocate_exception(i64 1) #4 + call void @__cxa_throw(i8* %exception, i8* bitcast ({ i8*, i8* }* @_ZTI13TestException to i8*), i8* null) #2 + unreachable +} + +define void @func() #0 { +entry: +; CHECK: func() +; CHECK: invoke void @throw +; CHECK-NOT: call void @throw + invoke void @throw(i32 42) #0 + to label %exit unwind label %lpad + +lpad: + %tmp0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup + resume { i8*, i32 } %tmp0 + +exit: + invoke void @abort() #2 + to label %invoke.cont unwind label %lpad1 + +invoke.cont: + unreachable + +lpad1: + %tmp1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast ({ i8*, i8* }* @_ZTI13TestException to i8*) + %tmp2 = extractvalue { i8*, i32 } %tmp1, 1 + %tmp3 = call i32 @llvm.eh.typeid.for(i8* bitcast ({ i8*, i8* }* @_ZTI13TestException to i8*)) #4 + %matches = icmp eq i32 %tmp2, %tmp3 + br i1 %matches, label %catch, label %eh.resume + +catch: + ret void + +eh.resume: + resume { i8*, i32 } %tmp1 +} + +define linkonce_odr hidden void @__clang_call_terminate(i8*) #1 { + %2 = call i8* @__cxa_begin_catch(i8* %0) #4 + call void @_ZSt9terminatev() #5 + unreachable +} + +declare void @abort() #2 + +declare i32 @llvm.eh.typeid.for(i8*) #3 + +declare void @__cxa_end_catch() + +declare i8* @__cxa_allocate_exception(i64) + +declare i32 @__gxx_personality_v0(...) + +declare void @__cxa_throw(i8*, i8*, i8*) + +declare i8* @__cxa_begin_catch(i8*) + +declare void @_ZSt9terminatev() + +attributes #0 = { ssp uwtable } +attributes #1 = { noinline noreturn nounwind } +attributes #2 = { noreturn } +attributes #3 = { nounwind readnone } +attributes #4 = { nounwind } +attributes #5 = { noreturn nounwind } diff --git a/test/Transforms/SimplifyCFG/volatile-phioper.ll b/test/Transforms/SimplifyCFG/volatile-phioper.ll new file mode 100644 index 000000000000..164898897eff --- /dev/null +++ b/test/Transforms/SimplifyCFG/volatile-phioper.ll @@ -0,0 +1,48 @@ +; RUN: opt < %s -simplifycfg -S | FileCheck %s +; +; rdar:13349374 +; +; SimplifyCFG should not eliminate blocks with volatile stores. +; Essentially, volatile needs to be backdoor that tells the optimizer +; it can no longer use language standard as an excuse. The compiler +; needs to expose the volatile access to the platform. +; +; CHECK: @test +; CHECK: entry: +; CHECK: @Trace +; CHECK: while.body: +; CHECK: store volatile +; CHECK: end: +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" + +define void @test(i8** nocapture %PeiServices) #0 { +entry: + %call = tail call i32 (...)* @Trace() #2 + %tobool = icmp eq i32 %call, 0 + br i1 %tobool, label %while.body, label %if.then + +if.then: ; preds = %entry + %call1 = tail call i32 (...)* @Trace() #2 + br label %while.body + +while.body: ; preds = %entry, %if.then, %while.body + %Addr.017 = phi i8* [ %incdec.ptr, %while.body ], [ null, %if.then ], [ null, %entry ] + %x.016 = phi i8 [ %inc, %while.body ], [ 0, %if.then ], [ 0, %entry ] + %inc = add i8 %x.016, 1 + %incdec.ptr = getelementptr inbounds i8* %Addr.017, i64 1 + store volatile i8 %x.016, i8* %Addr.017, align 1 + %0 = ptrtoint i8* %incdec.ptr to i64 + %1 = trunc i64 %0 to i32 + %cmp = icmp ult i32 %1, 4096 + br i1 %cmp, label %while.body, label %end + +end: + ret void +} +declare i32 @Trace(...) #1 + +attributes #0 = { nounwind ssp uwtable "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="pic" "ssp-buffers-size"="8" } +attributes #1 = { "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="pic" "ssp-buffers-size"="8" } +attributes #2 = { nounwind } + +!0 = metadata !{i32 1039} diff --git a/test/Transforms/SimplifyLibCalls/2009-01-04-Annotate.ll b/test/Transforms/SimplifyLibCalls/2009-01-04-Annotate.ll deleted file mode 100644 index 73eb05b05e34..000000000000 --- a/test/Transforms/SimplifyLibCalls/2009-01-04-Annotate.ll +++ /dev/null @@ -1,12 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S > %t -; RUN: grep noalias %t | count 2 -; RUN: grep nocapture %t | count 3 -; RUN: grep nounwind %t | count 3 -; RUN: grep readonly %t | count 1 - -declare i8* @fopen(i8*, i8*) -declare i8 @strlen(i8*) -declare i32* @realloc(i32*, i32) - -; Test deliberately wrong declaration -declare i32 @strcpy(...) diff --git a/test/Transforms/SimplifyLibCalls/2009-02-11-NotInitialized.ll b/test/Transforms/SimplifyLibCalls/2009-02-11-NotInitialized.ll deleted file mode 100644 index ac89199b0ec1..000000000000 --- a/test/Transforms/SimplifyLibCalls/2009-02-11-NotInitialized.ll +++ /dev/null @@ -1,13 +0,0 @@ -; RUN: opt < %s -inline -simplify-libcalls -functionattrs | \ -; RUN: llvm-dis | grep nocapture | count 2 -; Check that nocapture attributes are added when run after an SCC pass. -; PR3520 - -define i32 @use(i8* %x) nounwind readonly { -entry: - %0 = tail call i64 @strlen(i8* %x) nounwind readonly ; <i64> [#uses=1] - %1 = trunc i64 %0 to i32 ; <i32> [#uses=1] - ret i32 %1 -} - -declare i64 @strlen(i8*) nounwind readonly diff --git a/test/Transforms/SimplifyLibCalls/FFS.ll b/test/Transforms/SimplifyLibCalls/FFS.ll deleted file mode 100644 index 6aecbeacd7e6..000000000000 --- a/test/Transforms/SimplifyLibCalls/FFS.ll +++ /dev/null @@ -1,45 +0,0 @@ -; Test that FFSOpt works correctly -; RUN: opt < %s -simplify-libcalls -S | FileCheck %s - -; CHECK-NOT: call{{.*}}@ffs - -@non_const = external global i32 ; <i32*> [#uses=1] - -declare i32 @ffs(i32) - -declare i32 @ffsl(i32) - -declare i32 @ffsll(i64) - -define i32 @main() { - %arg = load i32* @non_const ; <i32> [#uses=1] - %val0 = call i32 @ffs( i32 %arg ) ; <i32> [#uses=1] - %val1 = call i32 @ffs( i32 1 ) ; <i32> [#uses=1] - %val2 = call i32 @ffs( i32 2048 ) ; <i32> [#uses=1] - %val3 = call i32 @ffsl( i32 65536 ) ; <i32> [#uses=1] - %val4 = call i32 @ffsll( i64 1024 ) ; <i32> [#uses=1] - %val5 = call i32 @ffsll( i64 17179869184 ) ; <i32> [#uses=1] - %val6 = call i32 @ffsll( i64 1152921504606846976 ) ; <i32> [#uses=1] - %rslt1 = add i32 %val1, %val2 ; <i32> [#uses=1] - %rslt2 = add i32 %val3, %val4 ; <i32> [#uses=1] - %rslt3 = add i32 %val5, %val6 ; <i32> [#uses=1] - %rslt4 = add i32 %rslt1, %rslt2 ; <i32> [#uses=1] - %rslt5 = add i32 %rslt4, %rslt3 ; <i32> [#uses=2] - %rslt6 = add i32 %rslt5, %val0 ; <i32> [#uses=0] - ret i32 %rslt5 -} - - -; PR4206 -define i32 @a(i64) nounwind { - %2 = call i32 @ffsll(i64 %0) ; <i32> [#uses=1] - ret i32 %2 -} - -; PR13028 -define i32 @b() nounwind { - %ffs = call i32 @ffsll(i64 0) - ret i32 %ffs -; CHECK: @b -; CHECK-NEXT: ret i32 0 -} diff --git a/test/Transforms/SimplifyLibCalls/FPrintF.ll b/test/Transforms/SimplifyLibCalls/FPrintF.ll deleted file mode 100644 index 51733e4a1ef6..000000000000 --- a/test/Transforms/SimplifyLibCalls/FPrintF.ll +++ /dev/null @@ -1,28 +0,0 @@ -; Test that the FPrintFOptimizer works correctly -; RUN: opt < %s -simplify-libcalls -S | \ -; RUN: not grep "call.*fprintf" - -; This transformation requires the pointer size, as it assumes that size_t is -; the size of a pointer. -target datalayout = "-p:64:64:64" - - %struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i32, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i32, [52 x i8] } - %struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } -@str = constant [3 x i8] c"%s\00" ; <[3 x i8]*> [#uses=1] -@chr = constant [3 x i8] c"%c\00" ; <[3 x i8]*> [#uses=1] -@hello = constant [13 x i8] c"hello world\0A\00" ; <[13 x i8]*> [#uses=1] -@stdout = external global %struct._IO_FILE* ; <%struct._IO_FILE**> [#uses=3] - -declare i32 @fprintf(%struct._IO_FILE*, i8*, ...) - -define i32 @foo() { -entry: - %tmp.1 = load %struct._IO_FILE** @stdout ; <%struct._IO_FILE*> [#uses=1] - %tmp.0 = call i32 (%struct._IO_FILE*, i8*, ...)* @fprintf( %struct._IO_FILE* %tmp.1, i8* getelementptr ([13 x i8]* @hello, i32 0, i32 0) ) ; <i32> [#uses=0] - %tmp.4 = load %struct._IO_FILE** @stdout ; <%struct._IO_FILE*> [#uses=1] - %tmp.3 = call i32 (%struct._IO_FILE*, i8*, ...)* @fprintf( %struct._IO_FILE* %tmp.4, i8* getelementptr ([3 x i8]* @str, i32 0, i32 0), i8* getelementptr ([13 x i8]* @hello, i32 0, i32 0) ) ; <i32> [#uses=0] - %tmp.8 = load %struct._IO_FILE** @stdout ; <%struct._IO_FILE*> [#uses=1] - %tmp.7 = call i32 (%struct._IO_FILE*, i8*, ...)* @fprintf( %struct._IO_FILE* %tmp.8, i8* getelementptr ([3 x i8]* @chr, i32 0, i32 0), i32 33 ) ; <i32> [#uses=0] - ret i32 0 -} - diff --git a/test/Transforms/SimplifyLibCalls/FPuts.ll b/test/Transforms/SimplifyLibCalls/FPuts.ll deleted file mode 100644 index aa01aba2656c..000000000000 --- a/test/Transforms/SimplifyLibCalls/FPuts.ll +++ /dev/null @@ -1,29 +0,0 @@ -; Test that the FPutsOptimizer works correctly -; RUN: opt < %s -simplify-libcalls -S | \ -; RUN: not grep "call.*fputs" - -; This transformation requires the pointer size, as it assumes that size_t is -; the size of a pointer. -target datalayout = "-p:64:64:64" - - %struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i32, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i32, [52 x i8] } - %struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } -@stdout = external global %struct._IO_FILE* ; <%struct._IO_FILE**> [#uses=1] -@empty = constant [1 x i8] zeroinitializer ; <[1 x i8]*> [#uses=1] -@len1 = constant [2 x i8] c"A\00" ; <[2 x i8]*> [#uses=1] -@long = constant [7 x i8] c"hello\0A\00" ; <[7 x i8]*> [#uses=1] - -declare i32 @fputs(i8*, %struct._IO_FILE*) - -define i32 @main() { -entry: - %out = load %struct._IO_FILE** @stdout ; <%struct._IO_FILE*> [#uses=3] - %s1 = getelementptr [1 x i8]* @empty, i32 0, i32 0 ; <i8*> [#uses=1] - %s2 = getelementptr [2 x i8]* @len1, i32 0, i32 0 ; <i8*> [#uses=1] - %s3 = getelementptr [7 x i8]* @long, i32 0, i32 0 ; <i8*> [#uses=1] - %a = call i32 @fputs( i8* %s1, %struct._IO_FILE* %out ) ; <i32> [#uses=0] - %b = call i32 @fputs( i8* %s2, %struct._IO_FILE* %out ) ; <i32> [#uses=0] - %c = call i32 @fputs( i8* %s3, %struct._IO_FILE* %out ) ; <i32> [#uses=0] - ret i32 0 -} - diff --git a/test/Transforms/SimplifyLibCalls/IsDigit.ll b/test/Transforms/SimplifyLibCalls/IsDigit.ll deleted file mode 100644 index 51a769d9bb3d..000000000000 --- a/test/Transforms/SimplifyLibCalls/IsDigit.ll +++ /dev/null @@ -1,21 +0,0 @@ -; Test that the IsDigitOptimizer works correctly -; RUN: opt < %s -simplify-libcalls -S | \ -; RUN: not grep call - -declare i32 @isdigit(i32) - -declare i32 @isascii(i32) - -define i32 @main() { - %val1 = call i32 @isdigit( i32 47 ) ; <i32> [#uses=1] - %val2 = call i32 @isdigit( i32 48 ) ; <i32> [#uses=1] - %val3 = call i32 @isdigit( i32 57 ) ; <i32> [#uses=1] - %val4 = call i32 @isdigit( i32 58 ) ; <i32> [#uses=1] - %rslt1 = add i32 %val1, %val2 ; <i32> [#uses=1] - %rslt2 = add i32 %val3, %val4 ; <i32> [#uses=1] - %sum = add i32 %rslt1, %rslt2 ; <i32> [#uses=1] - %rslt = call i32 @isdigit( i32 %sum ) ; <i32> [#uses=1] - %tmp = call i32 @isascii( i32 %rslt ) ; <i32> [#uses=1] - ret i32 %tmp -} - diff --git a/test/Transforms/SimplifyLibCalls/Printf.ll b/test/Transforms/SimplifyLibCalls/Printf.ll deleted file mode 100644 index 489c993f2110..000000000000 --- a/test/Transforms/SimplifyLibCalls/Printf.ll +++ /dev/null @@ -1,37 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S | FileCheck %s - -@str = internal constant [13 x i8] c"hello world\0A\00" ; <[13 x i8]*> [#uses=1] -@str1 = internal constant [2 x i8] c"h\00" ; <[2 x i8]*> [#uses=1] - -; CHECK: private unnamed_addr constant [12 x i8] c"hello world\00" - -declare i32 @printf(i8*, ...) - -; CHECK: define void @f0 -; CHECK-NOT: printf -; CHECK: } -define void @f0() { -entry: - %tmp1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([13 x i8]* @str, i32 0, i32 0) ) ; <i32> [#uses=0] - ret void -} - -; CHECK: define void @f1 -; CHECK-NOT: printf -; CHECK: } -define void @f1() { -entry: - %tmp1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([2 x i8]* @str1, i32 0, i32 0) ) ; <i32> [#uses=0] - ret void -} - -; Verify that we don't turn this into a putchar call (thus changing the return -; value). -; -; CHECK: define i32 @f2 -; CHECK: printf -; CHECK: } -define i32 @f2() { - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8]* @str1, i32 0, i32 0)) - ret i32 %call -} diff --git a/test/Transforms/SimplifyLibCalls/Puts.ll b/test/Transforms/SimplifyLibCalls/Puts.ll deleted file mode 100644 index 48431434cc61..000000000000 --- a/test/Transforms/SimplifyLibCalls/Puts.ll +++ /dev/null @@ -1,15 +0,0 @@ -; Test that the PutsOptimizer works correctly -; RUN: opt < %s -simplify-libcalls -S | FileCheck %s - -target datalayout = "-p:64:64:64" - -@.str = private constant [1 x i8] zeroinitializer - -declare i32 @puts(i8*) - -define void @foo() { -entry: -; CHECK: call i32 @putchar(i32 10) - %call = call i32 @puts(i8* getelementptr inbounds ([1 x i8]* @.str, i32 0, i32 0)) - ret void -} diff --git a/test/Transforms/SimplifyLibCalls/SPrintF.ll b/test/Transforms/SimplifyLibCalls/SPrintF.ll deleted file mode 100644 index 514a7d9f6eee..000000000000 --- a/test/Transforms/SimplifyLibCalls/SPrintF.ll +++ /dev/null @@ -1,40 +0,0 @@ -; Test that the SPrintFOptimizer works correctly -; RUN: opt < %s -simplify-libcalls -S | \ -; RUN: not grep "call.*sprintf" - -; This transformation requires the pointer size, as it assumes that size_t is -; the size of a pointer. -target datalayout = "-p:64:64:64" - -@hello = constant [6 x i8] c"hello\00" ; <[6 x i8]*> [#uses=1] -@null = constant [1 x i8] zeroinitializer ; <[1 x i8]*> [#uses=1] -@null_hello = constant [7 x i8] c"\00hello\00" ; <[7 x i8]*> [#uses=1] -@fmt1 = constant [3 x i8] c"%s\00" ; <[3 x i8]*> [#uses=1] -@fmt2 = constant [3 x i8] c"%c\00" ; <[3 x i8]*> [#uses=1] - -declare i32 @sprintf(i8*, i8*, ...) - -declare i32 @puts(i8*) - -define i32 @foo(i8* %p) { - %target = alloca [1024 x i8] ; <[1024 x i8]*> [#uses=1] - %target_p = getelementptr [1024 x i8]* %target, i32 0, i32 0 ; <i8*> [#uses=7] - %hello_p = getelementptr [6 x i8]* @hello, i32 0, i32 0 ; <i8*> [#uses=2] - %null_p = getelementptr [1 x i8]* @null, i32 0, i32 0 ; <i8*> [#uses=1] - %nh_p = getelementptr [7 x i8]* @null_hello, i32 0, i32 0 ; <i8*> [#uses=1] - %fmt1_p = getelementptr [3 x i8]* @fmt1, i32 0, i32 0 ; <i8*> [#uses=2] - %fmt2_p = getelementptr [3 x i8]* @fmt2, i32 0, i32 0 ; <i8*> [#uses=1] - store i8 0, i8* %target_p - %r1 = call i32 (i8*, i8*, ...)* @sprintf( i8* %target_p, i8* %hello_p ) ; <i32> [#uses=1] - %r2 = call i32 (i8*, i8*, ...)* @sprintf( i8* %target_p, i8* %null_p ) ; <i32> [#uses=1] - %r3 = call i32 (i8*, i8*, ...)* @sprintf( i8* %target_p, i8* %nh_p ) ; <i32> [#uses=1] - %r4 = call i32 (i8*, i8*, ...)* @sprintf( i8* %target_p, i8* %fmt1_p, i8* %hello_p ) ; <i32> [#uses=1] - %r4.1 = call i32 (i8*, i8*, ...)* @sprintf( i8* %target_p, i8* %fmt1_p, i8* %p ) ; <i32> [#uses=1] - %r5 = call i32 (i8*, i8*, ...)* @sprintf( i8* %target_p, i8* %fmt2_p, i32 82 ) ; <i32> [#uses=1] - %r6 = add i32 %r1, %r2 ; <i32> [#uses=1] - %r7 = add i32 %r3, %r6 ; <i32> [#uses=1] - %r8 = add i32 %r5, %r7 ; <i32> [#uses=1] - %r9 = add i32 %r8, %r4 ; <i32> [#uses=1] - %r10 = add i32 %r9, %r4.1 ; <i32> [#uses=1] - ret i32 %r10 -} diff --git a/test/Transforms/SimplifyLibCalls/ToAscii.ll b/test/Transforms/SimplifyLibCalls/ToAscii.ll deleted file mode 100644 index aef47333b3c3..000000000000 --- a/test/Transforms/SimplifyLibCalls/ToAscii.ll +++ /dev/null @@ -1,21 +0,0 @@ -; Test that the ToAsciiOptimizer works correctly -; RUN: opt < %s -simplify-libcalls -S | \ -; RUN: not grep "call.*toascii" - -declare i32 @toascii(i32) - -define i32 @main() { - %val1 = call i32 @toascii( i32 1 ) ; <i32> [#uses=1] - %val2 = call i32 @toascii( i32 0 ) ; <i32> [#uses=1] - %val3 = call i32 @toascii( i32 127 ) ; <i32> [#uses=1] - %val4 = call i32 @toascii( i32 128 ) ; <i32> [#uses=1] - %val5 = call i32 @toascii( i32 255 ) ; <i32> [#uses=1] - %val6 = call i32 @toascii( i32 256 ) ; <i32> [#uses=1] - %rslt1 = add i32 %val1, %val2 ; <i32> [#uses=1] - %rslt2 = add i32 %val3, %val4 ; <i32> [#uses=1] - %rslt3 = add i32 %val5, %val6 ; <i32> [#uses=1] - %rslt4 = add i32 %rslt1, %rslt2 ; <i32> [#uses=1] - %rslt5 = add i32 %rslt4, %rslt3 ; <i32> [#uses=1] - ret i32 %rslt5 -} - diff --git a/test/Transforms/SimplifyLibCalls/abs.ll b/test/Transforms/SimplifyLibCalls/abs.ll deleted file mode 100644 index 3934a5b98f74..000000000000 --- a/test/Transforms/SimplifyLibCalls/abs.ll +++ /dev/null @@ -1,11 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S | grep "select i1 %ispos" -; PR2337 - -define i32 @test(i32 %x) { -entry: - %call = call i32 @abs( i32 %x ) ; <i32> [#uses=1] - ret i32 %call -} - -declare i32 @abs(i32) - diff --git a/test/Transforms/SimplifyLibCalls/cos.ll b/test/Transforms/SimplifyLibCalls/cos.ll deleted file mode 100644 index 6a8ce8c3881d..000000000000 --- a/test/Transforms/SimplifyLibCalls/cos.ll +++ /dev/null @@ -1,14 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S | FileCheck %s - -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -define double @foo(double %d) nounwind readnone { -; CHECK: @foo - %1 = fsub double -0.000000e+00, %d - %2 = call double @cos(double %1) nounwind readnone -; CHECK: call double @cos(double %d) - ret double %2 -} - -declare double @cos(double) nounwind readnone diff --git a/test/Transforms/SimplifyLibCalls/exp2.ll b/test/Transforms/SimplifyLibCalls/exp2.ll deleted file mode 100644 index a5927757cf93..000000000000 --- a/test/Transforms/SimplifyLibCalls/exp2.ll +++ /dev/null @@ -1,38 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S | grep "call.*ldexp" | count 4 -; rdar://5852514 - -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" -target triple = "i386-apple-darwin8" - -define double @t1(i32 %x) nounwind { -entry: - %tmp12 = sitofp i32 %x to double ; <double> [#uses=1] - %exp2 = tail call double @exp2( double %tmp12 ) ; <double> [#uses=1] - ret double %exp2 -} - -define float @t4(i8 zeroext %x) nounwind { -entry: - %tmp12 = uitofp i8 %x to float ; <float> [#uses=1] - %tmp3 = tail call float @exp2f( float %tmp12 ) nounwind readonly ; <float> [#uses=1] - ret float %tmp3 -} - -declare float @exp2f(float) nounwind readonly - -define double @t3(i16 zeroext %x) nounwind { -entry: - %tmp12 = uitofp i16 %x to double ; <double> [#uses=1] - %exp2 = tail call double @exp2( double %tmp12 ) ; <double> [#uses=1] - ret double %exp2 -} - -define double @t2(i16 signext %x) nounwind { -entry: - %tmp12 = sitofp i16 %x to double ; <double> [#uses=1] - %exp2 = tail call double @exp2( double %tmp12 ) ; <double> [#uses=1] - ret double %exp2 -} - -declare double @exp2(double) - diff --git a/test/Transforms/SimplifyLibCalls/float-shrink-compare.ll b/test/Transforms/SimplifyLibCalls/float-shrink-compare.ll index aecb887beb3a..ad54c3e38f13 100644 --- a/test/Transforms/SimplifyLibCalls/float-shrink-compare.ll +++ b/test/Transforms/SimplifyLibCalls/float-shrink-compare.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -simplify-libcalls -instcombine %s | FileCheck %s +; RUN: opt -S -simplify-libcalls -instcombine < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.8.0" diff --git a/test/Transforms/SimplifyLibCalls/floor.ll b/test/Transforms/SimplifyLibCalls/floor.ll deleted file mode 100644 index 93c62c20023d..000000000000 --- a/test/Transforms/SimplifyLibCalls/floor.ll +++ /dev/null @@ -1,85 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S -mtriple "i386-pc-linux" | FileCheck -check-prefix=DO-SIMPLIFY %s -; RUN: opt < %s -simplify-libcalls -S -mtriple "i386-pc-win32" | FileCheck -check-prefix=DONT-SIMPLIFY %s -; RUN: opt < %s -simplify-libcalls -S -mtriple "x86_64-pc-win32" | FileCheck -check-prefix=C89-SIMPLIFY %s -; RUN: opt < %s -simplify-libcalls -S -mtriple "i386-pc-mingw32" | FileCheck -check-prefix=DO-SIMPLIFY %s -; RUN: opt < %s -simplify-libcalls -S -mtriple "x86_64-pc-mingw32" | FileCheck -check-prefix=DO-SIMPLIFY %s -; RUN: opt < %s -simplify-libcalls -S -mtriple "sparc-sun-solaris" | FileCheck -check-prefix=DO-SIMPLIFY %s - -; DO-SIMPLIFY: call float @floorf( -; DO-SIMPLIFY: call float @ceilf( -; DO-SIMPLIFY: call float @roundf( -; DO-SIMPLIFY: call float @nearbyintf( -; DO-SIMPLIFY: call float @truncf( -; DO-SIMPLIFY: call float @fabsf( - -; C89-SIMPLIFY: call float @floorf( -; C89-SIMPLIFY: call float @ceilf( -; C89-SIMPLIFY: call double @round( -; C89-SIMPLIFY: call double @nearbyint( - -; DONT-SIMPLIFY: call double @floor( -; DONT-SIMPLIFY: call double @ceil( -; DONT-SIMPLIFY: call double @round( -; DONT-SIMPLIFY: call double @nearbyint( -; DONT-SIMPLIFY: call double @trunc( -; DONT-SIMPLIFY: call double @fabs( - -declare double @floor(double) - -declare double @ceil(double) - -declare double @round(double) - -declare double @nearbyint(double) - -declare double @trunc(double) - -declare double @fabs(double) - -define float @test_floor(float %C) { - %D = fpext float %C to double ; <double> [#uses=1] - ; --> floorf - %E = call double @floor( double %D ) ; <double> [#uses=1] - %F = fptrunc double %E to float ; <float> [#uses=1] - ret float %F -} - -define float @test_ceil(float %C) { - %D = fpext float %C to double ; <double> [#uses=1] - ; --> ceilf - %E = call double @ceil( double %D ) ; <double> [#uses=1] - %F = fptrunc double %E to float ; <float> [#uses=1] - ret float %F -} - -define float @test_round(float %C) { - %D = fpext float %C to double ; <double> [#uses=1] - ; --> roundf - %E = call double @round( double %D ) ; <double> [#uses=1] - %F = fptrunc double %E to float ; <float> [#uses=1] - ret float %F -} - -define float @test_nearbyint(float %C) { - %D = fpext float %C to double ; <double> [#uses=1] - ; --> nearbyintf - %E = call double @nearbyint( double %D ) ; <double> [#uses=1] - %F = fptrunc double %E to float ; <float> [#uses=1] - ret float %F -} - -define float @test_trunc(float %C) { - %D = fpext float %C to double - ; --> truncf - %E = call double @trunc(double %D) - %F = fptrunc double %E to float - ret float %F -} - -define float @test_fabs(float %C) { - %D = fpext float %C to double - ; --> fabsf - %E = call double @fabs(double %D) - %F = fptrunc double %E to float - ret float %F -} diff --git a/test/Transforms/SimplifyLibCalls/fwrite.ll b/test/Transforms/SimplifyLibCalls/fwrite.ll deleted file mode 100644 index f0f3dcaac63e..000000000000 --- a/test/Transforms/SimplifyLibCalls/fwrite.ll +++ /dev/null @@ -1,13 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S | FileCheck %s - -%FILE = type { i32 } - -@.str = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 - -define i64 @foo(%FILE* %f) { -; CHECK: %retval = call i64 @fwrite - %retval = call i64 @fwrite(i8* getelementptr inbounds ([1 x i8]* @.str, i64 0, i64 0), i64 1, i64 1, %FILE* %f) - ret i64 %retval -} - -declare i64 @fwrite(i8*, i64, i64, %FILE *) diff --git a/test/Transforms/SimplifyLibCalls/iprintf.ll b/test/Transforms/SimplifyLibCalls/iprintf.ll deleted file mode 100644 index 7f036fe3ab8b..000000000000 --- a/test/Transforms/SimplifyLibCalls/iprintf.ll +++ /dev/null @@ -1,71 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S -o %t -; RUN: FileCheck < %t %s -target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32" -target triple = "xcore-xmos-elf" - -@.str = internal constant [4 x i8] c"%f\0A\00" ; <[4 x i8]*> [#uses=1] -@.str1 = internal constant [4 x i8] c"%d\0A\00" ; <[4 x i8]*> [#uses=1] - -; Verify printf with no floating point arguments is transformed to iprintf -define i32 @f0(i32 %x) nounwind { -entry: -; CHECK: define i32 @f0 -; CHECK: @iprintf -; CHECK: } - %0 = tail call i32 (i8*, ...)* @printf(i8* getelementptr ([4 x i8]* @.str1, i32 0, i32 0), i32 %x) ; <i32> [#uses=0] - ret i32 %0 -} - -; Verify we don't turn this into an iprintf call -define void @f1(double %x) nounwind { -entry: -; CHECK: define void @f1 -; CHECK: @printf -; CHECK: } - %0 = tail call i32 (i8*, ...)* @printf(i8* getelementptr ([4 x i8]* @.str, i32 0, i32 0), double %x) nounwind ; <i32> [#uses=0] - ret void -} - -; Verify sprintf with no floating point arguments is transformed to siprintf -define i32 @f2(i8* %p, i32 %x) nounwind { -entry: -; CHECK: define i32 @f2 -; CHECK: @siprintf -; CHECK: } - %0 = tail call i32 (i8*, i8*, ...)* @sprintf(i8 *%p, i8* getelementptr ([4 x i8]* @.str1, i32 0, i32 0), i32 %x) - ret i32 %0 -} - -; Verify we don't turn this into an siprintf call -define i32 @f3(i8* %p, double %x) nounwind { -entry: -; CHECK: define i32 @f3 -; CHECK: @sprintf -; CHECK: } - %0 = tail call i32 (i8*, i8*, ...)* @sprintf(i8 *%p, i8* getelementptr ([4 x i8]* @.str, i32 0, i32 0), double %x) - ret i32 %0 -} - -; Verify fprintf with no floating point arguments is transformed to fiprintf -define i32 @f4(i8* %p, i32 %x) nounwind { -entry: -; CHECK: define i32 @f4 -; CHECK: @fiprintf -; CHECK: } - %0 = tail call i32 (i8*, i8*, ...)* @fprintf(i8 *%p, i8* getelementptr ([4 x i8]* @.str1, i32 0, i32 0), i32 %x) - ret i32 %0 -} - -; Verify we don't turn this into an fiprintf call -define i32 @f5(i8* %p, double %x) nounwind { -entry: -; CHECK: define i32 @f5 -; CHECK: @fprintf -; CHECK: } - %0 = tail call i32 (i8*, i8*, ...)* @fprintf(i8 *%p, i8* getelementptr ([4 x i8]* @.str, i32 0, i32 0), double %x) - ret i32 %0 -} - -declare i32 @printf(i8* nocapture, ...) nounwind -declare i32 @sprintf(i8* nocapture, i8* nocapture, ...) nounwind -declare i32 @fprintf(i8* nocapture, i8* nocapture, ...) nounwind diff --git a/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll b/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll deleted file mode 100644 index 0480fdda8916..000000000000 --- a/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll +++ /dev/null @@ -1,33 +0,0 @@ -; RUN: opt < %s -simplify-libcalls -S | FileCheck %s -; rdar://7251832 - -; SimplifyLibcalls should optimize pow(x, 0.5) to sqrt plus code to handle -; special cases. The readonly attribute on the call should be preserved. - -; CHECK: define float @foo(float %x) nounwind { -; CHECK: %sqrtf = call float @sqrtf(float %x) nounwind readonly -; CHECK: %fabsf = call float @fabsf(float %sqrtf) nounwind readonly -; CHECK: %1 = fcmp oeq float %x, 0xFFF0000000000000 -; CHECK: %retval = select i1 %1, float 0x7FF0000000000000, float %fabsf -; CHECK: ret float %retval - -define float @foo(float %x) nounwind { - %retval = call float @powf(float %x, float 0.5) - ret float %retval -} - -; CHECK: define double @doo(double %x) nounwind { -; CHECK: %sqrt = call double @sqrt(double %x) nounwind readonly -; CHECK: %fabs = call double @fabs(double %sqrt) nounwind readonly -; CHECK: %1 = fcmp oeq double %x, 0xFFF0000000000000 -; CHECK: %retval = select i1 %1, double 0x7FF0000000000000, double %fabs -; CHECK: ret double %retval -; CHECK: } - -define double @doo(double %x) nounwind { - %retval = call double @pow(double %x, double 0.5) - ret double %retval -} - -declare float @powf(float, float) nounwind readonly -declare double @pow(double, double) nounwind readonly diff --git a/test/Transforms/SimplifyLibCalls/pow2.ll b/test/Transforms/SimplifyLibCalls/pow2.ll deleted file mode 100644 index f0964e7d6daa..000000000000 --- a/test/Transforms/SimplifyLibCalls/pow2.ll +++ /dev/null @@ -1,37 +0,0 @@ -; Testcase for calls to the standard C "pow" function -; -; RUN: opt < %s -simplify-libcalls -S | not grep "call .pow" - - -declare double @pow(double, double) -declare float @powf(float, float) - -define double @test1(double %X) { - %Y = call double @pow( double %X, double 0.000000e+00 ) ; <double> [#uses=1] - ret double %Y -} - -define double @test2(double %X) { - %Y = call double @pow( double %X, double -0.000000e+00 ) ; <double> [#uses=1] - ret double %Y -} - -define double @test3(double %X) { - %Y = call double @pow( double 1.000000e+00, double %X ) ; <double> [#uses=1] - ret double %Y -} - -define double @test4(double %X) { - %Y = call double @pow( double %X, double 2.0) - ret double %Y -} - -define float @test4f(float %X) { - %Y = call float @powf( float %X, float 2.0) - ret float %Y -} - -define float @test5f(float %X) { - %Y = call float @powf(float 2.0, float %X) ;; exp2 - ret float %Y -} diff --git a/test/Transforms/StripSymbols/2010-08-25-crash.ll b/test/Transforms/StripSymbols/2010-08-25-crash.ll index 3965c3782276..7de5a028054a 100644 --- a/test/Transforms/StripSymbols/2010-08-25-crash.ll +++ b/test/Transforms/StripSymbols/2010-08-25-crash.ll @@ -1,4 +1,4 @@ -; RUN: opt -strip-dead-debug-info -disable-output %s +; RUN: opt -strip-dead-debug-info -disable-output < %s define i32 @foo() nounwind ssp { entry: ret i32 0, !dbg !8 diff --git a/test/Transforms/StripSymbols/block-address.ll b/test/Transforms/StripSymbols/block-address.ll index d22c6b1b157c..113d4d94fa40 100644 --- a/test/Transforms/StripSymbols/block-address.ll +++ b/test/Transforms/StripSymbols/block-address.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -strip -S | FileCheck %s +; RUN: opt -strip -S < %s | FileCheck %s ; PR10286 @main_addrs = constant [2 x i8*] [i8* blockaddress(@f, %FOO), i8* blockaddress(@f, %BAR)] diff --git a/test/Transforms/TailCallElim/ackermann.ll b/test/Transforms/TailCallElim/ackermann.ll index 5b5dbcc225c1..83d98b84ea70 100644 --- a/test/Transforms/TailCallElim/ackermann.ll +++ b/test/Transforms/TailCallElim/ackermann.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; This function contains two tail calls, which should be eliminated ; RUN: opt < %s -tailcallelim -stats -disable-output 2>&1 | grep "2 tailcallelim" diff --git a/test/Transforms/TailCallElim/dont-tce-tail-marked-call.ll b/test/Transforms/TailCallElim/dont-tce-tail-marked-call.ll index e4f8b483c3c0..97e67b26424d 100644 --- a/test/Transforms/TailCallElim/dont-tce-tail-marked-call.ll +++ b/test/Transforms/TailCallElim/dont-tce-tail-marked-call.ll @@ -1,5 +1,4 @@ -; RUN: opt < %s -tailcallelim -S | \ -; RUN: grep "call i32 @foo" +; RUN: opt < %s -tailcallelim -S | FileCheck %s declare void @bar(i32*) @@ -7,6 +6,7 @@ define i32 @foo(i32 %N) { %A = alloca i32, i32 %N ; <i32*> [#uses=2] store i32 17, i32* %A call void @bar( i32* %A ) +; CHECK: tail call i32 @foo %X = tail call i32 @foo( i32 %N ) ; <i32> [#uses=1] ret i32 %X } diff --git a/test/Transforms/TailCallElim/dup_tail.ll b/test/Transforms/TailCallElim/dup_tail.ll index 42ac2f9dc4b9..f5b87f27644d 100644 --- a/test/Transforms/TailCallElim/dup_tail.ll +++ b/test/Transforms/TailCallElim/dup_tail.ll @@ -1,5 +1,8 @@ +; REQUIRES: asserts ; Duplicate the return into if.end to enable TCE. -; RUN: opt %s -tailcallelim -stats -disable-output 2>&1 | grep "Number of return duplicated" +; RUN: opt -tailcallelim -stats -disable-output < %s 2>&1 | FileCheck %s + +; CHECK: Number of return duplicated define i32 @fib(i32 %n) nounwind ssp { entry: diff --git a/test/Transforms/TailCallElim/intervening-inst.ll b/test/Transforms/TailCallElim/intervening-inst.ll index 0c40bd5dc50d..10dffbd69425 100644 --- a/test/Transforms/TailCallElim/intervening-inst.ll +++ b/test/Transforms/TailCallElim/intervening-inst.ll @@ -1,5 +1,5 @@ ; This function contains intervening instructions which should be moved out of the way -; RUN: opt < %s -tailcallelim -S | not grep call +; RUN: opt < %s -tailcallelim -S | FileCheck %s define i32 @Test(i32 %X) { entry: @@ -10,6 +10,7 @@ then.0: ; preds = %entry ret i32 %tmp.4 endif.0: ; preds = %entry %tmp.10 = add i32 %X, -1 ; <i32> [#uses=1] +; CHECK-NOT: call %tmp.8 = call i32 @Test( i32 %tmp.10 ) ; <i32> [#uses=1] %DUMMY = add i32 %X, 1 ; <i32> [#uses=0] ret i32 %tmp.8 diff --git a/test/Transforms/TailCallElim/move_alloca_for_tail_call.ll b/test/Transforms/TailCallElim/move_alloca_for_tail_call.ll index a556ddb6eb1d..741f5848bc67 100644 --- a/test/Transforms/TailCallElim/move_alloca_for_tail_call.ll +++ b/test/Transforms/TailCallElim/move_alloca_for_tail_call.ll @@ -1,4 +1,4 @@ -; RUN: opt -tailcallelim %s -S | FileCheck %s +; RUN: opt -tailcallelim -S < %s | FileCheck %s ; PR615 declare void @bar(i32*) diff --git a/test/Transforms/TailCallElim/nocapture.ll b/test/Transforms/TailCallElim/nocapture.ll index 87cb9dd427b4..e49d87cc4b59 100644 --- a/test/Transforms/TailCallElim/nocapture.ll +++ b/test/Transforms/TailCallElim/nocapture.ll @@ -1,4 +1,4 @@ -; RUN: opt %s -tailcallelim -S | FileCheck %s +; RUN: opt -tailcallelim -S < %s | FileCheck %s ; XFAIL: * declare void @use(i8* nocapture, i8* nocapture) diff --git a/test/Transforms/TailCallElim/reorder_load.ll b/test/Transforms/TailCallElim/reorder_load.ll index 7f5c36e4a207..53c65dab101b 100644 --- a/test/Transforms/TailCallElim/reorder_load.ll +++ b/test/Transforms/TailCallElim/reorder_load.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -tailcallelim -S | not grep call +; RUN: opt < %s -tailcallelim -S | FileCheck %s ; PR4323 ; Several cases where tail call elimination should move the load above the call, @@ -21,6 +21,7 @@ if: ; preds = %entry else: ; preds = %entry %tmp7 = add i32 %start_arg, 1 ; <i32> [#uses=1] +; CHECK-NOT: call %tmp8 = call fastcc i32 @raise_load_1(i32* %a_arg, i32 %a_len_arg, i32 %tmp7) ; <i32> [#uses=1] %tmp9 = load i32* %a_arg ; <i32> [#uses=1] %tmp10 = add i32 %tmp9, %tmp8 ; <i32> [#uses=1] @@ -47,6 +48,7 @@ unwind: ; preds = %else recurse: ; preds = %else %tmp7 = add i32 %start_arg, 1 ; <i32> [#uses=1] +; CHECK-NOT: call %tmp8 = call fastcc i32 @raise_load_2(i32* %a_arg, i32 %a_len_arg, i32 %tmp7) ; <i32> [#uses=1] %tmp9 = load i32* @global ; <i32> [#uses=1] %tmp10 = add i32 %tmp9, %tmp8 ; <i32> [#uses=1] @@ -66,6 +68,7 @@ if: ; preds = %entry else: ; preds = %entry %tmp7 = add i32 %start_arg, 1 ; <i32> [#uses=1] +; CHECK-NOT: call %tmp8 = call fastcc i32 @raise_load_3(i32* %a_arg, i32 %a_len_arg, i32 %tmp7) ; <i32> [#uses=1] %tmp9 = load i32* @extern_weak_global ; <i32> [#uses=1] %tmp10 = add i32 %tmp9, %tmp8 ; <i32> [#uses=1] @@ -94,6 +97,7 @@ unwind: ; preds = %else recurse: ; preds = %else %tmp7 = add i32 %start_arg, 1 ; <i32> [#uses=1] %first = load i32* %a_arg ; <i32> [#uses=1] +; CHECK-NOT: call %tmp8 = call fastcc i32 @raise_load_4(i32* %a_arg, i32 %first, i32 %tmp7) ; <i32> [#uses=1] %second = load i32* %a_arg ; <i32> [#uses=1] %tmp10 = add i32 %second, %tmp8 ; <i32> [#uses=1] diff --git a/test/Transforms/TailCallElim/return_constant.ll b/test/Transforms/TailCallElim/return_constant.ll index 48e5641bb57a..e99e57e1457d 100644 --- a/test/Transforms/TailCallElim/return_constant.ll +++ b/test/Transforms/TailCallElim/return_constant.ll @@ -1,7 +1,7 @@ ; Though this case seems to be fairly unlikely to occur in the wild, someone ; plunked it into the demo script, so maybe they care about it. ; -; RUN: opt < %s -tailcallelim -S | not grep call +; RUN: opt < %s -tailcallelim -S | FileCheck %s define i32 @aaa(i32 %c) { entry: @@ -9,6 +9,7 @@ entry: br i1 %tmp.1, label %return, label %else else: ; preds = %entry %tmp.5 = add i32 %c, -1 ; <i32> [#uses=1] +; CHECK-NOT: call %tmp.3 = call i32 @aaa( i32 %tmp.5 ) ; <i32> [#uses=0] ret i32 0 return: ; preds = %entry diff --git a/test/Transforms/TailCallElim/trivial_codegen_tailcall.ll b/test/Transforms/TailCallElim/trivial_codegen_tailcall.ll index 3d01d1709952..7049e4d588d4 100644 --- a/test/Transforms/TailCallElim/trivial_codegen_tailcall.ll +++ b/test/Transforms/TailCallElim/trivial_codegen_tailcall.ll @@ -1,11 +1,11 @@ -; RUN: opt < %s -tailcallelim -S | \ -; RUN: grep "tail call void @foo" +; RUN: opt < %s -tailcallelim -S | FileCheck %s declare void @foo() define void @bar() { - call void @foo( ) +; CHECK: tail call void @foo() + call void @foo() ret void } diff --git a/test/Transforms/TailDup/2008-06-11-AvoidDupLoopHeader.ll b/test/Transforms/TailDup/2008-06-11-AvoidDupLoopHeader.ll index 7853d7ba06fb..292186020f4f 100644 --- a/test/Transforms/TailDup/2008-06-11-AvoidDupLoopHeader.ll +++ b/test/Transforms/TailDup/2008-06-11-AvoidDupLoopHeader.ll @@ -1,3 +1,4 @@ +; REQUIRES: asserts ; RUN: opt < %s -tailduplicate -taildup-threshold=3 -stats -disable-output 2>&1 | not grep tailduplicate ; XFAIL: * diff --git a/test/Unit/lit.cfg b/test/Unit/lit.cfg index ba4cbc5d7980..15cf626c72bf 100644 --- a/test/Unit/lit.cfg +++ b/test/Unit/lit.cfg @@ -28,6 +28,11 @@ if 'TMP' in os.environ: if 'TEMP' in os.environ: config.environment['TEMP'] = os.environ['TEMP'] +# Propagate path to symbolizer for ASan/MSan. +for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']: + if symbolizer in os.environ: + config.environment[symbolizer] = os.environ[symbolizer] + ### # Check that the object root is known. diff --git a/test/Verifier/module-flags-1.ll b/test/Verifier/module-flags-1.ll new file mode 100644 index 000000000000..e5feaf3a580d --- /dev/null +++ b/test/Verifier/module-flags-1.ll @@ -0,0 +1,60 @@ +; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s + +; Check that module flags are structurally correct. +; +; CHECK: incorrect number of operands in module flag +; CHECK: metadata !0 +!0 = metadata !{ i32 1 } +; CHECK: invalid behavior operand in module flag (expected constant integer) +; CHECK: metadata !"foo" +!1 = metadata !{ metadata !"foo", metadata !"foo", i32 42 } +; CHECK: invalid behavior operand in module flag (unexpected constant) +; CHECK: i32 999 +!2 = metadata !{ i32 999, metadata !"foo", i32 43 } +; CHECK: invalid ID operand in module flag (expected metadata string) +; CHECK: i32 1 +!3 = metadata !{ i32 1, i32 1, i32 44 } +; CHECK: invalid value for 'require' module flag (expected metadata pair) +; CHECK: i32 45 +!4 = metadata !{ i32 3, metadata !"bla", i32 45 } +; CHECK: invalid value for 'require' module flag (expected metadata pair) +; CHECK: metadata ! +!5 = metadata !{ i32 3, metadata !"bla", metadata !{ i32 46 } } +; CHECK: invalid value for 'require' module flag (first value operand should be a string) +; CHECK: i32 47 +!6 = metadata !{ i32 3, metadata !"bla", metadata !{ i32 47, i32 48 } } + +; Check that module flags only have unique IDs. +; +; CHECK: module flag identifiers must be unique (or of 'require' type) +!7 = metadata !{ i32 1, metadata !"foo", i32 49 } +!8 = metadata !{ i32 2, metadata !"foo", i32 50 } +; CHECK-NOT: module flag identifiers must be unique +!9 = metadata !{ i32 2, metadata !"bar", i32 51 } +!10 = metadata !{ i32 3, metadata !"bar", metadata !{ metadata !"bar", i32 51 } } + +; Check that any 'append'-type module flags are valid. +; CHECK: invalid value for 'append'-type module flag (expected a metadata node) +!16 = metadata !{ i32 5, metadata !"flag-2", i32 56 } +; CHECK: invalid value for 'append'-type module flag (expected a metadata node) +!17 = metadata !{ i32 5, metadata !"flag-3", i32 57 } +; CHECK-NOT: invalid value for 'append'-type module flag (expected a metadata node) +!18 = metadata !{ i32 5, metadata !"flag-4", metadata !{ i32 57 } } + +; Check that any 'require' module flags are valid. +; CHECK: invalid requirement on flag, flag is not present in module +!11 = metadata !{ i32 3, metadata !"bar", + metadata !{ metadata !"no-such-flag", i32 52 } } +; CHECK: invalid requirement on flag, flag does not have the required value +!12 = metadata !{ i32 1, metadata !"flag-0", i32 53 } +!13 = metadata !{ i32 3, metadata !"bar", + metadata !{ metadata !"flag-0", i32 54 } } +; CHECK-NOT: invalid requirement on flag, flag is not present in module +; CHECK-NOT: invalid requirement on flag, flag does not have the required value +!14 = metadata !{ i32 1, metadata !"flag-1", i32 55 } +!15 = metadata !{ i32 3, metadata !"bar", + metadata !{ metadata !"flag-1", i32 55 } } + +!llvm.module.flags = !{ + !0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, + !16, !17, !18 } diff --git a/test/lit.cfg b/test/lit.cfg index 79eaa23c8ba9..0ecd8feb26a2 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -90,6 +90,11 @@ config.environment['LLVM_SRC_ROOT'] = getattr(config, 'llvm_src_root', '') config.environment['PYTHON_EXECUTABLE'] = getattr(config, 'python_executable', '') +# Propagate path to symbolizer for ASan/MSan. +for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']: + if symbolizer in os.environ: + config.environment[symbolizer] = os.environ[symbolizer] + ### import os @@ -140,12 +145,16 @@ if config.test_exec_root is None: ### -# Provide a target triple for mcjit tests -mcjit_triple = config.target_triple -# Force ELF format on Windows -if re.search(r'cygwin|mingw32|win32', mcjit_triple): - mcjit_triple += "-elf" -config.substitutions.append( ('%mcjit_triple', mcjit_triple) ) +# Provide a command line for mcjit tests +lli_mcjit = 'lli -use-mcjit' +# The target triple used by default by lli is the process target triple (some +# triple appropriate for generating code for the current process) but because +# we don't support COFF in MCJIT well enough for the tests, force ELF format on +# Windows. FIXME: the process target triple should be used here, but this is +# difficult to obtain on Windows. +if re.search(r'cygwin|mingw32|win32', config.host_triple): + lli_mcjit += ' -mtriple='+config.host_triple+'-elf' +config.substitutions.append( ('%lli_mcjit', lli_mcjit) ) # Provide a substition for those tests that need to run the jit to obtain data # but simply want use the currently considered most reliable jit for platform @@ -197,7 +206,7 @@ for pattern in [r"\bbugpoint\b(?!-)", r"(?<!/|-)\bclang\b(?!-)", r"\bllvm-bcanalyzer\b", r"\bllvm-config\b", r"\bllvm-cov\b", r"\bllvm-diff\b", r"\bllvm-dis\b", r"\bllvm-dwarfdump\b", - r"\bllvm-extract\b", + r"\bllvm-extract\b", r"\bllvm-jistlistener\b", r"\bllvm-link\b", r"\bllvm-mc\b", r"\bllvm-nm\b", r"\bllvm-objdump\b", r"\bllvm-prof\b", r"\bllvm-ranlib\b", @@ -248,6 +257,13 @@ if loadable_module: if config.lto_is_enabled == "1" and platform.system() == "Darwin": config.available_features.add('lto_on_osx') +# Sanitizers. +if config.llvm_use_sanitizer == "Address": + config.available_features.add("asan") +if (config.llvm_use_sanitizer == "Memory" or + config.llvm_use_sanitizer == "MemoryWithOrigins"): + config.available_features.add("msan") + # llc knows whether he is compiled with -DNDEBUG. import subprocess try: diff --git a/test/lit.site.cfg.in b/test/lit.site.cfg.in index 2bbe63e6348e..8024b24fcde7 100644 --- a/test/lit.site.cfg.in +++ b/test/lit.site.cfg.in @@ -1,5 +1,6 @@ ## Autogenerated by LLVM/Clang configuration. # Do not edit! +config.host_triple = "@LLVM_HOSTTRIPLE@" config.target_triple = "@TARGET_TRIPLE@" config.llvm_src_root = "@LLVM_SOURCE_DIR@" config.llvm_obj_root = "@LLVM_BINARY_DIR@" @@ -16,6 +17,8 @@ config.targets_to_build = "@TARGETS_TO_BUILD@" config.llvm_bindings = "@LLVM_BINDINGS@" config.host_os = "@HOST_OS@" config.host_arch = "@HOST_ARCH@" +config.llvm_use_intel_jitevents = "@LLVM_USE_INTEL_JITEVENTS@" +config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@" # Support substitution of the tools_dir with user parameters. This is # used when we can't determine the tool dir at configuration time. diff --git a/test/tools/llvm-lit/chain.c b/test/tools/llvm-lit/chain.c new file mode 100644 index 000000000000..6f6541d2e46a --- /dev/null +++ b/test/tools/llvm-lit/chain.c @@ -0,0 +1,9 @@ +// This test should fail. lit used to interpret this as: +// (false && false) || true +// instead of the intended +// false && (false || true +// +// RUN: false +// RUN: false || true +// +// XFAIL: * diff --git a/test/tools/llvm-lit/lit.local.cfg b/test/tools/llvm-lit/lit.local.cfg new file mode 100644 index 000000000000..856a54932f0b --- /dev/null +++ b/test/tools/llvm-lit/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.c'] diff --git a/test/tools/llvm-objdump/disassembly-show-raw.s b/test/tools/llvm-objdump/disassembly-show-raw.s new file mode 100644 index 000000000000..32fcad4a369d --- /dev/null +++ b/test/tools/llvm-objdump/disassembly-show-raw.s @@ -0,0 +1,15 @@ +// RUN: llvm-mc -filetype=obj -arch=x86 %s | llvm-objdump -d - \ +// RUN: | FileCheck %s -check-prefix=WITHRAW +// RUN: llvm-mc -filetype=obj -arch=x86 %s | llvm-objdump -d -no-show-raw-insn - \ +// RUN: | FileCheck %s -check-prefix=NORAW + +// Expect to find the raw incoding when run with raw output (default), but not +// when run explicitly with -no-show-raw-insn + +movl 0, %eax +// WITHRAW: a1 00 00 00 00 movl + +// NORAW: movl +// NORAW-NOT: a1 00 + + diff --git a/test/tools/llvm-objdump/lit.local.cfg b/test/tools/llvm-objdump/lit.local.cfg new file mode 100644 index 000000000000..56bf00859572 --- /dev/null +++ b/test/tools/llvm-objdump/lit.local.cfg @@ -0,0 +1,6 @@ +config.suffixes = ['.ll', '.s'] + +targets = set(config.root.targets_to_build.split()) +if not 'X86' in targets: + config.unsupported = True + diff --git a/test/tools/llvm-objdump/win64-unwind-data.s b/test/tools/llvm-objdump/win64-unwind-data.s new file mode 100644 index 000000000000..1e4c7428ce32 --- /dev/null +++ b/test/tools/llvm-objdump/win64-unwind-data.s @@ -0,0 +1,106 @@ +// This test checks that the unwind data is dumped by llvm-objdump. +// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-objdump -u - | FileCheck %s + +// CHECK: Unwind info: +// CHECK: Function Table: +// CHECK-NEXT: Start Address: .text +// CHECK-NEXT: End Address: .text + 0x001b +// CHECK-NEXT: Unwind Info Address: .xdata +// CHECK-NEXT: Version: 1 +// CHECK-NEXT: Flags: 1 UNW_ExceptionHandler +// CHECK-NEXT: Size of prolog: 18 +// CHECK-NEXT: Number of Codes: 8 +// CHECK-NEXT: Frame register: RBX +// CHECK-NEXT: Frame offset: 0 +// CHECK-NEXT: Unwind Codes: +// CHECK-NEXT: 0x00: UOP_SetFPReg +// CHECK-NEXT: 0x0f: UOP_PushNonVol RBX +// CHECK-NEXT: 0x0e: UOP_SaveXMM128 XMM8 [0x0000] +// CHECK-NEXT: 0x09: UOP_SaveNonVol RSI [0x0010] +// CHECK-NEXT: 0x04: UOP_AllocSmall 24 +// CHECK-NEXT: 0x00: UOP_PushMachFrame w/o error code +// CHECK: Function Table: +// CHECK-NEXT: Start Address: .text + 0x0012 +// CHECK-NEXT: End Address: .text + 0x0012 +// CHECK-NEXT: Unwind Info Address: .xdata + 0x001c +// CHECK-NEXT: Version: 1 +// CHECK-NEXT: Flags: 4 UNW_ChainInfo +// CHECK-NEXT: Size of prolog: 0 +// CHECK-NEXT: Number of Codes: 0 +// CHECK-NEXT: No frame pointer used +// CHECK: Function Table: +// CHECK-NEXT: Start Address: .text + 0x001b +// CHECK-NEXT: End Address: .text + 0x001c +// CHECK-NEXT: Unwind Info Address: .xdata + 0x002c +// CHECK-NEXT: Version: 1 +// CHECK-NEXT: Flags: 0 +// CHECK-NEXT: Size of prolog: 0 +// CHECK-NEXT: Number of Codes: 0 +// CHECK-NEXT: No frame pointer used +// CHECK: Function Table: +// CHECK-NEXT: Start Address: .text + 0x001c +// CHECK-NEXT: End Address: .text + 0x0039 +// CHECK-NEXT: Unwind Info Address: .xdata + 0x0034 +// CHECK-NEXT: Version: 1 +// CHECK-NEXT: Flags: 0 +// CHECK-NEXT: Size of prolog: 14 +// CHECK-NEXT: Number of Codes: 6 +// CHECK-NEXT: No frame pointer used +// CHECK-NEXT: Unwind Codes: +// CHECK-NEXT: 0x0e: UOP_AllocLarge 8454128 +// CHECK-NEXT: 0x07: UOP_AllocLarge 8190 +// CHECK-NEXT: 0x00: UOP_PushMachFrame w/o error code + + .text + .globl func + .def func; .scl 2; .type 32; .endef + .seh_proc func +func: + .seh_pushframe @code + subq $24, %rsp + .seh_stackalloc 24 + movq %rsi, 16(%rsp) + .seh_savereg %rsi, 16 + movups %xmm8, (%rsp) + .seh_savexmm %xmm8, 0 + pushq %rbx + .seh_pushreg 3 + mov %rsp, %rbx + .seh_setframe 3, 0 + .seh_endprologue + .seh_handler __C_specific_handler, @except + .seh_handlerdata + .long 0 + .text + .seh_startchained + .seh_endprologue + .seh_endchained + lea (%rbx), %rsp + pop %rbx + addq $24, %rsp + ret + .seh_endproc + +// Test emission of small functions. + .globl smallFunc + .def smallFunc; .scl 2; .type 32; .endef + .seh_proc smallFunc +smallFunc: + ret + .seh_endproc + +// Function with big stack allocation. + .globl smallFunc + .def allocFunc; .scl 2; .type 32; .endef + .seh_proc smallFunc +allocFunc: + .seh_pushframe @code + subq $65520, %rsp + .seh_stackalloc 65520 + sub $8454128, %rsp + .seh_stackalloc 8454128 + .seh_endprologue + add $8454128, %rsp + addq $65520, %rsp + ret + .seh_endproc diff --git a/test/tools/llvm-readobj/Inputs/trivial.ll b/test/tools/llvm-readobj/Inputs/trivial.ll new file mode 100644 index 000000000000..2cd7ec89e246 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/trivial.ll @@ -0,0 +1,19 @@ +; llc -mtriple=i386-pc-win32 trivial.ll -filetype=obj -o trivial-object-test.coff-i386 +; llc -mtriple=x86_64-pc-win32 trivial.ll -filetype=obj -o trivial-object-test.coff-x86-64 +; llc -mtriple=i386-linux-gnu trivial.ll -filetype=obj -o trivial-object-test.elf-i386 -relocation-model=pic +; llc -mtriple=x86_64-linux-gnu trivial.ll -filetype=obj -o trivial-object-test.elf-x86-64 -relocation-model=pic +; llc -mtriple=i386-apple-darwin10 trivial.ll -filetype=obj -o trivial-object-test.macho-i386 -relocation-model=pic +; llc -mtriple=x86_64-apple-darwin10 trivial.ll -filetype=obj -o trivial-object-test.macho-x86-64 -relocation-model=pic + +@.str = private unnamed_addr constant [13 x i8] c"Hello World\0A\00", align 1 + +define i32 @main() nounwind { +entry: + %call = tail call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0)) nounwind + tail call void bitcast (void (...)* @SomeOtherFunction to void ()*)() nounwind + ret i32 0 +} + +declare i32 @puts(i8* nocapture) nounwind + +declare void @SomeOtherFunction(...) diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 b/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 Binary files differnew file mode 100644 index 000000000000..282e5699a767 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/trivial.obj.coff-i386 diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.coff-x86-64 b/test/tools/llvm-readobj/Inputs/trivial.obj.coff-x86-64 Binary files differnew file mode 100644 index 000000000000..8a7060e61076 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/trivial.obj.coff-x86-64 diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.elf-i386 b/test/tools/llvm-readobj/Inputs/trivial.obj.elf-i386 Binary files differnew file mode 100644 index 000000000000..f85e40d6261f --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/trivial.obj.elf-i386 diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.elf-x86-64 b/test/tools/llvm-readobj/Inputs/trivial.obj.elf-x86-64 Binary files differnew file mode 100644 index 000000000000..95285c1f230c --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/trivial.obj.elf-x86-64 diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.macho-i386 b/test/tools/llvm-readobj/Inputs/trivial.obj.macho-i386 Binary files differnew file mode 100644 index 000000000000..5048171ccb0c --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/trivial.obj.macho-i386 diff --git a/test/tools/llvm-readobj/Inputs/trivial.obj.macho-x86-64 b/test/tools/llvm-readobj/Inputs/trivial.obj.macho-x86-64 Binary files differnew file mode 100644 index 000000000000..bcdfc8aa6967 --- /dev/null +++ b/test/tools/llvm-readobj/Inputs/trivial.obj.macho-x86-64 diff --git a/test/tools/llvm-readobj/file-headers.test b/test/tools/llvm-readobj/file-headers.test new file mode 100644 index 000000000000..226eb9342334 --- /dev/null +++ b/test/tools/llvm-readobj/file-headers.test @@ -0,0 +1,100 @@ +RUN: llvm-readobj -h %p/Inputs/trivial.obj.coff-i386 \ +RUN: | FileCheck %s -check-prefix COFF32 +RUN: llvm-readobj -h %p/Inputs/trivial.obj.coff-x86-64 \ +RUN: | FileCheck %s -check-prefix COFF64 +RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF64 + +COFF32: File: {{(.*[/\\])?}}trivial.obj.coff-i386 +COFF32-NEXT: Format: COFF-i386 +COFF32-NEXT: Arch: i386 +COFF32-NEXT: AddressSize: 32bit +COFF32-NEXT: ImageFileHeader { +COFF32-NEXT: Machine: IMAGE_FILE_MACHINE_I386 (0x14C) +COFF32-NEXT: SectionCount: 2 +COFF32-NEXT: TimeDateStamp: 2013-03-20 17:56:46 (0x5149F85E) +COFF32-NEXT: PointerToSymbolTable: 0xA5 +COFF32-NEXT: SymbolCount: 7 +COFF32-NEXT: OptionalHeaderSize: 0 +COFF32-NEXT: Characteristics [ (0x0) +COFF32-NEXT: ] +COFF32-NEXT: } + +COFF64: File: {{(.*[/\\])?}}trivial.obj.coff-x86-64 +COFF64-NEXT: Format: COFF-x86-64 +COFF64-NEXT: Arch: x86_64 +COFF64-NEXT: AddressSize: 64bit +COFF64-NEXT: ImageFileHeader { +COFF64-NEXT: Machine: IMAGE_FILE_MACHINE_AMD64 (0x8664) +COFF64-NEXT: SectionCount: 2 +COFF64-NEXT: TimeDateStamp: 2013-03-20 17:56:46 (0x5149F85E) +COFF64-NEXT: PointerToSymbolTable: 0xAB +COFF64-NEXT: SymbolCount: 7 +COFF64-NEXT: OptionalHeaderSize: 0 +COFF64-NEXT: Characteristics [ (0x0) +COFF64-NEXT: ] +COFF64-NEXT: } + +ELF32: File: {{(.*[/\\])?}}trivial.obj.elf-i386 +ELF32-NEXT: Format: ELF32-i386 +ELF32-NEXT: Arch: i386 +ELF32-NEXT: AddressSize: 32bit +ELF32-NEXT: LoadName: +ELF32-NEXT: ElfHeader { +ELF32-NEXT: Ident { +ELF32-NEXT: Magic: (7F 45 4C 46) +ELF32-NEXT: Class: 32-bit (0x1) +ELF32-NEXT: DataEncoding: LittleEndian (0x1) +ELF32-NEXT: FileVersion: 1 +ELF32-NEXT: OS/ABI: GNU/Linux (0x3) +ELF32-NEXT: ABIVersion: 0 +ELF32-NEXT: Unused: (00 00 00 00 00 00 00) +ELF32-NEXT: } +ELF32-NEXT: Type: Relocatable (0x1) +ELF32-NEXT: Machine: EM_386 (0x3) +ELF32-NEXT: Version: 1 +ELF32-NEXT: Entry: 0x0 +ELF32-NEXT: ProgramHeaderOffset: 0x0 +ELF32-NEXT: SectionHeaderOffset: 0xC8 +ELF32-NEXT: Flags [ (0x0) +ELF32-NEXT: ] +ELF32-NEXT: HeaderSize: 52 +ELF32-NEXT: ProgramHeaderEntrySize: 0 +ELF32-NEXT: ProgramHeaderCount: 0 +ELF32-NEXT: SectionHeaderEntrySize: 40 +ELF32-NEXT: SectionHeaderCount: 10 +ELF32-NEXT: StringTableSectionIndex: 7 +ELF32-NEXT: } + +ELF64: File: {{(.*[/\\])?}}trivial.obj.elf-x86-64 +ELF64-NEXT: Format: ELF64-x86-64 +ELF64-NEXT: Arch: x86_64 +ELF64-NEXT: AddressSize: 64bit +ELF64-NEXT: LoadName: +ELF64-NEXT: ElfHeader { +ELF64-NEXT: Ident { +ELF64-NEXT: Magic: (7F 45 4C 46) +ELF64-NEXT: Class: 64-bit (0x2) +ELF64-NEXT: DataEncoding: LittleEndian (0x1) +ELF64-NEXT: FileVersion: 1 +ELF64-NEXT: OS/ABI: GNU/Linux (0x3) +ELF64-NEXT: ABIVersion: 0 +ELF64-NEXT: Unused: (00 00 00 00 00 00 00) +ELF64-NEXT: } +ELF64-NEXT: Type: Relocatable (0x1) +ELF64-NEXT: Machine: EM_X86_64 (0x3E) +ELF64-NEXT: Version: 1 +ELF64-NEXT: Entry: 0x0 +ELF64-NEXT: ProgramHeaderOffset: 0x0 +ELF64-NEXT: SectionHeaderOffset: 0xB8 +ELF64-NEXT: Flags [ (0x0) +ELF64-NEXT: ] +ELF64-NEXT: HeaderSize: 64 +ELF64-NEXT: ProgramHeaderEntrySize: 0 +ELF64-NEXT: ProgramHeaderCount: 0 +ELF64-NEXT: SectionHeaderEntrySize: 64 +ELF64-NEXT: SectionHeaderCount: 10 +ELF64-NEXT: StringTableSectionIndex: 7 +ELF64-NEXT: } diff --git a/test/tools/llvm-readobj/lit.local.cfg b/test/tools/llvm-readobj/lit.local.cfg new file mode 100644 index 000000000000..df9b335dd131 --- /dev/null +++ b/test/tools/llvm-readobj/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.test'] diff --git a/test/tools/llvm-readobj/relocations.test b/test/tools/llvm-readobj/relocations.test new file mode 100644 index 000000000000..060856537356 --- /dev/null +++ b/test/tools/llvm-readobj/relocations.test @@ -0,0 +1,32 @@ +RUN: llvm-readobj -r %p/Inputs/trivial.obj.coff-i386 \ +RUN: | FileCheck %s -check-prefix COFF +RUN: llvm-readobj -r %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-readobj -r %p/Inputs/trivial.obj.macho-i386 \ +RUN: | FileCheck %s -check-prefix MACHO + +COFF: Relocations [ +COFF-NEXT: Section (1) .text { +COFF-NEXT: 0x4 IMAGE_REL_I386_DIR32 .data +COFF-NEXT: 0x9 IMAGE_REL_I386_REL32 _puts +COFF-NEXT: 0xE IMAGE_REL_I386_REL32 _SomeOtherFunction +COFF-NEXT: } +COFF-NEXT: ] + +ELF: Relocations [ +ELF-NEXT: Section (1) .text { +ELF-NEXT: 0xC R_386_GOTPC _GLOBAL_OFFSET_TABLE_ 0x0 +ELF-NEXT: 0x12 R_386_GOTOFF .L.str 0x0 +ELF-NEXT: 0x1A R_386_PLT32 puts 0x0 +ELF-NEXT: 0x1F R_386_PLT32 SomeOtherFunction 0x0 +ELF-NEXT: } +ELF-NEXT: ] + +MACHO: Relocations [ +MACHO-NEXT: Section __text { +MACHO-NEXT: 0x18 GENERIC_RELOC_VANILLA _SomeOtherFunction 0x0 +MACHO-NEXT: 0x13 GENERIC_RELOC_VANILLA _puts 0x0 +MACHO-NEXT: 0xB GENERIC_RELOC_LOCAL_SECTDIFF _main 0x{{[0-9A-F]+}} +MACHO-NEXT: 0x0 GENERIC_RELOC_PAIR _main 0x{{[0-9A-F]+}} +MACHO-NEXT: } +MACHO-NEXT: ] diff --git a/test/tools/llvm-readobj/sections-ext.test b/test/tools/llvm-readobj/sections-ext.test new file mode 100644 index 000000000000..3254040c0553 --- /dev/null +++ b/test/tools/llvm-readobj/sections-ext.test @@ -0,0 +1,175 @@ +RUN: llvm-readobj -s -st -sr -sd %p/Inputs/trivial.obj.coff-i386 \ +RUN: | FileCheck %s -check-prefix COFF +RUN: llvm-readobj -s -st -sr -sd %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-readobj -s -st -sr -sd %p/Inputs/trivial.obj.macho-i386 \ +RUN: | FileCheck %s -check-prefix MACHO + +COFF: Sections [ +COFF-NEXT: Section { +COFF-NEXT: Number: 1 +COFF-NEXT: Name: .text (2E 74 65 78 74 00 00 00) +COFF-NEXT: VirtualSize: 0x0 +COFF-NEXT: VirtualAddress: 0x0 +COFF-NEXT: RawDataSize: 22 +COFF-NEXT: PointerToRawData: 0x64 +COFF-NEXT: PointerToRelocations: 0x7A +COFF-NEXT: PointerToLineNumbers: 0x0 +COFF-NEXT: RelocationCount: 3 +COFF-NEXT: LineNumberCount: 0 +COFF-NEXT: Characteristics [ (0x60500020) +COFF-NEXT: IMAGE_SCN_ALIGN_16BYTES (0x500000) +COFF-NEXT: IMAGE_SCN_CNT_CODE (0x20) +COFF-NEXT: IMAGE_SCN_MEM_EXECUTE (0x20000000) +COFF-NEXT: IMAGE_SCN_MEM_READ (0x40000000) +COFF-NEXT: ] +COFF-NEXT: Relocations [ +COFF-NEXT: 0x4 IMAGE_REL_I386_DIR32 .data +COFF-NEXT: 0x9 IMAGE_REL_I386_REL32 _puts +COFF-NEXT: 0xE IMAGE_REL_I386_REL32 _SomeOtherFunction +COFF-NEXT: ] +COFF-NEXT: Symbols [ +COFF-NEXT: Symbol { +COFF-NEXT: Name: .text +COFF-NEXT: Value: 0 +COFF-NEXT: Section: .text (1) +COFF-NEXT: BaseType: Null (0x0) +COFF-NEXT: ComplexType: Null (0x0) +COFF-NEXT: StorageClass: Static (0x3) +COFF-NEXT: AuxSymbolCount: 1 +COFF-NEXT: AuxSectionDef { +COFF-NEXT: Length: 22 +COFF-NEXT: RelocationCount: 3 +COFF-NEXT: LineNumberCount: 0 +COFF-NEXT: Checksum: 0x0 +COFF-NEXT: Number: 1 +COFF-NEXT: Selection: 0x0 +COFF-NEXT: Unused: (00 00 00) +COFF-NEXT: } +COFF-NEXT: } +COFF-NEXT: Symbol { +COFF-NEXT: Name: _main +COFF-NEXT: Value: 0 +COFF-NEXT: Section: .text (1) +COFF-NEXT: BaseType: Null (0x0) +COFF-NEXT: ComplexType: Function (0x2) +COFF-NEXT: StorageClass: External (0x2) +COFF-NEXT: AuxSymbolCount: 0 +COFF-NEXT: } +COFF-NEXT: ] +COFF-NEXT: SectionData ( +COFF-NEXT: 0000: 50C70424 00000000 E8000000 00E80000 |P..$............| +COFF-NEXT: 0010: 000031C0 5AC3 |..1.Z.| +COFF-NEXT: ) +COFF-NEXT: } + +ELF: Sections [ +ELF-NEXT: Section { +ELF-NEXT: Index: 0 +ELF-NEXT: Name: (0) +ELF-NEXT: Type: SHT_NULL (0x0) +ELF-NEXT: Flags [ (0x0) +ELF-NEXT: ] +ELF-NEXT: Address: 0x0 +ELF-NEXT: Offset: 0x0 +ELF-NEXT: Size: 0 +ELF-NEXT: Link: 0 +ELF-NEXT: Info: 0 +ELF-NEXT: AddressAlignment: 0 +ELF-NEXT: EntrySize: 0 +ELF-NEXT: Relocations [ +ELF-NEXT: ] +ELF-NEXT: Symbols [ +ELF-NEXT: ] +ELF-NEXT: SectionData ( +ELF-NEXT: ) +ELF-NEXT: } +ELF-NEXT: Section { +ELF-NEXT: Index: 1 +ELF-NEXT: Name: .text (5) +ELF-NEXT: Type: SHT_PROGBITS (0x1) +ELF-NEXT: Flags [ (0x6) +ELF-NEXT: SHF_ALLOC (0x2) +ELF-NEXT: SHF_EXECINSTR (0x4) +ELF-NEXT: ] +ELF-NEXT: Address: 0x0 +ELF-NEXT: Offset: 0x40 +ELF-NEXT: Size: 42 +ELF-NEXT: Link: 0 +ELF-NEXT: Info: 0 +ELF-NEXT: AddressAlignment: 16 +ELF-NEXT: EntrySize: 0 +ELF-NEXT: Relocations [ +ELF-NEXT: 0xC R_386_GOTPC _GLOBAL_OFFSET_TABLE_ 0x0 +ELF-NEXT: 0x12 R_386_GOTOFF .L.str 0x0 +ELF-NEXT: 0x1A R_386_PLT32 puts 0x0 +ELF-NEXT: 0x1F R_386_PLT32 SomeOtherFunction 0x0 +ELF-NEXT: ] +ELF-NEXT: Symbols [ +ELF-NEXT: Symbol { +ELF-NEXT: Name: .text (0) +ELF-NEXT: Value: 0x0 +ELF-NEXT: Size: 0 +ELF-NEXT: Binding: Local (0x0) +ELF-NEXT: Type: Section (0x3) +ELF-NEXT: Other: 0 +ELF-NEXT: Section: .text (0x1) +ELF-NEXT: } +ELF-NEXT: Symbol { +ELF-NEXT: Name: main (12) +ELF-NEXT: Value: 0x0 +ELF-NEXT: Size: 42 +ELF-NEXT: Binding: Global (0x1) +ELF-NEXT: Type: Function (0x2) +ELF-NEXT: Other: 0 +ELF-NEXT: Section: .text (0x1) +ELF-NEXT: } +ELF-NEXT: ] +ELF-NEXT: SectionData ( +ELF-NEXT: 0000: 5383EC08 E8000000 005B81C3 03000000 |S........[......| +ELF-NEXT: 0010: 8D830000 00008904 24E8FCFF FFFFE8FC |........$.......| +ELF-NEXT: 0020: FFFFFF31 C083C408 5BC3 |...1....[.| +ELF-NEXT: ) +ELF-NEXT: } + +MACHO: Sections [ +MACHO-NEXT: Section { +MACHO-NEXT: Index: 0 +MACHO-NEXT: Name: __text (5F 5F 74 65 78 74 00 +MACHO-NEXT: Segment: +MACHO-NEXT: Address: 0x0 +MACHO-NEXT: Size: 0x22 +MACHO-NEXT: Offset: 324 +MACHO-NEXT: Alignment: 4 +MACHO-NEXT: RelocationOffset: 0x174 +MACHO-NEXT: RelocationCount: 4 +MACHO-NEXT: Type: 0x0 +MACHO-NEXT: Attributes [ (0x800004) +MACHO-NEXT: PureInstructions (0x800000) +MACHO-NEXT: SomeInstructions (0x4) +MACHO-NEXT: ] +MACHO-NEXT: Reserved1: 0x0 +MACHO-NEXT: Reserved2: 0x0 +MACHO-NEXT: Relocations [ +MACHO-NEXT: 0x18 GENERIC_RELOC_VANILLA _SomeOtherFunction 0x0 +MACHO-NEXT: 0x13 GENERIC_RELOC_VANILLA _puts 0x0 +MACHO-NEXT: 0xB GENERIC_RELOC_LOCAL_SECTDIFF _main 0x{{[0-9A-F]+}} +MACHO-NEXT: 0x0 GENERIC_RELOC_PAIR _main 0x{{[0-9A-F]+}} +MACHO-NEXT: ] +MACHO-NEXT: Symbols [ +MACHO-NEXT: Symbol { +MACHO-NEXT: Name: _main (1) +MACHO-NEXT: Type: 0xF +MACHO-NEXT: Section: __text (0x1) +MACHO-NEXT: RefType: UndefinedNonLazy (0x0) +MACHO-NEXT: Flags [ (0x0) +MACHO-NEXT: ] +MACHO-NEXT: Value: 0x0 +MACHO-NEXT: } +MACHO-NEXT: ] +MACHO-NEXT: SectionData ( +MACHO-NEXT: 0000: 83EC0CE8 00000000 588D801A 00000089 |........X.......| +MACHO-NEXT: 0010: 0424E8E9 FFFFFFE8 E4FFFFFF 31C083C4 |.$..........1...| +MACHO-NEXT: 0020: 0CC3 |..| +MACHO-NEXT: ) +MACHO-NEXT: } diff --git a/test/tools/llvm-readobj/sections.test b/test/tools/llvm-readobj/sections.test new file mode 100644 index 000000000000..e5c6c063b233 --- /dev/null +++ b/test/tools/llvm-readobj/sections.test @@ -0,0 +1,113 @@ +RUN: llvm-readobj -s %p/Inputs/trivial.obj.coff-i386 \ +RUN: | FileCheck %s -check-prefix COFF +RUN: llvm-readobj -s %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-readobj -s %p/Inputs/trivial.obj.macho-i386 \ +RUN: | FileCheck %s -check-prefix MACHO + +COFF: Sections [ +COFF-NEXT: Section { +COFF-NEXT: Number: 1 +COFF-NEXT: Name: .text (2E 74 65 78 74 00 00 00) +COFF-NEXT: VirtualSize: 0x0 +COFF-NEXT: VirtualAddress: 0x0 +COFF-NEXT: RawDataSize: 22 +COFF-NEXT: PointerToRawData: 0x64 +COFF-NEXT: PointerToRelocations: 0x7A +COFF-NEXT: PointerToLineNumbers: 0x0 +COFF-NEXT: RelocationCount: 3 +COFF-NEXT: LineNumberCount: 0 +COFF-NEXT: Characteristics [ (0x60500020) +COFF-NEXT: IMAGE_SCN_ALIGN_16BYTES (0x500000) +COFF-NEXT: IMAGE_SCN_CNT_CODE (0x20) +COFF-NEXT: IMAGE_SCN_MEM_EXECUTE (0x20000000) +COFF-NEXT: IMAGE_SCN_MEM_READ (0x40000000) +COFF-NEXT: ] +COFF-NEXT: } +COFF-NEXT: Section { +COFF-NEXT: Number: 2 +COFF-NEXT: Name: .data (2E 64 61 74 61 00 00 00) +COFF-NEXT: VirtualSize: 0x0 +COFF-NEXT: VirtualAddress: 0x0 +COFF-NEXT: RawDataSize: 13 +COFF-NEXT: PointerToRawData: 0x98 +COFF-NEXT: PointerToRelocations: 0x0 +COFF-NEXT: PointerToLineNumbers: 0x0 +COFF-NEXT: RelocationCount: 0 +COFF-NEXT: LineNumberCount: 0 +COFF-NEXT: Characteristics [ (0xC0300040) +COFF-NEXT: IMAGE_SCN_ALIGN_4BYTES (0x300000) +COFF-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) +COFF-NEXT: IMAGE_SCN_MEM_READ (0x40000000) +COFF-NEXT: IMAGE_SCN_MEM_WRITE (0x80000000) +COFF-NEXT: ] +COFF-NEXT: } +COFF-NEXT: ] + +ELF: Sections [ +ELF-NEXT: Section { +ELF-NEXT: Index: 0 +ELF-NEXT: Name: (0) +ELF-NEXT: Type: SHT_NULL (0x0) +ELF-NEXT: Flags [ (0x0) +ELF-NEXT: ] +ELF-NEXT: Address: 0x0 +ELF-NEXT: Offset: 0x0 +ELF-NEXT: Size: 0 +ELF-NEXT: Link: 0 +ELF-NEXT: Info: 0 +ELF-NEXT: AddressAlignment: 0 +ELF-NEXT: EntrySize: 0 +ELF-NEXT: } +ELF-NEXT: Section { +ELF-NEXT: Index: 1 +ELF-NEXT: Name: .text (5) +ELF-NEXT: Type: SHT_PROGBITS (0x1) +ELF-NEXT: Flags [ (0x6) +ELF-NEXT: SHF_ALLOC (0x2) +ELF-NEXT: SHF_EXECINSTR (0x4) +ELF-NEXT: ] +ELF-NEXT: Address: 0x0 +ELF-NEXT: Offset: 0x40 +ELF-NEXT: Size: 42 +ELF-NEXT: Link: 0 +ELF-NEXT: Info: 0 +ELF-NEXT: AddressAlignment: 16 +ELF-NEXT: EntrySize: 0 +ELF-NEXT: } + +MACHO: Sections [ +MACHO-NEXT: Section { +MACHO-NEXT: Index: 0 +MACHO-NEXT: Name: __text ( +MACHO-NEXT: Segment: +MACHO-NEXT: Address: 0x0 +MACHO-NEXT: Size: 0x22 +MACHO-NEXT: Offset: 324 +MACHO-NEXT: Alignment: 4 +MACHO-NEXT: RelocationOffset: 0x174 +MACHO-NEXT: RelocationCount: 4 +MACHO-NEXT: Type: 0x0 +MACHO-NEXT: Attributes [ (0x800004) +MACHO-NEXT: PureInstructions (0x800000) +MACHO-NEXT: SomeInstructions (0x4) +MACHO-NEXT: ] +MACHO-NEXT: Reserved1: 0x0 +MACHO-NEXT: Reserved2: 0x0 +MACHO-NEXT: } +MACHO-NEXT: Section { +MACHO-NEXT: Index: 1 +MACHO-NEXT: Name: __cstring ( +MACHO-NEXT: Segment: +MACHO-NEXT: Address: 0x22 +MACHO-NEXT: Size: 0xD +MACHO-NEXT: Offset: 358 +MACHO-NEXT: Alignment: 0 +MACHO-NEXT: RelocationOffset: 0x0 +MACHO-NEXT: RelocationCount: 0 +MACHO-NEXT: Type: ExtReloc (0x2) +MACHO-NEXT: Attributes [ (0x0) +MACHO-NEXT: ] +MACHO-NEXT: Reserved1: 0x0 +MACHO-NEXT: Reserved2: 0x0 +MACHO-NEXT: } diff --git a/test/tools/llvm-readobj/symbols.test b/test/tools/llvm-readobj/symbols.test new file mode 100644 index 000000000000..d33bd8ed2cd0 --- /dev/null +++ b/test/tools/llvm-readobj/symbols.test @@ -0,0 +1,44 @@ +RUN: llvm-readobj -t %p/Inputs/trivial.obj.coff-i386 \ +RUN: | FileCheck %s -check-prefix COFF +RUN: llvm-readobj -t %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF + +COFF: Symbols [ +COFF-NEXT: Symbol { +COFF-NEXT: Name: .text +COFF-NEXT: Value: 0 +COFF-NEXT: Section: .text (1) +COFF-NEXT: BaseType: Null (0x0) +COFF-NEXT: ComplexType: Null (0x0) +COFF-NEXT: StorageClass: Static (0x3) +COFF-NEXT: AuxSymbolCount: 1 +COFF-NEXT: AuxSectionDef { +COFF-NEXT: Length: 22 +COFF-NEXT: RelocationCount: 3 +COFF-NEXT: LineNumberCount: 0 +COFF-NEXT: Checksum: 0x0 +COFF-NEXT: Number: 1 +COFF-NEXT: Selection: 0x0 +COFF-NEXT: Unused: (00 00 00) +COFF-NEXT: } +COFF-NEXT: } + +ELF: Symbols [ +ELF-NEXT: Symbol { +ELF-NEXT: Name: trivial.ll (1) +ELF-NEXT: Value: 0x0 +ELF-NEXT: Size: 0 +ELF-NEXT: Binding: Local (0x0) +ELF-NEXT: Type: File (0x4) +ELF-NEXT: Other: 0 +ELF-NEXT: Section: (0xFFF1) +ELF-NEXT: } +ELF-NEXT: Symbol { +ELF-NEXT: Name: .L.str (39) +ELF-NEXT: Value: 0x0 +ELF-NEXT: Size: 13 +ELF-NEXT: Binding: Local (0x0) +ELF-NEXT: Type: Object (0x1) +ELF-NEXT: Other: 0 +ELF-NEXT: Section: .rodata.str1.1 (0x5) +ELF-NEXT: } |